• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdecore
 

tdecore

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     TQString disknode  = "/sys/power/disk";
00300     int state_rval = access (statenode.ascii(), W_OK);
00301     int disk_rval  = access (disknode.ascii(), W_OK);
00302     if (state_rval == 0 && disk_rval == 0) {
00303         if (powerStates().contains(TDESystemPowerState::Hibernate)) {
00304             return TRUE;
00305         }
00306         else {
00307             return FALSE;
00308         }
00309     }
00310 
00311 #ifdef WITH_LOGINDPOWER
00312     {
00313         TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00314         if (dbusConn.isConnected()) {
00315             // can hibernate?
00316             TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00317                         "org.freedesktop.login1",
00318                         "/org/freedesktop/login1",
00319                         "org.freedesktop.login1.Manager",
00320                         "CanHibernate");
00321             TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00322             if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
00323                 return (reply[0].toString() == "yes");
00324             }
00325         }
00326     }
00327 #endif // WITH_LOGINDPOWER
00328 
00329 #ifdef WITH_UPOWER
00330     {
00331         TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00332         if (dbusConn.isConnected()) {
00333             TQT_DBusProxy upowerProperties("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.DBus.Properties", dbusConn);
00334             if (upowerProperties.canSend()) {
00335                 // can hibernate?
00336                 TQValueList<TQT_DBusData> params;
00337                 params << TQT_DBusData::fromString(upowerProperties.interface()) << TQT_DBusData::fromString("CanHibernate");
00338                 TQT_DBusMessage reply = upowerProperties.sendWithReply("Get", params);
00339                 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
00340                     return reply[0].toVariant().value.toBool();
00341                 }
00342             }
00343         }
00344     }
00345 #endif// WITH_UPOWER
00346 
00347 #ifdef WITH_DEVKITPOWER
00348     {
00349         TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00350         if (dbusConn.isConnected()) {
00351             TQT_DBusProxy devkitpowerProperties("org.freedesktop.DeviceKit.Power", "/org/freedesktop/DeviceKit/Power", "org.freedesktop.DBus.Properties", dbusConn);
00352             if (devkitpowerProperties.canSend()) {
00353                 // can hibernate?
00354                 TQValueList<TQT_DBusData> params;
00355                 params << TQT_DBusData::fromString(devkitpowerProperties.interface()) << TQT_DBusData::fromString("CanHibernate");
00356                 TQT_DBusMessage reply = devkitpowerProperties.sendWithReply("Get", params);
00357                 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
00358                     return reply[0].toVariant().value.toBool();
00359                 }
00360             }
00361         }
00362     }
00363 #endif// WITH_DEVKITPOWER
00364 
00365 #ifdef WITH_HAL
00366     {
00367         TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00368         if (dbusConn.isConnected()) {
00369             TQT_DBusProxy halProperties("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device", dbusConn);
00370             if (halProperties.canSend()) {
00371                 // can hibernate?
00372                 TQValueList<TQT_DBusData> params;
00373                 TQT_DBusMessage reply;
00374                 params.clear();
00375                 params << TQT_DBusData::fromString("power_management.can_hibernate");
00376                 reply = halProperties.sendWithReply("GetPropertyBoolean", params);
00377                 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
00378                     return reply[0].toBool();
00379                 }
00380                 params.clear();
00381                 params << TQT_DBusData::fromString("power_management.can_suspend_to_disk");
00382                 reply = halProperties.sendWithReply("GetPropertyBoolean", params);
00383                 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
00384                     return reply[0].toBool();
00385                 }
00386             }
00387         }
00388     }
00389 #endif // WITH_HAL
00390 
00391 #ifdef WITH_TDEHWLIB_DAEMONS
00392     {
00393         TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00394         if (dbusConn.isConnected()) {
00395             // can hibernate?
00396             TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00397                         "org.trinitydesktop.hardwarecontrol",
00398                         "/org/trinitydesktop/hardwarecontrol",
00399                         "org.trinitydesktop.hardwarecontrol.Power",
00400                         "CanHibernate");
00401             TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00402             if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
00403                 return reply[0].toBool();
00404             }
00405         }
00406     }
00407 #endif // WITH_TDEHWLIB_DAEMONS
00408 
00409     return FALSE;
00410 }
00411 
00412 bool TDERootSystemDevice::canHybridSuspend() {
00413     TQString statenode = "/sys/power/state";
00414     TQString disknode  = "/sys/power/disk";
00415     int state_rval = access (statenode.ascii(), W_OK);
00416     int disk_rval  = access (disknode.ascii(), W_OK);
00417     if (state_rval == 0 && disk_rval == 0) {
00418         if (powerStates().contains(TDESystemPowerState::HybridSuspend)) {
00419             return TRUE;
00420         }
00421         else {
00422             return FALSE;
00423         }
00424     }
00425 
00426 #ifdef WITH_LOGINDPOWER
00427     {
00428         TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00429         if (dbusConn.isConnected()) {
00430             // can hybrid suspend?
00431             TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00432                         "org.freedesktop.login1",
00433                         "/org/freedesktop/login1",
00434                         "org.freedesktop.login1.Manager",
00435                         "CanHybridSleep");
00436             TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00437             if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
00438                 return (reply[0].toString() == "yes");
00439             }
00440         }
00441     }
00442 #endif // WITH_LOGINDPOWER
00443 
00444     // No support "hybrid suspend" in org.freedesktop.UPower
00445     // No support "hybrid suspend" in org.freedesktop.DeviceKit.Power
00446 
00447 #ifdef WITH_HAL
00448     {
00449         TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00450         if (dbusConn.isConnected()) {
00451             TQT_DBusProxy halProperties("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device", dbusConn);
00452             if (halProperties.canSend()) {
00453                 // can hybrid suspend?
00454                 TQValueList<TQT_DBusData> params;
00455                 TQT_DBusMessage reply;
00456                 params.clear();
00457                 params << TQT_DBusData::fromString("power_management.can_suspend_hybrid");
00458                 reply = halProperties.sendWithReply("GetPropertyBoolean", params);
00459                 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
00460                     return reply[0].toBool();
00461                 }
00462             }
00463         }
00464     }
00465 #endif // WITH_HAL
00466 
00467 #ifdef WITH_TDEHWLIB_DAEMONS
00468     {
00469         TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00470         if (dbusConn.isConnected()) {
00471             // can hybrid suspend?
00472             TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00473                         "org.trinitydesktop.hardwarecontrol",
00474                         "/org/trinitydesktop/hardwarecontrol",
00475                         "org.trinitydesktop.hardwarecontrol.Power",
00476                         "CanHybridSuspend");
00477             TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00478             if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
00479                 return reply[0].toBool();
00480             }
00481         }
00482     }
00483 #endif // WITH_TDEHWLIB_DAEMONS
00484 
00485     return FALSE;
00486 }
00487 
00488 bool TDERootSystemDevice::canPowerOff() {
00489     TDEConfig config("ksmserverrc", true);
00490     config.setGroup("General" );
00491     if (!config.readBoolEntry( "offerShutdown", true )) {
00492         return FALSE;
00493     }
00494 
00495 #ifdef WITH_LOGINDPOWER
00496     {
00497         TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00498         if (dbusConn.isConnected()) {
00499             // can power off?
00500             TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00501                         "org.freedesktop.login1",
00502                         "/org/freedesktop/login1",
00503                         "org.freedesktop.login1.Manager",
00504                         "CanPowerOff");
00505             TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00506             if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
00507                 return (reply[0].toString() == "yes");
00508             }
00509         }
00510     }
00511 #endif // WITH_LOGINDPOWER
00512 
00513 #ifdef WITH_CONSOLEKIT
00514     {
00515         TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00516         if (dbusConn.isConnected()) {
00517             // can power off?
00518             TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00519                         "org.freedesktop.ConsoleKit",
00520                         "/org/freedesktop/ConsoleKit/Manager",
00521                         "org.freedesktop.ConsoleKit.Manager",
00522                         "CanStop");
00523             TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00524             if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
00525                 return reply[0].toBool();
00526             }
00527         }
00528     }
00529 #endif // WITH_CONSOLEKIT
00530 
00531     // FIXME
00532     // Can we power down this system?
00533     // This should probably be checked via DCOP and therefore interface with TDM
00534     // if ( DM().canShutdown() ) {
00535     //  return TRUE;
00536     // }
00537     return TRUE;
00538 }
00539 
00540 bool TDERootSystemDevice::canReboot() {
00541     TDEConfig config("ksmserverrc", true);
00542     config.setGroup("General" );
00543     if (!config.readBoolEntry( "offerShutdown", true )) {
00544         return FALSE;
00545     }
00546 
00547 #ifdef WITH_LOGINDPOWER
00548     {
00549         TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00550         if (dbusConn.isConnected()) {
00551             // can reboot?
00552             TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00553                         "org.freedesktop.login1",
00554                         "/org/freedesktop/login1",
00555                         "org.freedesktop.login1.Manager",
00556                         "CanReboot");
00557             TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00558             if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
00559                 return (reply[0].toString() == "yes");
00560             }
00561         }
00562     }
00563 #endif // WITH_LOGINDPOWER
00564 
00565 #ifdef WITH_CONSOLEKIT
00566     {
00567         TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00568         if (dbusConn.isConnected()) {
00569             // can reboot?
00570             TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00571                         "org.freedesktop.ConsoleKit",
00572                         "/org/freedesktop/ConsoleKit/Manager",
00573                         "org.freedesktop.ConsoleKit.Manager",
00574                         "CanRestart");
00575             TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00576             if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
00577                 return reply[0].toBool();
00578             }
00579         }
00580     }
00581 #endif // WITH_CONSOLEKIT
00582 
00583     // FIXME
00584     // Can we power down this system?
00585     // This should probably be checked via DCOP and therefore interface with TDM
00586     // if ( DM().canShutdown() ) {
00587     //  return TRUE;
00588     // }
00589     return TRUE;
00590 }
00591 
00592 void TDERootSystemDevice::setHibernationMethod(TDESystemHibernationMethod::TDESystemHibernationMethod hm) {
00593     TQString hibernationnode = "/sys/power/disk";
00594     TQFile file( hibernationnode );
00595     if ( file.open( IO_WriteOnly ) ) {
00596         TQString hibernationCommand;
00597         if (hm == TDESystemHibernationMethod::Platform) {
00598             hibernationCommand = "platform";
00599         }
00600         else if (hm == TDESystemHibernationMethod::Shutdown) {
00601             hibernationCommand = "shutdown";
00602         }
00603         else if (hm == TDESystemHibernationMethod::Reboot) {
00604             hibernationCommand = "reboot";
00605         }
00606         else if (hm == TDESystemHibernationMethod::TestProc) {
00607             hibernationCommand = "testproc";
00608         }
00609         else if (hm == TDESystemHibernationMethod::Test) {
00610             hibernationCommand = "test";
00611         }
00612         else if (hm == TDESystemHibernationMethod::Suspend) {
00613             hibernationCommand = "suspend";
00614         }
00615         TQTextStream stream( &file );
00616         stream << hibernationCommand;
00617         file.close();
00618         return;
00619     }
00620 
00621 #ifdef WITH_TDEHWLIB_DAEMONS
00622     {
00623         TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00624         if (dbusConn.isConnected()) {
00625             TQT_DBusProxy hardwareControl("org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", dbusConn);
00626             if (hardwareControl.canSend()) {
00627                 // set hibernation method
00628                 TQValueList<TQT_DBusData> params;
00629                 TQString hibernationCommand;
00630                 if (hm == TDESystemHibernationMethod::Platform) {
00631                     hibernationCommand = "platform";
00632                 }
00633                 else if (hm == TDESystemHibernationMethod::Shutdown) {
00634                     hibernationCommand = "shutdown";
00635                 }
00636                 else if (hm == TDESystemHibernationMethod::Reboot) {
00637                     hibernationCommand = "reboot";
00638                 }
00639                 else if (hm == TDESystemHibernationMethod::TestProc) {
00640                     hibernationCommand = "testproc";
00641                 }
00642                 else if (hm == TDESystemHibernationMethod::Test) {
00643                     hibernationCommand = "test";
00644                 }
00645                 else if (hm == TDESystemHibernationMethod::Suspend) {
00646                     hibernationCommand = "suspend";
00647                 }
00648                 params << TQT_DBusData::fromString(hibernationCommand);
00649                 TQT_DBusMessage reply = hardwareControl.sendWithReply("SetHibernationMethod", params);
00650                 if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00651                     return;
00652                 }
00653             }
00654         }
00655     }
00656 #endif // WITH_TDEHWLIB_DAEMONS
00657 
00658 }
00659 
00660 bool TDERootSystemDevice::setPowerState(TDESystemPowerState::TDESystemPowerState ps) {
00661     if ((ps == TDESystemPowerState::Freeze)  || (ps == TDESystemPowerState::Standby)   ||  
00662         (ps == TDESystemPowerState::Suspend) || (ps == TDESystemPowerState::Hibernate) ||
00663         (ps == TDESystemPowerState::HybridSuspend)) {
00664         TQString statenode = "/sys/power/state";
00665         TQString disknode  = "/sys/power/disk";
00666         TQFile statefile( statenode );
00667         TQFile diskfile( disknode );
00668         if ( statefile.open( IO_WriteOnly ) &&
00669              ((ps != TDESystemPowerState::Hibernate && ps != TDESystemPowerState::HybridSuspend) || 
00670                diskfile.open( IO_WriteOnly )) ) {
00671             TQString powerCommand;
00672             if (ps == TDESystemPowerState::Freeze) {
00673                 powerCommand = "freeze";
00674             }
00675             else if (ps == TDESystemPowerState::Standby) {
00676                 powerCommand = "standby";
00677             }
00678             else if (ps == TDESystemPowerState::Suspend) {
00679                 powerCommand = "mem";
00680             }
00681             else if (ps == TDESystemPowerState::Hibernate) {
00682                 powerCommand = "disk";
00683                 TQTextStream diskstream( &diskfile );
00684                 diskstream << "platform";
00685                 diskfile.close();
00686             }
00687             else if (ps == TDESystemPowerState::HybridSuspend) {
00688                 powerCommand = "disk";
00689                 TQTextStream diskstream( &diskfile );
00690                 diskstream << "suspend";
00691                 diskfile.close();
00692             }
00693             TQTextStream statestream( &statefile );
00694             statestream << powerCommand;
00695             statefile.close();
00696             return true;
00697         }
00698 
00699 #ifdef WITH_LOGINDPOWER
00700         {
00701             // No support for "freeze" and "standby" in org.freedesktop.login1
00702             TQT_DBusConnection dbusConn;
00703             dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00704             if ( dbusConn.isConnected() ) {
00705                 TQT_DBusProxy logindProxy("org.freedesktop.login1", "/org/freedesktop/login1",
00706                                           "org.freedesktop.login1.Manager", dbusConn);
00707                 TQValueList<TQT_DBusData> params;
00708                 params << TQT_DBusData::fromBool(true);
00709                 if (logindProxy.canSend()) {
00710                     if (ps == TDESystemPowerState::Suspend) {
00711                         TQT_DBusMessage reply = logindProxy.sendWithReply("Suspend", params);
00712                         if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00713                             return true;
00714                         }
00715                     }
00716                     else if (ps == TDESystemPowerState::Hibernate) {
00717                         TQT_DBusMessage reply = logindProxy.sendWithReply("Hibernate", params);
00718                         if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00719                             return true;
00720                         }
00721                     }
00722                     else if (ps == TDESystemPowerState::HybridSuspend) {
00723                         TQT_DBusMessage reply = logindProxy.sendWithReply("HybridSleep", params);
00724                         if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00725                             return true;
00726                         }
00727                     }
00728                 }
00729             }
00730         }
00731 #endif // WITH_LOGINDPOWER
00732 
00733 #ifdef WITH_UPOWER
00734         {
00735           // No support for "freeze" and "hybrid suspend" in org.freedesktop.UPower
00736             TQT_DBusConnection dbusConn;
00737             dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00738             if ( dbusConn.isConnected() ) {
00739                 if (ps == TDESystemPowerState::Suspend) {
00740                     TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00741                                 "org.freedesktop.UPower",
00742                                 "/org/freedesktop/UPower",
00743                                 "org.freedesktop.UPower",
00744                                 "Suspend");
00745                     TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00746                     if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00747                         return true;
00748                     }
00749                 }
00750                 else if (ps == TDESystemPowerState::Hibernate) {
00751                     TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00752                                 "org.freedesktop.UPower",
00753                                 "/org/freedesktop/UPower",
00754                                 "org.freedesktop.UPower",
00755                                 "Hibernate");
00756                     TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00757                     if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00758                         return true;
00759                     }
00760                 }
00761             }
00762         }
00763 #endif // WITH_UPOWER
00764 
00765 #ifdef WITH_DEVKITPOWER
00766         {
00767           // No support for "freeze" and "hybrid suspend" in org.freedesktop.DeviceKit.Power
00768             TQT_DBusConnection dbusConn;
00769             dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00770             if ( dbusConn.isConnected() ) {
00771                 if (ps == TDESystemPowerState::Suspend) {
00772                     TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00773                                 "org.freedesktop.DeviceKit.Power",
00774                                 "/org/freedesktop/DeviceKit/Power",
00775                                 "org.freedesktop.DeviceKit.Power",
00776                                 "Suspend");
00777                     TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00778                     if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00779                         return true;
00780                     }
00781                 }
00782                 else if (ps == TDESystemPowerState::Hibernate) {
00783                     TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00784                                 "org.freedesktop.DeviceKit.Power",
00785                                 "/org/freedesktop/DeviceKit/Power",
00786                                 "org.freedesktop.DeviceKit.Power",
00787                                 "Hibernate");
00788                     TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00789                     if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00790                         return true;
00791                     }
00792                 }
00793             }
00794         }
00795 #endif // WITH_DEVKITPOWER
00796 
00797 #ifdef WITH_HAL
00798         {
00799           // No support for "freeze" in org.freedesktop.Hal
00800             TQT_DBusConnection dbusConn;
00801             dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00802             if ( dbusConn.isConnected() ) {
00803                 if (ps == TDESystemPowerState::Suspend) {
00804                     TQT_DBusProxy halPowerManagement(
00805                             "org.freedesktop.Hal",
00806                             "/org/freedesktop/Hal/devices/computer",
00807                             "org.freedesktop.Hal.Device.SystemPowerManagement",
00808                             dbusConn);
00809                     TQValueList<TQT_DBusData> params;
00810                     params << TQT_DBusData::fromInt32(0);
00811                     TQT_DBusMessage reply = halPowerManagement.sendWithReply("Suspend", params);
00812                     if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00813                         return true;
00814                     }
00815                 }
00816                 else if (ps == TDESystemPowerState::Hibernate) {
00817                     TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00818                                 "org.freedesktop.Hal",
00819                                 "/org/freedesktop/Hal/devices/computer",
00820                                 "org.freedesktop.Hal.Device.SystemPowerManagement",
00821                                 "Hibernate");
00822                     TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00823                     if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00824                         return true;
00825                     }
00826                 }
00827                 else if (ps == TDESystemPowerState::HybridSuspend) {
00828                     TQT_DBusProxy halPowerManagement(
00829                             "org.freedesktop.Hal",
00830                             "/org/freedesktop/Hal/devices/computer",
00831                             "org.freedesktop.Hal.Device.SystemPowerManagement",
00832                             dbusConn);
00833                     TQValueList<TQT_DBusData> params;
00834                     params << TQT_DBusData::fromInt32(0);
00835                     TQT_DBusMessage reply = halPowerManagement.sendWithReply("SuspendHybrid", params);
00836                     if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00837                         return true;
00838                     }
00839                 }
00840             }
00841         }
00842 #endif // WITH_HAL
00843 
00844 #ifdef WITH_TDEHWLIB_DAEMONS
00845         {
00846             TQT_DBusConnection dbusConn;
00847             dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00848             if ( dbusConn.isConnected() ) {
00849                 if (ps == TDESystemPowerState::Standby) {
00850                     TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00851                                 "org.trinitydesktop.hardwarecontrol",
00852                                 "/org/trinitydesktop/hardwarecontrol",
00853                                 "org.trinitydesktop.hardwarecontrol.Power",
00854                                 "Standby");
00855                     TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00856                     if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00857                         return true;
00858                     }
00859                 }
00860                 else if (ps == TDESystemPowerState::Freeze) {
00861                     TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00862                                 "org.trinitydesktop.hardwarecontrol",
00863                                 "/org/trinitydesktop/hardwarecontrol",
00864                                 "org.trinitydesktop.hardwarecontrol.Power",
00865                                 "Freeze");
00866                     TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00867                     if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00868                         return true;
00869                     }
00870                 }
00871                 else if (ps == TDESystemPowerState::Suspend) {
00872                     TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00873                                 "org.trinitydesktop.hardwarecontrol",
00874                                 "/org/trinitydesktop/hardwarecontrol",
00875                                 "org.trinitydesktop.hardwarecontrol.Power",
00876                                 "Suspend");
00877                     TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00878                     if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00879                         return true;
00880                     }
00881                 }
00882                 else if (ps == TDESystemPowerState::Hibernate) {
00883                     TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00884                                 "org.trinitydesktop.hardwarecontrol",
00885                                 "/org/trinitydesktop/hardwarecontrol",
00886                                 "org.trinitydesktop.hardwarecontrol.Power",
00887                                 "Hibernate");
00888                     TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00889                     if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00890                         return true;
00891                     }
00892                 }
00893                 else if (ps == TDESystemPowerState::HybridSuspend) {
00894                     TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00895                                 "org.trinitydesktop.hardwarecontrol",
00896                                 "/org/trinitydesktop/hardwarecontrol",
00897                                 "org.trinitydesktop.hardwarecontrol.Power",
00898                                 "HybridSuspend");
00899                     TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00900                     if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00901                         return true;
00902                     }
00903                 }
00904             }
00905         }
00906 #endif // WITH_TDEHWLIB_DAEMONS
00907 
00908         return false;
00909     }
00910     else if (ps == TDESystemPowerState::PowerOff) {
00911         TDEConfig config("ksmserverrc", true);
00912         config.setGroup("General" );
00913         if (!config.readBoolEntry( "offerShutdown", true )) {
00914             return false;
00915         }
00916 #ifdef WITH_LOGINDPOWER
00917         {
00918             TQT_DBusConnection dbusConn;
00919             dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00920             if ( dbusConn.isConnected() ) {
00921                 TQT_DBusProxy logindProxy("org.freedesktop.login1", "/org/freedesktop/login1",
00922                                           "org.freedesktop.login1.Manager", dbusConn);
00923                 TQValueList<TQT_DBusData> params;
00924                 params << TQT_DBusData::fromBool(true);
00925                 if (logindProxy.canSend()) {
00926                     TQT_DBusMessage reply = logindProxy.sendWithReply("PowerOff", params);
00927                     if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00928                         return true;
00929                     }
00930                 }
00931             }
00932         }
00933 #endif // WITH_LOGINDPOWER
00934 #ifdef WITH_CONSOLEKIT
00935         {
00936             TQT_DBusConnection dbusConn;
00937             dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00938             if ( dbusConn.isConnected() ) {
00939                 TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00940                             "org.freedesktop.ConsoleKit",
00941                             "/org/freedesktop/ConsoleKit/Manager",
00942                             "org.freedesktop.ConsoleKit.Manager",
00943                             "Stop");
00944                 TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00945                 if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00946                     return true;
00947                 }
00948             }
00949         }
00950 #endif // WITH_CONSOLEKIT
00951         // Power down the system using a DCOP command
00952         /* As found at http://lists.kde.org/?l=kde-linux&m=115770988603387
00953         Logout parameters explanation:
00954         First parameter:    confirm
00955             Obey the user's confirmation setting:   -1
00956             Don't confirm, shutdown without asking: 0
00957             Always confirm, ask even if the user turned it off: 1
00958         Second parameter:   type
00959             Select previous action or the default if it's the first time: -1
00960             Only log out: 0
00961             Log out and reboot the machine: 1
00962             Log out and halt the machine: 2
00963         Third parameter:    mode
00964             Select previous mode or the default if it's the first time: -1
00965             Schedule a shutdown (halt or reboot) for the time all active sessions have exited: 0
00966             Shut down, if no sessions are active. Otherwise do nothing: 1
00967             Force shutdown. Kill any possibly active sessions: 2
00968             Pop up a dialog asking the user what to do if sessions are still active: 3
00969         */
00970         TQByteArray data;
00971         TQDataStream arg(data, IO_WriteOnly);
00972         arg << (int)0 << (int)2 << (int)2;
00973         if ( kapp->dcopClient()->send("ksmserver", "default", "logout(int,int,int)", data) ) {
00974             return true;
00975         }
00976         return false;
00977     }
00978     else if (ps == TDESystemPowerState::Reboot) {
00979         TDEConfig config("ksmserverrc", true);
00980         config.setGroup("General" );
00981         if (!config.readBoolEntry( "offerShutdown", true )) {
00982             return false;
00983         }
00984 #ifdef WITH_LOGINDPOWER
00985         {
00986             TQT_DBusConnection dbusConn;
00987             dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00988             if ( dbusConn.isConnected() ) {
00989                 TQT_DBusProxy logindProxy("org.freedesktop.login1", "/org/freedesktop/login1",
00990                                           "org.freedesktop.login1.Manager", dbusConn);
00991                 TQValueList<TQT_DBusData> params;
00992                 params << TQT_DBusData::fromBool(true);
00993                 if (logindProxy.canSend()) {
00994                     TQT_DBusMessage reply = logindProxy.sendWithReply("Reboot", params);
00995                     if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00996                         return true;
00997                     }
00998                 }
00999             }
01000         }
01001 #endif // WITH_LOGINDPOWER
01002 #ifdef WITH_CONSOLEKIT
01003         {
01004             TQT_DBusConnection dbusConn;
01005             dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
01006             if ( dbusConn.isConnected() ) {
01007                 TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
01008                             "org.freedesktop.ConsoleKit",
01009                             "/org/freedesktop/ConsoleKit/Manager",
01010                             "org.freedesktop.ConsoleKit.Manager",
01011                             "Restart");
01012                 TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
01013                 if (reply.type() == TQT_DBusMessage::ReplyMessage) {
01014                     return true;
01015                 }
01016             }
01017         }
01018 #endif // WITH_CONSOLEKIT
01019         // Power down the system using a DCOP command
01020         // See above PowerOff section for logout() parameters explanation
01021         TQByteArray data;
01022         TQDataStream arg(data, IO_WriteOnly);
01023         arg << (int)0 << (int)1 << (int)2;
01024         if ( kapp->dcopClient()->send("ksmserver", "default", "logout(int,int,int)", data) ) {
01025             return true;
01026         }
01027         return false;
01028     }
01029     else if (ps == TDESystemPowerState::Active) {
01030         // Ummm...we're already active...
01031         return true;
01032     }
01033 
01034     return false;
01035 }
01036 
01037 #include "tderootsystemdevice.moc"

tdecore

Skip menu "tdecore"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

tdecore

Skip menu "tdecore"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdecore by doxygen 1.6.3
This website is maintained by Timothy Pearson.