00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "disksensor.h"
00011
00012 #include <tqfile.h>
00013 #include <tqtextstream.h>
00014 #include <tqstring.h>
00015 #include <tqregexp.h>
00016 #include <kprocess.h>
00017 #include <kprocio.h>
00018
00019 DiskSensor::DiskSensor( int msec ) : Sensor( msec )
00020 {
00021 connect(&ksp, TQT_SIGNAL(receivedStdout(TDEProcess *, char *, int )),
00022 this,TQT_SLOT(receivedStdout(TDEProcess *, char *, int )));
00023 connect(&ksp, TQT_SIGNAL(processExited(TDEProcess *)),
00024 this,TQT_SLOT(processExited( TDEProcess * )));
00025
00026
00027 ksp.clearArguments();
00028 ksp << "df";
00029 ksp.start( KProcIO::Block,KProcIO::Stdout);
00030 init = 1;
00031 }
00032 DiskSensor::~DiskSensor()
00033 {}
00034
00035 long DiskSensor::getFreeSpace(TQString mntPt) const
00036 {
00037 TQRegExp rx( "^\\S*\\s*\\d+\\s+\\d+\\s+(\\d+)");
00038 rx.search(mntMap[mntPt]);
00039 return rx.cap(1).toLong();
00040 }
00041
00042 long DiskSensor::getUsedSpace(TQString mntPt) const
00043 {
00044 TQRegExp rx( "^\\S*\\s*\\d+\\s+(\\d+)\\s+\\d+");
00045 rx.search(mntMap[mntPt]);
00046 return rx.cap(1).toLong();
00047 }
00048
00049 long DiskSensor::getTotalSpace(TQString mntPt) const
00050 {
00051
00052 TQRegExp rx( "^\\S*\\s*(\\d+)\\s+\\d+\\s+\\d+");
00053 rx.search(mntMap[mntPt]);
00054
00055 return rx.cap(1).toLong();
00056
00057 }
00058
00059 int DiskSensor::getPercentUsed(TQString mntPt) const
00060 {
00061 TQRegExp rx( "\\s+(\\d+)%\\s+");
00062 rx.search(mntMap[mntPt]);
00063 return rx.cap(1).toInt();
00064 }
00065
00066 int DiskSensor::getPercentFree(TQString mntPt) const
00067 {
00068 return ( 100 - getPercentUsed( mntPt ) );
00069 }
00070
00071 void DiskSensor::receivedStdout(TDEProcess *, char *buffer, int len )
00072 {
00073
00074 buffer[len] = 0;
00075 sensorResult += TQString( TQCString(buffer) );
00076
00077 }
00078
00079 void DiskSensor::processExited(TDEProcess *)
00080 {
00081 TQStringList stringList = TQStringList::split('\n',sensorResult);
00082 sensorResult = "";
00083 TQStringList::Iterator it = stringList.begin();
00084
00085 TQRegExp rx( ".*\\s+(/\\S*)$");
00086
00087 while( it != stringList.end())
00088 {
00089 rx.search( *it );
00090 if ( !rx.cap(0).isEmpty())
00091 {
00092 mntMap[rx.cap(1)] = *it;
00093 }
00094 it++;
00095 }
00096 stringList.clear();
00097
00098 TQString format;
00099 TQString mntPt;
00100 SensorParams *sp;
00101 Meter *meter;
00102
00103 TQObjectListIt lit( *objList );
00104 while (lit != 0)
00105 {
00106 sp = (SensorParams*)(*lit);
00107 meter = sp->getMeter();
00108 format = sp->getParam("FORMAT");
00109 mntPt = sp->getParam("MOUNTPOINT");
00110 if (mntPt.length() == 0)
00111 mntPt="/";
00112
00113 if (format.length() == 0 )
00114 {
00115 format = "%u";
00116 }
00117 format.replace( TQRegExp("%fp", false),TQString::number(getPercentFree(mntPt)));
00118 format.replace( TQRegExp("%fg",false),
00119 TQString::number(getFreeSpace(mntPt)/(1024*1024)));
00120 format.replace( TQRegExp("%fkb",false),
00121 TQString::number(getFreeSpace(mntPt)*8) );
00122 format.replace( TQRegExp("%fk",false),
00123 TQString::number(getFreeSpace(mntPt)) );
00124 format.replace( TQRegExp("%f", false),TQString::number(getFreeSpace(mntPt)/1024));
00125
00126 format.replace( TQRegExp("%up", false),TQString::number(getPercentUsed(mntPt)));
00127 format.replace( TQRegExp("%ug",false),
00128 TQString::number(getUsedSpace(mntPt)/(1024*1024)));
00129 format.replace( TQRegExp("%ukb",false),
00130 TQString::number(getUsedSpace(mntPt)*8) );
00131 format.replace( TQRegExp("%uk",false),
00132 TQString::number(getUsedSpace(mntPt)) );
00133 format.replace( TQRegExp("%u", false),TQString::number(getUsedSpace(mntPt)/1024));
00134
00135 format.replace( TQRegExp("%tg",false),
00136 TQString::number(getTotalSpace(mntPt)/(1024*1024)));
00137 format.replace( TQRegExp("%tkb",false),
00138 TQString::number(getTotalSpace(mntPt)*8));
00139 format.replace( TQRegExp("%tk",false),
00140 TQString::number(getTotalSpace(mntPt)));
00141 format.replace( TQRegExp("%t", false),TQString::number(getTotalSpace(mntPt)/1024));
00142 meter->setValue(format);
00143 ++lit;
00144 }
00145 if ( init == 1 )
00146 {
00147 emit initComplete();
00148 init = 0;
00149 }
00150 }
00151
00152 void DiskSensor::update()
00153 {
00154 ksp.clearArguments();
00155 ksp << "df";
00156 ksp.start( KProcIO::NotifyOnExit,KProcIO::Stdout);
00157 }
00158
00159 void DiskSensor::setMaxValue( SensorParams *sp )
00160 {
00161 Meter *meter;
00162 meter = sp->getMeter();
00163 const TQString mntPt = sp->getParam( "MOUNTPOINT" );
00164
00165 TQString f;
00166 f = sp->getParam("FORMAT");
00167 if( f == "%fp" || f == "%up" )
00168 meter->setMax( 100 );
00169 else
00170 meter->setMax( getTotalSpace( mntPt ) / 1024 );
00171 }
00172
00173
00174
00175 #include "disksensor.moc"