summaryrefslogtreecommitdiff
path: root/library/alarmserver.cpp
Side-by-side diff
Diffstat (limited to 'library/alarmserver.cpp') (more/less context) (show whitespace changes)
-rw-r--r--library/alarmserver.cpp91
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
}