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

Использование Market Daemon

Ниже приведены фрагменты кода или же цельные файлы, которые предоставляют функционал для установки, обновления и удаления RPM-пакетов с обработкой статусов операций и отображением уведомлений о событиях.

  1. .spec-файл:

    ...
    BuildRequires:  pkgconfig(nemonotifications-qt5)
    BuildRequires:  pkgconfig(market)
    ...
    
  2. .pro-файл:

    ...
    PKGCONFIG += \
        market \
        nemonotifications-qt5 \
    ...
    SOURCES += \
        src/{путь к файлу}/controllerexample.cpp \
    ...
    HEADERS += \
        src/{путь к файлу}/controllerexample.h \
    ...
    
  3. controllerexample.h:

    // SPDX-FileCopyrightText: 2025 Open Mobile Platform LLC <community@omp.ru>
    // SPDX-License-Identifier: BSD-3-Clause
    
    #pragma once
    
    #include <QObject>
    
    #include <market/daemon-connection.hpp>
    
    // Класс ControllerExample — это класс для работы с Market::DaemonConnection.
    // Этот класс демонстрирует, как вызывать операции с пакетами, например, установку пакета,
    // а также использование класса EventSubscription для подписки на события операций Market::DaemonConnection.
    class ControllerExample : public QObject
    {
        Q_OBJECT
    
    public:
        explicit ControllerExample(QObject *parent = nullptr);
        ~ControllerExample() override;
    
        QString operationErrorCodeToString(const Market::Operation &operation);
        void installPackage(const QString &packagePath);
        QStringList packagesPaths();
    
    public slots:
        void handleOperationStatusChanged(Market::Operation operation);
        void handlePackageInstalled(Market::Package package);
        void handlePackageUpgraded(Market::Package package);
        void handlePackageRemoved(Market::Package package);
    
    private:
        void subscribeToDaemonConnectionEvents();
        void unsubscribeFromDaemonConnectionEvents();
        void showNotification(const QString &summary, const QString &message);
        void addRpmPackagesToInstallList();
    
    private:
        std::vector<Market::EventSubscription> m_subscriptions;
        Market::DaemonConnection m_daemon;
        QStringList m_packagesPaths;
    
  4. controllerexample.cpp:

    // SPDX-FileCopyrightText: 2025 Open Mobile Platform LLC <community@omp.ru>
    // SPDX-License-Identifier: BSD-3-Clause
    
    #include "controllerexample.h"
    
    #include <QCoreApplication>
    #include <QDebug>
    #include <QDir>
    #include <QStandardPaths>
    
    #include <nemonotifications-qt5/notification.h>
    
    // Конструктор инициализирует поля класса.
    // parent — родительский экземпляр QObject.
    ControllerExample::ControllerExample(QObject *parent) : QObject(parent), m_daemon(Market::GetDaemonConnection())
    {
        if (m_daemon) {
            unsubscribeFromDaemonConnectionEvents();
        }
    
        subscribeToDaemonConnectionEvents();
        addRpmPackagesToInstallList();
    }
    
    ControllerExample::~ControllerExample()
    {
        unsubscribeFromDaemonConnectionEvents();
    }
    
    // Преобразует код ошибки операции в строковый формат.
    // operation — операция.
    // Возвращает ошибку операции в строковом формате.
    QString ControllerExample::operationErrorCodeToString(const Market::Operation &operation)
    {
        switch (operation.GetErrorCode()) {
        case Market::OperationErrorCode::None:
            return QStringLiteral("None");
        case Market::OperationErrorCode::Filesystem:
            return QStringLiteral("Filesystem");
        case Market::OperationErrorCode::Internal:
            return QStringLiteral("Internal");
        case Market::OperationErrorCode::FileNotFound:
            return QStringLiteral("FileNotFound");
        case Market::OperationErrorCode::BadPackage:
            return QStringLiteral("BadPackage");
        case Market::OperationErrorCode::BadPackageID:
            return QStringLiteral("BadPackageID");
        case Market::OperationErrorCode::BadPackageArchitecture:
            return QStringLiteral("BadPackageArchitecture");
        case Market::OperationErrorCode::BadPackageSignature:
            return QStringLiteral("BadPackageSignature");
        case Market::OperationErrorCode::DowngradeAttempt:
            return QStringLiteral("DowngradeAttempt");
        case Market::OperationErrorCode::UpgradeAlreadyPrepared:
            return QStringLiteral("UpgradeAlreadyPrepared");
        case Market::OperationErrorCode::PackageNotExist:
            return QStringLiteral("PackageNotExist");
        case Market::OperationErrorCode::CorruptedInstalledPackage:
            return QStringLiteral("CorruptedInstalledPackage");
        case Market::OperationErrorCode::UnresolvedDependency:
            return QStringLiteral("UnresolvedDependency");
        case Market::OperationErrorCode::UnauthorizedAccess:
            return QStringLiteral("UnauthorizedAccess");
        default:
            return QStringLiteral("Internal");
        }
    }
    
    // Обрабатывает сигнал operationStatusChanged() от Market Daemon.
    // Этот метод выводит информацию об ошибке в логи и показывает push-уведомление,
    // если операция завершилась с ошибкой.
    // operation — информация об операции.
    void ControllerExample::handleOperationStatusChanged(Market::Operation operation)
    {
        if (operation.GetStatus() == Market::OperationStatus::Failed) {
            QString summary = tr("Operation Failed");
            QString message = tr("Error code: ").append(operationErrorCodeToString(operation));
            qInfo() << message;
            showNotification(summary, message);
        }
    }
    
    // Обрабатывает сигнал packageInstalled() от Market Daemon.
    // Этот метод выводит информацию об установленном пакете в логи и показывает
    // push-уведомление.
    // package — информация об установленном пакете.
    void ControllerExample::handlePackageInstalled(Market::Package package)
    {
        QString summary = tr("Package Installed");
        QString message =
            tr("Package: ")
                .append(QString("%1, %2, %3, %4")
                            .arg(QString::fromStdString(package.GetID()),
                                QString::fromStdString(package.GetVersion()),
                                QString::fromStdString(
                                    package.GetDeveloperCertificateSubgroup()),
                                QString::fromStdString(
                                    package.GetDeveloperCertificateID())));
        qInfo() << message;
        showNotification(summary, message);
    }
    
    // Обрабатывает сигнал packageUpgraded() от Market Daemon.
    // Этот метод выводит информацию об обновленном пакете в логи и показывает
    // push-уведомление.
    // package — информация об обновленном пакете.
    void ControllerExample::handlePackageUpgraded(Market::Package package)
    {
        QString summary = tr("Package Upgraded");
        QString message =
            tr("Package: ")
                .append(QString("%1, %2, %3, %4")
                            .arg(QString::fromStdString(package.GetID()),
                                QString::fromStdString(package.GetVersion()),
                                QString::fromStdString(
                                    package.GetDeveloperCertificateSubgroup()),
                                QString::fromStdString(
                                    package.GetDeveloperCertificateID())));
        qInfo() << message;
        showNotification(summary, message);
    }
    
    // Обрабатывает сигнал packageRemoved() от Market Daemon.
    // Этот метод выводит информацию об удаленном пакете в логи и показывает
    // push-уведомление.
    // package — информация об удаленном пакете.
    void ControllerExample::handlePackageRemoved(Market::Package package)
    {
        QString summary = tr("Package Removed");
        QString message = tr("Package: ").append(QString::fromStdString(package.GetID()));
        qInfo() << message;
        showNotification(summary, message);
    }
    
    // Этот метод отменяет подписки на события операций с пакетами и события статусов операций,
    // отправляемых Market Daemon.
    void ControllerExample::unsubscribeFromDaemonConnectionEvents()
    {
        for (const Market::EventSubscription &subscription : std::as_const(m_subscriptions)) {
            m_daemon.UnsubscribeFromEvent(subscription);
        }
    }
    
    // Этот метод выполняет подписки на события операций с пакетами и события статусов операций,
    // отправляемых Market Daemon. 
    // DaemonConnection::SubscribeToEvent() возвращает объект класса EventSubscription.
    void ControllerExample::subscribeToDaemonConnectionEvents()
    {
        m_subscriptions.push_back(m_daemon.SubscribeToEvent(
            Market::EventType::OperationStatusChanged, [this](const Market::Operation &operation) {
                handleOperationStatusChanged(operation);
            }));
    
        m_subscriptions.push_back(m_daemon.SubscribeToEvent(
            Market::EventType::PackageInstalled,
            [this](const Market::Package &package) { handlePackageInstalled(package); }));
        m_subscriptions.push_back(m_daemon.SubscribeToEvent(
            Market::EventType::PackageUpgraded,
            [this](const Market::Package &package) { handlePackageUpgraded(package); }));
        m_subscriptions.push_back(m_daemon.SubscribeToEvent(
            Market::EventType::PackageRemoved,
            [this](const Market::Package &package) { handlePackageRemoved(package); }));
    }
    
    // Показывает push-уведомление с заданными заголовком и сообщением.
    // summary — заголовок уведомления для показа.
    // message — сообщение уведомления для показа.
    void ControllerExample::showNotification(const QString &summary, const QString &message)
    {
        Notification notification;
        notification.setAppName(qApp->applicationName());
        notification.setSummary(summary);
        notification.setBody(message);
        notification.publish();
    }
    
    // Заполняет список rpm-пакетов из директории ~/Downloads для установки.
    void ControllerExample::addRpmPackagesToInstallList()
    {
        QDir dir(QStandardPaths::writableLocation(QStandardPaths::DownloadLocation));
    
        dir.setNameFilters(QStringList() << "*.rpm");
        dir.setFilter(QDir::Files);
    
        const QFileInfoList list = dir.entryInfoList();
        for (const QFileInfo &file : std::as_const(list)) {
            m_packagesPaths << file.absoluteFilePath();
        }
    }
    
    // Запускает установку RPM-пакета с использованием Market Daemon и класса OperationRequest.
    // packagePath — полный путь к RPM-файлу.
    void ControllerExample::installPackage(const QString &packagePath)
    {
        qInfo() << "Start install package: " << packagePath;
    
        if (!m_daemon) {
            return;
        }
    
        Market::OperationRequest operationRequest = Market::OperationRequest::Builder()
                                                        .SetOperationType(Market::OperationType::Install)
                                                        .SetPackagePath(packagePath.toStdString())
                                                        .Build();
    
        Market::Result<Market::OperationUUID> result = m_daemon.CreateOperation(operationRequest);
    
        if (!result) {
    
            qWarning() << QStringLiteral("Couldn't install package %1 (%2)")
                            .arg(packagePath, QString::fromStdString(result.GetError()));
        }
    }
    
    // Возвращает пути к пакетам для всех rpm-пакетов, находящихся в QStandardPaths::DownloadLocation.
    // Возвращает список путей к пакетам.
    QStringList ControllerExample::packagesPaths()
    {
        return m_packagesPaths;
    }
    
  5. main.cpp:

    ...
    #include "{путь к файлу}/controllerexample.h"
    ...
    // Чтобы увидеть уведомления о событиях операций, выполните операции с пакетами, такие как установка, обновление
    // или удаление пакетов на устройстве. Также код ниже попытается установить первый найденный rpm-пакет
    // в папке Downloads.
    ControllerExample *controllerExample = new ControllerExample(view.data());
    if (!controllerExample->packagesPaths().isEmpty()) {
        controllerExample->installPackage(controllerExample->packagesPaths().constFirst());
     }
    

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

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