summaryrefslogtreecommitdiff
path: root/library/alarmserver.cpp
Unidiff
Diffstat (limited to 'library/alarmserver.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/alarmserver.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/library/alarmserver.cpp b/library/alarmserver.cpp
index 02bca3d..7e6e515 100644
--- a/library/alarmserver.cpp
+++ b/library/alarmserver.cpp
@@ -1,401 +1,401 @@
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
160 const char* data = 160 const char* data =
161#ifdef QT_QWS_CUSTOM 161#ifdef QT_QWS_SHARP
162 //custom atd only writes HW Clock if we write a 'W' 162 //custom atd only writes HW Clock if we write a 'W'
163 ( writeHWClock ) ? "W\n" : 163 ( writeHWClock ) ? "W\n" :
164#endif 164#endif
165 data = "\n"; 165 data = "\n";
166 int len = strlen(data); 166 int len = strlen(data);
167 int total_written = trigger.writeBlock(data,len); 167 int total_written = trigger.writeBlock(data,len);
168 if ( total_written != len ) { 168 if ( total_written != len ) {
169 QMessageBox::critical( 0, QObject::tr( "Out of Space" ), 169 QMessageBox::critical( 0, QObject::tr( "Out of Space" ),
170 QObject::tr( "Unable to schedule alarm.\nFree some memory and try again." ) ); 170 QObject::tr( "Unable to schedule alarm.\nFree some memory and try again." ) );
171 trigger.close(); 171 trigger.close();
172 QFile::remove( trigger.name() ); 172 QFile::remove( trigger.name() );
173 return FALSE; 173 return FALSE;
174 } 174 }
175 return TRUE; 175 return TRUE;
176 } 176 }
177 return FALSE; 177 return FALSE;
178} 178}
179 179
180void TimerReceiverObject::deleteTimer() 180void TimerReceiverObject::deleteTimer()
181{ 181{
182 if ( !atfilename.isEmpty() ) { 182 if ( !atfilename.isEmpty() ) {
183 unlink( atfilename ); 183 unlink( atfilename );
184 atfilename = QString::null; 184 atfilename = QString::null;
185 triggerAtd( FALSE ); 185 triggerAtd( FALSE );
186 } 186 }
187} 187}
188 188
189void TimerReceiverObject::resetTimer() 189void TimerReceiverObject::resetTimer()
190{ 190{
191 const int maxsecs = 2147000; 191 const int maxsecs = 2147000;
192 int total_written; 192 int total_written;
193 QDateTime nearest = TimeConversion::fromUTC(nearestTimerEvent->UTCtime); 193 QDateTime nearest = TimeConversion::fromUTC(nearestTimerEvent->UTCtime);
194 QDateTime now = QDateTime::currentDateTime(); 194 QDateTime now = QDateTime::currentDateTime();
195 if ( nearest < now ) 195 if ( nearest < now )
196 nearest = now; 196 nearest = now;
197 int secs = TimeConversion::secsTo( now, nearest ); 197 int secs = TimeConversion::secsTo( now, nearest );
198 if ( secs > maxsecs ) { 198 if ( secs > maxsecs ) {
199 // too far for millisecond timing 199 // too far for millisecond timing
200 secs = maxsecs; 200 secs = maxsecs;
201 } 201 }
202 202
203 // System timer (needed so that we wake from deep sleep), 203 // System timer (needed so that we wake from deep sleep),
204 // from the Epoch in seconds. 204 // from the Epoch in seconds.
205 // 205 //
206 int at_secs = TimeConversion::toUTC(nearest); 206 int at_secs = TimeConversion::toUTC(nearest);
207 // qDebug("reset timer to %d seconds from Epoch",at_secs); 207 // qDebug("reset timer to %d seconds from Epoch",at_secs);
208 QString fn = atdir + QString::number(at_secs) + "." 208 QString fn = atdir + QString::number(at_secs) + "."
209 + QString::number(getpid()); 209 + QString::number(getpid());
210 if ( fn != atfilename ) { 210 if ( fn != atfilename ) {
211 QFile atfile(fn+".new"); 211 QFile atfile(fn+".new");
212 if ( atfile.open(IO_WriteOnly|IO_Raw) ) { 212 if ( atfile.open(IO_WriteOnly|IO_Raw) ) {
213 // just wake up and delete the at file 213 // just wake up and delete the at file
214 QString cmd = "#!/bin/sh\nrm " + fn; 214 QString cmd = "#!/bin/sh\nrm " + fn;
215 total_written = atfile.writeBlock(cmd.latin1(),cmd.length()); 215 total_written = atfile.writeBlock(cmd.latin1(),cmd.length());
216 if ( total_written != int(cmd.length()) ) { 216 if ( total_written != int(cmd.length()) ) {
217 QMessageBox::critical( 0, tr("Out of Space"), 217 QMessageBox::critical( 0, tr("Out of Space"),
218 tr("Unable to schedule alarm.\n" 218 tr("Unable to schedule alarm.\n"
219 "Please free up space and try again") ); 219 "Please free up space and try again") );
220 atfile.close(); 220 atfile.close();
221 QFile::remove( atfile.name() ); 221 QFile::remove( atfile.name() );
222 return; 222 return;
223 } 223 }
224 atfile.close(); 224 atfile.close();
225 unlink( atfilename ); 225 unlink( atfilename );
226 QDir d; d.rename(fn+".new",fn); 226 QDir d; d.rename(fn+".new",fn);
227 chmod(fn.latin1(),0755); 227 chmod(fn.latin1(),0755);
228 atfilename = fn; 228 atfilename = fn;
229 triggerAtd( FALSE ); 229 triggerAtd( FALSE );
230 } else { 230 } else {
231 qWarning("Cannot open atd file %s",fn.latin1()); 231 qWarning("Cannot open atd file %s",fn.latin1());
232 } 232 }
233 } 233 }
234 // Qt timers (does the actual alarm) 234 // Qt timers (does the actual alarm)
235 // from now in milliseconds 235 // from now in milliseconds
236 // 236 //
237 qDebug("AlarmServer waiting %d seconds",secs); 237 qDebug("AlarmServer waiting %d seconds",secs);
238 startTimer( 1000 * secs + 500 ); 238 startTimer( 1000 * secs + 500 );
239} 239}
240 240
241void TimerReceiverObject::timerEvent( QTimerEvent * ) 241void TimerReceiverObject::timerEvent( QTimerEvent * )
242{ 242{
243 bool needSave = FALSE; 243 bool needSave = FALSE;
244 killTimers(); 244 killTimers();
245 if (nearestTimerEvent) { 245 if (nearestTimerEvent) {
246 if ( nearestTimerEvent->UTCtime 246 if ( nearestTimerEvent->UTCtime
247 <= TimeConversion::toUTC(QDateTime::currentDateTime()) ) { 247 <= TimeConversion::toUTC(QDateTime::currentDateTime()) ) {
248#ifndef QT_NO_COP 248#ifndef QT_NO_COP
249 QCopEnvelope e( nearestTimerEvent->channel, 249 QCopEnvelope e( nearestTimerEvent->channel,
250 nearestTimerEvent->message ); 250 nearestTimerEvent->message );
251 e << TimeConversion::fromUTC( nearestTimerEvent->UTCtime ) 251 e << TimeConversion::fromUTC( nearestTimerEvent->UTCtime )
252 << nearestTimerEvent->data; 252 << nearestTimerEvent->data;
253#endif 253#endif
254 timerEventList.remove( nearestTimerEvent ); 254 timerEventList.remove( nearestTimerEvent );
255 needSave = TRUE; 255 needSave = TRUE;
256 } 256 }
257 setNearestTimerEvent(); 257 setNearestTimerEvent();
258 } else { 258 } else {
259 resetTimer(); 259 resetTimer();
260 } 260 }
261 if ( needSave ) 261 if ( needSave )
262 saveState(); 262 saveState();
263} 263}
264 264
265/*! 265/*!
266 \class AlarmServer alarmserver.h 266 \class AlarmServer alarmserver.h
267 \brief The AlarmServer class allows alarms to be scheduled and unscheduled. 267 \brief The AlarmServer class allows alarms to be scheduled and unscheduled.
268 268
269 Applications can schedule alarms with addAlarm() and can 269 Applications can schedule alarms with addAlarm() and can
270 unschedule alarms with deleteAlarm(). When the time for an alarm 270 unschedule alarms with deleteAlarm(). When the time for an alarm
271 to go off is reached the specified \link qcop.html QCop\endlink 271 to go off is reached the specified \link qcop.html QCop\endlink
272 message is sent on the specified channel (optionally with 272 message is sent on the specified channel (optionally with
273 additional data). 273 additional data).
274 274
275 Scheduling an alarm using this class is important (rather just using 275 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 276 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 277 the Linux kernel which implements this at the kernel level to minimize
278 battery usage while asleep. 278 battery usage while asleep.
279 279
280 \ingroup qtopiaemb 280 \ingroup qtopiaemb
281 \sa QCopEnvelope 281 \sa QCopEnvelope
282*/ 282*/
283 283
284/*! 284/*!
285 Schedules an alarm to go off at (or soon after) time \a when. When 285 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 286 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. 287 be sent to \a channel, with \a data as a parameter.
288 288
289 If this function is called with exactly the same data as a previous 289 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 290 call the subsequent call is ignored, so there is only ever one alarm
291 with a given set of parameters. 291 with a given set of parameters.
292 292
293 \sa deleteAlarm() 293 \sa deleteAlarm()
294*/ 294*/
295void AlarmServer::addAlarm ( QDateTime when, const QCString& channel, 295void AlarmServer::addAlarm ( QDateTime when, const QCString& channel,
296 const QCString& message, int data) 296 const QCString& message, int data)
297{ 297{
298 if ( qApp->type() == QApplication::GuiServer ) { 298 if ( qApp->type() == QApplication::GuiServer ) {
299 bool needSave = FALSE; 299 bool needSave = FALSE;
300 // Here we are the server so either it has been directly called from 300 // 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 301 // within the server or it has been sent to us from a client via QCop
302 if (!timerEventReceiver) 302 if (!timerEventReceiver)
303 timerEventReceiver = new TimerReceiverObject; 303 timerEventReceiver = new TimerReceiverObject;
304 304
305 timerEventItem *newTimerEventItem = new timerEventItem; 305 timerEventItem *newTimerEventItem = new timerEventItem;
306 newTimerEventItem->UTCtime = TimeConversion::toUTC( when ); 306 newTimerEventItem->UTCtime = TimeConversion::toUTC( when );
307 newTimerEventItem->channel = channel; 307 newTimerEventItem->channel = channel;
308 newTimerEventItem->message = message; 308 newTimerEventItem->message = message;
309 newTimerEventItem->data = data; 309 newTimerEventItem->data = data;
310 // explore the case of already having the event in here... 310 // explore the case of already having the event in here...
311 QListIterator<timerEventItem> it( timerEventList ); 311 QListIterator<timerEventItem> it( timerEventList );
312 for ( ; *it; ++it ) 312 for ( ; *it; ++it )
313 if ( *(*it) == *newTimerEventItem ) 313 if ( *(*it) == *newTimerEventItem )
314 return; 314 return;
315 // if we made it here, it is okay to add the item... 315 // if we made it here, it is okay to add the item...
316 timerEventList.append( newTimerEventItem ); 316 timerEventList.append( newTimerEventItem );
317 needSave = TRUE; 317 needSave = TRUE;
318 // quicker than using setNearestTimerEvent() 318 // quicker than using setNearestTimerEvent()
319 if ( nearestTimerEvent ) { 319 if ( nearestTimerEvent ) {
320 if (newTimerEventItem->UTCtime < nearestTimerEvent->UTCtime) { 320 if (newTimerEventItem->UTCtime < nearestTimerEvent->UTCtime) {
321 nearestTimerEvent = newTimerEventItem; 321 nearestTimerEvent = newTimerEventItem;
322 timerEventReceiver->killTimers(); 322 timerEventReceiver->killTimers();
323 timerEventReceiver->resetTimer(); 323 timerEventReceiver->resetTimer();
324 } 324 }
325 } else { 325 } else {
326 nearestTimerEvent = newTimerEventItem; 326 nearestTimerEvent = newTimerEventItem;
327 timerEventReceiver->resetTimer(); 327 timerEventReceiver->resetTimer();
328 } 328 }
329 if ( needSave ) 329 if ( needSave )
330 saveState(); 330 saveState();
331 } else { 331 } else {
332#ifndef QT_NO_COP 332#ifndef QT_NO_COP
333 QCopEnvelope e( "QPE/System", "addAlarm(QDateTime,QCString,QCString,int)" ); 333 QCopEnvelope e( "QPE/System", "addAlarm(QDateTime,QCString,QCString,int)" );
334 e << when << channel << message << data; 334 e << when << channel << message << data;
335#endif 335#endif
336 } 336 }
337} 337}
338 338
339/*! 339/*!
340 Deletes previously scheduled alarms which match \a when, \a channel, 340 Deletes previously scheduled alarms which match \a when, \a channel,
341 \a message, and \a data. 341 \a message, and \a data.
342 342
343 Passing null values for \a when, \a channel, or for the \link 343 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". 344 qcop.html QCop\endlink \a message, acts as a wildcard meaning "any".
345 Similarly, passing -1 for \a data indicates "any". 345 Similarly, passing -1 for \a data indicates "any".
346 346
347 If there is no matching alarm, nothing happens. 347 If there is no matching alarm, nothing happens.
348 348
349 \sa addAlarm() 349 \sa addAlarm()
350 350
351*/ 351*/
352void AlarmServer::deleteAlarm (QDateTime when, const QCString& channel, const QCString& message, int data) 352void AlarmServer::deleteAlarm (QDateTime when, const QCString& channel, const QCString& message, int data)
353{ 353{
354 if ( qApp->type() == QApplication::GuiServer) { 354 if ( qApp->type() == QApplication::GuiServer) {
355 bool needSave = FALSE; 355 bool needSave = FALSE;
356 if ( timerEventReceiver != NULL ) { 356 if ( timerEventReceiver != NULL ) {
357 timerEventReceiver->killTimers(); 357 timerEventReceiver->killTimers();
358 358
359 // iterate over the list of events 359 // iterate over the list of events
360 QListIterator<timerEventItem> it( timerEventList ); 360 QListIterator<timerEventItem> it( timerEventList );
361 time_t deleteTime = TimeConversion::toUTC( when ); 361 time_t deleteTime = TimeConversion::toUTC( when );
362 for ( ; *it; ++it ) { 362 for ( ; *it; ++it ) {
363 // if its a match, delete it 363 // if its a match, delete it
364 if ( ( (*it)->UTCtime == deleteTime || when.isNull() ) 364 if ( ( (*it)->UTCtime == deleteTime || when.isNull() )
365 && ( channel.isNull() || (*it)->channel == channel ) 365 && ( channel.isNull() || (*it)->channel == channel )
366 && ( message.isNull() || (*it)->message == message ) 366 && ( message.isNull() || (*it)->message == message )
367 && ( data==-1 || (*it)->data == data ) ) 367 && ( data==-1 || (*it)->data == data ) )
368 { 368 {
369 // if it's first, then we need to update the timer 369 // if it's first, then we need to update the timer
370 if ( (*it) == nearestTimerEvent ) { 370 if ( (*it) == nearestTimerEvent ) {
371 timerEventList.remove(*it); 371 timerEventList.remove(*it);
372 setNearestTimerEvent(); 372 setNearestTimerEvent();
373 } else { 373 } else {
374 timerEventList.remove(*it); 374 timerEventList.remove(*it);
375 } 375 }
376 needSave = TRUE; 376 needSave = TRUE;
377 } 377 }
378 } 378 }
379 if ( nearestTimerEvent ) 379 if ( nearestTimerEvent )
380 timerEventReceiver->resetTimer(); 380 timerEventReceiver->resetTimer();
381 } 381 }
382 if ( needSave ) 382 if ( needSave )
383 saveState(); 383 saveState();
384 } else { 384 } else {
385#ifndef QT_NO_COP 385#ifndef QT_NO_COP
386 QCopEnvelope e( "QPE/System", "deleteAlarm(QDateTime,QCString,QCString,int)" ); 386 QCopEnvelope e( "QPE/System", "deleteAlarm(QDateTime,QCString,QCString,int)" );
387 e << when << channel << message << data; 387 e << when << channel << message << data;
388#endif 388#endif
389 } 389 }
390} 390}
391 391
392/*! 392/*!
393 Writes the system clock to the hardware clock. 393 Writes the system clock to the hardware clock.
394*/ 394*/
395void Global::writeHWClock() 395void Global::writeHWClock()
396{ 396{
397 if ( !triggerAtd( TRUE ) ) { 397 if ( !triggerAtd( TRUE ) ) {
398 // atd not running? set it ourselves 398 // atd not running? set it ourselves
399 system("/sbin/hwclock --systohc"); // ##### UTC? 399 system("/sbin/hwclock --systohc"); // ##### UTC?
400 } 400 }
401} 401}