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,224 +1,224 @@
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;