summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pagelib/sortedtimers.cpp28
-rw-r--r--pagelib/sortedtimers.h26
-rw-r--r--timers.cpp42
-rw-r--r--timers.h37
4 files changed, 77 insertions, 56 deletions
diff --git a/pagelib/sortedtimers.cpp b/pagelib/sortedtimers.cpp
deleted file mode 100644
index 547c482..0000000
--- a/pagelib/sortedtimers.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "sortedtimers.h"
-
-static bool operator<( cTimer const& left, cTimer const& right )
-{
- return left.Compare( right ) < 0;
-}
-
-/*
-static bool operator==( cTimer const& left, cTimer const& right )
-{
- return left.Channel() == right.Channel() &&
- (left.WeekDays() && left.WeekDays() == right.WeekDays() || !left.WeekDays() && left.Day() == right.Day()) &&
- left.Start() == right.Start() &&
- left.Stop() == right.Stop();
-}
-*/
-
-namespace vdrlive {
-
-SortedTimers::SortedTimers()
-{
- for ( cTimer* timer = Timers.First(); timer != 0; timer = Timers.Next( timer ) ) {
- m_timers.push_back( *timer );
- }
- m_timers.sort();
-}
-
-} // namespace vdrlive
diff --git a/pagelib/sortedtimers.h b/pagelib/sortedtimers.h
deleted file mode 100644
index ffe9150..0000000
--- a/pagelib/sortedtimers.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef VDR_LIVE_SORTEDTIMERS_H
-#define VDR_LIVE_SORTEDTIMERS_H
-
-#include <list>
-#include <vdr/timers.h>
-
-namespace vdrlive {
-
-class SortedTimers
-{
-public:
- typedef std::list< cTimer > List;
- typedef List::iterator iterator;
-
- SortedTimers();
-
- iterator begin() { return m_timers.begin(); }
- iterator end() { return m_timers.end(); }
-
-private:
- List m_timers;
-};
-
-} // namespace vdrlive
-
-#endif // VDR_LIVE_SORTEDTIMERS_H
diff --git a/timers.cpp b/timers.cpp
index ea3d6d1..e1689ce 100644
--- a/timers.cpp
+++ b/timers.cpp
@@ -1,9 +1,51 @@
+#include <sstream>
#include "timers.h"
+static bool operator<( cTimer const& left, cTimer const& right )
+{
+ return left.Compare( right ) < 0;
+}
+
namespace vdrlive {
+using namespace std;
+
+SortedTimers::SortedTimers():
+ m_state( 0 )
+{
+ ReloadTimers( true );
+}
+
+string SortedTimers::GetTimerId( cTimer const& timer )
+{
+ ostringstream builder;
+ builder << *timer.Channel()->GetChannelID().ToString() << ":" << timer.WeekDays() << ":"
+ << timer.Day() << ":" << timer.Start() << ":" << timer.Stop();
+ return builder.str();
+}
+
+void SortedTimers::ReloadTimers( bool initial )
+{
+ if ( !Timers.Modified( m_state ) && !initial )
+ return;
+
+ dsyslog("reloading timers");
+
+ clear();
+ for ( cTimer* timer = Timers.First(); timer != 0; timer = Timers.Next( timer ) ) {
+ push_back( *timer );
+ }
+ sort();
+}
+
TimerManager::TimerManager()
{
}
+void TimerManager::DoPendingWork()
+{
+ cMutexLock lock( this );
+ m_timers.ReloadTimers();
+}
+
} // namespace vdrlive
diff --git a/timers.h b/timers.h
index b6c53b8..339ead4 100644
--- a/timers.h
+++ b/timers.h
@@ -2,22 +2,55 @@
#define VDR_LIVE_TIMERS_H
#include <list>
+#include <string>
#include <vdr/timers.h>
+#include <vdr/thread.h>
#include "live.h"
namespace vdrlive {
class Plugin;
-class TimerManager
+class SortedTimersInterface: public std::list< cTimer >
+{
+public:
+ virtual ~SortedTimersInterface() {}
+
+ virtual std::string GetTimerId( cTimer const& timer ) = 0;
+};
+
+class SortedTimers: public SortedTimersInterface
+{
+ friend class TimerManager;
+
+public:
+ virtual std::string GetTimerId( cTimer const& timer );
+
+private:
+ SortedTimers();
+ SortedTimers( SortedTimers const& );
+
+ int m_state;
+ int m_refs;
+
+ void ReloadTimers( bool initial = false );
+};
+
+class TimerManager: public cMutex
{
friend TimerManager& Plugin::GetLiveTimerManager();
+public:
+ SortedTimersInterface& GetTimers() { return m_timers; }
+
+ // may only be called from Plugin::MainThreadHook
+ void DoPendingWork();
+
private:
TimerManager();
TimerManager( TimerManager const& );
-
+ SortedTimers m_timers;
};
inline TimerManager& LiveTimerManager()