summaryrefslogtreecommitdiff
path: root/libcore/timers.c
diff options
context:
space:
mode:
Diffstat (limited to 'libcore/timers.c')
-rw-r--r--libcore/timers.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/libcore/timers.c b/libcore/timers.c
new file mode 100644
index 0000000..09af69b
--- /dev/null
+++ b/libcore/timers.c
@@ -0,0 +1,84 @@
+#include "timers.h"
+#include "../services/epgsearch.h"
+#include "../services/remotetimers.h"
+
+static int CompareTimers(const void *a, const void *b) {
+ return (*(const cTimer **)a)->Compare(**(const cTimer **)b);
+}
+
+cGlobalSortedTimers::cGlobalSortedTimers(bool forceRefresh) : cVector<const cTimer *>(Timers.Count()) {
+ static bool initial = true;
+ static cRemoteTimerRefresh *remoteTimerRefresh = NULL;
+
+ if (forceRefresh)
+ initial = true;
+ //check if remotetimers plugin is available
+ static cPlugin* pRemoteTimers = cPluginManager::GetPlugin("remotetimers");
+
+ cSchedulesLock SchedulesLock;
+ const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock);
+
+ if (pRemoteTimers && initial) {
+ cString errorMsg;
+ pRemoteTimers->Service("RemoteTimers::RefreshTimers-v1.0", &errorMsg);
+ initial = false;
+ }
+
+ for (cTimer *Timer = Timers.First(); Timer; Timer = Timers.Next(Timer))
+ Append(Timer);
+
+ //if remotetimers plugin is available, take timers also from him
+ if (pRemoteTimers) {
+ cTimer* remoteTimer = NULL;
+ while (pRemoteTimers->Service("RemoteTimers::ForEach-v1.0", &remoteTimer) && remoteTimer != NULL) {
+ remoteTimer->SetEventFromSchedule(Schedules); // make sure the event is current
+ Append(remoteTimer);
+ }
+ }
+
+ Sort(CompareTimers);
+
+ if (pRemoteTimers && (remoteTimerRefresh == NULL))
+ remoteTimerRefresh = new cRemoteTimerRefresh();
+}
+
+int cGlobalSortedTimers::NumTimerConfilicts(void) {
+ int numConflicts = 0;
+ cPlugin *p = cPluginManager::GetPlugin("epgsearch");
+ if (p) {
+ Epgsearch_lastconflictinfo_v1_0 *serviceData = new Epgsearch_lastconflictinfo_v1_0;
+ if (serviceData) {
+ serviceData->nextConflict = 0;
+ serviceData->relevantConflicts = 0;
+ serviceData->totalConflicts = 0;
+ p->Service("Epgsearch-lastconflictinfo-v1.0", serviceData);
+ if (serviceData->relevantConflicts > 0) {
+ numConflicts = serviceData->relevantConflicts;
+ }
+ delete serviceData;
+ }
+ }
+ return numConflicts;
+}
+
+cRemoteTimerRefresh::cRemoteTimerRefresh(): cThread("skindesigner: RemoteTimers::RefreshTimers") {
+ Start();
+}
+
+cRemoteTimerRefresh::~cRemoteTimerRefresh(void) {
+ Cancel(-1);
+ while (Active())
+ cCondWait::SleepMs(10);
+}
+
+void cRemoteTimerRefresh::Action(void) {
+ #define REFESH_INTERVALL_MS 30000
+ while (Running()) {
+ cCondWait::SleepMs(REFESH_INTERVALL_MS);
+ if (!cOsd::IsOpen()) {//make sure that no timer is currently being edited
+ cGlobalSortedTimers(true);
+ Timers.SetModified();
+ }
+ }
+}
+ \ No newline at end of file