summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Wieninger <cwieninger@gmx.de>2010-03-12 18:34:47 +0100
committerChristian Wieninger <cwieninger@gmx.de>2010-03-12 18:34:47 +0100
commita9a6ba970b574bfd62279f5cc32d9a7d50bf5be1 (patch)
tree67ee40c9d6ee3615496084cc80d5184348f74318
parentadb0f46774d562a7ec164e2e81c1f2d946d03fdf (diff)
downloadvdr-plugin-epgsearch-a9a6ba970b574bfd62279f5cc32d9a7d50bf5be1.tar.gz
vdr-plugin-epgsearch-a9a6ba970b574bfd62279f5cc32d9a7d50bf5be1.tar.bz2
refactoring switch timers to prevent usage of pointers to events
-rw-r--r--menu_switchtimers.c35
-rw-r--r--menu_switchtimers.h5
-rw-r--r--switchtimer.c45
-rw-r--r--switchtimer.h6
-rw-r--r--switchtimer_thread.c10
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));