tderootsystemdevice.cpp
00001 /* This file is part of the TDE libraries 00002 Copyright (C) 2012 Timothy Pearson <kb9vqf@pearsoncomputing.net> 00003 (C) 2013 Golubev Alexander <fatzer2@gmail.com> 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Library General Public 00007 License version 2 as published by the Free Software Foundation. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public License 00015 along with this library; see the file COPYING.LIB. If not, write to 00016 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 00017 Boston, MA 02110-1301, USA. 00018 */ 00019 00020 #include "tderootsystemdevice.h" 00021 #include "tdestoragedevice.h" 00022 00023 #include <unistd.h> 00024 00025 #include <tqfile.h> 00026 00027 #include <dcopclient.h> 00028 #include "tdeglobal.h" 00029 #include "tdeconfig.h" 00030 #include "tdeapplication.h" 00031 #include "kstandarddirs.h" 00032 00033 #include "config.h" 00034 00035 #if defined(WITH_TDEHWLIB_DAEMONS) || defined(WITH_UPOWER) || defined(WITH_DEVKITPOWER) || defined(WITH_HAL) || defined(WITH_CONSOLEKIT) 00036 #include <tqdbusdata.h> 00037 #include <tqdbusmessage.h> 00038 #include <tqdbusproxy.h> 00039 #include <tqdbusvariant.h> 00040 #include <tqdbusconnection.h> 00041 #endif // defined(WITH_TDEHWLIB_DAEMONS) || defined(WITH_UPOWER) || defined(WITH_DEVKITPOWER) || defined(WITH_HAL) || defined(WITH_CONSOLEKIT) 00042 00043 TDERootSystemDevice::TDERootSystemDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn) : TDEGenericDevice(dt, dn) { 00044 m_hibernationSpace = -1; 00045 } 00046 00047 TDERootSystemDevice::~TDERootSystemDevice() { 00048 } 00049 00050 TDESystemFormFactor::TDESystemFormFactor TDERootSystemDevice::formFactor() { 00051 return m_formFactor; 00052 } 00053 00054 void TDERootSystemDevice::internalSetFormFactor(TDESystemFormFactor::TDESystemFormFactor ff) { 00055 m_formFactor = ff; 00056 } 00057 00058 TDESystemPowerStateList TDERootSystemDevice::powerStates() { 00059 return m_powerStates; 00060 } 00061 00062 void TDERootSystemDevice::internalSetPowerStates(TDESystemPowerStateList ps) { 00063 m_powerStates = ps; 00064 } 00065 00066 TDESystemHibernationMethodList TDERootSystemDevice::hibernationMethods() { 00067 return m_hibernationMethods; 00068 } 00069 00070 void TDERootSystemDevice::internalSetHibernationMethods(TDESystemHibernationMethodList hm) { 00071 m_hibernationMethods = hm; 00072 } 00073 00074 TDESystemHibernationMethod::TDESystemHibernationMethod TDERootSystemDevice::hibernationMethod() { 00075 return m_hibernationMethod; 00076 } 00077 00078 void TDERootSystemDevice::internalSetHibernationMethod(TDESystemHibernationMethod::TDESystemHibernationMethod hm) { 00079 m_hibernationMethod = hm; 00080 } 00081 00082 unsigned long TDERootSystemDevice::diskSpaceNeededForHibernation() { 00083 return m_hibernationSpace; 00084 } 00085 00086 void TDERootSystemDevice::internalSetDiskSpaceNeededForHibernation(unsigned long sz) { 00087 m_hibernationSpace = sz; 00088 } 00089 00090 bool TDERootSystemDevice::canSetHibernationMethod() { 00091 TQString hibernationnode = "/sys/power/disk"; 00092 int rval = access (hibernationnode.ascii(), W_OK); 00093 if (rval == 0) { 00094 return TRUE; 00095 } 00096 00097 #ifdef WITH_TDEHWLIB_DAEMONS 00098 { 00099 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00100 if (dbusConn.isConnected()) { 00101 // can set hibernation method? 00102 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00103 "org.trinitydesktop.hardwarecontrol", 00104 "/org/trinitydesktop/hardwarecontrol", 00105 "org.trinitydesktop.hardwarecontrol.Power", 00106 "CanSetHibernationMethod"); 00107 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00108 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00109 return reply[0].toBool(); 00110 } 00111 } 00112 } 00113 #endif // WITH_TDEHWLIB_DAEMONS 00114 00115 return FALSE; 00116 } 00117 00118 bool TDERootSystemDevice::canStandby() { 00119 TQString statenode = "/sys/power/state"; 00120 int rval = access (statenode.ascii(), W_OK); 00121 if (rval == 0) { 00122 if (powerStates().contains(TDESystemPowerState::Standby)) { 00123 return TRUE; 00124 } 00125 else { 00126 return FALSE; 00127 } 00128 } 00129 00130 #ifdef WITH_TDEHWLIB_DAEMONS 00131 { 00132 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00133 if (dbusConn.isConnected()) { 00134 // can standby? 00135 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00136 "org.trinitydesktop.hardwarecontrol", 00137 "/org/trinitydesktop/hardwarecontrol", 00138 "org.trinitydesktop.hardwarecontrol.Power", 00139 "CanStandby"); 00140 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00141 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00142 return reply[0].toBool(); 00143 } 00144 } 00145 } 00146 #endif // WITH_TDEHWLIB_DAEMONS 00147 00148 return FALSE; 00149 } 00150 00151 bool TDERootSystemDevice::canFreeze() { 00152 TQString statenode = "/sys/power/state"; 00153 int rval = access (statenode.ascii(), W_OK); 00154 if (rval == 0) { 00155 if (powerStates().contains(TDESystemPowerState::Freeze)) { 00156 return TRUE; 00157 } 00158 else { 00159 return FALSE; 00160 } 00161 } 00162 00163 #ifdef WITH_TDEHWLIB_DAEMONS 00164 { 00165 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00166 if (dbusConn.isConnected()) { 00167 // can freeze? 00168 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00169 "org.trinitydesktop.hardwarecontrol", 00170 "/org/trinitydesktop/hardwarecontrol", 00171 "org.trinitydesktop.hardwarecontrol.Power", 00172 "CanFreeze"); 00173 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00174 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00175 return reply[0].toBool(); 00176 } 00177 } 00178 } 00179 #endif // WITH_TDEHWLIB_DAEMONS 00180 00181 return FALSE; 00182 } 00183 00184 bool TDERootSystemDevice::canSuspend() { 00185 TQString statenode = "/sys/power/state"; 00186 int rval = access (statenode.ascii(), W_OK); 00187 if (rval == 0) { 00188 if (powerStates().contains(TDESystemPowerState::Suspend)) { 00189 return TRUE; 00190 } 00191 else { 00192 return FALSE; 00193 } 00194 } 00195 00196 #ifdef WITH_LOGINDPOWER 00197 { 00198 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00199 if (dbusConn.isConnected()) { 00200 // can suspend? 00201 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00202 "org.freedesktop.login1", 00203 "/org/freedesktop/login1", 00204 "org.freedesktop.login1.Manager", 00205 "CanSuspend"); 00206 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00207 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00208 return (reply[0].toString() == "yes"); 00209 } 00210 } 00211 } 00212 #endif // WITH_LOGINDPOWER 00213 00214 #ifdef WITH_UPOWER 00215 { 00216 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00217 if (dbusConn.isConnected()) { 00218 TQT_DBusProxy upowerProperties("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.DBus.Properties", dbusConn); 00219 if (upowerProperties.canSend()) { 00220 // can suspend? 00221 TQValueList<TQT_DBusData> params; 00222 params << TQT_DBusData::fromString(upowerProperties.interface()) << TQT_DBusData::fromString("CanSuspend"); 00223 TQT_DBusMessage reply = upowerProperties.sendWithReply("Get", params); 00224 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00225 return reply[0].toVariant().value.toBool(); 00226 } 00227 } 00228 } 00229 } 00230 #endif// WITH_UPOWER 00231 00232 #ifdef WITH_DEVKITPOWER 00233 { 00234 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00235 if (dbusConn.isConnected()) { 00236 TQT_DBusProxy devkitpowerProperties("org.freedesktop.DeviceKit.Power", "/org/freedesktop/DeviceKit/Power", "org.freedesktop.DBus.Properties", dbusConn); 00237 if (devkitpowerProperties.canSend()) { 00238 // can suspend? 00239 TQValueList<TQT_DBusData> params; 00240 params << TQT_DBusData::fromString(devkitpowerProperties.interface()) << TQT_DBusData::fromString("CanSuspend"); 00241 TQT_DBusMessage reply = devkitpowerProperties.sendWithReply("Get", params); 00242 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00243 return reply[0].toVariant().value.toBool(); 00244 } 00245 } 00246 } 00247 } 00248 #endif// WITH_DEVKITPOWER 00249 00250 #ifdef WITH_HAL 00251 { 00252 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00253 if (dbusConn.isConnected()) { 00254 TQT_DBusProxy halProperties("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device", dbusConn); 00255 if (halProperties.canSend()) { 00256 // can suspend? 00257 TQValueList<TQT_DBusData> params; 00258 TQT_DBusMessage reply; 00259 params.clear(); 00260 params << TQT_DBusData::fromString("power_management.can_suspend"); 00261 reply = halProperties.sendWithReply("GetPropertyBoolean", params); 00262 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00263 return reply[0].toBool(); 00264 } 00265 params.clear(); 00266 params << TQT_DBusData::fromString("power_management.can_suspend_to_ram"); 00267 reply = halProperties.sendWithReply("GetPropertyBoolean", params); 00268 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00269 return reply[0].toBool(); 00270 } 00271 } 00272 } 00273 } 00274 #endif // WITH_HAL 00275 00276 #ifdef WITH_TDEHWLIB_DAEMONS 00277 { 00278 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00279 if (dbusConn.isConnected()) { 00280 // can suspend? 00281 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00282 "org.trinitydesktop.hardwarecontrol", 00283 "/org/trinitydesktop/hardwarecontrol", 00284 "org.trinitydesktop.hardwarecontrol.Power", 00285 "CanSuspend"); 00286 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00287 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00288 return reply[0].toBool(); 00289 } 00290 } 00291 } 00292 #endif // WITH_TDEHWLIB_DAEMONS 00293 00294 return FALSE; 00295 } 00296 00297 bool TDERootSystemDevice::canHibernate() { 00298 TQString statenode = "/sys/power/state"; 00299 int rval = access (statenode.ascii(), W_OK); 00300 if (rval == 0) { 00301 if (powerStates().contains(TDESystemPowerState::Hibernate)) { 00302 return TRUE; 00303 } 00304 else { 00305 return FALSE; 00306 } 00307 } 00308 00309 #ifdef WITH_LOGINDPOWER 00310 { 00311 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00312 if (dbusConn.isConnected()) { 00313 // can hibernate? 00314 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00315 "org.freedesktop.login1", 00316 "/org/freedesktop/login1", 00317 "org.freedesktop.login1.Manager", 00318 "CanHibernate"); 00319 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00320 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00321 return (reply[0].toString() == "yes"); 00322 } 00323 } 00324 } 00325 #endif // WITH_LOGINDPOWER 00326 00327 #ifdef WITH_UPOWER 00328 { 00329 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00330 if (dbusConn.isConnected()) { 00331 TQT_DBusProxy upowerProperties("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.DBus.Properties", dbusConn); 00332 if (upowerProperties.canSend()) { 00333 // can hibernate? 00334 TQValueList<TQT_DBusData> params; 00335 params << TQT_DBusData::fromString(upowerProperties.interface()) << TQT_DBusData::fromString("CanHibernate"); 00336 TQT_DBusMessage reply = upowerProperties.sendWithReply("Get", params); 00337 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00338 return reply[0].toVariant().value.toBool(); 00339 } 00340 } 00341 } 00342 } 00343 #endif// WITH_UPOWER 00344 00345 #ifdef WITH_DEVKITPOWER 00346 { 00347 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00348 if (dbusConn.isConnected()) { 00349 TQT_DBusProxy devkitpowerProperties("org.freedesktop.DeviceKit.Power", "/org/freedesktop/DeviceKit/Power", "org.freedesktop.DBus.Properties", dbusConn); 00350 if (devkitpowerProperties.canSend()) { 00351 // can hibernate? 00352 TQValueList<TQT_DBusData> params; 00353 params << TQT_DBusData::fromString(devkitpowerProperties.interface()) << TQT_DBusData::fromString("CanHibernate"); 00354 TQT_DBusMessage reply = devkitpowerProperties.sendWithReply("Get", params); 00355 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00356 return reply[0].toVariant().value.toBool(); 00357 } 00358 } 00359 } 00360 } 00361 #endif// WITH_DEVKITPOWER 00362 00363 #ifdef WITH_HAL 00364 { 00365 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00366 if (dbusConn.isConnected()) { 00367 TQT_DBusProxy halProperties("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device", dbusConn); 00368 if (halProperties.canSend()) { 00369 // can hibernate? 00370 TQValueList<TQT_DBusData> params; 00371 TQT_DBusMessage reply; 00372 params.clear(); 00373 params << TQT_DBusData::fromString("power_management.can_hibernate"); 00374 reply = halProperties.sendWithReply("GetPropertyBoolean", params); 00375 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00376 return reply[0].toBool(); 00377 } 00378 params.clear(); 00379 params << TQT_DBusData::fromString("power_management.can_suspend_to_disk"); 00380 reply = halProperties.sendWithReply("GetPropertyBoolean", params); 00381 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00382 return reply[0].toBool(); 00383 } 00384 } 00385 } 00386 } 00387 #endif // WITH_HAL 00388 00389 #ifdef WITH_TDEHWLIB_DAEMONS 00390 { 00391 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00392 if (dbusConn.isConnected()) { 00393 // can hibernate? 00394 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00395 "org.trinitydesktop.hardwarecontrol", 00396 "/org/trinitydesktop/hardwarecontrol", 00397 "org.trinitydesktop.hardwarecontrol.Power", 00398 "CanHibernate"); 00399 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00400 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00401 return reply[0].toBool(); 00402 } 00403 } 00404 } 00405 #endif // WITH_TDEHWLIB_DAEMONS 00406 00407 return FALSE; 00408 } 00409 00410 bool TDERootSystemDevice::canPowerOff() { 00411 TDEConfig config("ksmserverrc", true); 00412 config.setGroup("General" ); 00413 if (!config.readBoolEntry( "offerShutdown", true )) { 00414 return FALSE; 00415 } 00416 00417 #ifdef WITH_LOGINDPOWER 00418 { 00419 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00420 if (dbusConn.isConnected()) { 00421 // can power off? 00422 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00423 "org.freedesktop.login1", 00424 "/org/freedesktop/login1", 00425 "org.freedesktop.login1.Manager", 00426 "CanPowerOff"); 00427 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00428 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00429 return (reply[0].toString() == "yes"); 00430 } 00431 } 00432 } 00433 #endif // WITH_LOGINDPOWER 00434 00435 #ifdef WITH_CONSOLEKIT 00436 { 00437 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00438 if (dbusConn.isConnected()) { 00439 // can power off? 00440 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00441 "org.freedesktop.ConsoleKit", 00442 "/org/freedesktop/ConsoleKit/Manager", 00443 "org.freedesktop.ConsoleKit.Manager", 00444 "CanStop"); 00445 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00446 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00447 return reply[0].toBool(); 00448 } 00449 } 00450 } 00451 #endif // WITH_CONSOLEKIT 00452 00453 // FIXME 00454 // Can we power down this system? 00455 // This should probably be checked via DCOP and therefore interface with TDM 00456 // if ( DM().canShutdown() ) { 00457 // return TRUE; 00458 // } 00459 return TRUE; 00460 } 00461 00462 bool TDERootSystemDevice::canReboot() { 00463 TDEConfig config("ksmserverrc", true); 00464 config.setGroup("General" ); 00465 if (!config.readBoolEntry( "offerShutdown", true )) { 00466 return FALSE; 00467 } 00468 00469 #ifdef WITH_LOGINDPOWER 00470 { 00471 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00472 if (dbusConn.isConnected()) { 00473 // can reboot? 00474 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00475 "org.freedesktop.login1", 00476 "/org/freedesktop/login1", 00477 "org.freedesktop.login1.Manager", 00478 "CanReboot"); 00479 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00480 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00481 return (reply[0].toString() == "yes"); 00482 } 00483 } 00484 } 00485 #endif // WITH_LOGINDPOWER 00486 00487 #ifdef WITH_CONSOLEKIT 00488 { 00489 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00490 if (dbusConn.isConnected()) { 00491 // can reboot? 00492 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00493 "org.freedesktop.ConsoleKit", 00494 "/org/freedesktop/ConsoleKit/Manager", 00495 "org.freedesktop.ConsoleKit.Manager", 00496 "CanRestart"); 00497 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00498 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { 00499 return reply[0].toBool(); 00500 } 00501 } 00502 } 00503 #endif // WITH_CONSOLEKIT 00504 00505 // FIXME 00506 // Can we power down this system? 00507 // This should probably be checked via DCOP and therefore interface with TDM 00508 // if ( DM().canShutdown() ) { 00509 // return TRUE; 00510 // } 00511 return TRUE; 00512 } 00513 00514 void TDERootSystemDevice::setHibernationMethod(TDESystemHibernationMethod::TDESystemHibernationMethod hm) { 00515 TQString hibernationnode = "/sys/power/disk"; 00516 TQFile file( hibernationnode ); 00517 if ( file.open( IO_WriteOnly ) ) { 00518 TQString hibernationCommand; 00519 if (hm == TDESystemHibernationMethod::Platform) { 00520 hibernationCommand = "platform"; 00521 } 00522 if (hm == TDESystemHibernationMethod::Shutdown) { 00523 hibernationCommand = "shutdown"; 00524 } 00525 if (hm == TDESystemHibernationMethod::Reboot) { 00526 hibernationCommand = "reboot"; 00527 } 00528 if (hm == TDESystemHibernationMethod::TestProc) { 00529 hibernationCommand = "testproc"; 00530 } 00531 if (hm == TDESystemHibernationMethod::Test) { 00532 hibernationCommand = "test"; 00533 } 00534 TQTextStream stream( &file ); 00535 stream << hibernationCommand; 00536 file.close(); 00537 return; 00538 } 00539 00540 #ifdef WITH_TDEHWLIB_DAEMONS 00541 { 00542 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00543 if (dbusConn.isConnected()) { 00544 TQT_DBusProxy hardwareControl("org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", dbusConn); 00545 if (hardwareControl.canSend()) { 00546 // set hibernation method 00547 TQValueList<TQT_DBusData> params; 00548 TQString hibernationCommand; 00549 if (hm == TDESystemHibernationMethod::Platform) { 00550 hibernationCommand = "platform"; 00551 } 00552 if (hm == TDESystemHibernationMethod::Shutdown) { 00553 hibernationCommand = "shutdown"; 00554 } 00555 if (hm == TDESystemHibernationMethod::Reboot) { 00556 hibernationCommand = "reboot"; 00557 } 00558 if (hm == TDESystemHibernationMethod::TestProc) { 00559 hibernationCommand = "testproc"; 00560 } 00561 if (hm == TDESystemHibernationMethod::Test) { 00562 hibernationCommand = "test"; 00563 } 00564 params << TQT_DBusData::fromString(hibernationCommand); 00565 TQT_DBusMessage reply = hardwareControl.sendWithReply("SetHibernationMethod", params); 00566 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00567 return; 00568 } 00569 } 00570 } 00571 } 00572 #endif // WITH_TDEHWLIB_DAEMONS 00573 00574 } 00575 00576 bool TDERootSystemDevice::setPowerState(TDESystemPowerState::TDESystemPowerState ps) { 00577 if ((ps == TDESystemPowerState::Standby) || (ps == TDESystemPowerState::Freeze) || (ps == TDESystemPowerState::Suspend) || (ps == TDESystemPowerState::Hibernate)) { 00578 TQString statenode = "/sys/power/state"; 00579 TQFile file( statenode ); 00580 if ( file.open( IO_WriteOnly ) ) { 00581 TQString powerCommand; 00582 if (ps == TDESystemPowerState::Standby) { 00583 powerCommand = "standby"; 00584 } 00585 if (ps == TDESystemPowerState::Freeze) { 00586 powerCommand = "freeze"; 00587 } 00588 if (ps == TDESystemPowerState::Suspend) { 00589 powerCommand = "mem"; 00590 } 00591 if (ps == TDESystemPowerState::Hibernate) { 00592 powerCommand = "disk"; 00593 } 00594 TQTextStream stream( &file ); 00595 stream << powerCommand; 00596 file.close(); 00597 return true; 00598 } 00599 00600 #ifdef WITH_LOGINDPOWER 00601 { 00602 // No support for "freeze" and "standby" in org.freedesktop.login1 00603 TQT_DBusConnection dbusConn; 00604 dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00605 if ( dbusConn.isConnected() ) { 00606 TQT_DBusProxy logindProxy("org.freedesktop.login1", "/org/freedesktop/login1", 00607 "org.freedesktop.login1.Manager", dbusConn); 00608 TQValueList<TQT_DBusData> params; 00609 params << TQT_DBusData::fromBool(true); 00610 if (logindProxy.canSend()) { 00611 if (ps == TDESystemPowerState::Suspend) { 00612 TQT_DBusMessage reply = logindProxy.sendWithReply("Suspend", params); 00613 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00614 return true; 00615 } 00616 } 00617 else if (ps == TDESystemPowerState::Hibernate) { 00618 TQT_DBusMessage reply = logindProxy.sendWithReply("Hibernate", params); 00619 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00620 return true; 00621 } 00622 } 00623 } 00624 } 00625 } 00626 #endif // WITH_LOGINDPOWER 00627 00628 #ifdef WITH_UPOWER 00629 { 00630 TQT_DBusConnection dbusConn; 00631 dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00632 if ( dbusConn.isConnected() ) { 00633 if (ps == TDESystemPowerState::Suspend) { 00634 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00635 "org.freedesktop.UPower", 00636 "/org/freedesktop/UPower", 00637 "org.freedesktop.UPower", 00638 "Suspend"); 00639 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00640 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00641 return true; 00642 } 00643 } 00644 else if (ps == TDESystemPowerState::Hibernate) { 00645 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00646 "org.freedesktop.UPower", 00647 "/org/freedesktop/UPower", 00648 "org.freedesktop.UPower", 00649 "Hibernate"); 00650 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00651 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00652 return true; 00653 } 00654 } 00655 } 00656 } 00657 #endif // WITH_UPOWER 00658 00659 #ifdef WITH_DEVKITPOWER 00660 { 00661 TQT_DBusConnection dbusConn; 00662 dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00663 if ( dbusConn.isConnected() ) { 00664 if (ps == TDESystemPowerState::Suspend) { 00665 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00666 "org.freedesktop.DeviceKit.Power", 00667 "/org/freedesktop/DeviceKit/Power", 00668 "org.freedesktop.DeviceKit.Power", 00669 "Suspend"); 00670 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00671 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00672 return true; 00673 } 00674 } 00675 else if (ps == TDESystemPowerState::Hibernate) { 00676 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00677 "org.freedesktop.DeviceKit.Power", 00678 "/org/freedesktop/DeviceKit/Power", 00679 "org.freedesktop.DeviceKit.Power", 00680 "Hibernate"); 00681 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00682 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00683 return true; 00684 } 00685 } 00686 } 00687 } 00688 #endif // WITH_DEVKITPOWER 00689 00690 #ifdef WITH_HAL 00691 { 00692 TQT_DBusConnection dbusConn; 00693 dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00694 if ( dbusConn.isConnected() ) { 00695 if (ps == TDESystemPowerState::Suspend) { 00696 TQT_DBusProxy halPowerManagement( 00697 "org.freedesktop.Hal", 00698 "/org/freedesktop/Hal/devices/computer", 00699 "org.freedesktop.Hal.Device.SystemPowerManagement", 00700 dbusConn); 00701 TQValueList<TQT_DBusData> params; 00702 params << TQT_DBusData::fromInt32(0); 00703 TQT_DBusMessage reply = halPowerManagement.sendWithReply("Suspend", params); 00704 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00705 return true; 00706 } 00707 } 00708 else if (ps == TDESystemPowerState::Hibernate) { 00709 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00710 "org.freedesktop.Hal", 00711 "/org/freedesktop/Hal/devices/computer", 00712 "org.freedesktop.Hal.Device.SystemPowerManagement", 00713 "Hibernate"); 00714 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00715 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00716 return true; 00717 } 00718 } 00719 } 00720 } 00721 #endif // WITH_HAL 00722 00723 #ifdef WITH_TDEHWLIB_DAEMONS 00724 { 00725 TQT_DBusConnection dbusConn; 00726 dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00727 if ( dbusConn.isConnected() ) { 00728 if (ps == TDESystemPowerState::Standby) { 00729 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00730 "org.trinitydesktop.hardwarecontrol", 00731 "/org/trinitydesktop/hardwarecontrol", 00732 "org.trinitydesktop.hardwarecontrol.Power", 00733 "Standby"); 00734 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00735 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00736 return true; 00737 } 00738 } 00739 else if (ps == TDESystemPowerState::Freeze) { 00740 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00741 "org.trinitydesktop.hardwarecontrol", 00742 "/org/trinitydesktop/hardwarecontrol", 00743 "org.trinitydesktop.hardwarecontrol.Power", 00744 "Freeze"); 00745 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00746 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00747 return true; 00748 } 00749 } 00750 else if (ps == TDESystemPowerState::Suspend) { 00751 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00752 "org.trinitydesktop.hardwarecontrol", 00753 "/org/trinitydesktop/hardwarecontrol", 00754 "org.trinitydesktop.hardwarecontrol.Power", 00755 "Suspend"); 00756 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00757 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00758 return true; 00759 } 00760 } 00761 else if (ps == TDESystemPowerState::Hibernate) { 00762 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00763 "org.trinitydesktop.hardwarecontrol", 00764 "/org/trinitydesktop/hardwarecontrol", 00765 "org.trinitydesktop.hardwarecontrol.Power", 00766 "Hibernate"); 00767 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00768 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00769 return true; 00770 } 00771 } 00772 } 00773 } 00774 #endif // WITH_TDEHWLIB_DAEMONS 00775 00776 return false; 00777 } 00778 else if (ps == TDESystemPowerState::PowerOff) { 00779 TDEConfig config("ksmserverrc", true); 00780 config.setGroup("General" ); 00781 if (!config.readBoolEntry( "offerShutdown", true )) { 00782 return false; 00783 } 00784 #ifdef WITH_LOGINDPOWER 00785 { 00786 TQT_DBusConnection dbusConn; 00787 dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00788 if ( dbusConn.isConnected() ) { 00789 TQT_DBusProxy logindProxy("org.freedesktop.login1", "/org/freedesktop/login1", 00790 "org.freedesktop.login1.Manager", dbusConn); 00791 TQValueList<TQT_DBusData> params; 00792 params << TQT_DBusData::fromBool(true); 00793 if (logindProxy.canSend()) { 00794 TQT_DBusMessage reply = logindProxy.sendWithReply("PowerOff", params); 00795 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00796 return true; 00797 } 00798 } 00799 } 00800 } 00801 #endif // WITH_LOGINDPOWER 00802 #ifdef WITH_CONSOLEKIT 00803 { 00804 TQT_DBusConnection dbusConn; 00805 dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00806 if ( dbusConn.isConnected() ) { 00807 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00808 "org.freedesktop.ConsoleKit", 00809 "/org/freedesktop/ConsoleKit/Manager", 00810 "org.freedesktop.ConsoleKit.Manager", 00811 "Stop"); 00812 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00813 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00814 return true; 00815 } 00816 } 00817 } 00818 #endif // WITH_CONSOLEKIT 00819 // Power down the system using a DCOP command 00820 // Values are explained at http://lists.kde.org/?l=kde-linux&m=115770988603387 00821 TQByteArray data; 00822 TQDataStream arg(data, IO_WriteOnly); 00823 arg << (int)0 << (int)2 << (int)2; 00824 if ( kapp->dcopClient()->send("ksmserver", "default", "logout(int,int,int)", data) ) { 00825 return true; 00826 } 00827 return false; 00828 } 00829 else if (ps == TDESystemPowerState::Reboot) { 00830 TDEConfig config("ksmserverrc", true); 00831 config.setGroup("General" ); 00832 if (!config.readBoolEntry( "offerShutdown", true )) { 00833 return false; 00834 } 00835 #ifdef WITH_LOGINDPOWER 00836 { 00837 TQT_DBusConnection dbusConn; 00838 dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00839 if ( dbusConn.isConnected() ) { 00840 TQT_DBusProxy logindProxy("org.freedesktop.login1", "/org/freedesktop/login1", 00841 "org.freedesktop.login1.Manager", dbusConn); 00842 TQValueList<TQT_DBusData> params; 00843 params << TQT_DBusData::fromBool(true); 00844 if (logindProxy.canSend()) { 00845 TQT_DBusMessage reply = logindProxy.sendWithReply("Reboot", params); 00846 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00847 return true; 00848 } 00849 } 00850 } 00851 } 00852 #endif // WITH_LOGINDPOWER 00853 #ifdef WITH_CONSOLEKIT 00854 { 00855 TQT_DBusConnection dbusConn; 00856 dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); 00857 if ( dbusConn.isConnected() ) { 00858 TQT_DBusMessage msg = TQT_DBusMessage::methodCall( 00859 "org.freedesktop.ConsoleKit", 00860 "/org/freedesktop/ConsoleKit/Manager", 00861 "org.freedesktop.ConsoleKit.Manager", 00862 "Restart"); 00863 TQT_DBusMessage reply = dbusConn.sendWithReply(msg); 00864 if (reply.type() == TQT_DBusMessage::ReplyMessage) { 00865 return true; 00866 } 00867 } 00868 } 00869 #endif // WITH_CONSOLEKIT 00870 // Power down the system using a DCOP command 00871 // Values are explained at http://lists.kde.org/?l=kde-linux&m=115770988603387 00872 TQByteArray data; 00873 TQDataStream arg(data, IO_WriteOnly); 00874 arg << (int)0 << (int)1 << (int)2; 00875 if ( kapp->dcopClient()->send("ksmserver", "default", "logout(int,int,int)", data) ) { 00876 return true; 00877 } 00878 return false; 00879 } 00880 else if (ps == TDESystemPowerState::Active) { 00881 // Ummm...we're already active... 00882 return true; 00883 } 00884 00885 return false; 00886 } 00887 00888 #include "tderootsystemdevice.moc"