File indexing completed on 2024-04-28 16:55:47
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 "desktopportal.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 Request::~Request() 0037 { 0038 } 0039 0040 bool Request::handleMessage(const QDBusMessage &message, const QDBusConnection &connection) 0041 { 0042 Q_UNUSED(connection); 0043 0044 /* Check to make sure we're getting properties on our interface */ 0045 if (message.type() != QDBusMessage::MessageType::MethodCallMessage) { 0046 return false; 0047 } 0048 0049 qCDebug(XdgRequestKdeRequest) << message.interface(); 0050 qCDebug(XdgRequestKdeRequest) << message.member(); 0051 qCDebug(XdgRequestKdeRequest) << message.path(); 0052 0053 if (message.interface() == QLatin1String("org.freedesktop.impl.portal.Request")) { 0054 if (message.member() == QLatin1String("Close")) { 0055 if (m_portalName == QLatin1String("org.freedesktop.impl.portal.Inhibit")) { 0056 QDBusMessage uninhibitMessage = QDBusMessage::createMethodCall(QStringLiteral("org.kde.Solid.PowerManagement"), 0057 QStringLiteral("/org/kde/Solid/PowerManagement/PolicyAgent"), 0058 QStringLiteral("org.kde.Solid.PowerManagement.PolicyAgent"), 0059 QStringLiteral("ReleaseInhibition")); 0060 0061 uninhibitMessage << m_data.toUInt(); 0062 0063 QDBusPendingCall pendingCall = QDBusConnection::sessionBus().asyncCall(uninhibitMessage); 0064 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall); 0065 connect(watcher, &QDBusPendingCallWatcher::finished, this, [this, message](QDBusPendingCallWatcher *watcher) { 0066 QDBusPendingReply<> reply = *watcher; 0067 QDBusMessage messageReply; 0068 if (reply.isError()) { 0069 qCDebug(XdgRequestKdeRequest) << "Uninhibit error: " << reply.error().message(); 0070 messageReply = message.createErrorReply(reply.error()); 0071 } else { 0072 messageReply = message.createReply(); 0073 Q_EMIT closeRequested(); 0074 } 0075 0076 QDBusConnection::sessionBus().asyncCall(messageReply); 0077 }); 0078 } else { 0079 Q_EMIT closeRequested(); 0080 QDBusMessage reply = message.createReply(); 0081 return connection.send(reply); 0082 } 0083 } 0084 } 0085 0086 return true; 0087 } 0088 0089 QString Request::introspect(const QString &path) const 0090 { 0091 QString nodes; 0092 0093 if (path.startsWith(QLatin1String("/org/freedesktop/portal/desktop/request/"))) { 0094 nodes = QStringLiteral( 0095 "<interface name=\"org.freedesktop.impl.portal.Request\">" 0096 " <method name=\"Close\">" 0097 " </method>" 0098 "</interface>"); 0099 } 0100 0101 qCDebug(XdgRequestKdeRequest) << nodes; 0102 0103 return nodes; 0104 }