From de38b364cb3ffd52681cc3bba0c886584de8d46d Mon Sep 17 00:00:00 2001 From: Robert Griebl Date: Mon, 8 May 2023 17:43:55 +0200 Subject: Also expose applications in taskRequestingInstallationAcknowledge Since switching to the new multiple-apps-per-package architecture, the actual infos about the apps in the package were not exposed via the requesting-acknowledge signal anymore. Change-Id: Id535c5d8710998ce26043ec8e56cd1881961628d Reviewed-by: Dominik Holland (cherry picked from commit a027b61a64160ca5fa1c3bc8d135a38c75a534a7) --- src/dbus-lib/packagemanagerdbuscontextadaptor.cpp | 16 ++++++++++++++-- src/manager-lib/installationtask.cpp | 10 +++++++++- src/manager-lib/installationtask.h | 6 +++++- tests/qml/installer/tst_installer.qml | 11 ++++++++++- 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/dbus-lib/packagemanagerdbuscontextadaptor.cpp b/src/dbus-lib/packagemanagerdbuscontextadaptor.cpp index 98fc664b..2247214b 100644 --- a/src/dbus-lib/packagemanagerdbuscontextadaptor.cpp +++ b/src/dbus-lib/packagemanagerdbuscontextadaptor.cpp @@ -44,6 +44,7 @@ #include "package.h" #include "packagemanager.h" #include "io.qt.packagemanager_adaptor.h" +#include "applicationmanager.h" #include "dbuspolicy.h" #include "exception.h" #include "logging.h" @@ -88,8 +89,19 @@ PackageManagerAdaptor::PackageManagerAdaptor(QObject *parent) const QVariantMap &packageExtraSignedMetaData) { auto map = PackageManager::instance()->get(package); map.remove(qSL("package")); // cannot marshall QObject * - taskRequestingInstallationAcknowledge(taskId, map, packageExtraMetaData, - packageExtraSignedMetaData); + + const auto apps = package->applications(); // these are QObject * (legacy API) + QVariantList appList; + appList.reserve(apps.size()); + for (const auto *obj : apps) { + QVariantMap app = ApplicationManager::instance()->get(obj->property("id").toString()); + app.remove(qSL("application")); // cannot marshall QObject * + appList.append(app); + } + map.insert(qSL("applications"), appList); + + emit taskRequestingInstallationAcknowledge(taskId, map, packageExtraMetaData, + packageExtraSignedMetaData); }); connect(pm, &PackageManager::taskStarted, this, &PackageManagerAdaptor::taskStarted); diff --git a/src/manager-lib/installationtask.cpp b/src/manager-lib/installationtask.cpp index c9b487d2..7c53311a 100644 --- a/src/manager-lib/installationtask.cpp +++ b/src/manager-lib/installationtask.cpp @@ -50,6 +50,8 @@ #include "package.h" #include "packageinfo.h" #include "packageextractor.h" +#include "application.h" +#include "applicationinfo.h" #include "exception.h" #include "packagemanager.h" #include "sudo.h" @@ -331,7 +333,13 @@ void InstallationTask::checkExtractedFile(const QString &file) Q_DECL_NOEXCEPT_E qCDebug(LogInstaller) << "emit taskRequestingInstallationAcknowledge" << id() << "for package" << m_package->id(); // this is a temporary just for the signal emission below - m_tempPackageForAcknowledge.reset(new Package(m_package.data(), Package::BeingInstalled)); + m_tempPackageForAcknowledge.reset(new Package(m_package.get(), Package::BeingInstalled)); + const auto &applicationInfos = m_package.get()->applications(); + for (const auto &applicationInfo : applicationInfos) { + auto tempApp = new Application(applicationInfo, m_tempPackageForAcknowledge.get()); + m_tempPackageForAcknowledge->addApplication(tempApp); + m_tempApplicationsForAcknowledge.emplace_back(tempApp); + } emit m_pm->taskRequestingInstallationAcknowledge(id(), m_tempPackageForAcknowledge.get(), m_extractor->installationReport().extraMetaData(), m_extractor->installationReport().extraSignedMetaData()); diff --git a/src/manager-lib/installationtask.h b/src/manager-lib/installationtask.h index e16ee5fb..dc9e88a6 100644 --- a/src/manager-lib/installationtask.h +++ b/src/manager-lib/installationtask.h @@ -51,8 +51,11 @@ #include #include +#include + QT_BEGIN_NAMESPACE_AM +class Application; class Package; class PackageInfo; class PackageManager; @@ -94,7 +97,8 @@ private: bool m_managerApproval = false; QScopedPointer m_package; uint m_applicationUid = uint(-1); - QScopedPointer m_tempPackageForAcknowledge; + std::unique_ptr m_tempPackageForAcknowledge; + std::vector> m_tempApplicationsForAcknowledge; // changes to these 4 member variables are protected by m_mutex PackageExtractor *m_extractor = nullptr; diff --git a/tests/qml/installer/tst_installer.qml b/tests/qml/installer/tst_installer.qml index bc81b2d6..18666c19 100644 --- a/tests/qml/installer/tst_installer.qml +++ b/tests/qml/installer/tst_installer.qml @@ -136,7 +136,16 @@ TestCase { taskRequestingInstallationAcknowledgeSpy.wait(spyTimeout); compare(taskRequestingInstallationAcknowledgeSpy.count, 1); compare(taskRequestingInstallationAcknowledgeSpy.signalArguments[0][0], id); - var pkgId = taskRequestingInstallationAcknowledgeSpy.signalArguments[0][1].id + + // this Package is temporary and it will be gone, as soon as we call + // acknowledgePackageInstallation below + var pkg = taskRequestingInstallationAcknowledgeSpy.signalArguments[0][1] + var pkgId = pkg.id + compare(pkgId, "com.pelagicore.test") + compare(pkg.applications.length, 1) + compare(pkg.applications[0].id, "com.pelagicore.test") + compare(pkg.applications[0].runtimeName, "native") + taskRequestingInstallationAcknowledgeSpy.clear(); PackageManager.acknowledgePackageInstallation(id); -- cgit v1.2.1