-rw-r--r-- | library/alarmserver.cpp | 2 | ||||
-rw-r--r-- | library/power.cpp | 4 | ||||
-rw-r--r-- | library/storage.cpp | 2 |
3 files changed, 4 insertions, 4 deletions
diff --git a/library/alarmserver.cpp b/library/alarmserver.cpp index 02bca3d..7e6e515 100644 --- a/library/alarmserver.cpp +++ b/library/alarmserver.cpp @@ -65,193 +65,193 @@ private: QString atfilename; }; TimerReceiverObject *timerEventReceiver = NULL; QList<timerEventItem> timerEventList; timerEventItem *nearestTimerEvent = NULL; // set the timer to go off on the next event in the list 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(); } //store current state to file //Simple implementation. Should run on a timer. static void saveState() { QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" ); if ( timerEventList.isEmpty() ) { unlink( savefilename ); return; } QFile savefile(savefilename+".new"); if ( savefile.open(IO_WriteOnly) ) { QDataStream ds( &savefile ); //save 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); } } /*! Sets up the alarm server. Restoring to previous state (session management). */ 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 ); } savefile.close(); if (!timerEventReceiver) timerEventReceiver = new TimerReceiverObject; setNearestTimerEvent(); } } 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) ) { const char* data = -#ifdef QT_QWS_CUSTOM +#ifdef QT_QWS_SHARP //custom atd only writes HW Clock if we write a 'W' ( writeHWClock ) ? "W\n" : #endif data = "\n"; int len = strlen(data); int total_written = trigger.writeBlock(data,len); if ( total_written != len ) { 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; } void TimerReceiverObject::deleteTimer() { if ( !atfilename.isEmpty() ) { unlink( atfilename ); atfilename = QString::null; triggerAtd( FALSE ); } } 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()); } } // 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()) ) { #ifndef QT_NO_COP QCopEnvelope e( nearestTimerEvent->channel, nearestTimerEvent->message ); e << TimeConversion::fromUTC( nearestTimerEvent->UTCtime ) << nearestTimerEvent->data; #endif timerEventList.remove( nearestTimerEvent ); needSave = TRUE; } setNearestTimerEvent(); diff --git a/library/power.cpp b/library/power.cpp index d53ecfe..ec5b309 100644 --- a/library/power.cpp +++ b/library/power.cpp @@ -1,228 +1,228 @@ /********************************************************************** ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** ** This file is part of the Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include "power.h" -#ifdef QT_QWS_CUSTOM +#ifdef QT_QWS_SHARP #include "custom.h" #endif #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <sys/ioctl.h> #ifdef QT_QWS_IPAQ_NO_APM #include <linux/h3600_ts.h> #endif PowerStatusManager *PowerStatusManager::powerManager = 0; PowerStatus *PowerStatusManager::ps = 0; static bool haveProcApm = false; PowerStatusManager::PowerStatusManager() { powerManager = this; ps = new PowerStatus; FILE *f = fopen("/proc/apm", "r"); if ( f ) { fclose(f); haveProcApm = TRUE; } } const PowerStatus &PowerStatusManager::readStatus() { if ( !powerManager ) (void)new PowerStatusManager; powerManager->getStatus(); return *ps; } // Standard /proc/apm reader bool PowerStatusManager::getProcApmStatus( int &ac, int &bs, int &bf, int &pc, int &sec ) { bool ok = false; ac = 0xff; bs = 0xff; bf = 0xff; pc = -1; sec = -1; FILE *f = fopen("/proc/apm", "r"); if ( f ) { //I 1.13 1.2 0x02 0x00 0xff 0xff 49% 147 sec char u; fscanf(f, "%*[^ ] %*d.%*d 0x%*x 0x%x 0x%x 0x%x %d%% %i %c", &ac, &bs, &bf, &pc, &sec, &u); fclose(f); switch ( u ) { case 'm': sec *= 60; case 's': break; // ok default: sec = -1; // unknown } // extract data switch ( bs ) { case 0x00: ps->bs = PowerStatus::High; break; case 0x01: ps->bs = PowerStatus::Low; break; case 0x7f: ps->bs = PowerStatus::VeryLow; break; case 0x02: ps->bs = PowerStatus::Critical; break; case 0x03: ps->bs = PowerStatus::Charging; break; case 0x04: case 0xff: // 0xff is Unknown but we map to NotPresent default: ps->bs = PowerStatus::NotPresent; break; } switch ( ac ) { case 0x00: ps->ac = PowerStatus::Offline; break; case 0x01: ps->ac = PowerStatus::Online; break; case 0x02: ps->ac = PowerStatus::Backup; break; } if ( pc > 100 ) pc = -1; ps->percentRemain = pc; ps->secsRemain = sec; ok = true; } return ok; } -#ifdef QT_QWS_CUSTOM +#ifdef QT_QWS_SHARP void PowerStatusManager::getStatus() { int ac, bs, bf, pc, sec; ps->percentAccurate = TRUE; // not for long... if ( haveProcApm && getProcApmStatus( ac, bs, bf, pc, sec ) ) { // special case if ( bs == 0x7f ) ps->bs = PowerStatus::VeryLow; pc = -1; // fake percentage if ( pc < 0 ) { switch ( bs ) { case 0x00: ps->percentRemain = 100; break; // High case 0x01: ps->percentRemain = 30; break; // Low case 0x7f: ps->percentRemain = 10; break; // Very Low case 0x02: ps->percentRemain = 5; break; // Critical case 0x03: ps->percentRemain = -1; break; // Charging } ps->percentAccurate = FALSE; } } char *device = "/dev/apm_bios"; int fd = ::open (device, O_WRONLY); if ( fd >= 0 ) { int bbat_status = ioctl( fd, APM_IOC_BATTERY_BACK_CHK, 0 ); switch ( bbat_status ) { case 0x00: ps->bbs = PowerStatus::High; break; case 0x01: ps->bbs = PowerStatus::Low; break; case 0x7f: ps->bbs = PowerStatus::VeryLow; break; case 0x02: ps->bbs = PowerStatus::Critical; break; case 0x03: ps->bbs = PowerStatus::Charging; break; case 0x04: ps->bbs = PowerStatus::NotPresent; break; } ::close(fd); } } #else void PowerStatusManager::getStatus() { bool usedApm = FALSE; ps->percentAccurate = TRUE; // Some iPAQ kernel builds don't have APM. If this is not the case we // save ourselves an ioctl by testing if /proc/apm exists in the // constructor and we use /proc/apm instead int ac, bs, bf, pc, sec; if ( haveProcApm ) usedApm = getProcApmStatus( ac, bs, bf, pc, sec ); if ( !usedApm ) { #ifdef QT_QWS_IPAQ_NO_APM int fd; int err; struct bat_dev batt_info; memset(&batt_info, 0, sizeof(batt_info)); fd = ::open("/dev/ts",O_RDONLY); if( fd < 0 ) return; ioctl(fd, GET_BATTERY_STATUS, &batt_info); ac_status = batt_info.ac_status; ps->percentRemain = ( 425 * batt_info.batt1_voltage ) / 1000 - 298; // from h3600_ts.c ps->secsRemain = -1; // seconds is bogus on iPAQ ::close (fd); #else ps->percentRemain = 100; ps->secsRemain = -1; ps->percentAccurate = FALSE; #endif } } #endif diff --git a/library/storage.cpp b/library/storage.cpp index 937908d..3668d29 100644 --- a/library/storage.cpp +++ b/library/storage.cpp @@ -1,119 +1,119 @@ /********************************************************************** ** Copyright (C) Holger 'zecke' Freyther <freyther@kde.org> ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include <qpe/storage.h> -#ifdef QT_QWS_CUSTOM +#ifdef QT_QWS_SHARP #include <qpe/custom.h> #endif #include <qfile.h> #include <qtimer.h> #include <qcopchannel_qws.h> #include <stdio.h> #if defined(_OS_LINUX_) || defined(Q_OS_LINUX) #include <sys/vfs.h> #include <mntent.h> #endif #include <qstringlist.h> static bool isCF(const QString& m) { FILE* f = fopen("/var/run/stab", "r"); if (!f) f = fopen("/var/state/pcmcia/stab", "r"); if (!f) f = fopen("/var/lib/pcmcia/stab", "r"); if ( f ) { char line[1024]; char devtype[80]; char devname[80]; while ( fgets( line, 1024, f ) ) { // 0 ide ide-cs 0 hda 3 0 if ( sscanf(line,"%*d %s %*s %*s %s", devtype, devname )==2 ) { if ( QString(devtype) == "ide" && m.find(devname)>0 ) { fclose(f); return TRUE; } } } fclose(f); } return FALSE; } StorageInfo::StorageInfo( QObject *parent ) : QObject( parent ) { mFileSystems.setAutoDelete( TRUE ); channel = new QCopChannel( "QPE/Card", this ); connect( channel, SIGNAL(received(const QCString &, const QByteArray &)), this, SLOT(cardMessage( const QCString &, const QByteArray &)) ); update(); } const FileSystem *StorageInfo::fileSystemOf( const QString &filename ) { for (QListIterator<FileSystem> i(mFileSystems); i.current(); ++i) { if ( filename.startsWith( (*i)->path() ) ) return (*i); } return 0; } void StorageInfo::cardMessage( const QCString& msg, const QByteArray& ) { if ( msg == "mtabChanged()" ) update(); } // cause of the lack of a d pointer we need // to store informations in a config file :( void StorageInfo::update() { //qDebug("StorageInfo::updating"); #if defined(_OS_LINUX_) || defined(Q_OS_LINUX) struct mntent *me; FILE *mntfp = setmntent( "/etc/mtab", "r" ); QStringList curdisks; QStringList curopts; QStringList curfs; bool rebuild = FALSE; int n=0; if ( mntfp ) { while ( (me = getmntent( mntfp )) != 0 ) { QString fs = me->mnt_fsname; if ( fs.left(7)=="/dev/hd" || fs.left(7)=="/dev/sd" || fs.left(8)=="/dev/mtd" || fs.left(9) == "/dev/mmcd" || fs.left( 14 ) == "/dev/mmc/part1" || fs.left(5)=="tmpfs" ) { n++; curdisks.append(fs); curopts.append( me->mnt_opts ); //qDebug("-->fs %s opts %s", fs.latin1(), me->mnt_opts ); curfs.append( me->mnt_dir ); bool found = FALSE; for (QListIterator<FileSystem> i(mFileSystems); i.current(); ++i) { if ( (*i)->disk() == fs ) { found = TRUE; |