diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 55c5b272..7af31b22 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -2294,3 +2294,7 @@ Hans-Werner Hilse Mikko Matilainen for reporting a possible crash if the Info key is pressed after deleting the currently replayed recording + +Benedikt Elser + for a patch that was used to add cStatus::TimerChange() to inform plugins about + changes to the list of timers diff --git a/HISTORY b/HISTORY index aebfc466..f9c2097a 100644 --- a/HISTORY +++ b/HISTORY @@ -5633,3 +5633,5 @@ Video Disk Recorder Revision History which would not add any free space to the video directory. - Implemented the cStatus, cDevice and cPlayer functions for setting subtitle tracks in plugins (thanks to Petri Hintukainen). +- Added cStatus::TimerChange() to inform plugins about changes to the list of timers + (based on a patch from Benedikt Elser). diff --git a/status.c b/status.c index 42334fa9..1d7a8d42 100644 --- a/status.c +++ b/status.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: status.c 1.9 2008/02/16 13:50:15 kls Exp $ + * $Id: status.c 1.10 2008/02/16 14:46:31 kls Exp $ */ #include "status.h" @@ -23,6 +23,12 @@ cStatus::~cStatus() statusMonitors.Del(this, false); } +void cStatus::MsgTimerChange(const cTimer *Timer, eTimerChange Change) +{ + for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) + sm->TimerChange(Timer, Change); +} + void cStatus::MsgChannelSwitch(const cDevice *Device, int ChannelNumber) { for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) diff --git a/status.h b/status.h index 1448151a..b6c4d8b4 100644 --- a/status.h +++ b/status.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: status.h 1.11 2008/02/16 13:50:15 kls Exp $ + * $Id: status.h 1.12 2008/02/16 15:00:33 kls Exp $ */ #ifndef __STATUS_H @@ -15,11 +15,21 @@ #include "player.h" #include "tools.h" +enum eTimerChange { tcMod, tcAdd, tcDel }; + +class cTimer; + class cStatus : public cListObject { private: static cList statusMonitors; protected: // These functions can be implemented by derived classes to receive status information: + virtual void TimerChange(const cTimer *Timer, eTimerChange Change) {} + // Indicates a change in the timer settings. + // If Change is tcAdd or tcDel, Timer points to the timer that has + // been added or will be deleted, respectively. In case of tcMod, + // Timer is NULL; this indicates that some timer has been changed. + // Note that tcAdd and tcDel are always also followed by a tcMod. virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber) {} // Indicates a channel switch on the given DVB device. // If ChannelNumber is 0, this is before the channel is being switched, @@ -74,6 +84,7 @@ public: cStatus(void); virtual ~cStatus(); // These functions are called whenever the related status information changes: + static void MsgTimerChange(const cTimer *Timer, eTimerChange Change); static void MsgChannelSwitch(const cDevice *Device, int ChannelNumber); static void MsgRecording(const cDevice *Device, const char *Name, const char *FileName, bool On); static void MsgReplaying(const cControl *Control, const char *Name, const char *FileName, bool On); diff --git a/timers.c b/timers.c index 1e9feec2..c76511e8 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 1.72 2008/02/15 15:36:59 kls Exp $ + * $Id: timers.c 1.73 2008/02/16 14:47:40 kls Exp $ */ #include "timers.h" @@ -15,6 +15,7 @@ #include "libsi/si.h" #include "recording.h" #include "remote.h" +#include "status.h" #define VFAT_MAX_FILENAME 40 // same as MAX_SUBTITLE_LENGTH in recording.c @@ -136,7 +137,7 @@ int cTimer::Compare(const cListObject &ListObject) const return r; } -cString cTimer::ToText(bool UseChannelID) +cString cTimer::ToText(bool UseChannelID) const { strreplace(file, ':', '|'); cString buffer = cString::sprintf("%u:%s:%s:%04d:%04d:%d:%d:%s:%s\n", flags, UseChannelID ? *Channel()->GetChannelID().ToString() : *itoa(Channel()->Number()), *PrintDay(day, weekdays, true), start, stop, priority, lifetime, file, aux ? aux : ""); @@ -696,9 +697,28 @@ cTimer *cTimers::GetNextActiveTimer(void) void cTimers::SetModified(void) { + cStatus::MsgTimerChange(NULL, tcMod); state++; } +void cTimers::Add(cTimer *Timer, cTimer *After) +{ + cConfig::Add(Timer, After); + cStatus::MsgTimerChange(Timer, tcAdd); +} + +void cTimers::Ins(cTimer *Timer, cTimer *Before) +{ + cConfig::Ins(Timer, Before); + cStatus::MsgTimerChange(Timer, tcAdd); +} + +void cTimers::Del(cTimer *Timer, bool DeleteObject) +{ + cStatus::MsgTimerChange(Timer, tcDel); + cConfig::Del(Timer, DeleteObject); +} + bool cTimers::Modified(int &State) { bool Result = state != State; diff --git a/timers.h b/timers.h index 64d562b0..a18f9f87 100644 --- a/timers.h +++ b/timers.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: timers.h 1.30 2007/06/03 13:24:58 kls Exp $ + * $Id: timers.h 1.31 2008/02/16 14:33:23 kls Exp $ */ #ifndef __TIMERS_H @@ -38,7 +38,7 @@ private: int stop; int priority; int lifetime; - char file[MaxFileName]; + mutable char file[MaxFileName]; char *aux; const cEvent *event; public: @@ -62,7 +62,7 @@ public: const char *File(void) const { return file; } time_t FirstDay(void) const { return weekdays ? day : 0; } const char *Aux(void) const { return aux; } - cString ToText(bool UseChannelID = false); + cString ToText(bool UseChannelID = false) const; cString ToDescr(void) const; const cEvent *Event(void) const { return event; } bool Parse(const char *s); @@ -119,6 +119,9 @@ public: ///< Upon return the internal state will be stored in State. void SetEvents(void); void DeleteExpired(void); + void Add(cTimer *Timer, cTimer *After = NULL); + void Ins(cTimer *Timer, cTimer *Before = NULL); + void Del(cTimer *Timer, bool DeleteObject = true); }; extern cTimers Timers;