Документация
ОС Аврора 5.1.6

Использование D-Bus интерфейса для взаимодействия с Market API

Ниже приведены фрагменты кода или же цельные файлы, которые реализуют клиент для работы с D-Bus API пакетного менеджера Market. Данный менеджер предоставляет функционал для получения свойств системы и установленных пакетов, управления операциями (установка, удаление) и обработки сигналов об изменении статусов операций через пользовательские D-Bus типы данных.

  1. .spec-файл:

    ...
    BuildRequires:  pkgconfig(Qt5DBus)
    ...
    
  2. .pro-файл:

    ...
    QT += dbus \
    ...
    SOURCES += \
        src/{путь_к_файлу}/dbusinterface.cpp \
    ...
    HEADERS += \
        src/{путь_к_файлу}/customdbastype.h \
        src/{путь_к_файлу}/dbusinterface.h \
    ...
    
  3. 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)
    
  4. 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;
    
    };
    
  5. 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;
    }
    
  6. 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());
            }
        */
    ...
    

Мы используем cookies для персонализации сайта и его более удобного использования. Вы можете запретить cookies в настройках браузера.

Пожалуйста ознакомьтесь с политикой использования cookies.