summaryrefslogtreecommitdiff
authorsandman <sandman>2002-12-10 22:15:30 (UTC)
committer sandman <sandman>2002-12-10 22:15:30 (UTC)
commit2173e57fcbd5d460fceb34a111845389dca56506 (patch) (side-by-side diff)
tree462b451f7c75e3960472468c55ae0037595d1af1
parent51f44c6a22971d6f60f5e36523d9efbeaa8aec55 (diff)
downloadopie-2173e57fcbd5d460fceb34a111845389dca56506.zip
opie-2173e57fcbd5d460fceb34a111845389dca56506.tar.gz
opie-2173e57fcbd5d460fceb34a111845389dca56506.tar.bz2
don't use atd anymore - our atd is only simple shell script, so better get
rid of it.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/alarmserver.cpp519
1 files changed, 288 insertions, 231 deletions
diff --git a/library/alarmserver.cpp b/library/alarmserver.cpp
index 5e4dd18..2ea4025 100644
--- a/library/alarmserver.cpp
+++ b/library/alarmserver.cpp
@@ -39,15 +39,20 @@
#include <unistd.h>
-struct timerEventItem {
- time_t UTCtime;
- QCString channel, message;
- int data;
- bool operator==( const timerEventItem &right ) const
- {
- return ( UTCtime == right.UTCtime
- && channel == right.channel
- && message == right.message
- && data == right.data );
- }
+
+#undef USE_ATD // not used anymore -- we run opie-alarm on suspend/resume
+
+
+struct timerEventItem
+{
+ time_t UTCtime;
+ QCString channel, message;
+ int data;
+ bool operator==( const timerEventItem &right ) const
+ {
+ return ( UTCtime == right.UTCtime
+ && channel == right.channel
+ && message == right.message
+ && data == right.data );
+ }
};
@@ -55,13 +60,18 @@ class TimerReceiverObject : public QObject
{
public:
- TimerReceiverObject() { }
- ~TimerReceiverObject() { }
- void resetTimer();
- void setTimerEventItem();
- void deleteTimer();
+ TimerReceiverObject()
+ { }
+ ~TimerReceiverObject()
+ { }
+ void resetTimer();
+ void setTimerEventItem();
+ void deleteTimer();
protected:
- void timerEvent( QTimerEvent *te );
+ void timerEvent( QTimerEvent *te );
+
+#ifdef USE_ATD
private:
- QString atfilename;
+ QString atfilename;
+#endif
};
@@ -74,15 +84,15 @@ timerEventItem *nearestTimerEvent = NULL;
void setNearestTimerEvent()
{
- nearestTimerEvent = NULL;
- QListIterator<timerEventItem> it( timerEventList );
- if ( *it )
- nearestTimerEvent = *it;
- for ( ; *it; ++it )
- if ( (*it)->UTCtime < nearestTimerEvent->UTCtime )
- nearestTimerEvent = *it;
- if (nearestTimerEvent)
- timerEventReceiver->resetTimer();
- else
- timerEventReceiver->deleteTimer();
+ nearestTimerEvent = NULL;
+ QListIterator<timerEventItem> it( timerEventList );
+ if ( *it )
+ nearestTimerEvent = *it;
+ for ( ; *it; ++it )
+ if ( (*it)->UTCtime < nearestTimerEvent->UTCtime )
+ nearestTimerEvent = *it;
+ if (nearestTimerEvent)
+ timerEventReceiver->resetTimer();
+ else
+ timerEventReceiver->deleteTimer();
}
@@ -93,30 +103,31 @@ void setNearestTimerEvent()
static void saveState()
{
- QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" );
- if ( timerEventList.isEmpty() ) {
- unlink( savefilename );
- return;
- }
+ QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" );
+ if ( timerEventList.isEmpty() ) {
+ unlink( savefilename );
+ return ;
+ }
- QFile savefile(savefilename+".new");
- if ( savefile.open(IO_WriteOnly) ) {
- QDataStream ds( &savefile );
+ QFile savefile(savefilename + ".new");
+ if ( savefile.open(IO_WriteOnly) ) {
+ QDataStream ds( &savefile );
- //save
+ //save
- QListIterator<timerEventItem> it( timerEventList );
- for ( ; *it; ++it ) {
- ds << it.current()->UTCtime;
- ds << it.current()->channel;
- ds << it.current()->message;
- ds << it.current()->data;
- }
+ QListIterator<timerEventItem> it( timerEventList );
+ for ( ; *it; ++it ) {
+ ds << it.current()->UTCtime;
+ ds << it.current()->channel;
+ ds << it.current()->message;
+ ds << it.current()->data;
+ }
- savefile.close();
- unlink( savefilename );
- QDir d; d.rename(savefilename+".new",savefilename);
+ savefile.close();
+ unlink( savefilename );
+ QDir d;
+ d.rename(savefilename + ".new", savefilename);
- }
+ }
}
@@ -126,28 +137,28 @@ static void saveState()
void AlarmServer::initialize()
{
- //read autosave file and put events in timerEventList
-
- QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" );
-
- QFile savefile(savefilename);
- if ( savefile.open(IO_ReadOnly) ) {
- QDataStream ds( &savefile );
- while ( !ds.atEnd() ) {
- timerEventItem *newTimerEventItem = new timerEventItem;
- ds >> newTimerEventItem->UTCtime;
- ds >> newTimerEventItem->channel;
- ds >> newTimerEventItem->message;
- ds >> newTimerEventItem->data;
- timerEventList.append( newTimerEventItem );
+ //read autosave file and put events in timerEventList
+
+ QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" );
+
+ QFile savefile(savefilename);
+ if ( savefile.open(IO_ReadOnly) ) {
+ QDataStream ds( &savefile );
+ while ( !ds.atEnd() ) {
+ timerEventItem *newTimerEventItem = new timerEventItem;
+ ds >> newTimerEventItem->UTCtime;
+ ds >> newTimerEventItem->channel;
+ ds >> newTimerEventItem->message;
+ ds >> newTimerEventItem->data;
+ timerEventList.append( newTimerEventItem );
+ }
+ savefile.close();
+ if (!timerEventReceiver)
+ timerEventReceiver = new TimerReceiverObject;
+ setNearestTimerEvent();
}
- savefile.close();
- if (!timerEventReceiver)
- timerEventReceiver = new TimerReceiverObject;
- setNearestTimerEvent();
- }
}
-
+#ifdef USE_ATD
static const char* atdir = "/var/spool/at/";
@@ -155,101 +166,138 @@ static const char* atdir = "/var/spool/at/";
static bool triggerAtd( bool writeHWClock = FALSE )
{
- QFile trigger(QString(atdir) + "trigger");
- if ( trigger.open(IO_WriteOnly|IO_Raw) ) {
- if ( trigger.writeBlock("\n",2) != 2 ) {
- QMessageBox::critical( 0, QObject::tr( "Out of Space" ),
- QObject::tr( "Unable to schedule alarm.\nFree some memory and try again." ) );
- trigger.close();
- QFile::remove( trigger.name() );
- return FALSE;
+ QFile trigger(QString(atdir) + "trigger");
+ if ( trigger.open(IO_WriteOnly | IO_Raw) ) {
+ if ( trigger.writeBlock("\n", 2) != 2 ) {
+ QMessageBox::critical( 0, QObject::tr( "Out of Space" ),
+ QObject::tr( "Unable to schedule alarm.\nFree some memory and try again." ) );
+ trigger.close();
+ QFile::remove
+ ( trigger.name() );
+ return FALSE;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+#else
+
+static bool writeResumeAt ( time_t wakeup )
+{
+ FILE *fp = ::fopen ( "/var/run/resumeat", "w" );
+
+ if ( fp ) {
+ ::fprintf ( fp, "%d\n", (int) wakeup );
+ ::fclose ( fp );
}
- return TRUE;
- }
- return FALSE;
+ else
+ qWarning ( "Failed to write wakeup time to /var/run/resumeat" );
+
+ return ( fp );
}
+#endif
+
void TimerReceiverObject::deleteTimer()
{
- if ( !atfilename.isEmpty() ) {
- unlink( atfilename );
- atfilename = QString::null;
- triggerAtd( FALSE );
- }
+#ifdef USE_ATD
+ if ( !atfilename.isEmpty() ) {
+ unlink( atfilename );
+ atfilename = QString::null;
+ triggerAtd( FALSE );
+ }
+#else
+ writeResumeAt ( 0 );
+#endif
}
void TimerReceiverObject::resetTimer()
{
- const int maxsecs = 2147000;
- int total_written;
- QDateTime nearest = TimeConversion::fromUTC(nearestTimerEvent->UTCtime);
- QDateTime now = QDateTime::currentDateTime();
- if ( nearest < now )
- nearest = now;
- int secs = TimeConversion::secsTo( now, nearest );
- if ( secs > maxsecs ) {
- // too far for millisecond timing
- secs = maxsecs;
- }
-
- // System timer (needed so that we wake from deep sleep),
- // from the Epoch in seconds.
- //
- int at_secs = TimeConversion::toUTC(nearest);
- // qDebug("reset timer to %d seconds from Epoch",at_secs);
- QString fn = atdir + QString::number(at_secs) + "."
- + QString::number(getpid());
- if ( fn != atfilename ) {
- QFile atfile(fn+".new");
- if ( atfile.open(IO_WriteOnly|IO_Raw) ) {
- // just wake up and delete the at file
- QString cmd = "#!/bin/sh\nrm " + fn;
- total_written = atfile.writeBlock(cmd.latin1(),cmd.length());
- if ( total_written != int(cmd.length()) ) {
- QMessageBox::critical( 0, tr("Out of Space"),
- tr("Unable to schedule alarm.\n"
- "Please free up space and try again") );
- atfile.close();
- QFile::remove( atfile.name() );
- return;
- }
- atfile.close();
- unlink( atfilename );
- QDir d; d.rename(fn+".new",fn);
- chmod(fn.latin1(),0755);
- atfilename = fn;
- triggerAtd( FALSE );
- } else {
- qWarning("Cannot open atd file %s",fn.latin1());
+ const int maxsecs = 2147000;
+ QDateTime nearest = TimeConversion::fromUTC(nearestTimerEvent->UTCtime);
+ QDateTime now = QDateTime::currentDateTime();
+ if ( nearest < now )
+ nearest = now;
+ int secs = TimeConversion::secsTo( now, nearest );
+ if ( secs > maxsecs ) {
+ // too far for millisecond timing
+ secs = maxsecs;
+ }
+
+ // System timer (needed so that we wake from deep sleep),
+ // from the Epoch in seconds.
+ //
+ int at_secs = TimeConversion::toUTC(nearest);
+ // qDebug("reset timer to %d seconds from Epoch",at_secs);
+
+#ifdef USE_ATD
+
+ QString fn = atdir + QString::number(at_secs) + "."
+ + QString::number(getpid());
+ if ( fn != atfilename ) {
+ QFile atfile(fn + ".new");
+ if ( atfile.open(IO_WriteOnly | IO_Raw) ) {
+ int total_written;
+
+ // just wake up and delete the at file
+ QString cmd = "#!/bin/sh\nrm " + fn;
+ total_written = atfile.writeBlock(cmd.latin1(), cmd.length());
+ if ( total_written != int(cmd.length()) ) {
+ QMessageBox::critical( 0, tr("Out of Space"),
+ tr("Unable to schedule alarm.\n"
+ "Please free up space and try again") );
+ atfile.close();
+ QFile::remove
+ ( atfile.name() );
+ return ;
+ }
+ atfile.close();
+ unlink( atfilename );
+ QDir d;
+ d.rename(fn + ".new", fn);
+ chmod(fn.latin1(), 0755);
+ atfilename = fn;
+ triggerAtd( FALSE );
+ }
+ else {
+ qWarning("Cannot open atd file %s", fn.latin1());
+ }
}
- }
- // Qt timers (does the actual alarm)
- // from now in milliseconds
- //
- qDebug("AlarmServer waiting %d seconds",secs);
- startTimer( 1000 * secs + 500 );
+#else
+ writeResumeAt ( at_secs );
+
+#endif
+
+ // Qt timers (does the actual alarm)
+ // from now in milliseconds
+ //
+ qDebug("AlarmServer waiting %d seconds", secs);
+ startTimer( 1000 * secs + 500 );
}
void TimerReceiverObject::timerEvent( QTimerEvent * )
{
- bool needSave = FALSE;
- killTimers();
- if (nearestTimerEvent) {
- if ( nearestTimerEvent->UTCtime
- <= TimeConversion::toUTC(QDateTime::currentDateTime()) ) {
+ bool needSave = FALSE;
+ killTimers();
+ if (nearestTimerEvent) {
+ if ( nearestTimerEvent->UTCtime
+ <= TimeConversion::toUTC(QDateTime::currentDateTime()) ) {
#ifndef QT_NO_COP
- QCopEnvelope e( nearestTimerEvent->channel,
- nearestTimerEvent->message );
- e << TimeConversion::fromUTC( nearestTimerEvent->UTCtime )
- << nearestTimerEvent->data;
+ QCopEnvelope e( nearestTimerEvent->channel,
+ nearestTimerEvent->message );
+ e << TimeConversion::fromUTC( nearestTimerEvent->UTCtime )
+ << nearestTimerEvent->data;
#endif
- timerEventList.remove( nearestTimerEvent );
- needSave = TRUE;
+
+ timerEventList.remove( nearestTimerEvent );
+ needSave = TRUE;
+ }
+ setNearestTimerEvent();
}
- setNearestTimerEvent();
- } else {
- resetTimer();
- }
- if ( needSave )
- saveState();
+ else {
+ resetTimer();
+ }
+ if ( needSave )
+ saveState();
}
@@ -257,5 +305,5 @@ void TimerReceiverObject::timerEvent( QTimerEvent * )
\class AlarmServer alarmserver.h
\brief The AlarmServer class allows alarms to be scheduled and unscheduled.
-
+
Applications can schedule alarms with addAlarm() and can
unschedule alarms with deleteAlarm(). When the time for an alarm
@@ -263,10 +311,10 @@ void TimerReceiverObject::timerEvent( QTimerEvent * )
message is sent on the specified channel (optionally with
additional data).
-
+
Scheduling an alarm using this class is important (rather just using
a QTimer) since the machine may be asleep and needs to get woken up using
the Linux kernel which implements this at the kernel level to minimize
battery usage while asleep.
-
+
\ingroup qtopiaemb
\sa QCopEnvelope
@@ -277,53 +325,56 @@ void TimerReceiverObject::timerEvent( QTimerEvent * )
the alarm goes off, the \link qcop.html QCop\endlink \a message will
be sent to \a channel, with \a data as a parameter.
-
+
If this function is called with exactly the same data as a previous
call the subsequent call is ignored, so there is only ever one alarm
with a given set of parameters.
-
+
\sa deleteAlarm()
*/
void AlarmServer::addAlarm ( QDateTime when, const QCString& channel,
- const QCString& message, int data)
+ const QCString& message, int data)
{
- if ( qApp->type() == QApplication::GuiServer ) {
- bool needSave = FALSE;
- // Here we are the server so either it has been directly called from
- // within the server or it has been sent to us from a client via QCop
- if (!timerEventReceiver)
- timerEventReceiver = new TimerReceiverObject;
-
- timerEventItem *newTimerEventItem = new timerEventItem;
- newTimerEventItem->UTCtime = TimeConversion::toUTC( when );
- newTimerEventItem->channel = channel;
- newTimerEventItem->message = message;
- newTimerEventItem->data = data;
- // explore the case of already having the event in here...
- QListIterator<timerEventItem> it( timerEventList );
- for ( ; *it; ++it )
- if ( *(*it) == *newTimerEventItem )
- return;
- // if we made it here, it is okay to add the item...
- timerEventList.append( newTimerEventItem );
- needSave = TRUE;
- // quicker than using setNearestTimerEvent()
- if ( nearestTimerEvent ) {
- if (newTimerEventItem->UTCtime < nearestTimerEvent->UTCtime) {
- nearestTimerEvent = newTimerEventItem;
- timerEventReceiver->killTimers();
- timerEventReceiver->resetTimer();
- }
- } else {
- nearestTimerEvent = newTimerEventItem;
- timerEventReceiver->resetTimer();
+ if ( qApp->type() == QApplication::GuiServer ) {
+ bool needSave = FALSE;
+ // Here we are the server so either it has been directly called from
+ // within the server or it has been sent to us from a client via QCop
+ if (!timerEventReceiver)
+ timerEventReceiver = new TimerReceiverObject;
+
+ timerEventItem *newTimerEventItem = new timerEventItem;
+ newTimerEventItem->UTCtime = TimeConversion::toUTC( when );
+ newTimerEventItem->channel = channel;
+ newTimerEventItem->message = message;
+ newTimerEventItem->data = data;
+ // explore the case of already having the event in here...
+ QListIterator<timerEventItem> it( timerEventList );
+ for ( ; *it; ++it )
+ if ( *(*it) == *newTimerEventItem )
+ return ;
+ // if we made it here, it is okay to add the item...
+ timerEventList.append( newTimerEventItem );
+ needSave = TRUE;
+ // quicker than using setNearestTimerEvent()
+ if ( nearestTimerEvent ) {
+ if (newTimerEventItem->UTCtime < nearestTimerEvent->UTCtime) {
+ nearestTimerEvent = newTimerEventItem;
+ timerEventReceiver->killTimers();
+ timerEventReceiver->resetTimer();
+ }
+ }
+ else {
+ nearestTimerEvent = newTimerEventItem;
+ timerEventReceiver->resetTimer();
+ }
+ if ( needSave )
+ saveState();
}
- if ( needSave )
- saveState();
- } else {
+ else {
#ifndef QT_NO_COP
- QCopEnvelope e( "QPE/System", "addAlarm(QDateTime,QCString,QCString,int)" );
- e << when << channel << message << data;
+ QCopEnvelope e( "QPE/System", "addAlarm(QDateTime,QCString,QCString,int)" );
+ e << when << channel << message << data;
#endif
- }
+
+ }
}
@@ -331,52 +382,54 @@ void AlarmServer::addAlarm ( QDateTime when, const QCString& channel,
Deletes previously scheduled alarms which match \a when, \a channel,
\a message, and \a data.
-
+
Passing null values for \a when, \a channel, or for the \link
qcop.html QCop\endlink \a message, acts as a wildcard meaning "any".
Similarly, passing -1 for \a data indicates "any".
-
+
If there is no matching alarm, nothing happens.
-
+
\sa addAlarm()
-
+
*/
void AlarmServer::deleteAlarm (QDateTime when, const QCString& channel, const QCString& message, int data)
{
- if ( qApp->type() == QApplication::GuiServer) {
- bool needSave = FALSE;
- if ( timerEventReceiver != NULL ) {
- timerEventReceiver->killTimers();
-
- // iterate over the list of events
- QListIterator<timerEventItem> it( timerEventList );
- time_t deleteTime = TimeConversion::toUTC( when );
- for ( ; *it; ++it ) {
- // if its a match, delete it
- if ( ( (*it)->UTCtime == deleteTime || when.isNull() )
- && ( channel.isNull() || (*it)->channel == channel )
- && ( message.isNull() || (*it)->message == message )
- && ( data==-1 || (*it)->data == data ) )
- {
- // if it's first, then we need to update the timer
- if ( (*it) == nearestTimerEvent ) {
- timerEventList.remove(*it);
- setNearestTimerEvent();
- } else {
- timerEventList.remove(*it);
- }
- needSave = TRUE;
+ if ( qApp->type() == QApplication::GuiServer) {
+ bool needSave = FALSE;
+ if ( timerEventReceiver != NULL ) {
+ timerEventReceiver->killTimers();
+
+ // iterate over the list of events
+ QListIterator<timerEventItem> it( timerEventList );
+ time_t deleteTime = TimeConversion::toUTC( when );
+ for ( ; *it; ++it ) {
+ // if its a match, delete it
+ if ( ( (*it)->UTCtime == deleteTime || when.isNull() )
+ && ( channel.isNull() || (*it)->channel == channel )
+ && ( message.isNull() || (*it)->message == message )
+ && ( data == -1 || (*it)->data == data ) ) {
+ // if it's first, then we need to update the timer
+ if ( (*it) == nearestTimerEvent ) {
+ timerEventList.remove(*it);
+ setNearestTimerEvent();
+ }
+ else {
+ timerEventList.remove(*it);
+ }
+ needSave = TRUE;
+ }
+ }
+ if ( nearestTimerEvent )
+ timerEventReceiver->resetTimer();
}
- }
- if ( nearestTimerEvent )
- timerEventReceiver->resetTimer();
+ if ( needSave )
+ saveState();
}
- if ( needSave )
- saveState();
- } else {
+ else {
#ifndef QT_NO_COP
- QCopEnvelope e( "QPE/System", "deleteAlarm(QDateTime,QCString,QCString,int)" );
- e << when << channel << message << data;
+ QCopEnvelope e( "QPE/System", "deleteAlarm(QDateTime,QCString,QCString,int)" );
+ e << when << channel << message << data;
#endif
- }
+
+ }
}
@@ -386,7 +439,11 @@ void AlarmServer::deleteAlarm (QDateTime when, const QCString& channel, const QC
void Global::writeHWClock()
{
- if ( !triggerAtd( TRUE ) ) {
- // atd not running? set it ourselves
- system("/sbin/hwclock --systohc"); // ##### UTC?
- }
+#ifdef USE_ATD
+ if ( !triggerAtd( TRUE ) ) {
+ // atd not running? set it ourselves
+ system("/sbin/hwclock --systohc"); // ##### UTC?
+ }
+#else
+ // hwclock is written on suspend
+#endif
}