From bfc3f1f4b2be0cad91d3aa8781c564ff20927063 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sun, 13 Sep 2015 13:57:51 +0200 Subject: [PATCH] Fixed moving currently recording timers between machines --- HISTORY | 2 ++ menu.c | 22 +++++++++++++++++++++- menu.h | 3 ++- svdrp.c | 8 ++++---- timers.c | 9 ++++----- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/HISTORY b/HISTORY index e66325e5..61f4185a 100644 --- a/HISTORY +++ b/HISTORY @@ -8804,6 +8804,8 @@ Video Disk Recorder Revision History because cTimer::ToText() is now also needed in a context where the terminating newline can't be used. Consequently, cChannel::ToText() and cMark::ToText() have been modified accordingly. +- All timer related response strings from SVDRP commands now use the channel ID + instead of channel numbers. - The "Edit timer" menu now has a new parameter "Record on", which can be used to select the VDR on which this timer shall record. Timers can be freely moved between connected VDRs by simply selecting the desired machine in this field. diff --git a/menu.c b/menu.c index 60ffe45c..f95c3bce 100644 --- a/menu.c +++ b/menu.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 4.10 2015/09/13 10:39:02 kls Exp $ + * $Id: menu.c 4.11 2015/09/13 13:54:27 kls Exp $ */ #include "menu.h" @@ -1075,11 +1075,14 @@ bool cMenuEditTimer::HandleRemoteModifications(cTimer *OldTimer, cTimer *NewTime if (NewTimer->Local()) { // timer stays local, nothing to do } else { // timer is moved from local to remote + if (NewTimer->Recording()) + NewTimer->SetRecording(false); // in case it was recording on the local machine if (!ExecSVDRPCommand(NewTimer->Remote(), cString::sprintf("NEWT %s", *NewTimer->ToText(true)), &Response) || SVDRPCode(Response[0]) != 250) return RemoteTimerError(NewTimer); int RemoteId = atoi(SVDRPValue(Response[0])); if (RemoteId <= 0) return RemoteTimerError(NewTimer); + cRecordControls::Stop(OldTimer); NewTimer->SetId(RemoteId); isyslog("moved timer %s to %d@%s", *OldTimer->ToDescr(), NewTimer->Id(), NewTimer->Remote()); } @@ -1090,6 +1093,8 @@ bool cMenuEditTimer::HandleRemoteModifications(cTimer *OldTimer, cTimer *NewTime return RemoteTimerError(OldTimer); } NewTimer->SetId(cTimers::NewTimerId()); + if (NewTimer->Recording()) + NewTimer->SetRecording(false); // in case it was recording on the remote machine isyslog("moved timer %d@%s to %s", OldTimer->Id(), OldTimer->Remote(), *NewTimer->ToDescr()); } else if (strcmp(OldTimer->Remote(), NewTimer->Remote()) == 0) { // timer stays remote on same machine @@ -1109,6 +1114,8 @@ bool cMenuEditTimer::HandleRemoteModifications(cTimer *OldTimer, cTimer *NewTime } } else { // timer is moved from one remote machine to an other + if (NewTimer->Recording()) + NewTimer->SetRecording(false); // in case it was recording on the remote machine if (!ExecSVDRPCommand(NewTimer->Remote(), cString::sprintf("NEWT %s", *NewTimer->ToText(true)), &Response) || SVDRPCode(Response[0]) != 250) return RemoteTimerError(NewTimer); int RemoteId = atoi(SVDRPValue(Response[0])); @@ -5250,6 +5257,19 @@ void cRecordControls::Stop(const char *InstantId) } } +void cRecordControls::Stop(cTimer *Timer) +{ + for (int i = 0; i < MAXRECORDCONTROLS; i++) { + if (RecordControls[i]) { + if (RecordControls[i]->Timer() == Timer) { + DELETENULL(RecordControls[i]); + ChangeState(); + break; + } + } + } +} + bool cRecordControls::PauseLiveVideo(void) { Skins.Message(mtStatus, tr("Pausing live video...")); diff --git a/menu.h b/menu.h index 3f380840..311f2cae 100644 --- a/menu.h +++ b/menu.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.h 4.2 2015/09/08 14:04:27 kls Exp $ + * $Id: menu.h 4.3 2015/09/13 12:27:50 kls Exp $ */ #ifndef __MENU_H @@ -262,6 +262,7 @@ public: static bool Start(cTimers *Timers, cTimer *Timer, bool Pause = false); static bool Start(bool Pause = false); static void Stop(const char *InstantId); + static void Stop(cTimer *Timer); static bool PauseLiveVideo(void); static const char *GetInstantId(const char *LastInstantId); static cRecordControl *GetRecordControl(const char *FileName); diff --git a/svdrp.c b/svdrp.c index a57d58ca..8b2e04ce 100644 --- a/svdrp.c +++ b/svdrp.c @@ -10,7 +10,7 @@ * and interact with the Video Disk Recorder - or write a full featured * graphical interface that sits on top of an SVDRP connection. * - * $Id: svdrp.c 4.7 2015/09/10 10:39:45 kls Exp $ + * $Id: svdrp.c 4.8 2015/09/13 13:57:51 kls Exp $ */ #include "svdrp.h" @@ -1858,7 +1858,7 @@ void cSVDRPServer::CmdMODT(const char *Option) *Timer = t; Timers->SetModified(); isyslog("SVDRP < %s modified timer %s (%s)", *connection, *Timer->ToDescr(), Timer->HasFlags(tfActive) ? "active" : "inactive"); - Reply(250, "%d %s", Timer->Id(), *Timer->ToText()); + Reply(250, "%d %s", Timer->Id(), *Timer->ToText(true)); } else Reply(501, "Timer \"%d\" not defined", Id); @@ -2002,7 +2002,7 @@ void cSVDRPServer::CmdNEWT(const char *Option) LOCK_TIMERS_WRITE; Timers->Add(Timer); isyslog("SVDRP < %s added timer %s", *connection, *Timer->ToDescr()); - Reply(250, "%d %s", Timer->Id(), *Timer->ToText()); + Reply(250, "%d %s", Timer->Id(), *Timer->ToText(true)); return; } else @@ -2261,7 +2261,7 @@ void cSVDRPServer::CmdUPDT(const char *Option) Timers->Add(Timer); isyslog("SVDRP < %s added timer %s", *connection, *Timer->ToDescr()); } - Reply(250, "%d %s", Timer->Id(), *Timer->ToText()); + Reply(250, "%d %s", Timer->Id(), *Timer->ToText(true)); return; } else diff --git a/timers.c b/timers.c index 7fd977e2..771f66b2 100644 --- a/timers.c +++ b/timers.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: timers.c 4.4 2015/09/09 10:42:18 kls Exp $ + * $Id: timers.c 4.5 2015/09/13 13:10:24 kls Exp $ */ #include "timers.h" @@ -33,7 +33,7 @@ cTimer::cTimer(bool Instant, bool Pause, const cChannel *Channel) flags = tfNone; *file = 0; aux = NULL; - remote = *Setup.SVDRPDefaultHost ? strdup(Setup.SVDRPDefaultHost) : NULL; + remote = NULL; event = NULL; if (Instant) SetFlags(tfActive | tfInstant); @@ -91,7 +91,7 @@ cTimer::cTimer(const cEvent *Event) flags = tfActive; *file = 0; aux = NULL; - remote = *Setup.SVDRPDefaultHost ? strdup(Setup.SVDRPDefaultHost) : NULL; + remote = NULL; event = NULL; if (Event->Vps() && Setup.UseVps) SetFlags(tfVps); @@ -142,14 +142,13 @@ cTimer& cTimer::operator= (const cTimer &Timer) { if (&Timer != this) { id = Timer.id; - uint OldFlags = flags & tfRecording; startTime = Timer.startTime; stopTime = Timer.stopTime; scheduleState = -1; deferred = 0; pending = Timer.pending; inVpsMargin = Timer.inVpsMargin; - flags = Timer.flags | OldFlags; + flags = Timer.flags; channel = Timer.channel; day = Timer.day; weekdays = Timer.weekdays;