summaryrefslogtreecommitdiff
path: root/plugin/status.cpp
diff options
context:
space:
mode:
authorJochen Dolze <vdr@dolze.de>2010-04-08 17:00:31 +0200
committerJochen Dolze <vdr@dolze.de>2010-04-08 17:00:31 +0200
commit0bb11d711bb02bad0cf4a8694522dff766aa1c54 (patch)
tree798e07e274d453b6faab28e7f12dd059797192c2 /plugin/status.cpp
parenta1f19e122cca43e5c07079e99e3544301cf3a1c8 (diff)
downloadvdr-plugin-markad-0bb11d711bb02bad0cf4a8694522dff766aa1c54.tar.gz
vdr-plugin-markad-0bb11d711bb02bad0cf4a8694522dff766aa1c54.tar.bz2
Added plugin setup, plugin main menu
Diffstat (limited to 'plugin/status.cpp')
-rw-r--r--plugin/status.cpp306
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);
+ }
}
}
}