/* This file is part of the TDE libraries Copyright (C) 2012 Timothy Pearson (C) 2013 Golubev Alexander This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "tderootsystemdevice.h" #include "tdestoragedevice.h" #include #include #include #include #include "tdeglobal.h" #include "tdeconfig.h" #include "tdeapplication.h" #include "kstandarddirs.h" #include "config.h" #if defined(WITH_TDEHWLIB_DAEMONS) || defined(WITH_UPOWER) || defined(WITH_DEVKITPOWER) || defined(WITH_HAL) || defined(WITH_CONSOLEKIT) #include #include #include #include #include #endif // defined(WITH_TDEHWLIB_DAEMONS) || defined(WITH_UPOWER) || defined(WITH_DEVKITPOWER) || defined(WITH_HAL) || defined(WITH_CONSOLEKIT) TDERootSystemDevice::TDERootSystemDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn) : TDEGenericDevice(dt, dn) { m_hibernationSpace = -1; } TDERootSystemDevice::~TDERootSystemDevice() { } TDESystemFormFactor::TDESystemFormFactor TDERootSystemDevice::formFactor() { return m_formFactor; } void TDERootSystemDevice::internalSetFormFactor(TDESystemFormFactor::TDESystemFormFactor ff) { m_formFactor = ff; } TDESystemPowerStateList TDERootSystemDevice::powerStates() { return m_powerStates; } void TDERootSystemDevice::internalSetPowerStates(TDESystemPowerStateList ps) { m_powerStates = ps; } TDESystemHibernationMethodList TDERootSystemDevice::hibernationMethods() { return m_hibernationMethods; } void TDERootSystemDevice::internalSetHibernationMethods(TDESystemHibernationMethodList hm) { m_hibernationMethods = hm; } TDESystemHibernationMethod::TDESystemHibernationMethod TDERootSystemDevice::hibernationMethod() { return m_hibernationMethod; } void TDERootSystemDevice::internalSetHibernationMethod(TDESystemHibernationMethod::TDESystemHibernationMethod hm) { m_hibernationMethod = hm; } unsigned long TDERootSystemDevice::diskSpaceNeededForHibernation() { return m_hibernationSpace; } void TDERootSystemDevice::internalSetDiskSpaceNeededForHibernation(unsigned long sz) { m_hibernationSpace = sz; } bool TDERootSystemDevice::canSetHibernationMethod() { TQString hibernationnode = "/sys/power/disk"; int rval = access (hibernationnode.ascii(), W_OK); if (rval == 0) { return TRUE; } #ifdef WITH_TDEHWLIB_DAEMONS { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { // can set hibernation method? TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", "CanSetHibernationMethod"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toBool(); } } } #endif // WITH_TDEHWLIB_DAEMONS return FALSE; } bool TDERootSystemDevice::canFreeze() { TQString statenode = "/sys/power/state"; int rval = access (statenode.ascii(), W_OK); if (rval == 0) { if (powerStates().contains(TDESystemPowerState::Freeze)) { return TRUE; } } #ifdef WITH_TDEHWLIB_DAEMONS { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { // can freeze? TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", "CanFreeze"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toBool(); } } } #endif // WITH_TDEHWLIB_DAEMONS return FALSE; } bool TDERootSystemDevice::canStandby() { TQString statenode = "/sys/power/state"; int rval = access (statenode.ascii(), W_OK); if (rval == 0) { if (powerStates().contains(TDESystemPowerState::Standby)) { return TRUE; } } #ifdef WITH_TDEHWLIB_DAEMONS { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { // can standby? TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", "CanStandby"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toBool(); } } } #endif // WITH_TDEHWLIB_DAEMONS return FALSE; } bool TDERootSystemDevice::canSuspend() { TQString statenode = "/sys/power/state"; int rval = access (statenode.ascii(), W_OK); if (rval == 0) { if (powerStates().contains(TDESystemPowerState::Suspend)) { return TRUE; } } #ifdef WITH_TDEHWLIB_DAEMONS { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { // can suspend? TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", "CanSuspend"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toBool(); } } } #endif // WITH_TDEHWLIB_DAEMONS #ifdef WITH_LOGINDPOWER { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { // can suspend? TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", "CanSuspend"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return (reply[0].toString() == "yes"); } } } #endif // WITH_LOGINDPOWER #ifdef WITH_UPOWER { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { TQT_DBusProxy upowerProperties("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.DBus.Properties", dbusConn); if (upowerProperties.canSend()) { // can suspend? TQValueList params; params << TQT_DBusData::fromString(upowerProperties.interface()) << TQT_DBusData::fromString("CanSuspend"); TQT_DBusMessage reply = upowerProperties.sendWithReply("Get", params); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toVariant().value.toBool(); } } } } #endif// WITH_UPOWER #ifdef WITH_DEVKITPOWER { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { TQT_DBusProxy devkitpowerProperties("org.freedesktop.DeviceKit.Power", "/org/freedesktop/DeviceKit/Power", "org.freedesktop.DBus.Properties", dbusConn); if (devkitpowerProperties.canSend()) { // can suspend? TQValueList params; params << TQT_DBusData::fromString(devkitpowerProperties.interface()) << TQT_DBusData::fromString("CanSuspend"); TQT_DBusMessage reply = devkitpowerProperties.sendWithReply("Get", params); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toVariant().value.toBool(); } } } } #endif// WITH_DEVKITPOWER #ifdef WITH_HAL { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { TQT_DBusProxy halProperties("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device", dbusConn); if (halProperties.canSend()) { // can suspend? TQValueList params; TQT_DBusMessage reply; params.clear(); params << TQT_DBusData::fromString("power_management.can_suspend"); reply = halProperties.sendWithReply("GetPropertyBoolean", params); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toBool(); } params.clear(); params << TQT_DBusData::fromString("power_management.can_suspend_to_ram"); reply = halProperties.sendWithReply("GetPropertyBoolean", params); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toBool(); } } } } #endif // WITH_HAL return FALSE; } bool TDERootSystemDevice::canHybridSuspend() { TQString statenode = "/sys/power/state"; TQString disknode = "/sys/power/disk"; int state_rval = access (statenode.ascii(), W_OK); int disk_rval = access (disknode.ascii(), W_OK); if (state_rval == 0 && disk_rval == 0) { if (powerStates().contains(TDESystemPowerState::HybridSuspend)) { return TRUE; } } #ifdef WITH_TDEHWLIB_DAEMONS { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { // can hybrid suspend? TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", "CanHybridSuspend"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toBool(); } } } #endif // WITH_TDEHWLIB_DAEMONS #ifdef WITH_LOGINDPOWER { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { // can hybrid suspend? TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", "CanHybridSleep"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return (reply[0].toString() == "yes"); } } } #endif // WITH_LOGINDPOWER // No support "hybrid suspend" in org.freedesktop.UPower // No support "hybrid suspend" in org.freedesktop.DeviceKit.Power #ifdef WITH_HAL { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { TQT_DBusProxy halProperties("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device", dbusConn); if (halProperties.canSend()) { // can hybrid suspend? TQValueList params; TQT_DBusMessage reply; params.clear(); params << TQT_DBusData::fromString("power_management.can_suspend_hybrid"); reply = halProperties.sendWithReply("GetPropertyBoolean", params); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toBool(); } } } } #endif // WITH_HAL return FALSE; } bool TDERootSystemDevice::canHibernate() { TQString statenode = "/sys/power/state"; TQString disknode = "/sys/power/disk"; int state_rval = access (statenode.ascii(), W_OK); int disk_rval = access (disknode.ascii(), W_OK); if (state_rval == 0 && disk_rval == 0) { if (powerStates().contains(TDESystemPowerState::Hibernate)) { return TRUE; } } #ifdef WITH_TDEHWLIB_DAEMONS { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { // can hibernate? TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", "CanHibernate"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toBool(); } } } #endif // WITH_TDEHWLIB_DAEMONS #ifdef WITH_LOGINDPOWER { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { // can hibernate? TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", "CanHibernate"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return (reply[0].toString() == "yes"); } } } #endif // WITH_LOGINDPOWER #ifdef WITH_UPOWER { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { TQT_DBusProxy upowerProperties("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.DBus.Properties", dbusConn); if (upowerProperties.canSend()) { // can hibernate? TQValueList params; params << TQT_DBusData::fromString(upowerProperties.interface()) << TQT_DBusData::fromString("CanHibernate"); TQT_DBusMessage reply = upowerProperties.sendWithReply("Get", params); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toVariant().value.toBool(); } } } } #endif// WITH_UPOWER #ifdef WITH_DEVKITPOWER { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { TQT_DBusProxy devkitpowerProperties("org.freedesktop.DeviceKit.Power", "/org/freedesktop/DeviceKit/Power", "org.freedesktop.DBus.Properties", dbusConn); if (devkitpowerProperties.canSend()) { // can hibernate? TQValueList params; params << TQT_DBusData::fromString(devkitpowerProperties.interface()) << TQT_DBusData::fromString("CanHibernate"); TQT_DBusMessage reply = devkitpowerProperties.sendWithReply("Get", params); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toVariant().value.toBool(); } } } } #endif// WITH_DEVKITPOWER #ifdef WITH_HAL { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { TQT_DBusProxy halProperties("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device", dbusConn); if (halProperties.canSend()) { // can hibernate? TQValueList params; TQT_DBusMessage reply; params.clear(); params << TQT_DBusData::fromString("power_management.can_hibernate"); reply = halProperties.sendWithReply("GetPropertyBoolean", params); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toBool(); } params.clear(); params << TQT_DBusData::fromString("power_management.can_suspend_to_disk"); reply = halProperties.sendWithReply("GetPropertyBoolean", params); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toBool(); } } } } #endif // WITH_HAL return FALSE; } bool TDERootSystemDevice::canPowerOff() { TDEConfig config("ksmserverrc", true); config.setGroup("General" ); if (!config.readBoolEntry( "offerShutdown", true )) { return FALSE; } #ifdef WITH_LOGINDPOWER { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { // can power off? TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", "CanPowerOff"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return (reply[0].toString() == "yes"); } } } #endif // WITH_LOGINDPOWER #ifdef WITH_CONSOLEKIT { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { // can power off? TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", "CanStop"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toBool(); } } } #endif // WITH_CONSOLEKIT // FIXME // Can we power down this system? // This should probably be checked via DCOP and therefore interface with TDM // if ( DM().canShutdown() ) { // return TRUE; // } return TRUE; } bool TDERootSystemDevice::canReboot() { TDEConfig config("ksmserverrc", true); config.setGroup("General" ); if (!config.readBoolEntry( "offerShutdown", true )) { return FALSE; } #ifdef WITH_LOGINDPOWER { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { // can reboot? TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", "CanReboot"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return (reply[0].toString() == "yes"); } } } #endif // WITH_LOGINDPOWER #ifdef WITH_CONSOLEKIT { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { // can reboot? TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", "CanRestart"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { return reply[0].toBool(); } } } #endif // WITH_CONSOLEKIT // FIXME // Can we power down this system? // This should probably be checked via DCOP and therefore interface with TDM // if ( DM().canShutdown() ) { // return TRUE; // } return TRUE; } void TDERootSystemDevice::setHibernationMethod(TDESystemHibernationMethod::TDESystemHibernationMethod hm) { TQString hibernationnode = "/sys/power/disk"; TQFile file( hibernationnode ); if ( file.open( IO_WriteOnly ) ) { TQString hibernationCommand; if (hm == TDESystemHibernationMethod::Platform) { hibernationCommand = "platform"; } else if (hm == TDESystemHibernationMethod::Shutdown) { hibernationCommand = "shutdown"; } else if (hm == TDESystemHibernationMethod::Reboot) { hibernationCommand = "reboot"; } else if (hm == TDESystemHibernationMethod::TestProc) { hibernationCommand = "testproc"; } else if (hm == TDESystemHibernationMethod::Test) { hibernationCommand = "test"; } else if (hm == TDESystemHibernationMethod::Suspend) { hibernationCommand = "suspend"; } TQTextStream stream( &file ); stream << hibernationCommand; file.close(); return; } #ifdef WITH_TDEHWLIB_DAEMONS { TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if (dbusConn.isConnected()) { TQT_DBusProxy hardwareControl("org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", dbusConn); if (hardwareControl.canSend()) { // set hibernation method TQValueList params; TQString hibernationCommand; if (hm == TDESystemHibernationMethod::Platform) { hibernationCommand = "platform"; } else if (hm == TDESystemHibernationMethod::Shutdown) { hibernationCommand = "shutdown"; } else if (hm == TDESystemHibernationMethod::Reboot) { hibernationCommand = "reboot"; } else if (hm == TDESystemHibernationMethod::TestProc) { hibernationCommand = "testproc"; } else if (hm == TDESystemHibernationMethod::Test) { hibernationCommand = "test"; } else if (hm == TDESystemHibernationMethod::Suspend) { hibernationCommand = "suspend"; } params << TQT_DBusData::fromString(hibernationCommand); TQT_DBusMessage reply = hardwareControl.sendWithReply("SetHibernationMethod", params); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return; } } } } #endif // WITH_TDEHWLIB_DAEMONS } bool check_CanSetSuspend(char* state, char* disk, char* mem) { // check if required files are writable bool files_writable = (access("/sys/power/state", W_OK) == 0); if (disk) { files_writable &= (access("/sys/power/disk", W_OK) == 0); } if (mem) { files_writable &= (access("/sys/power/mem_sleep", W_OK) == 0); } if (!files_writable) { return false; } // check if method is supported bool result = false; // state FILE *state_node = fopen("/sys/power/state", "r"); if (state_node) { char *line = NULL; size_t len = 0; ssize_t read = getline(&line, &len, state_node); if (read > 0 && line) { result = (strstr(line, state) != NULL); free(line); } fclose(state_node); } if (!result) { return false; } // disk if (disk) { FILE *disk_node = fopen("/sys/power/disk", "r"); if (disk_node) { char *line = NULL; size_t len = 0; ssize_t read = getline(&line, &len, disk_node); if (read > 0 && line) { result &= (strstr(line, disk) != NULL); free(line); } fclose(disk_node); } } if (!result) { return false; } // mem_sleep if (mem) { FILE *mem_node = fopen("/sys/power/mem_sleep", "r"); if (mem_node) { char *line = NULL; size_t len = 0; ssize_t read = getline(&line, &len, mem_node); if (read > 0 && line) { result &= (strstr(line, mem) != NULL); free(line); } fclose(mem_node); } } return result; } bool TDERootSystemDevice::setPowerState(TDESystemPowerState::TDESystemPowerState ps) { if ((ps == TDESystemPowerState::Freeze) || (ps == TDESystemPowerState::Standby) || (ps == TDESystemPowerState::Suspend) || (ps == TDESystemPowerState::Hibernate) || (ps == TDESystemPowerState::HybridSuspend)) { TQString statenode = "/sys/power/state"; TQString disknode = "/sys/power/disk"; TQString memnode = "/sys/power/mem_sleep"; TQFile statefile( statenode ); TQFile diskfile( disknode ); TQFile memfile( memnode ); TQString stateCommand = TQString::null; TQString diskCommand = TQString::null; TQString memCommand = TQString::null; bool stateWriteOk = false; bool diskWriteOk = false; bool memWriteOk = false; if (ps == TDESystemPowerState::Freeze) { if (check_CanSetSuspend("freeze", NULL, NULL)) { stateCommand = "freeze"; } else { stateCommand = "mem"; diskCommand = "s2idle"; } } else if (ps == TDESystemPowerState::Standby) { if (check_CanSetSuspend("standby", NULL, NULL)) { stateCommand = "standby"; } else { stateCommand = "mem"; diskCommand = "shallow"; } } else if (ps == TDESystemPowerState::Suspend) { stateCommand = "mem"; if (check_CanSetSuspend("mem", NULL, "deep")) { diskCommand = "deep"; } } else if (ps == TDESystemPowerState::HybridSuspend) { stateCommand = "disk"; diskCommand = "suspend"; } else if (ps == TDESystemPowerState::Hibernate) { stateCommand = "disk"; if (check_CanSetSuspend("disk", "shutdown", NULL)) { diskCommand = "shutdown"; } else { diskCommand = "platform"; } } memWriteOk = (memCommand == TQString::null); if (memCommand != TQString::null && memfile.open( IO_WriteOnly )) { memWriteOk = true; TQTextStream memstream( &memfile ); memstream << memCommand; memfile.close(); } if (memWriteOk) { diskWriteOk = (diskCommand == TQString::null); if (diskCommand != TQString::null && diskfile.open( IO_WriteOnly )) { diskWriteOk = true; TQTextStream diskstream( &diskfile ); diskstream << diskCommand; diskfile.close(); } if (diskWriteOk) { if (stateCommand != TQString::null && statefile.open( IO_WriteOnly )) { TQTextStream statestream( &statefile ); statestream << stateCommand; statefile.close(); return true; } } } #ifdef WITH_TDEHWLIB_DAEMONS { TQT_DBusConnection dbusConn; dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if ( dbusConn.isConnected() ) { if (ps == TDESystemPowerState::Freeze) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", "Freeze"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } else if (ps == TDESystemPowerState::Standby) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", "Standby"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } else if (ps == TDESystemPowerState::Suspend) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", "Suspend"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } else if (ps == TDESystemPowerState::HybridSuspend) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", "HybridSuspend"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } else if (ps == TDESystemPowerState::Hibernate) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", "Hibernate"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } } } #endif // WITH_TDEHWLIB_DAEMONS #ifdef WITH_LOGINDPOWER { // No support for "freeze" in org.freedesktop.login1 TQT_DBusConnection dbusConn; dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if ( dbusConn.isConnected() ) { if (ps == TDESystemPowerState::Suspend) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", "Suspend"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } else if (ps == TDESystemPowerState::Hibernate) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", "Hibernate"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } else if (ps == TDESystemPowerState::HybridSuspend) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", "HybridSleep"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } } } #endif // WITH_LOGINDPOWER #ifdef WITH_UPOWER { // No support for "freeze" and "hybrid suspend" in org.freedesktop.UPower TQT_DBusConnection dbusConn; dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if ( dbusConn.isConnected() ) { if (ps == TDESystemPowerState::Suspend) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.UPower", "Suspend"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } else if (ps == TDESystemPowerState::Hibernate) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.UPower", "Hibernate"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } } } #endif // WITH_UPOWER #ifdef WITH_DEVKITPOWER { // No support for "freeze" and "hybrid suspend" in org.freedesktop.DeviceKit.Power TQT_DBusConnection dbusConn; dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if ( dbusConn.isConnected() ) { if (ps == TDESystemPowerState::Suspend) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.DeviceKit.Power", "/org/freedesktop/DeviceKit/Power", "org.freedesktop.DeviceKit.Power", "Suspend"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } else if (ps == TDESystemPowerState::Hibernate) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.DeviceKit.Power", "/org/freedesktop/DeviceKit/Power", "org.freedesktop.DeviceKit.Power", "Hibernate"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } } } #endif // WITH_DEVKITPOWER #ifdef WITH_HAL { // No support for "freeze" in org.freedesktop.Hal TQT_DBusConnection dbusConn; dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if ( dbusConn.isConnected() ) { if (ps == TDESystemPowerState::Suspend) { TQT_DBusProxy halPowerManagement( "org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device.SystemPowerManagement", dbusConn); TQValueList params; params << TQT_DBusData::fromInt32(0); TQT_DBusMessage reply = halPowerManagement.sendWithReply("Suspend", params); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } else if (ps == TDESystemPowerState::Hibernate) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device.SystemPowerManagement", "Hibernate"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } else if (ps == TDESystemPowerState::HybridSuspend) { TQT_DBusProxy halPowerManagement( "org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device.SystemPowerManagement", dbusConn); TQValueList params; params << TQT_DBusData::fromInt32(0); TQT_DBusMessage reply = halPowerManagement.sendWithReply("SuspendHybrid", params); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } } } #endif // WITH_HAL return false; } else if (ps == TDESystemPowerState::PowerOff) { TDEConfig config("ksmserverrc", true); config.setGroup("General" ); if (!config.readBoolEntry( "offerShutdown", true )) { return false; } #ifdef WITH_LOGINDPOWER { TQT_DBusConnection dbusConn; dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if ( dbusConn.isConnected() ) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.trinitydesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", "PowerOff"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } } #endif // WITH_LOGINDPOWER #ifdef WITH_CONSOLEKIT { TQT_DBusConnection dbusConn; dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if ( dbusConn.isConnected() ) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", "Stop"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } } #endif // WITH_CONSOLEKIT // Power down the system using a DCOP command /* As found at http://lists.kde.org/?l=kde-linux&m=115770988603387 Logout parameters explanation: First parameter: confirm Obey the user's confirmation setting: -1 Don't confirm, shutdown without asking: 0 Always confirm, ask even if the user turned it off: 1 Second parameter: type Select previous action or the default if it's the first time: -1 Only log out: 0 Log out and reboot the machine: 1 Log out and halt the machine: 2 Third parameter: mode Select previous mode or the default if it's the first time: -1 Schedule a shutdown (halt or reboot) for the time all active sessions have exited: 0 Shut down, if no sessions are active. Otherwise do nothing: 1 Force shutdown. Kill any possibly active sessions: 2 Pop up a dialog asking the user what to do if sessions are still active: 3 */ TQByteArray data; TQDataStream arg(data, IO_WriteOnly); arg << (int)0 << (int)2 << (int)2; if ( kapp->dcopClient()->send("ksmserver", "default", "logout(int,int,int)", data) ) { return true; } return false; } else if (ps == TDESystemPowerState::Reboot) { TDEConfig config("ksmserverrc", true); config.setGroup("General" ); if (!config.readBoolEntry( "offerShutdown", true )) { return false; } #ifdef WITH_LOGINDPOWER { TQT_DBusConnection dbusConn; dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if ( dbusConn.isConnected() ) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.trinitydesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", "Reboot"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } } #endif // WITH_LOGINDPOWER #ifdef WITH_CONSOLEKIT { TQT_DBusConnection dbusConn; dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); if ( dbusConn.isConnected() ) { TQT_DBusMessage msg = TQT_DBusMessage::methodCall( "org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", "Restart"); TQT_DBusMessage reply = dbusConn.sendWithReply(msg); if (reply.type() == TQT_DBusMessage::ReplyMessage) { return true; } } } #endif // WITH_CONSOLEKIT // Power down the system using a DCOP command // See above PowerOff section for logout() parameters explanation TQByteArray data; TQDataStream arg(data, IO_WriteOnly); arg << (int)0 << (int)1 << (int)2; if ( kapp->dcopClient()->send("ksmserver", "default", "logout(int,int,int)", data) ) { return true; } return false; } else if (ps == TDESystemPowerState::Active) { // Ummm...we're already active... return true; } return false; } #include "tderootsystemdevice.moc"