File indexing completed on 2024-04-14 05:21: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"