diff options
Diffstat (limited to 'timers.h')
-rw-r--r-- | timers.h | 119 |
1 files changed, 93 insertions, 26 deletions
@@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: timers.h 2.7 2013/03/11 10:35:53 kls Exp $ + * $Id: timers.h 4.1 2015/08/31 10:42:53 kls Exp $ */ #ifndef __TIMERS_H @@ -28,11 +28,11 @@ class cTimer : public cListObject { friend class cMenuEditTimer; private: mutable time_t startTime, stopTime; - time_t lastSetEvent; + int scheduleState; mutable time_t deferred; ///< Matches(time_t, ...) will return false if the current time is before this value - bool recording, pending, inVpsMargin; + bool pending, inVpsMargin; uint flags; - cChannel *channel; + const cChannel *channel; mutable time_t day; ///< midnight of the day this timer shall hit, or of the first day it shall hit in case of a repeating timer int weekdays; ///< bitmask, lowest bits: SSFTWTM (the 'M' is the LSB) int start; @@ -41,15 +41,16 @@ private: int lifetime; mutable char file[NAME_MAX * 2 + 1]; // *2 to be able to hold 'title' and 'episode', which can each be up to 255 characters long char *aux; + char *remote; const cEvent *event; public: - cTimer(bool Instant = false, bool Pause = false, cChannel *Channel = NULL); + cTimer(bool Instant = false, bool Pause = false, const cChannel *Channel = NULL); cTimer(const cEvent *Event); cTimer(const cTimer &Timer); virtual ~cTimer(); cTimer& operator= (const cTimer &Timer); virtual int Compare(const cListObject &ListObject) const; - bool Recording(void) const { return recording; } + bool Recording(void) const { return HasFlags(tfRecording); } bool Pending(void) const { return pending; } bool InVpsMargin(void) const { return inVpsMargin; } uint Flags(void) const { return flags; } @@ -63,6 +64,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; } + const char *Remote(void) const { return remote; } time_t Deferred(void) const { return deferred; } cString ToText(bool UseChannelID = false) const; cString ToDescr(void) const; @@ -81,8 +83,8 @@ public: bool Expired(void) const; time_t StartTime(void) const; time_t StopTime(void) const; - void SetEventFromSchedule(const cSchedules *Schedules = NULL); - void SetEvent(const cEvent *Event); + bool SetEventFromSchedule(const cSchedules *Schedules); + bool SetEvent(const cEvent *Event); void SetRecording(bool Recording); void SetPending(bool Pending); void SetInVpsMargin(bool InVpsMargin); @@ -93,6 +95,7 @@ public: void SetPriority(int Priority); void SetLifetime(int Lifetime); void SetAux(const char *Aux); + void SetRemote(const char *Remote); void SetDeferred(int Seconds); void SetFlags(uint Flags); void ClrFlags(uint Flags); @@ -108,36 +111,100 @@ public: class cTimers : public cConfig<cTimer> { private: - int state; - int beingEdited; - time_t lastSetEvents; + static cTimers timers; time_t lastDeleteExpired; public: cTimers(void); + static const cTimers *GetTimersRead(cStateKey &StateKey, int TimeoutMs = 0); + ///< Gets the list of timers for read access. If TimeoutMs is given, + ///< it will wait that long to get a write lock before giving up. + ///< Otherwise it will wait indefinitely. If no read lock can be + ///< obtained within the given timeout, NULL will be returned. + ///< The list is locked and a pointer to it is returned if the state + ///< of the list is different than the state of the given StateKey. + ///< If both states are equal, the list of timers has not been modified + ///< since the last call with the same StateKey, and NULL will be + ///< returned (and the list is not locked). After the returned list of + ///< timers is no longer needed, the StateKey's Remove() function must + ///< be called to release the list. The time between calling + ///< cTimers::GetTimersRead() and StateKey.Remove() should be as short + ///< as possible. After calling StateKey.Remove() the list returned from + ///< this call must not be accessed any more. If you need to access the + ///< timers again later, a new call to GetTimersRead() must be made. + ///< A typical code sequence would look like this: + ///< cStateKey StateKey; + ///< if (const cTimers *Timers = cTimers::GetTimersRead(StateKey)) { + ///< // access the timers + ///< StateKey.Remove(); + ///< } + static cTimers *GetTimersWrite(cStateKey &StateKey, int TimeoutMs = 0); + ///< Gets the list of timers for write access. If TimeoutMs is given, + ///< it will wait that long to get a write lock before giving up. + ///< Otherwise it will wait indefinitely. If no write lock can be + ///< obtained within the given timeout, NULL will be returned. + ///< If a write lock can be obtained, the list of timers will be + ///< returned, regardless of the state values of the timers or the + ///< given StateKey. After the returned list of timers is no longer + ///< needed, the StateKey's Remove() function must be called to release + ///< the list. The time between calling cTimers::GetTimersWrite() and + ///< StateKey.Remove() should be as short as possible. After calling + ///< StateKey.Remove() the list returned from this call must not be + ///< accessed any more. If you need to access the timers again later, + ///< a new call to GetTimersWrite() must be made. The call + ///< to StateKey.Remove() will increment the state of the list of + ///< timers and will copy the new state value to the StateKey. You can + ///< suppress this by using 'false' as the parameter to the call, in + ///< which case the state values are left untouched. + ///< A typical code sequence would look like this: + ///< cStateKey StateKey; + ///< if (cTimers *Timers = cTimers::GetTimersWrite(StateKey)) { + ///< // access the timers + ///< StateKey.Remove(); + ///< } + static bool Load(const char *FileName); cTimer *GetTimer(cTimer *Timer); - cTimer *GetMatch(time_t t); - cTimer *GetMatch(const cEvent *Event, eTimerMatch *Match = NULL); - cTimer *GetNextActiveTimer(void); - int BeingEdited(void) { return beingEdited; } - void IncBeingEdited(void) { beingEdited++; } - void DecBeingEdited(void) { if (!--beingEdited) lastSetEvents = 0; } - void SetModified(void); - bool Modified(int &State); - ///< Returns true if any of the timers have been modified, which - ///< is detected by State being different than the internal state. - ///< Upon return the internal state will be stored in State. - void SetEvents(void); - void DeleteExpired(void); + const cTimer *GetMatch(time_t t) const; + cTimer *GetMatch(time_t t) { return const_cast<cTimer *>(static_cast<const cTimers *>(this)->GetMatch(t)); }; + const cTimer *GetMatch(const cEvent *Event, eTimerMatch *Match = NULL) const; + cTimer *GetMatch(const cEvent *Event, eTimerMatch *Match = NULL) { return const_cast<cTimer *>(static_cast<const cTimers *>(this)->GetMatch(Event, Match)); } + const cTimer *GetNextActiveTimer(void) const; + const cTimer *UsesChannel(const cChannel *Channel) const; + bool SetEvents(const cSchedules *Schedules); + bool DeleteExpired(void); void Add(cTimer *Timer, cTimer *After = NULL); void Ins(cTimer *Timer, cTimer *Before = NULL); void Del(cTimer *Timer, bool DeleteObject = true); + bool GetRemoteTimers(const char *ServerName = NULL); + ///< Gets the timers from the given remote machine and adds them to this + ///< list. If no ServerName is given, all timers from all known remote + ///< machines will be fetched. This function calls DelRemoteTimers() with + ///< the given ServerName first. + ///< Returns true if any remote timers have been added or deleted + bool DelRemoteTimers(const char *ServerName = NULL); + ///< Deletes all timers of the given remote machine from this list (leaves + ///< them untouched on the remote machine). If no ServerName is given, the + ///< timers of all remote machines will be deleted from the list. + ///< Returns true if any remote timers have been deleted. + void TriggerRemoteTimerPoll(const char *ServerName = NULL); + ///< Sends an SVDRP POLL command to the given remote machine. + ///< If no ServerName is given, the POLL command will be sent to all + ///< known remote machines. }; -extern cTimers Timers; +// Provide lock controlled access to the list: + +DEF_LIST_LOCK(Timers); + +// These macros provide a convenient way of locking the global timers list +// and making sure the lock is released as soon as the current scope is left +// (note that these macros wait forever to obtain the lock!): + +#define LOCK_TIMERS_READ USE_LIST_LOCK_READ(Timers) +#define LOCK_TIMERS_WRITE USE_LIST_LOCK_WRITE(Timers) class cSortedTimers : public cVector<const cTimer *> { public: - cSortedTimers(void); + cSortedTimers(const cTimers *Timers); }; #endif //__TIMERS_H |