1
mirror of https://github.com/qbittorrent/qBittorrent synced 2024-07-12 18:10:50 +02:00

Detect D-Bus interface

This commit is contained in:
Chocobo1 2023-07-18 15:34:32 +08:00
parent 79afa0b84d
commit 64c3845a7c
No known key found for this signature in database
GPG Key ID: 210D9C873253A68C
2 changed files with 39 additions and 58 deletions

View File

@ -29,7 +29,7 @@
#include "powermanagement_x11.h"
#include <QDBusConnection>
#include <QDBusMessage>
#include <QDBusInterface>
#include <QDBusPendingCall>
#include <QDBusPendingReply>
@ -37,16 +37,27 @@
PowerManagementInhibitor::PowerManagementInhibitor(QObject *parent)
: QObject(parent)
, m_busInterface {new QDBusInterface(u"org.gnome.SessionManager"_s, u"/org/gnome/SessionManager"_s
, u"org.gnome.SessionManager"_s, QDBusConnection::sessionBus(), this)}
{
if (!QDBusConnection::sessionBus().isConnected())
if (!m_busInterface->isValid())
{
qDebug("D-Bus: Could not connect to session bus");
m_state = Error;
}
else
{
m_state = Idle;
delete m_busInterface;
m_busInterface = new QDBusInterface(u"org.freedesktop.PowerManagement"_s, u"/org/freedesktop/PowerManagement/Inhibit"_s
, u"org.freedesktop.PowerManagement.Inhibit"_s, QDBusConnection::sessionBus(), this);
m_manager = ManagerType::Freedesktop;
if (!m_busInterface->isValid())
{
delete m_busInterface;
m_busInterface = nullptr;
m_state = Error;
return;
}
}
m_busInterface->setTimeout(1000);
}
void PowerManagementInhibitor::requestIdle()
@ -58,20 +69,10 @@ void PowerManagementInhibitor::requestIdle()
m_state = RequestIdle;
qDebug("D-Bus: PowerManagementInhibitor: Requesting idle");
QDBusMessage call = m_useGSM
? QDBusMessage::createMethodCall(
u"org.gnome.SessionManager"_s,
u"/org/gnome/SessionManager"_s,
u"org.gnome.SessionManager"_s,
u"Uninhibit"_s)
: QDBusMessage::createMethodCall(
u"org.freedesktop.PowerManagement"_s,
u"/org/freedesktop/PowerManagement/Inhibit"_s,
u"org.freedesktop.PowerManagement.Inhibit"_s,
u"UnInhibit"_s);
call.setArguments({m_cookie});
const QDBusPendingCall pcall = QDBusConnection::sessionBus().asyncCall(call, 1000);
const QString method = (m_manager == ManagerType::Gnome)
? u"Uninhibit"_s
: u"UnInhibit"_s;
const QDBusPendingCall pcall = m_busInterface->asyncCall(method, m_cookie);
const auto *watcher = new QDBusPendingCallWatcher(pcall, this);
connect(watcher, &QDBusPendingCallWatcher::finished, this, &PowerManagementInhibitor::onAsyncReply);
}
@ -85,27 +86,11 @@ void PowerManagementInhibitor::requestBusy()
m_state = RequestBusy;
qDebug("D-Bus: PowerManagementInhibitor: Requesting busy");
QDBusMessage call = m_useGSM
? QDBusMessage::createMethodCall(
u"org.gnome.SessionManager"_s,
u"/org/gnome/SessionManager"_s,
u"org.gnome.SessionManager"_s,
u"Inhibit"_s)
: QDBusMessage::createMethodCall(
u"org.freedesktop.PowerManagement"_s,
u"/org/freedesktop/PowerManagement/Inhibit"_s,
u"org.freedesktop.PowerManagement.Inhibit"_s,
u"Inhibit"_s);
QList<QVariant> args = {u"qBittorrent"_s};
if (m_useGSM)
args << 0u;
args << u"Active torrents are presented"_s;
if (m_useGSM)
args << 4u;
call.setArguments(args);
const QDBusPendingCall pcall = QDBusConnection::sessionBus().asyncCall(call, 1000);
const QString message = u"Active torrents are presented"_s;
const auto args = (m_manager == ManagerType::Gnome)
? QList<QVariant> {u"qBittorrent"_s, 0u, message, 4u}
: QList<QVariant> {u"qBittorrent"_s, message};
const QDBusPendingCall pcall = m_busInterface->asyncCallWithArgumentList(u"Inhibit"_s, args);
const auto *watcher = new QDBusPendingCallWatcher(pcall, this);
connect(watcher, &QDBusPendingCallWatcher::finished, this, &PowerManagementInhibitor::onAsyncReply);
}
@ -138,19 +123,7 @@ void PowerManagementInhibitor::onAsyncReply(QDBusPendingCallWatcher *call)
if (reply.isError())
{
qDebug("D-Bus: Reply: Error: %s", qUtf8Printable(reply.error().message()));
if (m_useGSM)
{
qDebug("D-Bus: Falling back to org.freedesktop.PowerManagement");
m_useGSM = false;
m_state = Idle;
if (m_intendedState == Busy)
requestBusy();
}
else
{
m_state = Error;
}
m_state = Error;
}
else
{

View File

@ -30,6 +30,7 @@
#include <QObject>
class QDBusInterface;
class QDBusPendingCallWatcher;
class PowerManagementInhibitor final : public QObject
@ -57,9 +58,16 @@ private:
RequestIdle
};
enum class ManagerType
{
Freedesktop, // https://www.freedesktop.org/wiki/Specifications/power-management-spec/
Gnome // https://github.com/GNOME/gnome-settings-daemon/blob/master/gnome-settings-daemon/org.gnome.SessionManager.xml
};
QDBusInterface *m_busInterface = nullptr;
ManagerType m_manager = ManagerType::Gnome;
enum State m_state = Error;
enum State m_intendedState = Idle;
quint32 m_cookie = 0;
bool m_useGSM = true;
};