1
#! /bin/sh /usr/share/dpatch/dpatch-run
2
## 91_timer-delete-fix.dpath.dpatch by Tobias Grimm <tg@e-tobi.net>
4
## All lines beginning with `## DP:' are a description of the patch.
5
## DP: Fixes crashes when deleting timers (taken from upstream SVN)
8
diff -urNad vdr-plugin-live-0.1.0~/timers.cpp vdr-plugin-live-0.1.0/timers.cpp
9
--- vdr-plugin-live-0.1.0~/timers.cpp 2007-05-03 20:17:16.000000000 +0200
10
+++ vdr-plugin-live-0.1.0/timers.cpp 2007-06-21 23:24:12.000000000 +0200
13
using namespace vdrlive;
15
+static char const* const TIMER_DELETE = "DELETE";
16
+static char const* const TIMER_TOGGLE = "TOGGLE";
18
SortedTimers::SortedTimers():
22
void TimerManager::UpdateTimer( cTimer* timer, int flags, tChannelID& channel, string const& weekdays, string const& day,
23
int start, int stop, int priority, int lifetime, string const& title, string const& aux )
25
+ cMutexLock lock( this );
27
ostringstream builder;
28
builder << flags << ":" << channel << ":" << ( weekdays != "-------" ? weekdays : "" )
29
<< ( weekdays == "-------" || day.empty() ? "" : "@" ) << day << ":" << start << ":" << stop << ":"
31
throw HtmlError( error );
34
-void TimerManager::DelTimer( cTimer* timer)
35
+void TimerManager::DelTimer( cTimer* timer )
37
- cTimer* delTimer = Timers.GetTimer(timer);
38
- Timers.Del(delTimer, true);
39
- Timers.SetModified();
40
- m_timers.ReloadTimers(false);
41
+ cMutexLock lock( this );
43
+ TimerPair timerData( timer, TIMER_DELETE );
45
+ m_updateTimers.push_back( timerData );
46
+ m_updateWait.Wait( *this );
48
+ string error = GetError( timerData );
49
+ if ( !error.empty() )
50
+ throw HtmlError( error );
53
void TimerManager::ToggleTimerActive( cTimer* timer)
55
- cTimer* toggleTimer = Timers.GetTimer(timer);
56
- toggleTimer->OnOff();
57
- Timers.SetModified();
58
- m_timers.ReloadTimers(false);
60
+ cMutexLock lock( this );
62
+ TimerPair timerData( timer, TIMER_TOGGLE );
64
+ m_updateTimers.push_back( timerData );
65
+ m_updateWait.Wait( *this );
67
+ string error = GetError( timerData );
68
+ if ( !error.empty() )
69
+ throw HtmlError( error );
72
void TimerManager::DoPendingWork()
75
cMutexLock lock( this );
76
if ( m_updateTimers.size() > 0 ) {
78
- dsyslog("SV: signalling waiters");
79
- m_updateWait.Broadcast();
82
+ dsyslog("SV: signalling waiters");
83
+ m_updateWait.Broadcast();
86
void TimerManager::DoUpdateTimers()
88
for ( TimerList::iterator timer = m_updateTimers.begin(); timer != m_updateTimers.end(); ++timer ) {
89
if ( timer->first == 0 ) // new timer
90
DoInsertTimer( *timer );
91
- else if ( timer->second == "" ) // delete timer
93
+ else if ( timer->second == TIMER_DELETE ) // delete timer
94
+ DoDeleteTimer( *timer );
95
+ else if ( timer->second == TIMER_TOGGLE ) // toggle timer
96
+ DoToggleTimer( *timer );
98
DoUpdateTimer( *timer );
101
isyslog("live timer %s modified (%s)", *oldTimer->ToDescr(), oldTimer->HasFlags(tfActive) ? "active" : "inactive");
104
+void TimerManager::DoDeleteTimer( TimerPair& timerData )
106
+ if ( Timers.BeingEdited() ) {
107
+ StoreError( timerData, tr("Timers are being edited - try again later") );
111
+ cTimer* oldTimer = Timers.GetTimer( timerData.first );
112
+ if ( oldTimer == 0 ) {
113
+ StoreError( timerData, tr("Timer not defined") );
117
+ cTimer copy = *oldTimer;
118
+ if ( oldTimer->Recording() ) {
120
+ cRecordControls::Process( time( 0 ) );
122
+ Timers.Del( oldTimer );
123
+ Timers.SetModified();
124
+ isyslog("live timer %s deleted", *copy.ToDescr());
127
+void TimerManager::DoToggleTimer( TimerPair& timerData )
129
+ if ( Timers.BeingEdited() ) {
130
+ StoreError( timerData, tr("Timers are being edited - try again later") );
134
+ cTimer* toggleTimer = Timers.GetTimer( timerData.first );
135
+ if ( toggleTimer == 0 ) {
136
+ StoreError( timerData, tr("Timer not defined") );
140
+ toggleTimer->OnOff();
141
+ Timers.SetModified();
142
+ isyslog("live timer %s toggled %s", *toggleTimer->ToDescr(), toggleTimer->HasFlags(tfActive) ? "on" : "off");
145
void TimerManager::StoreError( TimerPair const& timerData, std::string const& error )
147
m_failedUpdates.push_back( ErrorPair( timerData, error ) );
148
diff -urNad vdr-plugin-live-0.1.0~/timers.h vdr-plugin-live-0.1.0/timers.h
149
--- vdr-plugin-live-0.1.0~/timers.h 2007-05-03 20:17:16.000000000 +0200
150
+++ vdr-plugin-live-0.1.0/timers.h 2007-06-21 23:24:12.000000000 +0200
154
#include <vdr/channels.h>
155
+#include <vdr/menu.h>
156
#include <vdr/timers.h>
157
#include <vdr/thread.h>
160
void DoUpdateTimers();
161
void DoInsertTimer( TimerPair& timerData );
162
void DoUpdateTimer( TimerPair& timerData );
163
+ void DoDeleteTimer( TimerPair& timerData );
164
+ void DoToggleTimer( TimerPair& timerData );
166
void StoreError( TimerPair const& timerData, std::string const& error );
167
std::string GetError( TimerPair const& timerData );