vdr  2.7.6
timers.h
Go to the documentation of this file.
1 /*
2  * timers.h: Timer handling
3  *
4  * See the main source file 'vdr.c' for copyright information and
5  * how to reach the author.
6  *
7  * $Id: timers.h 5.12 2025/03/02 11:03:35 kls Exp $
8  */
9 
10 #ifndef __TIMERS_H
11 #define __TIMERS_H
12 
13 #include "channels.h"
14 #include "config.h"
15 #include "epg.h"
16 #include "tools.h"
17 
18 enum eTimerFlags { tfNone = 0x0000,
19  tfActive = 0x0001,
20  tfInstant = 0x0002,
21  tfVps = 0x0004,
22  tfRecording = 0x0008,
23  tfSpawned = 0x0010,
24  tfAvoid = 0x0020,
25  tfAll = 0xFFFF,
26  };
28 
29 class cTimers;
30 
31 class cTimer : public cListObject {
32  friend class cMenuEditTimer;
33 private:
34  int id;
35  mutable time_t startTime, stopTime;
39  mutable time_t deferred;
40  mutable time_t vpsNotRunning;
41  mutable bool vpsActive;
43  uint flags;
44  const cChannel *channel;
45  mutable time_t day;
46  int weekdays;
47  int start;
48  int stop;
49  int priority;
50  int lifetime;
51  mutable char pattern[NAME_MAX * 2 + 1]; // same size as 'file', to be able to initially fill 'pattern' with 'file' in the 'Edit timer' menu
52  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
53  char *aux;
54  char *remote;
55  const cEvent *event;
56 public:
57  cTimer(bool Instant = false, bool Pause = false, const cChannel *Channel = NULL);
58  cTimer(const cEvent *Event, const char *FileName = NULL, const cTimer *PatternTimer = NULL);
59  cTimer(const cTimer &Timer);
60  virtual ~cTimer() override;
61  cTimer& operator= (const cTimer &Timer);
62  void CalcMargins(int &MarginStart, int &MarginStop, const cEvent *Event);
63  virtual int Compare(const cListObject &ListObject) const override;
64  int Id(void) const { return id; }
65  bool Recording(void) const { return HasFlags(tfRecording); }
66  bool Pending(void) const { return pending; }
67  bool InVpsMargin(void) const { return inVpsMargin; }
68  uint Flags(void) const { return flags; }
69  const cChannel *Channel(void) const { return channel; }
70  time_t Day(void) const { return day; }
71  int WeekDays(void) const { return weekdays; }
72  int Start(void) const { return start; }
73  int Stop(void) const { return stop; }
74  int Priority(void) const { return priority; }
75  int Lifetime(void) const { return lifetime; }
76  const char *Pattern(void) const { return pattern; }
77  const char *File(void) const { return file; }
78  time_t FirstDay(void) const { return weekdays ? day : 0; }
79  const char *Aux(void) const { return aux; }
80  const char *Remote(void) const { return remote; }
81  bool Local(void) const { return !remote; } // convenience
82  time_t Deferred(void) const { return deferred; }
83  cString PatternAndFile(void) const;
84  cString ToText(bool UseChannelID = false) const;
85  cString ToDescr(void) const;
86  const cEvent *Event(void) const { return event; }
87  bool Parse(const char *s);
88  bool Save(FILE *f);
89  bool IsSingleEvent(void) const;
90  static int GetMDay(time_t t);
91  static int GetWDay(time_t t);
92  bool DayMatches(time_t t) const;
93  static time_t IncDay(time_t t, int Days);
94  static time_t SetTime(time_t t, int SecondsFromMidnight);
95  void SetPattern(const char *Pattern);
96  void SetFile(const char *File);
97  bool IsPatternTimer(void) const { return *pattern; }
98  bool Matches(time_t t = 0, bool Directly = false, int Margin = 0) const;
99  eTimerMatch Matches(const cEvent *Event, int *Overlap = NULL) const;
100  bool Expired(void) const;
101  time_t StartTime(void) const;
102  time_t StopTime(void) const;
103  time_t StartTimeEvent(void) const;
104  time_t StopTimeEvent(void) const;
105  void SetId(int Id);
106  cTimer *SpawnPatternTimer(const cEvent *Event, cTimers *Timers);
107  bool SpawnPatternTimers(const cSchedules *Schedules, cTimers *Timers);
108  bool AdjustSpawnedTimer(void);
109  void TriggerRespawn(void);
110  bool SetEventFromSchedule(const cSchedules *Schedules);
111  bool SetEvent(const cEvent *Event);
112  void SetRecording(bool Recording);
113  void SetPending(bool Pending);
114  void SetInVpsMargin(bool InVpsMargin);
115  void SetDay(time_t Day);
116  void SetWeekDays(int WeekDays);
117  void SetStart(int Start);
118  void SetStop(int Stop);
119  void SetPriority(int Priority);
120  void SetLifetime(int Lifetime);
121  void SetAux(const char *Aux);
122  void SetRemote(const char *Remote);
123  void SetDeferred(int Seconds);
124  void SetFlags(uint Flags);
125  void ClrFlags(uint Flags);
126  void InvFlags(uint Flags);
127  bool HasFlags(uint Flags) const;
128  void Skip(void);
129  void OnOff(void);
130  cString PrintFirstDay(void) const;
131  static int TimeToInt(int t);
132  static bool ParseDay(const char *s, time_t &Day, int &WeekDays);
133  static cString PrintDay(time_t Day, int WeekDays, bool SingleByteChars);
134  };
135 
136 class cTimers : public cConfig<cTimer> {
137 private:
138  static cTimers timers;
139  static int lastTimerId;
141 public:
142  cTimers(void);
143  static const cTimers *GetTimersRead(cStateKey &StateKey, int TimeoutMs = 0);
165  static cTimers *GetTimersWrite(cStateKey &StateKey, int TimeoutMs = 0);
189  static bool Load(const char *FileName);
190  static int NewTimerId(void);
191  const cTimer *GetById(int Id, const char *Remote = NULL) const;
192  cTimer *GetById(int Id, const char *Remote = NULL) { return const_cast<cTimer *>(static_cast<const cTimers *>(this)->GetById(Id, Remote)); };
193  const cTimer *GetTimer(const cTimer *Timer) const;
194  cTimer *GetTimer(const cTimer *Timer) { return const_cast<cTimer *>(static_cast<const cTimers *>(this)->GetTimer(Timer)); };
195  const cTimer *GetMatch(time_t t) const;
196  cTimer *GetMatch(time_t t) { return const_cast<cTimer *>(static_cast<const cTimers *>(this)->GetMatch(t)); };
197  const cTimer *GetMatch(const cEvent *Event, eTimerMatch *Match = NULL) const;
198  cTimer *GetMatch(const cEvent *Event, eTimerMatch *Match = NULL) { return const_cast<cTimer *>(static_cast<const cTimers *>(this)->GetMatch(Event, Match)); }
199  const cTimer *GetTimerForEvent(const cEvent *Event, eTimerFlags Flags = tfNone) const;
200  int GetMaxPriority(void) const;
203  const cTimer *GetNextActiveTimer(void) const;
204  const cTimer *UsesChannel(const cChannel *Channel) const;
205  bool SetEvents(const cSchedules *Schedules);
206  bool SpawnPatternTimers(const cSchedules *Schedules);
207  bool AdjustSpawnedTimers(void);
208  bool DeleteExpired(bool Force);
209  void Add(cTimer *Timer, cTimer *After = NULL);
210  void Ins(cTimer *Timer, cTimer *Before = NULL);
211  void Del(cTimer *Timer, bool DeleteObject = true);
212  bool StoreRemoteTimers(const char *ServerName = NULL, const cStringList *RemoteTimers = NULL);
220  };
221 
222 bool HandleRemoteTimerModifications(cTimer *NewTimer, cTimer *OldTimer = NULL, cString *Msg = NULL);
237 
238 // Provide lock controlled access to the list:
239 
241 
242 // These macros provide a convenient way of locking the global timers list
243 // and making sure the lock is released as soon as the current scope is left
244 // (note that these macros wait forever to obtain the lock!):
245 
246 #define LOCK_TIMERS_READ USE_LIST_LOCK_READ(Timers)
247 #define LOCK_TIMERS_WRITE USE_LIST_LOCK_WRITE(Timers)
248 
249 class cSortedTimers : public cVector<const cTimer *> {
250 public:
251  cSortedTimers(const cTimers *Timers);
252  };
253 
254 #endif //__TIMERS_H
const char * FileName(void)
Definition: config.h:134
Definition: epg.h:73
cSortedTimers(const cTimers *Timers)
Definition: timers.c:1514
Definition: tools.h:178
Definition: timers.h:31
int Stop(void) const
Definition: timers.h:73
void SetAux(const char *Aux)
Definition: timers.c:1042
time_t stopTime
the time_t value calculated from 'day', 'start' and 'stop'
Definition: timers.h:35
void OnOff(void)
Definition: timers.c:1087
void SetLifetime(int Lifetime)
Definition: timers.c:1037
cString PrintFirstDay(void) const
Definition: timers.c:436
char * aux
Definition: timers.h:53
time_t Deferred(void) const
Definition: timers.h:82
time_t day
midnight of the day this timer shall hit, or of the first day it shall hit in case of a repeating tim...
Definition: timers.h:45
int weekdays
bitmask, lowest bits: SSFTWTM (the 'M' is the LSB)
Definition: timers.h:46
bool IsSingleEvent(void) const
Definition: timers.c:513
void SetPending(bool Pending)
Definition: timers.c:1000
const char * Remote(void) const
Definition: timers.h:80
virtual ~cTimer() override
Definition: timers.c:240
cTimer(bool Instant=false, bool Pause=false, const cChannel *Channel=NULL)
Definition: timers.c:28
time_t StopTime(void) const
the stop time as given by the user
Definition: timers.c:778
time_t FirstDay(void) const
Definition: timers.h:78
cString PatternAndFile(void) const
Definition: timers.c:316
bool Recording(void) const
Definition: timers.h:65
void SetStart(int Start)
Definition: timers.c:1022
static time_t SetTime(time_t t, int SecondsFromMidnight)
Definition: timers.c:548
int priority
Definition: timers.h:49
bool Expired(void) const
Definition: timers.c:731
void ClrFlags(uint Flags)
Definition: timers.c:1065
char file[NAME_MAX *2+1]
Definition: timers.h:52
void SetFile(const char *File)
Definition: timers.c:564
void SetFlags(uint Flags)
Definition: timers.c:1060
int Start(void) const
Definition: timers.h:72
int id
Definition: timers.h:34
int start
the start and stop time of this timer as given by the user,
Definition: timers.h:47
void SetPriority(int Priority)
Definition: timers.c:1032
void SetDeferred(int Seconds)
Definition: timers.c:1054
void SetId(int Id)
Definition: timers.c:810
time_t StopTimeEvent(void) const
or by the user (for normal timers)
Definition: timers.c:796
bool AdjustSpawnedTimer(void)
Definition: timers.c:873
void SetInVpsMargin(bool InVpsMargin)
Definition: timers.c:1005
bool Save(FILE *f)
Definition: timers.c:506
bool IsPatternTimer(void) const
Definition: timers.h:97
static int GetWDay(time_t t)
Definition: timers.c:524
int WeekDays(void) const
Definition: timers.h:71
static cString PrintDay(time_t Day, int WeekDays, bool SingleByteChars)
Definition: timers.c:402
void TriggerRespawn(void)
Definition: timers.c:908
bool DayMatches(time_t t) const
Definition: timers.c:531
time_t Day(void) const
Definition: timers.h:70
void SetDay(time_t Day)
Definition: timers.c:1012
void SetRemote(const char *Remote)
Definition: timers.c:1048
bool InVpsMargin(void) const
Definition: timers.h:67
char * remote
Definition: timers.h:54
const char * Aux(void) const
Definition: timers.h:79
bool SetEvent(const cEvent *Event)
Definition: timers.c:971
const cChannel * channel
Definition: timers.h:44
void InvFlags(uint Flags)
Definition: timers.c:1070
void SetStop(int Stop)
Definition: timers.c:1027
int stop
in the form hhmm, with hh (00..23) and mm (00..59) added as hh*100+mm
Definition: timers.h:48
bool Local(void) const
Definition: timers.h:81
int scheduleStateSpawn
Definition: timers.h:37
static bool ParseDay(const char *s, time_t &Day, int &WeekDays)
Definition: timers.c:343
uint Flags(void) const
Definition: timers.h:68
bool vpsActive
true if this is a VPS timer and the event is current
Definition: timers.h:41
void Skip(void)
Definition: timers.c:1080
const char * File(void) const
Definition: timers.h:77
cTimer * SpawnPatternTimer(const cEvent *Event, cTimers *Timers)
Definition: timers.c:815
const cEvent * event
Definition: timers.h:55
time_t StartTime(void) const
the start time as given by the user
Definition: timers.c:771
bool Pending(void) const
Definition: timers.h:66
void CalcMargins(int &MarginStart, int &MarginStop, const cEvent *Event)
Definition: timers.c:283
cString ToDescr(void) const
Definition: timers.c:333
int scheduleStateSet
Definition: timers.h:36
const char * Pattern(void) const
Definition: timers.h:76
virtual int Compare(const cListObject &ListObject) const override
Must return 0 if this object is equal to ListObject, a positive value if it is "greater",...
Definition: timers.c:297
int scheduleStateAdjust
Definition: timers.h:38
bool SetEventFromSchedule(const cSchedules *Schedules)
Definition: timers.c:922
int Priority(void) const
Definition: timers.h:74
void SetRecording(bool Recording)
Definition: timers.c:991
time_t StartTimeEvent(void) const
the start/stop times as given by the event (for VPS timers), by event plus margins (for spawned non-V...
Definition: timers.c:785
void SetPattern(const char *Pattern)
Definition: timers.c:559
const cEvent * Event(void) const
Definition: timers.h:86
char pattern[NAME_MAX *2+1]
Definition: timers.h:51
bool pending
Definition: timers.h:42
time_t startTime
Definition: timers.h:35
static int TimeToInt(int t)
Definition: timers.c:338
time_t deferred
Matches(time_t, ...) will return false if the current time is before this value.
Definition: timers.h:39
static int GetMDay(time_t t)
Definition: timers.c:518
bool HasFlags(uint Flags) const
Definition: timers.c:1075
cTimer & operator=(const cTimer &Timer)
Definition: timers.c:248
time_t vpsNotRunning
the time when a VPS event's running status changed to "not running"
Definition: timers.h:40
void SetWeekDays(int WeekDays)
Definition: timers.c:1017
bool inVpsMargin
Definition: timers.h:42
int lifetime
Definition: timers.h:50
int Id(void) const
Definition: timers.h:64
bool Matches(time_t t=0, bool Directly=false, int Margin=0) const
Definition: timers.c:573
int Lifetime(void) const
Definition: timers.h:75
bool Parse(const char *s)
Definition: timers.c:446
uint flags
Definition: timers.h:43
cString ToText(bool UseChannelID=false) const
Definition: timers.c:323
const cChannel * Channel(void) const
Definition: timers.h:69
static time_t IncDay(time_t t, int Days)
Definition: timers.c:536
bool SpawnPatternTimers(const cSchedules *Schedules, cTimers *Timers)
Definition: timers.c:827
static cTimers timers
Definition: timers.h:138
static bool Load(const char *FileName)
Definition: timers.c:1116
int GetMaxPriority(void) const
Returns the maximum priority of all local timers that are currently recording.
Definition: timers.c:1211
const cTimer * UsesChannel(const cChannel *Channel) const
Definition: timers.c:1264
bool StoreRemoteTimers(const char *ServerName=NULL, const cStringList *RemoteTimers=NULL)
Stores the given list of RemoteTimers, which come from the VDR ServerName, in this list.
Definition: timers.c:1330
const cTimer * GetById(int Id, const char *Remote=NULL) const
Definition: timers.c:1136
void Add(cTimer *Timer, cTimer *After=NULL)
Definition: timers.c:1244
static cTimers * GetTimersWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of timers for write access.
Definition: timers.c:1239
cTimer * GetMatch(const cEvent *Event, eTimerMatch *Match=NULL)
Definition: timers.h:198
cTimer * GetMatch(time_t t)
Definition: timers.h:196
void Del(cTimer *Timer, bool DeleteObject=true)
Definition: timers.c:1258
static const cTimers * GetTimersRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of timers for read access.
Definition: timers.c:1234
const cTimer * GetTimer(const cTimer *Timer) const
Definition: timers.c:1147
const cTimer * GetMatch(time_t t) const
Definition: timers.c:1160
const cTimer * GetTimerForEvent(const cEvent *Event, eTimerFlags Flags=tfNone) const
Definition: timers.c:1200
static int lastTimerId
Definition: timers.h:139
cTimer * GetTimer(const cTimer *Timer)
Definition: timers.h:194
void Ins(cTimer *Timer, cTimer *Before=NULL)
Definition: timers.c:1252
time_t lastDeleteExpired
Definition: timers.h:140
bool SpawnPatternTimers(const cSchedules *Schedules)
Definition: timers.c:1283
const cTimer * GetNextActiveTimer(void) const
Definition: timers.c:1221
bool DeleteExpired(bool Force)
Definition: timers.c:1309
bool SetEvents(const cSchedules *Schedules)
Definition: timers.c:1273
bool AdjustSpawnedTimers(void)
Definition: timers.c:1295
static int NewTimerId(void)
Definition: timers.c:1131
cTimer * GetById(int Id, const char *Remote=NULL)
Definition: timers.h:192
cTimers(void)
Definition: timers.c:1110
Definition: tools.h:701
DEF_LIST_LOCK(Timers)
bool HandleRemoteTimerModifications(cTimer *NewTimer, cTimer *OldTimer=NULL, cString *Msg=NULL)
Performs any operations necessary to synchronize changes to a timer between peer VDR machines.
Definition: timers.c:1448
eTimerFlags
Definition: timers.h:18
@ tfNone
Definition: timers.h:18
@ tfAvoid
Definition: timers.h:24
@ tfInstant
Definition: timers.h:20
@ tfActive
Definition: timers.h:19
@ tfVps
Definition: timers.h:21
@ tfRecording
Definition: timers.h:22
@ tfAll
Definition: timers.h:25
@ tfSpawned
Definition: timers.h:23
eTimerMatch
Definition: timers.h:27
@ tmPartial
Definition: timers.h:27
@ tmFull
Definition: timers.h:27
@ tmNone
Definition: timers.h:27