File indexing completed on 2024-06-16 05:04:20
0001 /* 0002 SPDX-FileCopyrightText: 2016 Martin Gräßlin <mgraesslin@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 #include "powermanagement_inhibition.h" 0007 0008 #include <QDBusConnection> 0009 #include <QDBusMessage> 0010 #include <QDBusMetaType> 0011 #include <QDBusPendingCallWatcher> 0012 #include <QDBusPendingReply> 0013 #include <QDBusServiceWatcher> 0014 0015 static const QString s_solidPowerService = QStringLiteral("org.kde.Solid.PowerManagement.PolicyAgent"); 0016 static const QString s_solidPath = QStringLiteral("/org/kde/Solid/PowerManagement/PolicyAgent"); 0017 0018 Q_DECLARE_METATYPE(QList<InhibitionInfo>) 0019 Q_DECLARE_METATYPE(InhibitionInfo) 0020 0021 PowerManagementInhibition::PowerManagementInhibition(QObject *parent) 0022 : QObject(parent) 0023 , m_solidPowerServiceWatcher(new QDBusServiceWatcher(s_solidPowerService, 0024 QDBusConnection::sessionBus(), 0025 QDBusServiceWatcher::WatchForUnregistration | QDBusServiceWatcher::WatchForRegistration)) 0026 { 0027 qDBusRegisterMetaType<QList<InhibitionInfo>>(); 0028 qDBusRegisterMetaType<InhibitionInfo>(); 0029 0030 connect(m_solidPowerServiceWatcher, &QDBusServiceWatcher::serviceUnregistered, this, [this] { 0031 m_serviceRegistered = false; 0032 m_inhibited = false; 0033 QDBusConnection::sessionBus().disconnect(s_solidPowerService, 0034 s_solidPath, 0035 s_solidPowerService, 0036 QStringLiteral("InhibitionsChanged"), 0037 this, 0038 SLOT(inhibitionsChanged(QList<InhibitionInfo>, QStringList))); 0039 }); 0040 connect(m_solidPowerServiceWatcher, &QDBusServiceWatcher::serviceRegistered, this, &PowerManagementInhibition::update); 0041 0042 // check whether the service is registered 0043 QDBusMessage message = QDBusMessage::createMethodCall(QStringLiteral("org.freedesktop.DBus"), 0044 QStringLiteral("/"), 0045 QStringLiteral("org.freedesktop.DBus"), 0046 QStringLiteral("ListNames")); 0047 QDBusPendingReply<QStringList> async = QDBusConnection::sessionBus().asyncCall(message); 0048 QDBusPendingCallWatcher *callWatcher = new QDBusPendingCallWatcher(async, this); 0049 connect(callWatcher, &QDBusPendingCallWatcher::finished, this, [this](QDBusPendingCallWatcher *self) { 0050 QDBusPendingReply<QStringList> reply = *self; 0051 self->deleteLater(); 0052 if (!reply.isValid()) { 0053 return; 0054 } 0055 if (reply.value().contains(s_solidPowerService)) { 0056 update(); 0057 } 0058 }); 0059 } 0060 0061 PowerManagementInhibition::~PowerManagementInhibition() = default; 0062 0063 void PowerManagementInhibition::update() 0064 { 0065 m_serviceRegistered = true; 0066 QDBusConnection::sessionBus().connect(s_solidPowerService, 0067 s_solidPath, 0068 s_solidPowerService, 0069 QStringLiteral("InhibitionsChanged"), 0070 this, 0071 SLOT(inhibitionsChanged(QList<InhibitionInfo>, QStringList))); 0072 checkInhibition(); 0073 } 0074 0075 void PowerManagementInhibition::inhibitionsChanged(const QList<InhibitionInfo> &added, const QStringList &removed) 0076 { 0077 Q_UNUSED(added) 0078 Q_UNUSED(removed) 0079 checkInhibition(); 0080 } 0081 0082 void PowerManagementInhibition::checkInhibition() 0083 { 0084 QDBusMessage msg = QDBusMessage::createMethodCall(s_solidPowerService, s_solidPath, s_solidPowerService, QStringLiteral("HasInhibition")); 0085 msg << (uint)4; // PowerDevil::PolicyAgent::RequiredPolicy::ChangeScreenSettings 0086 QDBusPendingReply<bool> pendingReply = QDBusConnection::sessionBus().asyncCall(msg); 0087 QDBusPendingCallWatcher *callWatcher = new QDBusPendingCallWatcher(pendingReply, this); 0088 connect(callWatcher, &QDBusPendingCallWatcher::finished, this, [this](QDBusPendingCallWatcher *self) { 0089 QDBusPendingReply<bool> reply = *self; 0090 self->deleteLater(); 0091 if (!reply.isValid()) { 0092 return; 0093 } 0094 m_inhibited = reply.value(); 0095 }); 0096 } 0097 0098 #include "moc_powermanagement_inhibition.cpp"