summaryrefslogtreecommitdiff
path: root/timers.h
blob: 4ad8a7fd1fa298f8808ec69ef1ea4934abf0b680 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#ifndef VDR_LIVE_TIMERS_H
#define VDR_LIVE_TIMERS_H

#include <list>
#include <string>
#include <vdr/channels.h>
#include <vdr/menu.h>
#include <vdr/timers.h>
#include <vdr/thread.h>
#include "live.h"

namespace vdrlive {

	class SortedTimers: public std::list< cTimer >
	{
		friend class TimerManager;

		public:
			static std::string GetTimerId(cTimer const& timer);
			cTimer* GetByTimerId(std::string const& timerid);

			// en- or decodes a timer into an id usable for DOM Ids.
			static std::string EncodeDomId(std::string const& timerid);
			static std::string DecodeDomId(std::string const &timerDomId);

			bool Modified() { return Timers.Modified(m_state); }

			static std::string GetTimerDays(cTimer const& timer);
			static std::string GetTimerInfo(cTimer const& timer);

		private:
			SortedTimers();
			SortedTimers( SortedTimers const& );

			int m_state;

			void ReloadTimers( bool initial = false );
	};

	class TimerManager: public cMutex
	{
		friend TimerManager& LiveTimerManager();

		public:
			SortedTimers& GetTimers() { return m_timers; }

			void UpdateTimer( cTimer* timer, int flags, tChannelID& channel, std::string const& weekdays, std::string const& day,
							  int start, int stop, int priority, int lifetime, std::string const& title, std::string const& aux );

			void DelTimer( cTimer* timer);
			void ToggleTimerActive( cTimer* timer);
			// may only be called from Plugin::MainThreadHook
			void DoPendingWork();
			void DoReloadTimers() { m_timers.ReloadTimers(); }
			const cTimer* GetTimer(tEventID eventid, tChannelID channelid);

		private:
			typedef std::pair< cTimer*, std::string > TimerPair;
			typedef std::pair< TimerPair, std::string > ErrorPair;
			typedef std::list< TimerPair > TimerList;
			typedef std::list< ErrorPair > ErrorList;

			TimerManager();
			TimerManager( TimerManager const& );

			SortedTimers m_timers;
			TimerList m_updateTimers;
			ErrorList m_failedUpdates;
			cCondVar m_updateWait;

			void DoUpdateTimers();
			void DoInsertTimer( TimerPair& timerData );
			void DoUpdateTimer( TimerPair& timerData );
			void DoDeleteTimer( TimerPair& timerData );
			void DoToggleTimer( TimerPair& timerData );

			void StoreError( TimerPair const& timerData, std::string const& error );
			std::string GetError( TimerPair const& timerData );
	};

	TimerManager& LiveTimerManager();

} // namespace vdrlive

#endif // VDR_LIVE_TIMERS_H