コード例 #1
0
ファイル: shutdown.cpp プロジェクト: serghei/kde3-kdebase
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";
                }
            }