File: waydroidapplicationdbusobject.cpp

package info (click to toggle)
plasma-mobile 6.5.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 20,412 kB
  • sloc: xml: 38,474; cpp: 18,529; javascript: 139; sh: 82; makefile: 5
file content (110 lines) | stat: -rw-r--r-- 3,464 bytes parent folder | download
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;
}