Russian Qt Forum
Ноябрь 23, 2024, 08:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Выключение компьютера через D-Bus  (Прочитано 12620 раз)
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #15 : Май 07, 2013, 15:43 »

вот так попробуй

Код
C++ (Qt)
   QDBusInterface remoteApp("org.freedesktop.ConsoleKit",
                               "/org/freedesktop/ConsoleKit/Manager",
                               "org.freedesktop.ConsoleKit.Manager",
                               QDBusConnection::systemBus());
 
   remoteApp.call("Stop"); // нужно ещё проверить ответ если он есть и вывести ошибку если есть
 

Сделал так, проверил ответ и ошибку! Ответа нет, ошибки нет..
не проходит проверку if(remoteApp.isValid())

Код:
int main(int argc, char **argv)
{
     QCoreApplication app(argc, argv);

     // Создаем соединение с системной шиной D-Bus
     QDBusConnection conn = QDBusConnection::systemBus();

     if (!conn.isConnected()) {
         qDebug() << "Err: isConnected systemBus";
         return 1;
     }

     QDBusInterface iface("org.freedesktop.ConsoleKit.Manager",
                          "/org/freedesktop/ConsoleKit/Manager",
                          "org.freedesktop.ConsoleKit.Manager",
                          QDBusConnection::systemBus());

     if (iface.isValid())
     {
         qDebug() << "iface.isValid()";
         QDBusReply<QString> reply = iface.call("Stop");
         if (reply.isValid()) {
             printf("Reply was: %s\n", qPrintable(reply.value()));
             //return 0;
         }

         fprintf(stderr, "Call failed: %s\n", qPrintable(reply.error().message()));
         //return 1;
     }
     else
     {
        qDebug() << "iface not valid";
     }
     return 0;
}

iface not valid
« Последнее редактирование: Май 07, 2013, 16:07 от Vladimir » Записан
tester64
Гость
« Ответ #16 : Май 07, 2013, 22:09 »

Можно использовать D-Bus интерфейсы ConsoleKit, UPower, HAL, и десктоп-специфичные интерфейсы.
Какие из D-Bus интерфейсов будут работать - сказать трудно.
У меня на OpenSUSE 12.3 работает только UPower, но возможно, что он не позволяет выполнять выключение и перезагрузку (во всяком случае, в коде KShutdown такого нет, а спецификацию искать было лень).

Вот навскидку работающий вариант для KDE:
Код
C++ (Qt)
#include <kworkspace/kworkspace.h>
[...]
QDBusInterface dbiConsoleKit("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", QDBusConnection::systemBus());
QDBusInterface dbiUPower("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.UPower", QDBusConnection::systemBus());
QDBusInterface dbiHal("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device.SystemPowerManagement", QDBusConnection::systemBus());
QList<QDBusInterface*> dbis({&dbiConsoleKit, &dbiUPower, &dbiHal, nullptr});
QDBusMessage m;
QDBusError e;
QList<QDBusError::ErrorType> allowed({QDBusError::NoError, QDBusError::NoReply, QDBusError::Other});
foreach (QDBusInterface *dbi, dbis) {
if (dbi != nullptr && !dbi->isValid()) continue;
if (query == "system:halt") {
if (dbi == &dbiConsoleKit) m = dbi->call("Stop");
else if (dbi == &dbiHal) m = dbi->call("Shutdown");
else if (dbi == nullptr) KWorkSpace::requestShutDown(KWorkSpace::ShutdownConfirmNo, KWorkSpace::ShutdownTypeHalt, KWorkSpace::ShutdownModeForceNow); // именно "ShutdownTypeHalt", а не то, что написано в "kworkspace.h": "Temporary brain damage. Don't use. Same as ShutdownTypeNone"
else continue;
} else if (query == "system:reboot") {
if (dbi == &dbiConsoleKit) m = dbi->call("Restart");
else if (dbi == &dbiHal) m = dbi->call("Reboot");
else if (dbi == nullptr) KWorkSpace::requestShutDown(KWorkSpace::ShutdownConfirmNo, KWorkSpace::ShutdownTypeReboot, KWorkSpace::ShutdownModeForceNow);
else continue;
} else if [...]
}
e = dbi->lastError();
if (allowed.contains(e.type())) { ok = true; break; }
}

Если нужен другой десктоп или список по-максимуму, то наверное будет проще содрать из KShutdown.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #17 : Май 08, 2013, 00:06 »

Сделал так, проверил ответ и ошибку! Ответа нет, ошибки нет..
не проходит проверку if(remoteApp.isValid())

Думаю дело в правах или неправильном использовании интерфейса consolekit (в котором я не специалист).
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #18 : Май 08, 2013, 10:34 »

Сделал так, проверил ответ и ошибку! Ответа нет, ошибки нет..
не проходит проверку if(remoteApp.isValid())

Думаю дело в правах или неправильном использовании интерфейса consolekit (в котором я не специалист).

Да, дело было в неправильном использовании/написании интерфейса! Правильное написание

QDBusInterface dbiConsoleKit("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", QDBusConnection::systemBus());


вместо

QDBusInterface iface("org.freedesktop.ConsoleKit.Manager",
                          "/org/freedesktop/ConsoleKit/Manager",
                          "org.freedesktop.ConsoleKit.Manager",
                          QDBusConnection::systemBus());


Спасибо ВСЕМ за помощь! =)
« Последнее редактирование: Май 08, 2013, 10:37 от Vladimir » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #19 : Май 08, 2013, 13:16 »

Да, дело было в неправильном использовании/написании интерфейса! Правильное написание

Ну да, я не обратил внимание на то, что ты имя сервиса написал неправильно, хотя в моём сообщении было правильно.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.104 секунд. Запросов: 23.