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 108 109 110
|
/*
* SPDX-FileCopyrightText: 2025 Florian RICHER <florian.richer@protonmail.com>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "waydroidapplicationdbusobject.h"
#include "waydroidapplicationadaptor.h"
#include "waydroidintegrationplugin_debug.h"
#include <QDBusConnection>
#include <QLoggingCategory>
#include <QRegularExpression>
using namespace Qt::StringLiterals;
static const QRegularExpression nameRegExp(u"^Name:\\s*(\\S+)"_s);
static const QRegularExpression packageNameRegExp(u"^packageName:\\s*(\\S+)"_s);
WaydroidApplicationDBusObject::WaydroidApplicationDBusObject(QObject *parent)
: QObject{parent}
{
}
void WaydroidApplicationDBusObject::registerObject()
{
if (!m_dbusInitialized) {
new WaydroidApplicationAdaptor{this};
QString sanitizedPackageName = m_packageName;
sanitizedPackageName.replace(".", "_");
const QString objectPath = u"/WaydroidApplication/%1"_s.arg(sanitizedPackageName);
QDBusConnection::sessionBus().registerObject(objectPath, this);
m_objectPath = QDBusObjectPath(objectPath);
}
}
void WaydroidApplicationDBusObject::unregisterObject()
{
if (m_dbusInitialized) {
QDBusConnection::sessionBus().unregisterObject(m_objectPath.path());
m_dbusInitialized = false;
}
}
QDBusObjectPath WaydroidApplicationDBusObject::objectPath() const
{
return m_objectPath;
}
WaydroidApplicationDBusObject::Ptr WaydroidApplicationDBusObject::parseApplicationFromWaydroidLog(QTextStream &inFile)
{
const QString line = inFile.readLine();
const QRegularExpressionMatch nameMatch = nameRegExp.match(line);
if (!nameMatch.hasMatch() || nameMatch.lastCapturedIndex() == 0) {
return nullptr;
}
auto app = std::make_shared<WaydroidApplicationDBusObject>();
app->m_name = nameMatch.captured(nameMatch.lastCapturedIndex());
qint64 oldPos = inFile.pos();
while (!inFile.atEnd()) {
const QString line = inFile.readLine();
if (line.trimmed().isEmpty()) {
continue;
}
const QRegularExpressionMatch nameMatch = nameRegExp.match(line);
if (nameMatch.hasMatch()) {
inFile.seek(oldPos); // Revert file cursor position for the next Application parsing
return app;
}
const QRegularExpressionMatch packageNameMatch = packageNameRegExp.match(line);
if (packageNameMatch.hasMatch() && packageNameMatch.lastCapturedIndex() > 0) {
app->m_packageName = packageNameMatch.captured(packageNameMatch.lastCapturedIndex());
}
oldPos = inFile.pos();
}
return app;
}
QList<WaydroidApplicationDBusObject::Ptr> WaydroidApplicationDBusObject::parseApplicationsFromWaydroidLog(QTextStream &inFile)
{
QList<Ptr> applications;
while (!inFile.atEnd()) {
const auto app = parseApplicationFromWaydroidLog(inFile);
if (app == nullptr) {
qCWarning(WAYDROIDINTEGRATIONPLUGIN) << "Failed to fetch the application: Maybe wrong QTextStream cursor position.";
break;
}
qCDebug(WAYDROIDINTEGRATIONPLUGIN) << "Waydroid application found: " << app.get()->name() << " (" << app.get()->packageName() << ")";
applications.append(app);
}
return applications;
}
QString WaydroidApplicationDBusObject::name() const
{
return m_name;
}
QString WaydroidApplicationDBusObject::packageName() const
{
return m_packageName;
}
|