diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,7 +45,7 @@ set (REQUIRED_QT_VERSION 5.8.0) -find_package(Qt5 ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE COMPONENTS Core) +find_package(Qt5 ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE COMPONENTS Core DBus) find_package(KF5Archive ${KF5_DEP_VERSION} REQUIRED) find_package(KF5I18n ${KF5_DEP_VERSION} REQUIRED) diff --git a/src/kpackage/CMakeLists.txt b/src/kpackage/CMakeLists.txt --- a/src/kpackage/CMakeLists.txt +++ b/src/kpackage/CMakeLists.txt @@ -36,6 +36,7 @@ target_link_libraries(KF5Package PUBLIC #KF5::Service # For kplugininfo.h and kservice.h + Qt5::DBus KF5::CoreAddons PRIVATE KF5::Archive diff --git a/src/kpackage/private/packagejob.cpp b/src/kpackage/private/packagejob.cpp --- a/src/kpackage/private/packagejob.cpp +++ b/src/kpackage/private/packagejob.cpp @@ -25,6 +25,9 @@ #include "kpackage_debug.h" +#include +#include + namespace KPackage { class PackageJobPrivate @@ -48,8 +51,6 @@ } }); - connect(d->thread, SIGNAL(finished(bool,QString)), - SLOT(slotFinished(bool,QString)), Qt::QueuedConnection); connect(d->thread, &PackageJobThread::installPathChanged, this, [this](const QString &installPath) { if (d->package) { @@ -83,16 +84,45 @@ void PackageJob::install(const QString &src, const QString &dest) { + + connect(d->thread, &PackageJobThread::finished, this, [=](bool ok, const QString &error) { + if (ok) { + const QString pluginId = d->package->metadata().pluginId(); + const QStringList serviceTypes = d->package->metadata().serviceTypes(); + for (auto packageType: serviceTypes) { + auto msg = QDBusMessage::createSignal(QStringLiteral("/KPackage/") + packageType, QStringLiteral("org.kde.plasma.kpackage"), QStringLiteral("packageInstalled")); + msg.setArguments({pluginId}); + QDBusConnection::sessionBus().send(msg); + } + } + slotFinished(ok, error); + }, Qt::QueuedConnection); d->thread->install(src, dest); } void PackageJob::update(const QString &src, const QString &dest) { + connect(d->thread, &PackageJobThread::finished, this, [=](bool ok, const QString &error) { + slotFinished(ok, error); + }, Qt::QueuedConnection); d->thread->update(src, dest); } void PackageJob::uninstall(const QString &installationPath) { + //capture first as uninstalling wipes d->package + const QString pluginId = d->package->metadata().pluginId(); + const QStringList serviceTypes = d->package->metadata().serviceTypes(); + connect(d->thread, &PackageJobThread::finished, this, [=](bool ok, const QString &error) { + if (ok) { + for (auto packageType: serviceTypes) { + auto msg = QDBusMessage::createSignal(QStringLiteral("/KPackage/") + packageType, QStringLiteral("org.kde.plasma.kpackage"), QStringLiteral("packageUninstalled")); + msg.setArguments({pluginId}); + QDBusConnection::sessionBus().send(msg); + } + } + slotFinished(ok, error); + }, Qt::QueuedConnection); d->thread->uninstall(installationPath); }