diff --git a/CONTRIBUTORS b/CONTRIBUTORS index e968c719..5dc27101 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -712,3 +712,6 @@ Karim Afifi Jon Burgess for pointing out a problem with NPTL ("Native Posix Thread Library") + +Thomas Schmidt + for reporting a crash when cancelling a newly created timer diff --git a/HISTORY b/HISTORY index 5cab3edf..589d9838 100644 --- a/HISTORY +++ b/HISTORY @@ -2241,3 +2241,5 @@ Video Disk Recorder Revision History Gruber for reporting this one). - Fixed editing channels ('timers.conf' was not written after a channel has been modified, which could result in errors upon the next start of VDR). +- Fixed a crash when cancelling a newly created timer (thanks to Thomas Schmidt + for reporting this one). diff --git a/menu.c b/menu.c index 48ef0d1f..1e4a88f6 100644 --- a/menu.c +++ b/menu.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 1.254 2003/06/06 12:56:05 kls Exp $ + * $Id: menu.c 1.255 2003/06/06 14:59:47 kls Exp $ */ #include "menu.h" @@ -835,21 +835,21 @@ private: cTimer *timer; cTimer data; int channel; - bool deleteIfCancelled; + bool addIfConfirmed; cMenuEditDateItem *firstday; void SetFirstDayItem(void); public: - cMenuEditTimer(int Index, bool New = false); + cMenuEditTimer(cTimer *Timer, bool New = false); virtual ~cMenuEditTimer(); virtual eOSState ProcessKey(eKeys Key); }; -cMenuEditTimer::cMenuEditTimer(int Index, bool New) +cMenuEditTimer::cMenuEditTimer(cTimer *Timer, bool New) :cOsdMenu(tr("Edit timer"), 12) { firstday = NULL; - timer = Timers.Get(Index); - deleteIfCancelled = New; + timer = Timer; + addIfConfirmed = New; if (timer) { data = *timer; if (New) @@ -870,12 +870,8 @@ cMenuEditTimer::cMenuEditTimer(int Index, bool New) cMenuEditTimer::~cMenuEditTimer() { - if (timer && deleteIfCancelled) { - int Index = timer->Index(); - Timers.Del(timer); - Timers.Save(); - isyslog("timer %d deleted", Index + 1); - } + if (timer && addIfConfirmed) + delete timer; // apparently it wasn't confirmed Timers.DecBeingEdited(); } @@ -909,14 +905,18 @@ eOSState cMenuEditTimer::ProcessKey(eKeys Key) } if (!*data.file) strcpy(data.file, data.Channel()->Name()); - if (timer && memcmp(timer, &data, sizeof(data)) != 0) { - *timer = data; - if (timer->active) - timer->active = 1; // allows external programs to mark active timers with values > 1 and recognize if the user has modified them + if (timer) { + if (memcmp(timer, &data, sizeof(data)) != 0) { + *timer = data; + if (timer->active) + timer->active = 1; // allows external programs to mark active timers with values > 1 and recognize if the user has modified them + } + if (addIfConfirmed) + Timers.Add(timer); Timers.Save(); - isyslog("timer %d modified (%s)", timer->Index() + 1, timer->active ? "active" : "inactive"); + isyslog("timer %d %s (%s)", timer->Index() + 1, addIfConfirmed ? "added" : "modified", timer->active ? "active" : "inactive"); + addIfConfirmed = false; } - deleteIfCancelled = false; } return osBack; case kRed: @@ -1034,19 +1034,14 @@ eOSState cMenuTimers::Edit(void) if (HasSubMenu() || Count() == 0) return osContinue; isyslog("editing timer %d", CurrentTimer()->Index() + 1); - return AddSubMenu(new cMenuEditTimer(CurrentTimer()->Index())); + return AddSubMenu(new cMenuEditTimer(CurrentTimer())); } eOSState cMenuTimers::New(void) { if (HasSubMenu()) return osContinue; - cTimer *timer = new cTimer; - Timers.Add(timer); - Add(new cMenuTimerItem(timer), true); - Timers.Save(); - isyslog("timer %d added", timer->Index() + 1); - return AddSubMenu(new cMenuEditTimer(timer->Index(), true)); + return AddSubMenu(new cMenuEditTimer(new cTimer, true)); } eOSState cMenuTimers::Delete(void) @@ -1095,8 +1090,7 @@ eOSState cMenuTimers::Summary(void) eOSState cMenuTimers::ProcessKey(eKeys Key) { - cTimer *ti = HasSubMenu() ? CurrentTimer() : NULL; - int TimerNumber = ti ? ti->Index() : -1; + int TimerNumber = HasSubMenu() ? Count() : -1; eOSState state = cOsdMenu::ProcessKey(Key); if (state == osUnknown) { @@ -1113,9 +1107,9 @@ eOSState cMenuTimers::ProcessKey(eKeys Key) default: break; } } - if (TimerNumber >= 0 && !HasSubMenu() && !Timers.Get(TimerNumber)) { - // a newly created timer wasn't confirmed with Ok - cOsdMenu::Del(Current()); + if (TimerNumber >= 0 && !HasSubMenu() && Timers.Get(TimerNumber)) { + // a newly created timer was confirmed with Ok + Add(new cMenuTimerItem(Timers.Get(TimerNumber)), true); Display(); } return state; @@ -1275,16 +1269,11 @@ eOSState cMenuWhatsOn::Record(void) if (item) { cTimer *timer = new cTimer(item->eventInfo); cTimer *t = Timers.GetTimer(timer); - if (!t) { - Timers.Add(timer); - Timers.Save(); - isyslog("timer %d added", timer->Index() + 1); - } - else { + if (t) { delete timer; timer = t; } - return AddSubMenu(new cMenuEditTimer(timer->Index(), !t)); + return AddSubMenu(new cMenuEditTimer(timer, !t)); } return osContinue; } @@ -1409,16 +1398,11 @@ eOSState cMenuSchedule::Record(void) if (item) { cTimer *timer = new cTimer(item->eventInfo); cTimer *t = Timers.GetTimer(timer); - if (!t) { - Timers.Add(timer); - Timers.Save(); - isyslog("timer %d added", timer->Index() + 1); - } - else { + if (t) { delete timer; timer = t; } - return AddSubMenu(new cMenuEditTimer(timer->Index(), !t)); + return AddSubMenu(new cMenuEditTimer(timer, !t)); } return osContinue; }