summaryrefslogtreecommitdiff
path: root/libcore/timers.c
blob: 00f40e9c39c4ac8a1cc77df0387804b9957e65a7 (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
86
#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)) {
        if (Timer->HasFlags(tfActive))
            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();
        }
    }
}