summaryrefslogtreecommitdiff
path: root/library/alarmserver.cpp
Unidiff
Diffstat (limited to 'library/alarmserver.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/alarmserver.cpp11
1 files changed, 1 insertions, 10 deletions
diff --git a/library/alarmserver.cpp b/library/alarmserver.cpp
index 7e6e515..5e4dd18 100644
--- a/library/alarmserver.cpp
+++ b/library/alarmserver.cpp
@@ -1,401 +1,392 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of the Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21#include <qdir.h> 21#include <qdir.h>
22#include <qfile.h> 22#include <qfile.h>
23#include <qmessagebox.h> 23#include <qmessagebox.h>
24#include <qtextstream.h> 24#include <qtextstream.h>
25 25
26 26
27#include <qpe/qpeapplication.h> 27#include <qpe/qpeapplication.h>
28#include "global.h" 28#include "global.h"
29#include "resource.h" 29#include "resource.h"
30 30
31#include <qpe/qcopenvelope_qws.h> 31#include <qpe/qcopenvelope_qws.h>
32#include "alarmserver.h" 32#include "alarmserver.h"
33#include <qpe/timeconversion.h> 33#include <qpe/timeconversion.h>
34 34
35#include <sys/types.h> 35#include <sys/types.h>
36#include <sys/stat.h> 36#include <sys/stat.h>
37 37
38#include <stdlib.h> 38#include <stdlib.h>
39#include <unistd.h> 39#include <unistd.h>
40 40
41struct timerEventItem { 41struct timerEventItem {
42 time_t UTCtime; 42 time_t UTCtime;
43 QCString channel, message; 43 QCString channel, message;
44 int data; 44 int data;
45 bool operator==( const timerEventItem &right ) const 45 bool operator==( const timerEventItem &right ) const
46 { 46 {
47 return ( UTCtime == right.UTCtime 47 return ( UTCtime == right.UTCtime
48 && channel == right.channel 48 && channel == right.channel
49 && message == right.message 49 && message == right.message
50 && data == right.data ); 50 && data == right.data );
51 } 51 }
52}; 52};
53 53
54class TimerReceiverObject : public QObject 54class TimerReceiverObject : public QObject
55{ 55{
56public: 56public:
57 TimerReceiverObject() { } 57 TimerReceiverObject() { }
58 ~TimerReceiverObject() { } 58 ~TimerReceiverObject() { }
59 void resetTimer(); 59 void resetTimer();
60 void setTimerEventItem(); 60 void setTimerEventItem();
61 void deleteTimer(); 61 void deleteTimer();
62protected: 62protected:
63 void timerEvent( QTimerEvent *te ); 63 void timerEvent( QTimerEvent *te );
64private: 64private:
65 QString atfilename; 65 QString atfilename;
66}; 66};
67 67
68TimerReceiverObject *timerEventReceiver = NULL; 68TimerReceiverObject *timerEventReceiver = NULL;
69QList<timerEventItem> timerEventList; 69QList<timerEventItem> timerEventList;
70timerEventItem *nearestTimerEvent = NULL; 70timerEventItem *nearestTimerEvent = NULL;
71 71
72 72
73// set the timer to go off on the next event in the list 73// set the timer to go off on the next event in the list
74void setNearestTimerEvent() 74void setNearestTimerEvent()
75{ 75{
76 nearestTimerEvent = NULL; 76 nearestTimerEvent = NULL;
77 QListIterator<timerEventItem> it( timerEventList ); 77 QListIterator<timerEventItem> it( timerEventList );
78 if ( *it ) 78 if ( *it )
79 nearestTimerEvent = *it; 79 nearestTimerEvent = *it;
80 for ( ; *it; ++it ) 80 for ( ; *it; ++it )
81 if ( (*it)->UTCtime < nearestTimerEvent->UTCtime ) 81 if ( (*it)->UTCtime < nearestTimerEvent->UTCtime )
82 nearestTimerEvent = *it; 82 nearestTimerEvent = *it;
83 if (nearestTimerEvent) 83 if (nearestTimerEvent)
84 timerEventReceiver->resetTimer(); 84 timerEventReceiver->resetTimer();
85 else 85 else
86 timerEventReceiver->deleteTimer(); 86 timerEventReceiver->deleteTimer();
87} 87}
88 88
89 89
90//store current state to file 90//store current state to file
91//Simple implementation. Should run on a timer. 91//Simple implementation. Should run on a timer.
92 92
93static void saveState() 93static void saveState()
94{ 94{
95 QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" ); 95 QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" );
96 if ( timerEventList.isEmpty() ) { 96 if ( timerEventList.isEmpty() ) {
97 unlink( savefilename ); 97 unlink( savefilename );
98 return; 98 return;
99 } 99 }
100 100
101 QFile savefile(savefilename+".new"); 101 QFile savefile(savefilename+".new");
102 if ( savefile.open(IO_WriteOnly) ) { 102 if ( savefile.open(IO_WriteOnly) ) {
103 QDataStream ds( &savefile ); 103 QDataStream ds( &savefile );
104 104
105 //save 105 //save
106 106
107 QListIterator<timerEventItem> it( timerEventList ); 107 QListIterator<timerEventItem> it( timerEventList );
108 for ( ; *it; ++it ) { 108 for ( ; *it; ++it ) {
109 ds << it.current()->UTCtime; 109 ds << it.current()->UTCtime;
110 ds << it.current()->channel; 110 ds << it.current()->channel;
111 ds << it.current()->message; 111 ds << it.current()->message;
112 ds << it.current()->data; 112 ds << it.current()->data;
113 } 113 }
114 114
115 115
116 savefile.close(); 116 savefile.close();
117 unlink( savefilename ); 117 unlink( savefilename );
118 QDir d; d.rename(savefilename+".new",savefilename); 118 QDir d; d.rename(savefilename+".new",savefilename);
119 119
120 } 120 }
121} 121}
122 122
123/*! 123/*!
124 Sets up the alarm server. Restoring to previous state (session management). 124 Sets up the alarm server. Restoring to previous state (session management).
125 */ 125 */
126void AlarmServer::initialize() 126void AlarmServer::initialize()
127{ 127{
128 //read autosave file and put events in timerEventList 128 //read autosave file and put events in timerEventList
129 129
130 QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" ); 130 QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" );
131 131
132 QFile savefile(savefilename); 132 QFile savefile(savefilename);
133 if ( savefile.open(IO_ReadOnly) ) { 133 if ( savefile.open(IO_ReadOnly) ) {
134 QDataStream ds( &savefile ); 134 QDataStream ds( &savefile );
135 while ( !ds.atEnd() ) { 135 while ( !ds.atEnd() ) {
136 timerEventItem *newTimerEventItem = new timerEventItem; 136 timerEventItem *newTimerEventItem = new timerEventItem;
137 ds >> newTimerEventItem->UTCtime; 137 ds >> newTimerEventItem->UTCtime;
138 ds >> newTimerEventItem->channel; 138 ds >> newTimerEventItem->channel;
139 ds >> newTimerEventItem->message; 139 ds >> newTimerEventItem->message;
140 ds >> newTimerEventItem->data; 140 ds >> newTimerEventItem->data;
141 timerEventList.append( newTimerEventItem ); 141 timerEventList.append( newTimerEventItem );
142 } 142 }
143 savefile.close(); 143 savefile.close();
144 if (!timerEventReceiver) 144 if (!timerEventReceiver)
145 timerEventReceiver = new TimerReceiverObject; 145 timerEventReceiver = new TimerReceiverObject;
146 setNearestTimerEvent(); 146 setNearestTimerEvent();
147 } 147 }
148} 148}
149 149
150 150
151 151
152 152
153static const char* atdir = "/var/spool/at/"; 153static const char* atdir = "/var/spool/at/";
154 154
155static bool triggerAtd( bool writeHWClock = FALSE ) 155static bool triggerAtd( bool writeHWClock = FALSE )
156{ 156{
157 QFile trigger(QString(atdir) + "trigger"); 157 QFile trigger(QString(atdir) + "trigger");
158 if ( trigger.open(IO_WriteOnly|IO_Raw) ) { 158 if ( trigger.open(IO_WriteOnly|IO_Raw) ) {
159 159 if ( trigger.writeBlock("\n",2) != 2 ) {
160 const char* data =
161#ifdef QT_QWS_SHARP
162 //custom atd only writes HW Clock if we write a 'W'
163 ( writeHWClock ) ? "W\n" :
164#endif
165 data = "\n";
166 int len = strlen(data);
167 int total_written = trigger.writeBlock(data,len);
168 if ( total_written != len ) {
169 QMessageBox::critical( 0, QObject::tr( "Out of Space" ), 160 QMessageBox::critical( 0, QObject::tr( "Out of Space" ),
170 QObject::tr( "Unable to schedule alarm.\nFree some memory and try again." ) ); 161 QObject::tr( "Unable to schedule alarm.\nFree some memory and try again." ) );
171 trigger.close(); 162 trigger.close();
172 QFile::remove( trigger.name() ); 163 QFile::remove( trigger.name() );
173 return FALSE; 164 return FALSE;
174 } 165 }
175 return TRUE; 166 return TRUE;
176 } 167 }
177 return FALSE; 168 return FALSE;
178} 169}
179 170
180void TimerReceiverObject::deleteTimer() 171void TimerReceiverObject::deleteTimer()
181{ 172{
182 if ( !atfilename.isEmpty() ) { 173 if ( !atfilename.isEmpty() ) {
183 unlink( atfilename ); 174 unlink( atfilename );
184 atfilename = QString::null; 175 atfilename = QString::null;
185 triggerAtd( FALSE ); 176 triggerAtd( FALSE );
186 } 177 }
187} 178}
188 179
189void TimerReceiverObject::resetTimer() 180void TimerReceiverObject::resetTimer()
190{ 181{
191 const int maxsecs = 2147000; 182 const int maxsecs = 2147000;
192 int total_written; 183 int total_written;
193 QDateTime nearest = TimeConversion::fromUTC(nearestTimerEvent->UTCtime); 184 QDateTime nearest = TimeConversion::fromUTC(nearestTimerEvent->UTCtime);
194 QDateTime now = QDateTime::currentDateTime(); 185 QDateTime now = QDateTime::currentDateTime();
195 if ( nearest < now ) 186 if ( nearest < now )
196 nearest = now; 187 nearest = now;
197 int secs = TimeConversion::secsTo( now, nearest ); 188 int secs = TimeConversion::secsTo( now, nearest );
198 if ( secs > maxsecs ) { 189 if ( secs > maxsecs ) {
199 // too far for millisecond timing 190 // too far for millisecond timing
200 secs = maxsecs; 191 secs = maxsecs;
201 } 192 }
202 193
203 // System timer (needed so that we wake from deep sleep), 194 // System timer (needed so that we wake from deep sleep),
204 // from the Epoch in seconds. 195 // from the Epoch in seconds.
205 // 196 //
206 int at_secs = TimeConversion::toUTC(nearest); 197 int at_secs = TimeConversion::toUTC(nearest);
207 // qDebug("reset timer to %d seconds from Epoch",at_secs); 198 // qDebug("reset timer to %d seconds from Epoch",at_secs);
208 QString fn = atdir + QString::number(at_secs) + "." 199 QString fn = atdir + QString::number(at_secs) + "."
209 + QString::number(getpid()); 200 + QString::number(getpid());
210 if ( fn != atfilename ) { 201 if ( fn != atfilename ) {
211 QFile atfile(fn+".new"); 202 QFile atfile(fn+".new");
212 if ( atfile.open(IO_WriteOnly|IO_Raw) ) { 203 if ( atfile.open(IO_WriteOnly|IO_Raw) ) {
213 // just wake up and delete the at file 204 // just wake up and delete the at file
214 QString cmd = "#!/bin/sh\nrm " + fn; 205 QString cmd = "#!/bin/sh\nrm " + fn;
215 total_written = atfile.writeBlock(cmd.latin1(),cmd.length()); 206 total_written = atfile.writeBlock(cmd.latin1(),cmd.length());
216 if ( total_written != int(cmd.length()) ) { 207 if ( total_written != int(cmd.length()) ) {
217 QMessageBox::critical( 0, tr("Out of Space"), 208 QMessageBox::critical( 0, tr("Out of Space"),
218 tr("Unable to schedule alarm.\n" 209 tr("Unable to schedule alarm.\n"
219 "Please free up space and try again") ); 210 "Please free up space and try again") );
220 atfile.close(); 211 atfile.close();
221 QFile::remove( atfile.name() ); 212 QFile::remove( atfile.name() );
222 return; 213 return;
223 } 214 }
224 atfile.close(); 215 atfile.close();
225 unlink( atfilename ); 216 unlink( atfilename );
226 QDir d; d.rename(fn+".new",fn); 217 QDir d; d.rename(fn+".new",fn);
227 chmod(fn.latin1(),0755); 218 chmod(fn.latin1(),0755);
228 atfilename = fn; 219 atfilename = fn;
229 triggerAtd( FALSE ); 220 triggerAtd( FALSE );
230 } else { 221 } else {
231 qWarning("Cannot open atd file %s",fn.latin1()); 222 qWarning("Cannot open atd file %s",fn.latin1());
232 } 223 }
233 } 224 }
234 // Qt timers (does the actual alarm) 225 // Qt timers (does the actual alarm)
235 // from now in milliseconds 226 // from now in milliseconds
236 // 227 //
237 qDebug("AlarmServer waiting %d seconds",secs); 228 qDebug("AlarmServer waiting %d seconds",secs);
238 startTimer( 1000 * secs + 500 ); 229 startTimer( 1000 * secs + 500 );
239} 230}
240 231
241void TimerReceiverObject::timerEvent( QTimerEvent * ) 232void TimerReceiverObject::timerEvent( QTimerEvent * )
242{ 233{
243 bool needSave = FALSE; 234 bool needSave = FALSE;
244 killTimers(); 235 killTimers();
245 if (nearestTimerEvent) { 236 if (nearestTimerEvent) {
246 if ( nearestTimerEvent->UTCtime 237 if ( nearestTimerEvent->UTCtime
247 <= TimeConversion::toUTC(QDateTime::currentDateTime()) ) { 238 <= TimeConversion::toUTC(QDateTime::currentDateTime()) ) {
248#ifndef QT_NO_COP 239#ifndef QT_NO_COP
249 QCopEnvelope e( nearestTimerEvent->channel, 240 QCopEnvelope e( nearestTimerEvent->channel,
250 nearestTimerEvent->message ); 241 nearestTimerEvent->message );
251 e << TimeConversion::fromUTC( nearestTimerEvent->UTCtime ) 242 e << TimeConversion::fromUTC( nearestTimerEvent->UTCtime )
252 << nearestTimerEvent->data; 243 << nearestTimerEvent->data;
253#endif 244#endif
254 timerEventList.remove( nearestTimerEvent ); 245 timerEventList.remove( nearestTimerEvent );
255 needSave = TRUE; 246 needSave = TRUE;
256 } 247 }
257 setNearestTimerEvent(); 248 setNearestTimerEvent();
258 } else { 249 } else {
259 resetTimer(); 250 resetTimer();
260 } 251 }
261 if ( needSave ) 252 if ( needSave )
262 saveState(); 253 saveState();
263} 254}
264 255
265/*! 256/*!
266 \class AlarmServer alarmserver.h 257 \class AlarmServer alarmserver.h
267 \brief The AlarmServer class allows alarms to be scheduled and unscheduled. 258 \brief The AlarmServer class allows alarms to be scheduled and unscheduled.
268 259
269 Applications can schedule alarms with addAlarm() and can 260 Applications can schedule alarms with addAlarm() and can
270 unschedule alarms with deleteAlarm(). When the time for an alarm 261 unschedule alarms with deleteAlarm(). When the time for an alarm
271 to go off is reached the specified \link qcop.html QCop\endlink 262 to go off is reached the specified \link qcop.html QCop\endlink
272 message is sent on the specified channel (optionally with 263 message is sent on the specified channel (optionally with
273 additional data). 264 additional data).
274 265
275 Scheduling an alarm using this class is important (rather just using 266 Scheduling an alarm using this class is important (rather just using
276 a QTimer) since the machine may be asleep and needs to get woken up using 267 a QTimer) since the machine may be asleep and needs to get woken up using
277 the Linux kernel which implements this at the kernel level to minimize 268 the Linux kernel which implements this at the kernel level to minimize
278 battery usage while asleep. 269 battery usage while asleep.
279 270
280 \ingroup qtopiaemb 271 \ingroup qtopiaemb
281 \sa QCopEnvelope 272 \sa QCopEnvelope
282*/ 273*/
283 274
284/*! 275/*!
285 Schedules an alarm to go off at (or soon after) time \a when. When 276 Schedules an alarm to go off at (or soon after) time \a when. When
286 the alarm goes off, the \link qcop.html QCop\endlink \a message will 277 the alarm goes off, the \link qcop.html QCop\endlink \a message will
287 be sent to \a channel, with \a data as a parameter. 278 be sent to \a channel, with \a data as a parameter.
288 279
289 If this function is called with exactly the same data as a previous 280 If this function is called with exactly the same data as a previous
290 call the subsequent call is ignored, so there is only ever one alarm 281 call the subsequent call is ignored, so there is only ever one alarm
291 with a given set of parameters. 282 with a given set of parameters.
292 283
293 \sa deleteAlarm() 284 \sa deleteAlarm()
294*/ 285*/
295void AlarmServer::addAlarm ( QDateTime when, const QCString& channel, 286void AlarmServer::addAlarm ( QDateTime when, const QCString& channel,
296 const QCString& message, int data) 287 const QCString& message, int data)
297{ 288{
298 if ( qApp->type() == QApplication::GuiServer ) { 289 if ( qApp->type() == QApplication::GuiServer ) {
299 bool needSave = FALSE; 290 bool needSave = FALSE;
300 // Here we are the server so either it has been directly called from 291 // Here we are the server so either it has been directly called from
301 // within the server or it has been sent to us from a client via QCop 292 // within the server or it has been sent to us from a client via QCop
302 if (!timerEventReceiver) 293 if (!timerEventReceiver)
303 timerEventReceiver = new TimerReceiverObject; 294 timerEventReceiver = new TimerReceiverObject;
304 295
305 timerEventItem *newTimerEventItem = new timerEventItem; 296 timerEventItem *newTimerEventItem = new timerEventItem;
306 newTimerEventItem->UTCtime = TimeConversion::toUTC( when ); 297 newTimerEventItem->UTCtime = TimeConversion::toUTC( when );
307 newTimerEventItem->channel = channel; 298 newTimerEventItem->channel = channel;
308 newTimerEventItem->message = message; 299 newTimerEventItem->message = message;
309 newTimerEventItem->data = data; 300 newTimerEventItem->data = data;
310 // explore the case of already having the event in here... 301 // explore the case of already having the event in here...
311 QListIterator<timerEventItem> it( timerEventList ); 302 QListIterator<timerEventItem> it( timerEventList );
312 for ( ; *it; ++it ) 303 for ( ; *it; ++it )
313 if ( *(*it) == *newTimerEventItem ) 304 if ( *(*it) == *newTimerEventItem )
314 return; 305 return;
315 // if we made it here, it is okay to add the item... 306 // if we made it here, it is okay to add the item...
316 timerEventList.append( newTimerEventItem ); 307 timerEventList.append( newTimerEventItem );
317 needSave = TRUE; 308 needSave = TRUE;
318 // quicker than using setNearestTimerEvent() 309 // quicker than using setNearestTimerEvent()
319 if ( nearestTimerEvent ) { 310 if ( nearestTimerEvent ) {
320 if (newTimerEventItem->UTCtime < nearestTimerEvent->UTCtime) { 311 if (newTimerEventItem->UTCtime < nearestTimerEvent->UTCtime) {
321 nearestTimerEvent = newTimerEventItem; 312 nearestTimerEvent = newTimerEventItem;
322 timerEventReceiver->killTimers(); 313 timerEventReceiver->killTimers();
323 timerEventReceiver->resetTimer(); 314 timerEventReceiver->resetTimer();
324 } 315 }
325 } else { 316 } else {
326 nearestTimerEvent = newTimerEventItem; 317 nearestTimerEvent = newTimerEventItem;
327 timerEventReceiver->resetTimer(); 318 timerEventReceiver->resetTimer();
328 } 319 }
329 if ( needSave ) 320 if ( needSave )
330 saveState(); 321 saveState();
331 } else { 322 } else {
332#ifndef QT_NO_COP 323#ifndef QT_NO_COP
333 QCopEnvelope e( "QPE/System", "addAlarm(QDateTime,QCString,QCString,int)" ); 324 QCopEnvelope e( "QPE/System", "addAlarm(QDateTime,QCString,QCString,int)" );
334 e << when << channel << message << data; 325 e << when << channel << message << data;
335#endif 326#endif
336 } 327 }
337} 328}
338 329
339/*! 330/*!
340 Deletes previously scheduled alarms which match \a when, \a channel, 331 Deletes previously scheduled alarms which match \a when, \a channel,
341 \a message, and \a data. 332 \a message, and \a data.
342 333
343 Passing null values for \a when, \a channel, or for the \link 334 Passing null values for \a when, \a channel, or for the \link
344 qcop.html QCop\endlink \a message, acts as a wildcard meaning "any". 335 qcop.html QCop\endlink \a message, acts as a wildcard meaning "any".
345 Similarly, passing -1 for \a data indicates "any". 336 Similarly, passing -1 for \a data indicates "any".
346 337
347 If there is no matching alarm, nothing happens. 338 If there is no matching alarm, nothing happens.
348 339
349 \sa addAlarm() 340 \sa addAlarm()
350 341
351*/ 342*/
352void AlarmServer::deleteAlarm (QDateTime when, const QCString& channel, const QCString& message, int data) 343void AlarmServer::deleteAlarm (QDateTime when, const QCString& channel, const QCString& message, int data)
353{ 344{
354 if ( qApp->type() == QApplication::GuiServer) { 345 if ( qApp->type() == QApplication::GuiServer) {
355 bool needSave = FALSE; 346 bool needSave = FALSE;
356 if ( timerEventReceiver != NULL ) { 347 if ( timerEventReceiver != NULL ) {
357 timerEventReceiver->killTimers(); 348 timerEventReceiver->killTimers();
358 349
359 // iterate over the list of events 350 // iterate over the list of events
360 QListIterator<timerEventItem> it( timerEventList ); 351 QListIterator<timerEventItem> it( timerEventList );
361 time_t deleteTime = TimeConversion::toUTC( when ); 352 time_t deleteTime = TimeConversion::toUTC( when );
362 for ( ; *it; ++it ) { 353 for ( ; *it; ++it ) {
363 // if its a match, delete it 354 // if its a match, delete it
364 if ( ( (*it)->UTCtime == deleteTime || when.isNull() ) 355 if ( ( (*it)->UTCtime == deleteTime || when.isNull() )
365 && ( channel.isNull() || (*it)->channel == channel ) 356 && ( channel.isNull() || (*it)->channel == channel )
366 && ( message.isNull() || (*it)->message == message ) 357 && ( message.isNull() || (*it)->message == message )
367 && ( data==-1 || (*it)->data == data ) ) 358 && ( data==-1 || (*it)->data == data ) )
368 { 359 {
369 // if it's first, then we need to update the timer 360 // if it's first, then we need to update the timer
370 if ( (*it) == nearestTimerEvent ) { 361 if ( (*it) == nearestTimerEvent ) {
371 timerEventList.remove(*it); 362 timerEventList.remove(*it);
372 setNearestTimerEvent(); 363 setNearestTimerEvent();
373 } else { 364 } else {
374 timerEventList.remove(*it); 365 timerEventList.remove(*it);
375 } 366 }
376 needSave = TRUE; 367 needSave = TRUE;
377 } 368 }
378 } 369 }
379 if ( nearestTimerEvent ) 370 if ( nearestTimerEvent )
380 timerEventReceiver->resetTimer(); 371 timerEventReceiver->resetTimer();
381 } 372 }
382 if ( needSave ) 373 if ( needSave )
383 saveState(); 374 saveState();
384 } else { 375 } else {
385#ifndef QT_NO_COP 376#ifndef QT_NO_COP
386 QCopEnvelope e( "QPE/System", "deleteAlarm(QDateTime,QCString,QCString,int)" ); 377 QCopEnvelope e( "QPE/System", "deleteAlarm(QDateTime,QCString,QCString,int)" );
387 e << when << channel << message << data; 378 e << when << channel << message << data;
388#endif 379#endif
389 } 380 }
390} 381}
391 382
392/*! 383/*!
393 Writes the system clock to the hardware clock. 384 Writes the system clock to the hardware clock.
394*/ 385*/
395void Global::writeHWClock() 386void Global::writeHWClock()
396{ 387{
397 if ( !triggerAtd( TRUE ) ) { 388 if ( !triggerAtd( TRUE ) ) {
398 // atd not running? set it ourselves 389 // atd not running? set it ourselves
399 system("/sbin/hwclock --systohc"); // ##### UTC? 390 system("/sbin/hwclock --systohc"); // ##### UTC?
400 } 391 }
401} 392}