diff options
Diffstat (limited to 'plugin/status.cpp')
-rw-r--r-- | plugin/status.cpp | 306 |
1 files changed, 228 insertions, 78 deletions
diff --git a/plugin/status.cpp b/plugin/status.cpp index 8cf4966..fe074ac 100644 --- a/plugin/status.cpp +++ b/plugin/status.cpp @@ -7,130 +7,280 @@ #include "status.h" -void cStatusMarkAd::Recording(const cDevice *Device, const char *UNUSED(Name), const char *FileName, bool On) +cStatusMarkAd::cStatusMarkAd(const char *BinDir, const char *LogoDir, struct setup *Setup) +{ + setup=Setup; + bindir=BinDir; + logodir=LogoDir; + actpos=0; + memset(&recs,0,sizeof(recs)); +} + +cStatusMarkAd::~cStatusMarkAd() +{ + for (int i=0; i<(MAXDEVICES*MAXRECEIVERS); i++) + { + Remove(i); + } +} + +int cStatusMarkAd::Recording() +{ + int cnt=0; + for (int i=0; i<cDevice::NumDevices(); i++) + { + cDevice *dev=cDevice::GetDevice(i); + if (dev) + { + if (dev->Receiving()) cnt++; + } + } + return cnt; +} + +bool cStatusMarkAd::Replaying() +{ + for (int i=0; i<cDevice::NumDevices(); i++) + { + cDevice *dev=cDevice::GetDevice(i); + if (dev) + { + if (dev->Replaying()) return true; + } + } + return false; +} + +void cStatusMarkAd::Replaying(const cControl *UNUSED(Control), const char *UNUSED(Name), + const char *UNUSED(FileName), bool On) +{ + if (setup->whilePlaying) return; + if (On) + { + Pause(NULL); + } + else + { + if (!Recording()) Continue(NULL); + } +} + +void cStatusMarkAd::Recording(const cDevice *UNUSED(Device), const char *Name, + const char *FileName, bool On) { - if (!Device) return; // just to be safe if (!FileName) return; // we cannot operate without a filename if (!bindir) return; // we cannot operate without bindir if (!logodir) return; // we dont want to operate without logodir if (On) { - // Start markad with (before) recording + // Start markad with recording cString cmd = cString::sprintf("\"%s\"/markad --online=2 -l \"%s\" before \"%s\"",bindir, logodir,FileName); if (SystemExec(cmd)!=-1) { - Add(FileName); + usleep(200000); + int pos=Add(FileName,Name); + if (getPid(pos) && getStatus(pos)) + { + if (!setup->ProcessDuring) + { + if (!setup->whileRecording) + { + Pause(NULL); + } + else + { + Pause(FileName); + } + } + } } } else { -#if 0 - // Start markad after recording - cString cmd = cString::sprintf("\"%s\"/markad -l \"%s\" after \"%s\"",bindir, - logodir,FileName); - if (SystemExec(cmd)!=-1) + if (!setup->ProcessDuring) { - Add(FileName); + if (!setup->whileRecording) + { + if (!setup->whilePlaying) + { + if (!Recording() && !Replaying()) Continue(NULL); + } + else + { + if (!Recording()) Continue(NULL); + } + } + else + { + Continue(FileName); + } } -#endif - // TODO: Start second pass? } +} +bool cStatusMarkAd::getStatus(int Position) +{ + if (Position<0) return false; + if (!recs[Position].Pid) return false; + int ret=0; + char procname[256]=""; + snprintf(procname,sizeof(procname),"/proc/%i/stat",recs[Position].Pid); + FILE *fstat=fopen(procname,"r"); + if (fstat) + { + // found a running markad + ret=fscanf(fstat,"%*d %*s %c",&recs[Position].Status); + fclose(fstat); + } + else + { + if (errno==ENOENT) + { + // no such file or directory -> markad done or crashed + // remove filename from list + Remove(Position); + } + } + return (ret==1); } -cStatusMarkAd::cStatusMarkAd(const char *BinDir, const char *LogoDir) +bool cStatusMarkAd::getPid(int Position) { - bindir=BinDir; - logodir=LogoDir; - memset(&recs,0,sizeof(recs)); + if (Position<0) return false; + if (!recs[Position].FileName) return false; + if (recs[Position].Pid) return true; + int ret=0; + char *buf; + if (asprintf(&buf,"%s/markad.pid",recs[Position].FileName)==-1) return false; + + FILE *fpid=fopen(buf,"r"); + if (fpid) + { + free(buf); + int pid; + ret=fscanf(fpid,"%i\n",&pid); + if (ret==1) recs[Position].Pid=pid; + fclose(fpid); + } + else + { + if (errno==ENOENT) + { + // no such file or directory -> markad done or crashed + // remove entry from list + Remove(Position); + } + free(buf); + } + return (ret==1); } -cStatusMarkAd::~cStatusMarkAd() +bool cStatusMarkAd::GetNextActive(struct recs **RecEntry) { - for (int i=0; i<(MAXDEVICES*MAXRECEIVERS); i++) + if (!RecEntry) return false; + *RecEntry=NULL; + + if (actpos>=(MAXDEVICES*MAXRECEIVERS)) return true; + + do { - if (recs[i]) free(recs[i]); + if ((recs[actpos].FileName) && (recs[actpos].Pid)) + { + if (getStatus(actpos)) + { + *RecEntry=&recs[actpos++]; + break; + } + } + actpos++; } + while (actpos<(MAXDEVICES*MAXRECEIVERS)); + + return true; } bool cStatusMarkAd::MarkAdRunning() { - bool running=false; + struct recs *tmpRecs=NULL; + ResetActPos(); + GetNextActive(&tmpRecs); + return (tmpRecs!=NULL); +} + +void cStatusMarkAd::Remove(int Position) +{ + if (recs[Position].FileName) + { + dsyslog("markad: removing %s at position %i",recs[Position].FileName,Position); + free(recs[Position].FileName); + recs[Position].FileName=NULL; + } + if (recs[Position].Name) + { + free(recs[Position].Name); + recs[Position].Name=NULL; + } + recs[Position].Status=0; + recs[Position].Pid=0; +} + +int cStatusMarkAd::Add(const char *FileName, const char *Name) +{ for (int i=0; i<(MAXDEVICES*MAXRECEIVERS); i++) { - if (recs[i]) + if (!recs[i].FileName) { - char *buf; - if (asprintf(&buf,"%s/markad.pid",recs[i])==-1) + dsyslog("markad: adding %s at position %i",FileName,i); + recs[i].FileName=strdup(FileName); + recs[i].Name=strdup(Name); + recs[i].Status=0; + recs[i].Pid=0; + return i; + } + } + return -1; +} + +void cStatusMarkAd::Pause(const char *FileName) +{ + for (int i=0; i<(MAXDEVICES*MAXRECEIVERS); i++) + { + if (FileName) + { + if ((recs[i].FileName) && (!strcmp(recs[i].FileName,FileName)) && (recs[i].Pid)) { - // this is crude, but if we fail to allocate memory something - // is going really wrong! - return false; + kill(recs[i].Pid,SIGTSTP); } - // check for running markad process - FILE *fpid=fopen(buf,"r"); - free(buf); - if (fpid) - { - int pid,ret; - ret=fscanf(fpid,"%i\n",&pid); - fclose(fpid); - if (ret==1) - { - char procname[256]=""; - snprintf(procname,sizeof(procname),"/proc/%i",pid); - struct stat statbuf; - if (stat(procname,&statbuf)==0) - { - // found a running markad - running=true; - } - else - { - if (errno==ENOENT) - { - // no such file or directory -> markad crashed? - // remove filename from list - free(recs[i]); - recs[i]=NULL; - } - else - { - // serious error? -> let vdr close - return false; - } - } - } - } - else + } + else + { + if (recs[i].Pid) { - if (errno==ENOENT) - { - // no such file or directory -> markad already finished - // remove filename from list - free(recs[i]); - recs[i]=NULL; - } - else - { - // serious error? -> let vdr close - return false; - } + kill(recs[i].Pid,SIGTSTP); } } } - return running; } -void cStatusMarkAd::Add(const char *FileName) +void cStatusMarkAd::Continue(const char *FileName) { for (int i=0; i<(MAXDEVICES*MAXRECEIVERS); i++) { - if (!recs[i]) + if (FileName) { - recs[i]=strdup(FileName); + if ((recs[i].FileName) && (!strcmp(recs[i].FileName,FileName)) && (recs[i].Pid)) + { + kill(recs[i].Pid,SIGCONT); + } + } + else + { + if (recs[i].Pid) + { + kill(recs[i].Pid,SIGCONT); + } } } } |