diff options
author | Robert Griebl <robert.griebl@pelagicore.com> | 2019-06-26 15:32:11 +0200 |
---|---|---|
committer | Robert Griebl <robert.griebl@pelagicore.com> | 2019-06-26 16:00:54 +0200 |
commit | f6a895cdbfccd9aba9a6ff3e26c4e6584dbe9a59 (patch) | |
tree | e0d7c59e8d7bdfee9de371dfd794c4c25cdf6f20 | |
parent | 6be19e2462050932317111e24d9f8807232b3a5a (diff) | |
download | qtapplicationmanager-5.13.0-1_QtAS.tar.gz |
Wait for apps to stop before actually uninstalling themv5.13.0-1_QtAS
Change-Id: Iaf4b3da0c622079ccb79886875134af58175bd43
Task-number: AUTOSUITE-1075
Reviewed-by: Egor Nemtsev <enemtsev@luxoft.com>
Reviewed-by: Dominik Holland <dominik.holland@pelagicore.com>
-rw-r--r-- | src/installer-lib/deinstallationtask.cpp | 16 | ||||
-rw-r--r-- | src/installer-lib/deinstallationtask.h | 5 | ||||
-rw-r--r-- | src/window-lib/window.h | 4 |
3 files changed, 23 insertions, 2 deletions
diff --git a/src/installer-lib/deinstallationtask.cpp b/src/installer-lib/deinstallationtask.cpp index 485b0dea..8f31e3ee 100644 --- a/src/installer-lib/deinstallationtask.cpp +++ b/src/installer-lib/deinstallationtask.cpp @@ -63,6 +63,13 @@ DeinstallationTask::DeinstallationTask(ApplicationInfo *app, const InstallationL m_applicationId = m_app->id(); // in base class } +bool DeinstallationTask::cancel() +{ + if (m_canBeCanceled) + m_canceled = true; + return m_canceled; +} + void DeinstallationTask::execute() { // these have been checked in ApplicationInstaller::removePackage() already @@ -84,6 +91,15 @@ void DeinstallationTask::execute() if (!managerApproval) throw Exception("ApplicationManager rejected the removal of app %1").arg(m_app->id()); + // if the app was running before, we now need to wait until is has actually stopped + while (!m_canceled && + (ApplicationManager::instance()->applicationRunState(m_app->id()) != Am::NotRunning)) { + QThread::msleep(30); + } + // there's a small race condition here, but not doing a planned cancellation isn't harmful + m_canBeCanceled = false; + if (m_canceled) + throw Exception(Error::Canceled, "canceled"); ScopedRenamer docDirRename; ScopedRenamer appDirRename; diff --git a/src/installer-lib/deinstallationtask.h b/src/installer-lib/deinstallationtask.h index 912a34a1..f990cee7 100644 --- a/src/installer-lib/deinstallationtask.h +++ b/src/installer-lib/deinstallationtask.h @@ -56,6 +56,9 @@ class DeinstallationTask : public AsynchronousTask public: DeinstallationTask(ApplicationInfo *app, const InstallationLocation &installationLocation, bool forceDeinstallation, bool keepDocuments, QObject *parent = nullptr); + + bool cancel() override; + protected: void execute() override; @@ -64,6 +67,8 @@ private: const InstallationLocation &m_installationLocation; bool m_forceDeinstallation; bool m_keepDocuments; + bool m_canBeCanceled = true; + bool m_canceled = false; }; QT_END_NAMESPACE_AM diff --git a/src/window-lib/window.h b/src/window-lib/window.h index 538da721..e2981cea 100644 --- a/src/window-lib/window.h +++ b/src/window-lib/window.h @@ -48,10 +48,10 @@ #include <QQuickItem> #include <QSet> #include <QtAppManCommon/global.h> +#include <QtAppManManager/application.h> QT_BEGIN_NAMESPACE_AM -class AbstractApplication; class WindowItem; // A Window object exists for every application window that is managed by the application-manager @@ -125,7 +125,7 @@ signals: void _windowDestroyed(); protected: - AbstractApplication *m_application; + QPointer<AbstractApplication> m_application; QSet<WindowItem*> m_items; WindowItem *m_primaryItem{nullptr}; |