1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
/*
* SPDX-FileCopyrightText: 2025 Florian RICHER <florian.richer@protonmail.com>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "waydroidapplicationdbusclient.h"
#include <QDBusConnection>
using namespace Qt::StringLiterals;
WaydroidApplicationDBusClient::WaydroidApplicationDBusClient(const QDBusObjectPath &objectPath, QObject *parent)
: QObject{parent}
, m_objectPath{objectPath}
, m_interface{new OrgKdePlasmashellWaydroidApplicationInterface{u"org.kde.plasmashell"_s, objectPath.path(), QDBusConnection::sessionBus(), this}}
, m_watcher{new QDBusServiceWatcher{u"org.kde.plasmashell"_s, QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForOwnerChange, this}}
{
// Check if the service is already running
if (QDBusConnection::sessionBus().interface()->isServiceRegistered(u"org.kde.plasmashell"_s)) {
m_connected = true;
if (m_interface->isValid()) {
connectSignals();
}
}
connect(m_watcher, &QDBusServiceWatcher::serviceOwnerChanged, this, [this](const QString &service, const QString &oldOwner, const QString &newOwner) {
if (service == u"org.kde.plasmashell"_s) {
if (newOwner.isEmpty()) {
// Service stopped
m_connected = false;
} else if (oldOwner.isEmpty()) {
// Service started
m_connected = true;
if (m_interface->isValid()) {
connectSignals();
}
}
}
});
}
void WaydroidApplicationDBusClient::connectSignals()
{
// Initialize properties
updateName();
updatePackageName();
}
QString WaydroidApplicationDBusClient::name() const
{
return m_name;
}
QString WaydroidApplicationDBusClient::packageName() const
{
return m_packageName;
}
QDBusObjectPath WaydroidApplicationDBusClient::objectPath() const
{
return m_objectPath;
}
void WaydroidApplicationDBusClient::updateName()
{
if (!m_connected) {
return;
}
auto reply = m_interface->name();
auto watcher = new QDBusPendingCallWatcher(reply, this);
connect(watcher, &QDBusPendingCallWatcher::finished, this, [this](auto watcher) {
QDBusPendingReply<QString> reply = *watcher;
const auto name = reply.argumentAt<0>();
if (m_name != name) {
m_name = name;
Q_EMIT nameChanged();
}
watcher->deleteLater();
});
}
void WaydroidApplicationDBusClient::updatePackageName()
{
if (!m_connected) {
return;
}
auto reply = m_interface->name();
auto watcher = new QDBusPendingCallWatcher(reply, this);
connect(watcher, &QDBusPendingCallWatcher::finished, this, [this](auto watcher) {
QDBusPendingReply<QString> reply = *watcher;
const auto packageName = reply.argumentAt<0>();
if (m_packageName != packageName) {
m_packageName = packageName;
Q_EMIT packageNameChanged();
}
watcher->deleteLater();
});
}
|