Make a branch to make krunner Good Enough For Aaron™.
[kdebase/uwolfer.git] / workspace / ksysguard / gui / ksgrd / SensorManager.cc
blobd68ece7a9e9a165582aa4d122a120e6089793841
1 /*
2 KSysGuard, the KDE System Guard
4 Copyright (c) 1999 - 2001 Chris Schlaeger <cs@kde.org>
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public
8 License version 2 or at your option version 3 as published by
9 the Free Software Foundation.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 #include <QApplication>
23 #include <kdebug.h>
24 #include <klocale.h>
25 #include <QWidget>
26 #include <QEvent>
27 #include <kconfiggroup.h>
29 #include "SensorShellAgent.h"
30 #include "SensorSocketAgent.h"
32 #include "SensorManager.h"
34 using namespace KSGRD;
36 SensorManager::MessageEvent::MessageEvent( const QString &message )
37 : QEvent( QEvent::User ), mMessage( message )
41 QString SensorManager::MessageEvent::message() const
43 return mMessage;
46 SensorManager* KSGRD::SensorMgr;
48 SensorManager::SensorManager(QObject * parent) : QObject(parent)
50 retranslate();
52 void SensorManager::retranslate()
54 // Fill the sensor description dictionary.
55 mDict.clear();
56 mDict.insert( QLatin1String( "Delta" ), i18n( "Change" ) );
57 mDict.insert( QLatin1String( "Rate" ), i18n( "Rate" ) );
59 mDict.insert( QLatin1String( "cpu" ), i18n( "CPU Load" ) );
60 mDict.insert( QLatin1String( "idle" ), i18n( "Idling" ) );
61 mDict.insert( QLatin1String( "nice" ), i18n( "Nice Load" ) );
62 mDict.insert( QLatin1String( "user" ), i18n( "User Load" ) );
63 mDict.insert( QLatin1String( "sys" ), i18n( "System Load" ) );
64 mDict.insert( QLatin1String( "wait" ), i18n( "Waiting" ) );
65 mDict.insert( QLatin1String( "TotalLoad" ), i18n( "Total Load" ) );
66 mDict.insert( QLatin1String( "mem" ), i18n( "Memory" ) );
67 mDict.insert( QLatin1String( "physical" ), i18n( "Physical Memory" ) );
68 mDict.insert( QLatin1String( "swap" ), i18n( "Swap Memory" ) );
69 mDict.insert( QLatin1String( "cached" ), i18n( "Cached Memory" ) );
70 mDict.insert( QLatin1String( "buf" ), i18n( "Buffered Memory" ) );
71 mDict.insert( QLatin1String( "used" ), i18n( "Used Memory" ) );
72 mDict.insert( QLatin1String( "application" ), i18n( "Application Memory" ) );
73 mDict.insert( QLatin1String( "free" ), i18n( "Free Memory" ) );
74 mDict.insert( QLatin1String( "active" ), i18n( "Active Memory" ) );
75 mDict.insert( QLatin1String( "inactive" ), i18n( "Inactive Memory" ) );
76 mDict.insert( QLatin1String( "wired" ), i18n( "Wired Memory" ) );
77 mDict.insert( QLatin1String( "execpages" ), i18n( "Exec Pages" ) );
78 mDict.insert( QLatin1String( "filepages" ), i18n( "File Pages" ) );
79 mDict.insert( QLatin1String( "pscount" ), i18n( "Process Count" ) );
80 mDict.insert( QLatin1String( "ps" ), i18n( "Process Controller" ) );
81 mDict.insert( QLatin1String( "disk" ), i18n( "Disk Throughput" ) );
82 mDict.insert( QLatin1String( "load" ), i18nc( "CPU Load", "Load" ) );
83 mDict.insert( QLatin1String( "totalio" ), i18n( "Total Accesses" ) );
84 mDict.insert( QLatin1String( "rio" ), i18n( "Read Accesses" ) );
85 mDict.insert( QLatin1String( "wio" ), i18n( "Write Accesses" ) );
86 mDict.insert( QLatin1String( "rblk" ), i18n( "Read Data" ) );
87 mDict.insert( QLatin1String( "wblk" ), i18n( "Written Data" ) );
88 mDict.insert( QLatin1String( "rtim" ), i18n( "Milliseconds spent reading" ) );
89 mDict.insert( QLatin1String( "wtim" ), i18n( "Milliseconds spent writing" ) );
90 mDict.insert( QLatin1String( "ioqueue" ), i18n( "I/Os currently in progress" ) );
91 mDict.insert( QLatin1String( "pageIn" ), i18n( "Pages In" ) );
92 mDict.insert( QLatin1String( "pageOut" ), i18n( "Pages Out" ) );
93 mDict.insert( QLatin1String( "context" ), i18n( "Context Switches" ) );
94 mDict.insert( QLatin1String( "network" ), i18n( "Network" ) );
95 mDict.insert( QLatin1String( "interfaces" ), i18n( "Interfaces" ) );
96 mDict.insert( QLatin1String( "receiver" ), i18n( "Receiver" ) );
97 mDict.insert( QLatin1String( "transmitter" ), i18n( "Transmitter" ) );
98 mDict.insert( QLatin1String( "data" ), i18n( "Data" ) );
99 mDict.insert( QLatin1String( "compressed" ), i18n( "Compressed Packets" ) );
100 mDict.insert( QLatin1String( "drops" ), i18n( "Dropped Packets" ) );
101 mDict.insert( QLatin1String( "errors" ), i18n( "Errors" ) );
102 mDict.insert( QLatin1String( "fifo" ), i18n( "FIFO Overruns" ) );
103 mDict.insert( QLatin1String( "frame" ), i18n( "Frame Errors" ) );
104 mDict.insert( QLatin1String( "multicast" ), i18n( "Multicast" ) );
105 mDict.insert( QLatin1String( "packets" ), i18n( "Packets" ) );
106 mDict.insert( QLatin1String( "carrier" ), i18n( "Carrier" ) );
107 mDict.insert( QLatin1String( "collisions" ), i18n( "Collisions" ) );
108 mDict.insert( QLatin1String( "sockets" ), i18n( "Sockets" ) );
109 mDict.insert( QLatin1String( "count" ), i18n( "Total Number" ) );
110 mDict.insert( QLatin1String( "list" ), i18n( "Table" ) );
111 mDict.insert( QLatin1String( "apm" ), i18n( "Advanced Power Management" ) );
112 mDict.insert( QLatin1String( "acpi" ), i18n( "ACPI" ) );
113 mDict.insert( QLatin1String( "thermal_zone" ), i18n( "Thermal Zone" ) );
114 mDict.insert( QLatin1String( "temperature" ), i18n( "Temperature" ) );
115 mDict.insert( QLatin1String( "fan" ), i18n( "Fan" ) );
116 mDict.insert( QLatin1String( "state" ), i18n( "State" ) );
117 mDict.insert( QLatin1String( "battery" ), i18n( "Battery" ) );
118 mDict.insert( QLatin1String( "batterycharge" ), i18n( "Battery Charge" ) );
119 mDict.insert( QLatin1String( "batteryusage" ), i18n( "Battery Usage" ) );
120 mDict.insert( QLatin1String( "remainingtime" ), i18n( "Remaining Time" ) );
121 mDict.insert( QLatin1String( "interrupts" ), i18n( "Interrupts" ) );
122 mDict.insert( QLatin1String( "loadavg1" ), i18n( "Load Average (1 min)" ) );
123 mDict.insert( QLatin1String( "loadavg5" ), i18n( "Load Average (5 min)" ) );
124 mDict.insert( QLatin1String( "loadavg15" ), i18n( "Load Average (15 min)" ) );
125 mDict.insert( QLatin1String( "clock" ), i18n( "Clock Frequency" ) );
126 mDict.insert( QLatin1String( "lmsensors" ), i18n( "Hardware Sensors" ) );
127 mDict.insert( QLatin1String( "partitions" ), i18n( "Partition Usage" ) );
128 mDict.insert( QLatin1String( "usedspace" ), i18n( "Used Space" ) );
129 mDict.insert( QLatin1String( "freespace" ), i18n( "Free Space" ) );
130 mDict.insert( QLatin1String( "filllevel" ), i18n( "Fill Level" ) );
131 mDict.insert( QLatin1String( "system" ), i18n( "System" ) );
132 mDict.insert( QLatin1String( "uptime" ), i18n( "Uptime" ) );
133 mDict.insert( QLatin1String( "SoftRaid" ), i18n( "Linux Soft Raid (md)" ) );
134 mDict.insert( QLatin1String( "processors" ), i18n( "Processors" ) );
135 mDict.insert( QLatin1String( "cores" ), i18n( "Cores" ) );
137 for ( int i = 0; i < 32; i++ ) {
138 mDict.insert( QLatin1String( "cpu" ) + QString::number( i ), i18n( "CPU %1", i+1 ) );
139 mDict.insert( QLatin1String( "disk" ) + QString::number( i ), i18n( "Disk %1", i+1 ) );
142 for ( int i = 1; i < 6; i++) {
143 mDict.insert( QLatin1String( "fan" ) + QString::number( i ), i18n( "Fan %1", i ) );
144 mDict.insert( QLatin1String( "temp" ) + QString::number( i ), i18n( "Temperature %1", i ) );
147 mDict.insert( QLatin1String( "int00" ), i18n( "Total" ) );
149 QString num;
150 for ( int i = 1; i < 25; i++ ) {
151 num.sprintf( "%.2d", i );
152 mDict.insert( QLatin1String( "int" ) + num, ki18n( "Int %1" ).subs( i - 1, 3 ).toString() );
155 // TODO: translated descriptions not yet implemented.
156 mUnits.clear();
157 mUnits.insert( QLatin1String( "1/s" ), i18nc( "the unit 1 per second", "1/s" ) );
158 mUnits.insert( QLatin1String( "kBytes" ), i18n( "kBytes" ) );
159 mUnits.insert( QLatin1String( "min" ), i18nc( "the unit minutes", "min" ) );
160 mUnits.insert( QLatin1String( "MHz" ), i18nc( "the frequency unit", "MHz" ) );
161 mUnits.insert( QLatin1String( "%" ), i18nc( "a percentage", "%" ) );
163 mTypes.clear();
164 mTypes.insert( QLatin1String( "integer" ), i18n( "Integer Value" ) );
165 mTypes.insert( QLatin1String( "float" ), i18n( "Floating Point Value" ) );
166 mTypes.insert( QLatin1String( "table" ), i18n( "Process Controller" ) );
167 mTypes.insert( QLatin1String( "listview" ), i18n( "Table" ) );
169 mBroadcaster = NULL;
173 SensorManager::~SensorManager()
175 kDebug() << "Deleting manager";
178 bool SensorManager::engage( const QString &hostName, const QString &shell,
179 const QString &command, int port )
181 if ( !mAgents.contains( hostName ) ) {
182 SensorAgent *agent = 0;
184 if ( port == -1 )
185 agent = new SensorShellAgent( this );
186 else
187 agent = new SensorSocketAgent( this );
189 if ( !agent->start( hostName.toAscii(), shell, command, port ) ) {
190 delete agent;
191 return false;
194 mAgents.insert( hostName, agent );
195 connect( agent, SIGNAL( reconfigure( const SensorAgent* ) ),
196 SLOT( reconfigure( const SensorAgent* ) ) );
198 emit update();
199 return true;
202 return false;
205 bool SensorManager::disengage( SensorAgent *agent )
207 if(!agent) return false;
208 const QString key = mAgents.key( const_cast<SensorAgent*>( agent ) );
209 kDebug() << "disengage ";
210 agent->deleteLater();
211 if ( !key.isEmpty() ) {
212 mAgents.remove( key );
214 emit update();
215 return true;
218 return false;
221 bool SensorManager::isConnected( const QString &hostName )
223 return mAgents.contains( hostName );
225 bool SensorManager::disengage( const QString &hostName )
227 if ( mAgents.contains( hostName ) ) {
228 kDebug() << "disengage ";
229 delete mAgents.take( hostName );
231 emit update();
232 return true;
235 return false;
238 bool SensorManager::resynchronize( const QString &hostName )
240 const SensorAgent *agent = mAgents.value( hostName );
242 if ( !agent )
243 return false;
245 QString shell, command;
246 int port;
247 hostInfo( hostName, shell, command, port );
249 mAgents.remove( hostName );
251 kDebug (1215) << "Re-synchronizing connection to " << hostName;
253 return engage( hostName, shell, command );
256 void SensorManager::hostLost( const SensorAgent *agent )
258 emit hostConnectionLost( agent->hostName() );
260 notify( i18n( "Connection to %1 has been lost.", agent->hostName() ) );
263 void SensorManager::notify( const QString &msg ) const
265 /* This function relays text messages to the toplevel widget that
266 * displays the message in a pop-up box. It must be used for objects
267 * that might have been deleted before the pop-up box is closed. */
268 if ( mBroadcaster ) {
269 MessageEvent *event = new MessageEvent( msg );
270 qApp->postEvent( mBroadcaster, event );
274 void SensorManager::setBroadcaster( QWidget *wdg )
276 mBroadcaster = wdg;
279 void SensorManager::reconfigure( const SensorAgent* )
281 emit update();
284 bool SensorManager::sendRequest( const QString &hostName, const QString &req,
285 SensorClient *client, int id )
287 SensorAgent *agent = mAgents.value( hostName );
288 if ( !agent && hostName == "localhost") {
289 //we should always be able to reconnect to localhost
290 engage("localhost", "", "ksysguardd", -1);
291 agent = mAgents.value( hostName );
293 if ( agent ) {
294 agent->sendRequest( req, client, id );
295 return true;
298 return false;
301 const QString SensorManager::hostName( const SensorAgent *agent ) const
303 return mAgents.key( const_cast<SensorAgent*>( agent ) );
306 bool SensorManager::hostInfo( const QString &hostName, QString &shell,
307 QString &command, int &port )
309 const SensorAgent *agent = mAgents.value( hostName );
310 if ( agent ) {
311 agent->hostInfo( shell, command, port );
312 return true;
315 return false;
318 QString SensorManager::translateUnit( const QString &unit ) const
320 if ( !unit.isEmpty() && mUnits.contains( unit ) )
321 return mUnits[ unit ];
322 else
323 return unit;
326 QString SensorManager::translateSensorPath( const QString &path ) const
328 if ( !path.isEmpty() && mDict.contains( path ) )
329 return mDict[ path ];
330 else
331 return path;
334 QString SensorManager::translateSensorType( const QString &type ) const
336 if ( !type.isEmpty() && mTypes.contains( type ) )
337 return mTypes[ type ];
338 else
339 return type;
342 QString SensorManager::translateSensor( const QString &sensor ) const
344 QString token, out;
345 int start = 0, end = 0;
346 for ( ; ; ) {
347 end = sensor.indexOf( '/', start );
348 if ( end > 0 )
349 out += translateSensorPath( sensor.mid( start, end - start ) ) + '/';
350 else {
351 out += translateSensorPath( sensor.right( sensor.length() - start ) );
352 break;
354 start = end + 1;
357 return out;
360 void SensorManager::readProperties( const KConfigGroup& cfg )
362 mHostList = cfg.readEntry( "HostList" ,QStringList());
363 mCommandList = cfg.readEntry( "CommandList",QStringList() );
366 void
367 SensorManager::saveProperties( KConfigGroup &cfg )
369 cfg.writeEntry( "HostList", mHostList );
370 cfg.writeEntry( "CommandList", mCommandList );
373 void SensorManager::disconnectClient( SensorClient *client )
375 QHashIterator<QString, SensorAgent*> it( mAgents );
377 while ( it.hasNext() )
378 it.next().value()->disconnectClient( client );
381 #include "SensorManager.moc"