diff options
-rw-r--r-- | menu_switchtimers.c | 35 | ||||
-rw-r--r-- | menu_switchtimers.h | 5 | ||||
-rw-r--r-- | switchtimer.c | 45 | ||||
-rw-r--r-- | switchtimer.h | 6 | ||||
-rw-r--r-- | switchtimer_thread.c | 10 |
5 files changed, 62 insertions, 39 deletions
diff --git a/menu_switchtimers.c b/menu_switchtimers.c index 48e4dcf..fefa0b8 100644 --- a/menu_switchtimers.c +++ b/menu_switchtimers.c @@ -67,7 +67,7 @@ void cMenuEditSwitchTimer::Set() Add(new cMenuEditIntItem(tr("Ask ... minutes before start"), &data.switchMinsBefore, 0, 99)); cString info = cString::sprintf("%s:\t%s", tr("action at"), - TIMESTRING(data.event->StartTime() - 60 * data.switchMinsBefore)); + TIMESTRING(data.startTime - 60 * data.switchMinsBefore)); cOsdItem* pInfoItem = new cOsdItem(info); pInfoItem->SetSelectable(false); Add(pInfoItem); @@ -85,7 +85,7 @@ eOSState cMenuEditSwitchTimer::ProcessKey(eKeys Key) iOldMode != data.mode) { time_t now = time(NULL); - if (data.event->StartTime() - 60 * data.switchMinsBefore < now) + if (data.startTime - 60 * data.switchMinsBefore < now) data.switchMinsBefore = iOldMinsBefore; Set(); Display(); @@ -113,19 +113,19 @@ eOSState cMenuEditSwitchTimer::ProcessKey(eKeys Key) return state; } -cMenuSwitchTimerItem::cMenuSwitchTimerItem(cSwitchTimer* SwitchTimer) +cMenuSwitchTimerItem::cMenuSwitchTimerItem(cSwitchTimer* SwitchTimer, const cEvent* Event) { switchTimer = SwitchTimer; + event = Event; Set(); } -void cMenuSwitchTimerItem::Set(void) +void cMenuSwitchTimerItem::Set() { - if (!SwitchTimers.Exists(switchTimer) || !switchTimer || !switchTimer->event) + if (!SwitchTimers.Exists(switchTimer) || !switchTimer || !event) return; - const cEvent* event = switchTimer->event; - time_t startTime = event->StartTime(); + time_t startTime = switchTimer->startTime; char *buffer = NULL; char datebuf[32]; @@ -133,7 +133,7 @@ void cMenuSwitchTimerItem::Set(void) tm *tm = localtime_r(&startTime, &tm_r); strftime(datebuf, sizeof(datebuf), "%d.%m", tm); - cChannel* channel = Channels.GetByChannelID(event->ChannelID(),true,true); + cChannel* channel = Channels.GetByChannelID(switchTimer->channelID,true,true); msprintf(&buffer, "%s\t%d\t%s\t%s\t%d\'\t%s~%s", switchTimer->mode==1?"":">", channel?channel->Number():-1, datebuf, TIMESTRING(startTime), switchTimer->switchMinsBefore, event->Title()?event->Title():"", event->ShortText()?event->ShortText():""); SetText(buffer, false); @@ -142,7 +142,7 @@ void cMenuSwitchTimerItem::Set(void) int cMenuSwitchTimerItem::Compare(const cListObject &ListObject) const { cMenuSwitchTimerItem *p = (cMenuSwitchTimerItem *)&ListObject; - if (switchTimer->event->StartTime() > p->switchTimer->event->StartTime()) + if (switchTimer->startTime > p->switchTimer->startTime) return 1; else return -1; @@ -161,9 +161,11 @@ void cMenuSwitchTimers::Set() Clear(); cMutexLock SwitchTimersLock(&SwitchTimers); cSwitchTimer* switchTimer = SwitchTimers.First(); - while (switchTimer) { - if (switchTimer->event) - Add(new cMenuSwitchTimerItem(switchTimer)); + while (switchTimer) + { + const cEvent* event = switchTimer->Event(); + if (event) + Add(new cMenuSwitchTimerItem(switchTimer, event)); switchTimer = SwitchTimers.Next(switchTimer); } Display(); @@ -213,8 +215,13 @@ eOSState cMenuSwitchTimers::Summary(void) if (HasSubMenu() || Count() == 0) return osContinue; cSwitchTimer *curSwitchTimer = CurrentSwitchTimer(); - if (curSwitchTimer && !isempty(curSwitchTimer->event->Description())) - return AddSubMenu(new cMenuText(tr("Summary"), curSwitchTimer->event->Description())); + + if (curSwitchTimer) + { + const cEvent* event = curSwitchTimer->Event(); + if (event && !isempty(event->Description())) + return AddSubMenu(new cMenuText(tr("Summary"), event->Description())); + } return osContinue; } diff --git a/menu_switchtimers.h b/menu_switchtimers.h index 2938e8e..6a9ec03 100644 --- a/menu_switchtimers.h +++ b/menu_switchtimers.h @@ -32,8 +32,9 @@ The project's page is at http://winni.vdr-developer.org/epgsearch class cMenuSwitchTimerItem : public cOsdItem { public: cSwitchTimer* switchTimer; - cMenuSwitchTimerItem(cSwitchTimer* SwitchTimer); - void Set(void); + const cEvent* event; + cMenuSwitchTimerItem(cSwitchTimer* SwitchTimer, const cEvent* event); + void Set(); int Compare(const cListObject &ListObject) const; }; diff --git a/switchtimer.c b/switchtimer.c index 62cad59..5f2135b 100644 --- a/switchtimer.c +++ b/switchtimer.c @@ -29,7 +29,6 @@ cSwitchTimers SwitchTimers; // -- cSwitchTimer ----------------------------------------------------------------- cSwitchTimer::cSwitchTimer(void) { - event = NULL; switchMinsBefore = 1; mode = 0; unmute = 0; @@ -37,7 +36,14 @@ cSwitchTimer::cSwitchTimer(void) cSwitchTimer::cSwitchTimer(const cEvent* Event, int SwitchMinsBefore, int Mode, int Unmute) { - event = Event; + eventID = 0; + startTime = 0; + if (Event) + { + eventID = Event->EventID(); + channelID = Event->ChannelID(); + startTime = Event->StartTime(); + } switchMinsBefore = SwitchMinsBefore; mode = Mode; unmute = Unmute; @@ -53,10 +59,7 @@ bool cSwitchTimer::Parse(const char *s) #define MAXVALUELEN (10 * MaxFileName) char value[MAXVALUELEN]; - - cChannel* channel = NULL; - unsigned int eventID = 0; - time_t startTime=0; + startTime=0; pos = line = strdup(s); pos_next = pos + strlen(pos); @@ -75,7 +78,7 @@ bool cSwitchTimer::Parse(const char *s) pos = pos_next; switch (parameter) { case 1: - channel = Channels.GetByChannelID(tChannelID::FromString(value), true, true); + channelID = tChannelID::FromString(value); break; case 2: eventID = atoi(value); @@ -99,13 +102,20 @@ bool cSwitchTimer::Parse(const char *s) if (*pos) pos++; } //while + free(line); + return (parameter >= 3) ? true : false; +} + +const cEvent* cSwitchTimer::Event() +{ time_t now = time(NULL); - event = NULL; - if (startTime > now && channel) + const cEvent* event = NULL; + if (startTime > now) { cSchedulesLock schedulesLock; const cSchedules* schedules = cSchedules::Schedules(schedulesLock); - const cSchedule *Schedule = schedules->GetSchedule(channel->GetChannelID()); + if (!schedules) return NULL; + const cSchedule *Schedule = schedules->GetSchedule(channelID); if (Schedule) { event = Schedule->GetEvent(eventID, startTime); @@ -113,23 +123,22 @@ bool cSwitchTimer::Parse(const char *s) event = Schedule->GetEventAround(startTime); } } - free(line); - return (parameter >= 3) ? true : false; + return event; } cString cSwitchTimer::ToText(bool& ignore) { ignore = false; - if (!event) + if (!Event()) { ignore = true; return NULL; } - cChannel *channel = Channels.GetByChannelID(event->ChannelID(), true, true); + cChannel *channel = Channels.GetByChannelID(channelID, true, true); if (!channel) return NULL; cString buffer = cString::sprintf("%s:%u:%ld:%d:%d:%d", - CHANNELSTRING(channel), event->EventID(), - event->StartTime(), switchMinsBefore, + CHANNELSTRING(channel), eventID, + startTime, switchMinsBefore, mode, unmute?1:0); return buffer; } @@ -151,7 +160,9 @@ cSwitchTimer* cSwitchTimers::InSwitchList(const cEvent* event) cSwitchTimer* switchTimer = SwitchTimers.First(); while (switchTimer) { - if (switchTimer->event == event) + if (switchTimer->eventID == event->EventID() && + switchTimer->channelID == event->ChannelID() && + switchTimer->startTime == event->StartTime()) return switchTimer; switchTimer = SwitchTimers.Next(switchTimer); } diff --git a/switchtimer.h b/switchtimer.h index e1dff19..a2c325c 100644 --- a/switchtimer.h +++ b/switchtimer.h @@ -29,13 +29,17 @@ The project's page is at http://winni.vdr-developer.org/epgsearch class cSwitchTimer : public cListObject { public: - const cEvent* event; + tEventID eventID; + time_t startTime; + tChannelID channelID; + int switchMinsBefore; int mode; // 0 = switch, 1 = announce only, 2 = ask for switch int unmute; cSwitchTimer(void); cSwitchTimer(const cEvent* Event, int SwitchMinsBefore=1, int mode=0, int unmute=0); + const cEvent* Event(); bool Parse(const char *s); cString ToText(bool& ignore); bool Save(FILE *f); diff --git a/switchtimer_thread.c b/switchtimer_thread.c index 164592b..732768f 100644 --- a/switchtimer_thread.c +++ b/switchtimer_thread.c @@ -86,16 +86,16 @@ void cSwitchTimerThread::Action(void) cSwitchTimer* switchTimer = SwitchTimers.First(); while (switchTimer && m_Active) { - const cEvent* event = switchTimer->event; - if (event && event->StartTime() - now < switchTimer->switchMinsBefore*60 + MSG_DELAY + 1) + if (switchTimer->startTime - now < switchTimer->switchMinsBefore*60 + MSG_DELAY + 1) { - cChannel *channel = Channels.GetByChannelID(event->ChannelID(), true, true); + cChannel *channel = Channels.GetByChannelID(switchTimer->channelID, true, true); bool doSwitch = (switchTimer->mode == 0); bool doAsk = (switchTimer->mode == 2); bool doUnmute = switchTimer->unmute; SwitchTimers.Del(switchTimer); - - if (channel && (event->EndTime() >= now)) + + const cEvent* event = switchTimer->Event(); + if (event && channel && (event->EndTime() >= now)) { cString Message = cString::sprintf("%s: %s - %s", event->Title(), CHANNELNAME(channel), GETTIMESTRING(event)); |