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