File indexing completed on 2024-04-28 05:36:52

0001 /*
0002  * SPDX-FileCopyrightText: 2016 Red Hat Inc
0003  *
0004  * SPDX-License-Identifier: LGPL-2.0-or-later
0005  *
0006  * SPDX-FileCopyrightText: 2016 Jan Grulich <jgrulich@redhat.com>
0007  */
0008 
0009 #include "request.h"
0010 #include "request_debug.h"
0011 
0012 #include <QDBusConnection>
0013 #include <QDBusMessage>
0014 #include <QDBusPendingCall>
0015 #include <QDBusPendingCallWatcher>
0016 #include <QDBusPendingReply>
0017 
0018 Request::Request(const QDBusObjectPath &handle, QObject *parent, const QString &portalName, const QVariant &data)
0019     : QDBusVirtualObject(parent)
0020     , m_data(data)
0021     , m_portalName(portalName)
0022 {
0023     auto sessionBus = QDBusConnection::sessionBus();
0024     if (sessionBus.registerVirtualObject(handle.path(), this, QDBusConnection::VirtualObjectRegisterOption::SubPath)) {
0025         connect(this, &Request::closeRequested, this, [this, handle]() {
0026             QDBusConnection::sessionBus().unregisterObject(handle.path());
0027             deleteLater();
0028         });
0029     } else {
0030         qCDebug(XdgRequestKdeRequest) << sessionBus.lastError().message();
0031         qCDebug(XdgRequestKdeRequest) << "Failed to register request object for" << handle.path();
0032         deleteLater();
0033     }
0034 }
0035 
0036 bool Request::handleMessage(const QDBusMessage &message, const QDBusConnection &connection)
0037 {
0038     Q_UNUSED(connection);
0039 
0040     /* Check to make sure we're getting properties on our interface */
0041     if (message.type() != QDBusMessage::MessageType::MethodCallMessage) {
0042         return false;
0043     }
0044 
0045     qCDebug(XdgRequestKdeRequest) << message.interface();
0046     qCDebug(XdgRequestKdeRequest) << message.member();
0047     qCDebug(XdgRequestKdeRequest) << message.path();
0048 
0049     if (message.interface() == QLatin1String("org.freedesktop.impl.portal.Request")) {
0050         if (message.member() == QLatin1String("Close")) {
0051             if (m_portalName == QLatin1String("org.freedesktop.impl.portal.Inhibit")) {
0052                 QDBusMessage uninhibitMessage = QDBusMessage::createMethodCall(QStringLiteral("org.kde.Solid.PowerManagement"),
0053                                                                                QStringLiteral("/org/kde/Solid/PowerManagement/PolicyAgent"),
0054                                                                                QStringLiteral("org.kde.Solid.PowerManagement.PolicyAgent"),
0055                                                                                QStringLiteral("ReleaseInhibition"));
0056 
0057                 uninhibitMessage << m_data.toUInt();
0058 
0059                 QDBusPendingCall pendingCall = QDBusConnection::sessionBus().asyncCall(uninhibitMessage);
0060                 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall);
0061                 connect(watcher, &QDBusPendingCallWatcher::finished, this, [this, message](QDBusPendingCallWatcher *watcher) {
0062                     QDBusPendingReply<> reply = *watcher;
0063                     QDBusMessage messageReply;
0064                     if (reply.isError()) {
0065                         qCDebug(XdgRequestKdeRequest) << "Uninhibit error: " << reply.error().message();
0066                         messageReply = message.createErrorReply(reply.error());
0067                     } else {
0068                         messageReply = message.createReply();
0069                         Q_EMIT closeRequested();
0070                     }
0071 
0072                     QDBusConnection::sessionBus().asyncCall(messageReply);
0073                 });
0074             } else {
0075                 Q_EMIT closeRequested();
0076                 QDBusMessage reply = message.createReply();
0077                 return connection.send(reply);
0078             }
0079         }
0080     }
0081 
0082     return true;
0083 }
0084 
0085 QString Request::introspect(const QString &path) const
0086 {
0087     QString nodes;
0088 
0089     if (path.startsWith(QLatin1String("/org/freedesktop/portal/desktop/request/"))) {
0090         nodes = QStringLiteral(
0091             "<interface name=\"org.freedesktop.impl.portal.Request\">"
0092             "    <method name=\"Close\">"
0093             "    </method>"
0094             "</interface>");
0095     }
0096 
0097     qCDebug(XdgRequestKdeRequest) << nodes;
0098 
0099     return nodes;
0100 }