Документация
ОС Аврора 5.1.5
Использование Market Daemon
Ниже приведены фрагменты кода или же цельные файлы, которые предоставляют функционал для установки, обновления и удаления RPM-пакетов с обработкой статусов операций и отображением уведомлений о событиях.
-
.spec-файл:
... BuildRequires: pkgconfig(nemonotifications-qt5) BuildRequires: pkgconfig(market) ... -
.pro-файл:
... PKGCONFIG += \ market \ nemonotifications-qt5 \ ... SOURCES += \ src/{путь к файлу}/controllerexample.cpp \ ... HEADERS += \ src/{путь к файлу}/controllerexample.h \ ... -
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; -
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; } -
main.cpp:... #include "{путь к файлу}/controllerexample.h" ... // Чтобы увидеть уведомления о событиях операций, выполните операции с пакетами, такие как установка, обновление // или удаление пакетов на устройстве. Также код ниже попытается установить первый найденный rpm-пакет // в папке Downloads. ControllerExample *controllerExample = new ControllerExample(view.data()); if (!controllerExample->packagesPaths().isEmpty()) { controllerExample->installPackage(controllerExample->packagesPaths().constFirst()); }