disksensor.cpp
00001 /*************************************************************************** 00002 * Copyright (C) 2003 by Hans Karlsson * 00003 * karlsson.h@home.se * 00004 * * 00005 * This program is free software; you can redistribute it and/or modify * 00006 * it under the terms of the GNU General Public License as published by * 00007 * the Free Software Foundation; either version 2 of the License, or * 00008 * (at your option) any later version. * 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 // update values on startup 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 //TQRegExp rx( "^(/dev/).*(/\\S*)$"); 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"