From 0623a6b101127f36609d07ef52d411ca225cc2f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 20 Aug 2023 12:39:04 +0200 Subject: [PATCH] Implement stop/cancel on LibrariesUpdateCoordinator --- .../libraries_update_coordinator.cpp | 30 +++++++++++++++++-- .../libraries_update_coordinator.h | 4 +++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/YACReaderLibrary/libraries_update_coordinator.cpp b/YACReaderLibrary/libraries_update_coordinator.cpp index b6bf307d..bfbf8348 100644 --- a/YACReaderLibrary/libraries_update_coordinator.cpp +++ b/YACReaderLibrary/libraries_update_coordinator.cpp @@ -83,10 +83,14 @@ void LibrariesUpdateCoordinator::startUpdate() return; } + canceled = false; + updateFuture = std::async(std::launch::async, [this] { emit updateStarted(); for (auto library : libraries.getLibraries()) { - updateLibrary(library.getPath()); + if (!canceled) { + updateLibrary(library.getPath()); + } } emit updateEnded(); }); @@ -100,14 +104,34 @@ void LibrariesUpdateCoordinator::updateLibrary(const QString &path) } QEventLoop eventLoop; - LibraryCreator *libraryCreator = new LibraryCreator(settings); + auto libraryCreator = new LibraryCreator(settings); + std::shared_ptr sharedPtr(libraryCreator); + currentLibraryCreator = sharedPtr; + QString cleanPath = QDir::cleanPath(pathDir.absolutePath()); libraryCreator->updateLibrary(cleanPath, QDir::cleanPath(pathDir.absolutePath() + "/.yacreaderlibrary")); connect(libraryCreator, &LibraryCreator::finished, &eventLoop, &QEventLoop::quit); - connect(libraryCreator, &LibraryCreator::finished, libraryCreator, &QObject::deleteLater); libraryCreator->start(); eventLoop.exec(); } + +void LibrariesUpdateCoordinator::stop() +{ + canceled = true; + + if (auto libraryCreator = currentLibraryCreator.lock()) { + libraryCreator->stop(); + } +} + +void LibrariesUpdateCoordinator::cancel() +{ + canceled = true; + + if (auto libraryCreator = currentLibraryCreator.lock()) { + libraryCreator->cancel(); + } +} diff --git a/YACReaderLibrary/libraries_update_coordinator.h b/YACReaderLibrary/libraries_update_coordinator.h index 0600f49a..ce2b1af6 100644 --- a/YACReaderLibrary/libraries_update_coordinator.h +++ b/YACReaderLibrary/libraries_update_coordinator.h @@ -5,6 +5,7 @@ #include class YACReaderLibraries; +class LibraryCreator; class LibrariesUpdateCoordinator : public QObject { @@ -13,6 +14,7 @@ public: LibrariesUpdateCoordinator(QSettings *settings, YACReaderLibraries &libraries, QObject *parent = 0); void updateLibraries(); + void cancel(); signals: void updateStarted(); @@ -29,6 +31,8 @@ private: QTimer *timer; QElapsedTimer elapsedTimer; std::future updateFuture; + bool canceled; + std::weak_ptr currentLibraryCreator; }; #endif // LIBRARIES_UPDATE_COORDINATOR_H