summaryrefslogtreecommitdiff
path: root/plugin/status.cpp
diff options
context:
space:
mode:
authorJochen Dolze <vdr@dolze.de>2010-04-10 15:33:59 +0200
committerJochen Dolze <vdr@dolze.de>2010-04-10 15:33:59 +0200
commitb8fb66fe7f224892070debe4597b53c9beca6eb9 (patch)
treed727c1d92262606e629fdaa35c6330f86411f1f4 /plugin/status.cpp
parent3b55b1b944442a26457fb92ba4147ca79e03b434 (diff)
downloadvdr-plugin-markad-b8fb66fe7f224892070debe4597b53c9beca6eb9.tar.gz
vdr-plugin-markad-b8fb66fe7f224892070debe4597b53c9beca6eb9.tar.bz2
Added more setup options, added MARK svdrp command
Diffstat (limited to 'plugin/status.cpp')
-rw-r--r--plugin/status.cpp111
1 files changed, 86 insertions, 25 deletions
diff --git a/plugin/status.cpp b/plugin/status.cpp
index fe074ac..be32133 100644
--- a/plugin/status.cpp
+++ b/plugin/status.cpp
@@ -20,7 +20,7 @@ cStatusMarkAd::~cStatusMarkAd()
{
for (int i=0; i<(MAXDEVICES*MAXRECEIVERS); i++)
{
- Remove(i);
+ Remove(i,true);
}
}
@@ -54,7 +54,7 @@ bool cStatusMarkAd::Replaying()
void cStatusMarkAd::Replaying(const cControl *UNUSED(Control), const char *UNUSED(Name),
const char *UNUSED(FileName), bool On)
{
- if (setup->whilePlaying) return;
+ if (setup->whileReplaying) return;
if (On)
{
Pause(NULL);
@@ -65,25 +65,24 @@ void cStatusMarkAd::Replaying(const cControl *UNUSED(Control), const char *UNUSE
}
}
-void cStatusMarkAd::Recording(const cDevice *UNUSED(Device), const char *Name,
- const char *FileName, bool On)
+bool cStatusMarkAd::Start(const char *FileName, const char *Name, bool Direct)
{
- 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 ((Direct) && (Get(FileName)!=-1)) return false;
- if (On)
+ cString cmd = cString::sprintf("\"%s\"/markad %s %s %s -l \"%s\" %s \"%s\"",bindir,
+ setup->Verbose ? "-v" : "", setup->BackupMarks ? "-B" : "",
+ setup->OSDMessage ? "-O" : "",
+ logodir,Direct ? "after" : "--online=2 before", FileName);
+ dsyslog("executing %s",*cmd);
+ if (SystemExec(cmd)!=-1)
{
- // Start markad with recording
- cString cmd = cString::sprintf("\"%s\"/markad --online=2 -l \"%s\" before \"%s\"",bindir,
- logodir,FileName);
- if (SystemExec(cmd)!=-1)
+ usleep(200000);
+ int pos=Add(FileName,Name);
+ if (getPid(pos) && getStatus(pos))
{
- usleep(200000);
- int pos=Add(FileName,Name);
- if (getPid(pos) && getStatus(pos))
+ if (!setup->ProcessDuring)
{
- if (!setup->ProcessDuring)
+ if (!Direct)
{
if (!setup->whileRecording)
{
@@ -94,16 +93,43 @@ void cStatusMarkAd::Recording(const cDevice *UNUSED(Device), const char *Name,
Pause(FileName);
}
}
+ else
+ {
+ if (!setup->whileRecording && Recording())
+ {
+ Pause(FileName);
+ }
+ if (!setup->whileReplaying && Replaying())
+ {
+ Pause(FileName);
+ }
+ }
}
+ return true;
}
}
+ return false;
+}
+
+void cStatusMarkAd::Recording(const cDevice *UNUSED(Device), const char *Name,
+ const char *FileName, bool On)
+{
+ 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 recording
+ Start(FileName,Name);
+ }
else
{
if (!setup->ProcessDuring)
{
if (!setup->whileRecording)
{
- if (!setup->whilePlaying)
+ if (!setup->whileReplaying)
{
if (!Recording() && !Replaying()) Continue(NULL);
}
@@ -209,11 +235,19 @@ bool cStatusMarkAd::MarkAdRunning()
return (tmpRecs!=NULL);
}
-void cStatusMarkAd::Remove(int Position)
+int cStatusMarkAd::Get(const char *FileName)
+{
+ for (int i=0; i<(MAXDEVICES*MAXRECEIVERS); i++)
+ {
+ if ((recs[i].FileName) && (!strcmp(recs[i].FileName,FileName))) return i;
+ }
+ return -1;
+}
+
+void cStatusMarkAd::Remove(int Position, bool Kill)
{
if (recs[Position].FileName)
{
- dsyslog("markad: removing %s at position %i",recs[Position].FileName,Position);
free(recs[Position].FileName);
recs[Position].FileName=NULL;
}
@@ -222,6 +256,25 @@ void cStatusMarkAd::Remove(int Position)
free(recs[Position].Name);
recs[Position].Name=NULL;
}
+
+ if ((Kill) && (recs[Position].Pid))
+ {
+ if (getStatus(Position))
+ {
+ if ((recs[Position].Status=='R') || (recs[Position].Status=='S'))
+ {
+ kill(recs[Position].Pid,SIGTERM);
+ }
+ else
+ {
+ kill(recs[Position].Pid,SIGKILL);
+ }
+ }
+ else
+ {
+ kill(recs[Position].Pid,SIGKILL);
+ }
+ }
recs[Position].Status=0;
recs[Position].Pid=0;
}
@@ -232,9 +285,15 @@ int cStatusMarkAd::Add(const char *FileName, const char *Name)
{
if (!recs[i].FileName)
{
- dsyslog("markad: adding %s at position %i",FileName,i);
recs[i].FileName=strdup(FileName);
- recs[i].Name=strdup(Name);
+ if (Name)
+ {
+ recs[i].Name=strdup(Name);
+ }
+ else
+ {
+ Name=NULL;
+ }
recs[i].Status=0;
recs[i].Pid=0;
return i;
@@ -249,14 +308,15 @@ void cStatusMarkAd::Pause(const char *FileName)
{
if (FileName)
{
- if ((recs[i].FileName) && (!strcmp(recs[i].FileName,FileName)) && (recs[i].Pid))
+ if ((recs[i].FileName) && (!strcmp(recs[i].FileName,FileName)) &&
+ (recs[i].Pid) && (!recs[i].ChangedbyUser))
{
kill(recs[i].Pid,SIGTSTP);
}
}
else
{
- if (recs[i].Pid)
+ if ((recs[i].Pid) && (!recs[i].ChangedbyUser))
{
kill(recs[i].Pid,SIGTSTP);
}
@@ -270,14 +330,15 @@ void cStatusMarkAd::Continue(const char *FileName)
{
if (FileName)
{
- if ((recs[i].FileName) && (!strcmp(recs[i].FileName,FileName)) && (recs[i].Pid))
+ if ((recs[i].FileName) && (!strcmp(recs[i].FileName,FileName)) &&
+ (recs[i].Pid) && (!recs[i].ChangedbyUser) )
{
kill(recs[i].Pid,SIGCONT);
}
}
else
{
- if (recs[i].Pid)
+ if ((recs[i].Pid) && (!recs[i].ChangedbyUser))
{
kill(recs[i].Pid,SIGCONT);
}