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 }