-rw-r--r-- | library/alarmserver.cpp | 91 |
1 files changed, 74 insertions, 17 deletions
diff --git a/library/alarmserver.cpp b/library/alarmserver.cpp index 5e4dd18..2ea4025 100644 --- a/library/alarmserver.cpp +++ b/library/alarmserver.cpp @@ -39,5 +39,10 @@ #include <unistd.h> -struct timerEventItem { + +#undef USE_ATD // not used anymore -- we run opie-alarm on suspend/resume + + +struct timerEventItem +{ time_t UTCtime; QCString channel, message; @@ -55,6 +60,8 @@ class TimerReceiverObject : public QObject { public: - TimerReceiverObject() { } - ~TimerReceiverObject() { } + TimerReceiverObject() + { } + ~TimerReceiverObject() + { } void resetTimer(); void setTimerEventItem(); @@ -62,6 +69,9 @@ public: protected: void timerEvent( QTimerEvent *te ); + +#ifdef USE_ATD private: QString atfilename; +#endif }; @@ -116,5 +126,6 @@ static void saveState() savefile.close(); unlink( savefilename ); - QDir d; d.rename(savefilename+".new",savefilename); + QDir d; + d.rename(savefilename + ".new", savefilename); } @@ -149,5 +160,5 @@ void AlarmServer::initialize() - +#ifdef USE_ATD static const char* atdir = "/var/spool/at/"; @@ -161,5 +172,6 @@ static bool triggerAtd( bool writeHWClock = FALSE ) QObject::tr( "Unable to schedule alarm.\nFree some memory and try again." ) ); trigger.close(); - QFile::remove( trigger.name() ); + QFile::remove + ( trigger.name() ); return FALSE; } @@ -169,6 +181,25 @@ static bool triggerAtd( bool writeHWClock = 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 ); + } + else + qWarning ( "Failed to write wakeup time to /var/run/resumeat" ); + + return ( fp ); +} + +#endif + void TimerReceiverObject::deleteTimer() { +#ifdef USE_ATD if ( !atfilename.isEmpty() ) { unlink( atfilename ); @@ -176,4 +207,7 @@ void TimerReceiverObject::deleteTimer() triggerAtd( FALSE ); } +#else + writeResumeAt ( 0 ); +#endif } @@ -181,5 +215,4 @@ void TimerReceiverObject::resetTimer() { const int maxsecs = 2147000; - int total_written; QDateTime nearest = TimeConversion::fromUTC(nearestTimerEvent->UTCtime); QDateTime now = QDateTime::currentDateTime(); @@ -197,4 +230,7 @@ void TimerReceiverObject::resetTimer() 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()); @@ -202,4 +238,6 @@ void TimerReceiverObject::resetTimer() 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; @@ -210,17 +248,25 @@ void TimerReceiverObject::resetTimer() "Please free up space and try again") ); atfile.close(); - QFile::remove( atfile.name() ); + QFile::remove + ( atfile.name() ); return; } atfile.close(); unlink( atfilename ); - QDir d; d.rename(fn+".new",fn); + QDir d; + d.rename(fn + ".new", fn); chmod(fn.latin1(),0755); atfilename = fn; triggerAtd( FALSE ); - } else { + } + else { qWarning("Cannot open atd file %s",fn.latin1()); } } +#else + writeResumeAt ( at_secs ); + +#endif + // Qt timers (does the actual alarm) // from now in milliseconds @@ -243,9 +289,11 @@ void TimerReceiverObject::timerEvent( QTimerEvent * ) << nearestTimerEvent->data; #endif + timerEventList.remove( nearestTimerEvent ); needSave = TRUE; } setNearestTimerEvent(); - } else { + } + else { resetTimer(); } @@ -314,5 +362,6 @@ void AlarmServer::addAlarm ( QDateTime when, const QCString& channel, timerEventReceiver->resetTimer(); } - } else { + } + else { nearestTimerEvent = newTimerEventItem; timerEventReceiver->resetTimer(); @@ -320,9 +369,11 @@ void AlarmServer::addAlarm ( QDateTime when, const QCString& channel, if ( needSave ) saveState(); - } else { + } + else { #ifndef QT_NO_COP QCopEnvelope e( "QPE/System", "addAlarm(QDateTime,QCString,QCString,int)" ); e << when << channel << message << data; #endif + } } @@ -356,11 +407,11 @@ void AlarmServer::deleteAlarm (QDateTime when, const QCString& channel, const QC && ( channel.isNull() || (*it)->channel == channel ) && ( message.isNull() || (*it)->message == message ) - && ( data==-1 || (*it)->data == data ) ) - { + && ( data == -1 || (*it)->data == data ) ) { // if it's first, then we need to update the timer if ( (*it) == nearestTimerEvent ) { timerEventList.remove(*it); setNearestTimerEvent(); - } else { + } + else { timerEventList.remove(*it); } @@ -373,9 +424,11 @@ void AlarmServer::deleteAlarm (QDateTime when, const QCString& channel, const QC if ( needSave ) saveState(); - } else { + } + else { #ifndef QT_NO_COP 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() { +#ifdef USE_ATD if ( !triggerAtd( TRUE ) ) { // atd not running? set it ourselves system("/sbin/hwclock --systohc"); // ##### UTC? } +#else + // hwclock is written on suspend +#endif } |