void KSMServer::shutdown(KApplication::ShutdownConfirm confirm, KApplication::ShutdownType sdtype, KApplication::ShutdownMode sdmode) { pendingShutdown.stop(); if(dialogActive) return; if(state >= Shutdown) // already performing shutdown return; if(state != Idle) // performing startup { // perform shutdown as soon as startup is finished, in order to avoid saving partial session if(!pendingShutdown.isActive()) { pendingShutdown.start(1000); pendingShutdown_confirm = confirm; pendingShutdown_sdtype = sdtype; pendingShutdown_sdmode = sdmode; } return; } KConfig *config = KGlobal::config(); config->reparseConfiguration(); // config may have changed in the KControl module config->setGroup("General"); bool logoutConfirmed = (confirm == KApplication::ShutdownConfirmYes) ? false : (confirm == KApplication::ShutdownConfirmNo) ? true : !config->readBoolEntry("confirmLogout", true); bool mayShutdown = (config->readBoolEntry("offerShutdown", true) && DM().canShutdown()); bool maySuspend = config->readBoolEntry("offerSuspend", true); bool mayHibernate = config->readBoolEntry("offerHibernate", true); bool lockBeforeSuspendHibernate = config->readBoolEntry("lockBeforeSuspendHibernate", true); // FIXME At this moment we can't query for SuspendAllowed/HibernateAllowed because // we haven't support for ConsoleKit yet // query upower for suspend/hibernate capability QDBusConnection dbusConnection; if(maySuspend || mayHibernate) { dbusConnection = QDBusConnection::addConnection(QDBusConnection::SystemBus); if(dbusConnection.isConnected()) { // can suspend? if(maySuspend) { #ifdef WITH_LOGIND QDBusMessage dbusMessage = QDBusMessage::methodCall(DBUS_UPOWER_SERVICE, DBUS_UPOWER_PATH, DBUS_UPOWER_INTERFACE, "CanSuspend"); #else QDBusMessage dbusMessage = QDBusMessage::methodCall(DBUS_UPOWER_SERVICE, DBUS_UPOWER_PATH, DBUS_PROPERTIES_INTERFACE, "Get"); dbusMessage << QDBusData::fromString(DBUS_UPOWER_INTERFACE) << QDBusData::fromString("CanSuspend"); #endif QDBusMessage dbusReply = dbusConnection.sendWithReply(dbusMessage); if(dbusReply.type() == QDBusMessage::ReplyMessage && dbusReply.count() == 1) #ifdef WITH_LOGIND maySuspend = ("yes" == dbusReply[0].toString()); #else maySuspend = dbusReply[0].toVariant().value.toBool(); #endif else { maySuspend = false; kdDebug() << "[dbus/upower] CanSuspend: " << dbusConnection.lastError().message() << "\n"; } } // can hibernate? if(mayHibernate) { #ifdef WITH_LOGIND QDBusMessage dbusMessage = QDBusMessage::methodCall(DBUS_UPOWER_SERVICE, DBUS_UPOWER_PATH, DBUS_UPOWER_INTERFACE, "CanHibernate"); #else QDBusMessage dbusMessage = QDBusMessage::methodCall(DBUS_UPOWER_SERVICE, DBUS_UPOWER_PATH, DBUS_PROPERTIES_INTERFACE, "Get"); dbusMessage << QDBusData::fromString(DBUS_UPOWER_INTERFACE) << QDBusData::fromString("CanHibernate"); #endif QDBusMessage dbusReply = dbusConnection.sendWithReply(dbusMessage); if(dbusReply.type() == QDBusMessage::ReplyMessage && dbusReply.count() == 1) #ifdef WITH_LOGIND mayHibernate = ("yes" == dbusReply[0].toString()); #else mayHibernate = dbusReply[0].toVariant().value.toBool(); #endif else { mayHibernate = false; kdDebug() << "[dbus/upower] CanHibernate: " << dbusConnection.lastError().message() << "\n"; } }