summaryrefslogtreecommitdiff
path: root/library/alarmserver.cpp
authorzecke <zecke>2002-10-15 21:42:20 (UTC)
committer zecke <zecke>2002-10-15 21:42:20 (UTC)
commit676be5604cbdb3213c00775e0ff66f4e766f8dcb (patch) (unidiff)
tree63c29adab530a60371f78880ff75e2689398e239 /library/alarmserver.cpp
parentb774e015816e51ac65e5d1c685306f8404a3a19e (diff)
downloadopie-676be5604cbdb3213c00775e0ff66f4e766f8dcb.zip
opie-676be5604cbdb3213c00775e0ff66f4e766f8dcb.tar.gz
opie-676be5604cbdb3213c00775e0ff66f4e766f8dcb.tar.bz2
Actually most of them are -+ cause I opened them in xemacs..
The main goal is to replace some header names to let them be overwritten by external once so "qpeapplication.h" is now <qpe/qpeapplication.h> I'll check if it's building on non Qt2/X11 systems...
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,288 +1,288 @@
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