Документация
ОС Аврора 5.1.6
Использование D-Bus интерфейса для взаимодействия с Market API
Ниже приведены фрагменты кода или же цельные файлы, которые реализуют клиент для работы с D-Bus API пакетного менеджера Market. Данный менеджер предоставляет функционал для получения свойств системы и установленных пакетов, управления операциями (установка, удаление) и обработки сигналов об изменении статусов операций через пользовательские D-Bus типы данных.
-
.spec-файл:
... BuildRequires: pkgconfig(Qt5DBus) ... -
.pro-файл:
... QT += dbus \ ... SOURCES += \ src/{путь_к_файлу}/dbusinterface.cpp \ ... HEADERS += \ src/{путь_к_файлу}/customdbastype.h \ src/{путь_к_файлу}/dbusinterface.h \ ... -
customdbastype.h:// SPDX-FileCopyrightText: 2025 Open Mobile Platform LLC <community@omp.ru> // SPDX-License-Identifier: BSD-3-Clause #pragma once #include <QtDBus/QtDBus> // Данная структура служит для сериализации/десериализации данных операции(operation) D-Bus структуры типа (ssiii). struct Operation { QString operationUuid; QString packageId; int operationType; int operationStatus; int operationErrorCode; /*! Преобразует данные операции в формат аргумента D-Bus. argument — QDBusArgument. data — данные операции для преобразования. Возвращает аргумент D-Bus с переданными данными. */ friend QDBusArgument &operator << (QDBusArgument &argument, const Operation &data) { argument.beginStructure(); argument << data.operationUuid << data.packageId << data.operationType << data.operationStatus << data.operationErrorCode; argument.endStructure(); return argument; } /*! Извлекает данные операции из аргумента D-Bus. argument — QDBusArgument. data — выходной параметр с данными операции. Возвращает аргумент D-Bus, содержащий данные. */ friend const QDBusArgument &operator >> (const QDBusArgument &argument, Operation &data) { argument.beginStructure(); argument >> data.operationUuid >> data.packageId >> data.operationType >> data.operationStatus >> data.operationErrorCode; argument.endStructure(); return argument; } /*! Перегрузка оператора вывода. debug — экземпляр класса QDebug. operation — данные операции, предназначенные для вывода. Возвращает экземпляр класса QDebug. */ friend QDebug operator << (QDebug debug, const Operation &operation) { debug << "operationUuid =" << operation.operationUuid << "packageId =" << operation.packageId << "operationType =" << operation.operationType << "operationStatus =" << operation.operationStatus << "operationErrorCode =" << operation.operationErrorCode; return debug; } }; // Регистрация пользовательского типа для работы с QDBus Q_DECLARE_METATYPE(Operation) -
dbusinterface.h:// SPDX-FileCopyrightText: 2025 Open Mobile Platform LLC <community@omp.ru> // SPDX-License-Identifier: BSD-3-Clause #pragma once #include "customdbastype.h" /*! DbusInterface предоставляет интерфейс для работы с D-Bus API сервиса ru.omp.Market. */ class DbusInterface final : public QDBusAbstractInterface { Q_OBJECT public: explicit DbusInterface(QObject *parent = nullptr); ~DbusInterface() final override = default; void allProperties(); void removePackage(const QString &packageID); QStringList installedPackages() const; public slots: void handlePackageRemoved(const QString &packageId); void handleOperationStatusChanged(const Operation &operation); private: QStringList m_installedPackages; }; -
dbusinterface.cpp:// SPDX-FileCopyrightText: 2025 Open Mobile Platform LLC <community@omp.ru> // SPDX-License-Identifier: BSD-3-Clause #include "dbusinterface.h" #include <QDebug> namespace { const QString marketService = QStringLiteral("ru.omp.Market"); const QString marketObjectPath = QStringLiteral("/ru/omp/Market"); const char *marketInterface = "ru.omp.Market"; } // Конструктор регистрирует типы и подключается к D-Bus сервису ru.omp.Market. // parent — родительский экземпляр QObject. DbusInterface::DbusInterface(QObject *parent) : QDBusAbstractInterface(marketService, marketObjectPath, marketInterface, QDBusConnection::sessionBus(), parent) { // Регистрация пользовательского типа для работы с QDBus. qRegisterMetaType<Operation>("Operation"); qDBusRegisterMetaType<Operation>(); bool isConnected = connection().connect(marketService, marketObjectPath, marketInterface, QStringLiteral("PackageRemoved"), this, SLOT(handlePackageRemoved(const QString &))); if (!isConnected) { qWarning() << "Can't connect to PackageRemoved() signal !"; } isConnected = connection().connect(marketService, marketObjectPath, marketInterface, QStringLiteral("OperationStatusChanged"), this, SLOT(handleOperationStatusChanged(const Operation &))); if (!isConnected) { qWarning() << "Can't connect to OperationStatusChanged() signal !"; } } /*! Запрашивает все свойства, необходимые для работы с пакетами, через D-Bus метод GetAllProperties(). Используя GetAllProperties(), можно получить словарь со всеми требуемыми свойствами: - a{sv}: { 'Architecture': String, 'AuroraVersion': String, 'Packages': List<Package> a(ssssa{sv}) 'Operations': List<Operations>, a(ssiii) 'CompletedOperations': List<Operations>, a(ssiii) } Данный метод не демонстрирует получение всех данных. */ void DbusInterface::allProperties() { const QDBusPendingReply<QVariantMap> asyncReply = asyncCall(QStringLiteral("GetAllProperties")); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(asyncReply, this); QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, [this](QDBusPendingCallWatcher *watcher) { if (watcher->isError()) { qWarning() << "AllProperties: asyncCall() error: " << watcher->error().message(); } else { const QDBusPendingReply<QVariantMap> asyncReply = *watcher; QVariantMap properties = asyncReply.value(); qDebug() << "AllProperties: Architecture = " << properties.value("Architecture", QVariant()).toString(); qDebug() << "AllProperties: AuroraVersion = " << properties.value("AuroraVersion", QVariant()).toString(); QVariantList packagesVariant = qdbus_cast<QVariantList>(properties.value("Packages", QVariant())); m_installedPackages.reserve(packagesVariant.size()); for (const auto &package : std::as_const(packagesVariant)) { m_installedPackages.append(package.toString()); } qDebug() << "AllProperties: Packages: " << m_installedPackages; QList<Operation> activeOperations = qdbus_cast<QList<Operation>>(properties.value("Operations", QVariant())); for (const auto &operation : std::as_const(activeOperations)) { qDebug() << "AllProperties: Operations: " << operation; } QList<Operation> completedOperations = qdbus_cast<QList<Operation>>(properties.value("CompletedOperations", QVariant())); for (const auto &completedOperation : std::as_const(completedOperations)) { qDebug() << "AllProperties: CompletedOperations: " << completedOperation; } } watcher->deleteLater(); }); } /*! Удаляет пакет по его packageID через D-Bus метод Remove(). Ответ на вызов метода удаления пакета будет содержать структуру с данными операции (ssiii). packageID — идентификатор пакета в формате: "ru.auroraos.ApplicationTemplate". */ void DbusInterface::removePackage(const QString &packageID) { const QDBusPendingReply<Operation> asyncReply = asyncCall(QStringLiteral("Remove") , QVariant::fromValue(packageID)); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(asyncReply, this); QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, [](QDBusPendingCallWatcher *watcher) { if (watcher->isError()) { qWarning() << "Remove: error deleting package: " << watcher->error().message(); } else { const QDBusPendingReply<Operation> asyncReply = *watcher; Operation reply = asyncReply.value(); qDebug() << "Remove: removed package operation: " << reply; } watcher->deleteLater(); }); } /*! Геттер для установленных пакетов. Возвращает установленные пакеты. */ QStringList DbusInterface::installedPackages() const { return m_installedPackages; } /*! Обработчик сигнала PackageRemoved. packageId — идентификатор удалённого пакета. */ void DbusInterface::handlePackageRemoved(const QString &packageId) { qDebug() << "PackageRemoved, packageId = " << packageId; } /*! Обработчик сигнала OperationStatusChanged. operation — данные операции. */ void DbusInterface::handleOperationStatusChanged(const Operation &operation) { qDebug() << "OperationStatusChanged: " << operation; } -
main.cpp:... #include "{путь к файлу}/dbusinterface.h" ... int main(int argc, char *argv[]) { ... DbusInterface marketInterface; marketInterface.allProperties(); marketInterface.removePackage(QStringLiteral("ru.auroraos.ApplicationTemplate")); /*! Пример: удаляет первый пакет из списка установленных пакетов: if (marketInterface.installedPackages().size()) { marketInterface.removePackage(*marketInterface.installedPackages().constBegin()); } */ ...