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