diff options
author | Gleb Popov <6yearold@gmail.com> | 2023-09-02 11:30:50 +0300 |
---|---|---|
committer | Neal Gompa (ニール・ゴンパ) <ngompa13@gmail.com> | 2023-09-08 08:42:37 -0400 |
commit | 6564f759d16d1917521d83799cec6bcc313d4576 (patch) | |
tree | 41818de74b37630968891bc8c85e2f7f40ee9b12 | |
parent | d16b4f0b5107f706cae89f3f6e801c7820f61dd3 (diff) |
freebsd backend: Allow cancelling during package fetching in {install,update}_packages().
-rw-r--r-- | backends/freebsd/PKJobCanceller.hpp | 5 | ||||
-rw-r--r-- | backends/freebsd/pk-backend-freebsd.cpp | 47 |
2 files changed, 27 insertions, 25 deletions
diff --git a/backends/freebsd/PKJobCanceller.hpp b/backends/freebsd/PKJobCanceller.hpp index dd31e70ea..8922c5352 100644 --- a/backends/freebsd/PKJobCanceller.hpp +++ b/backends/freebsd/PKJobCanceller.hpp @@ -33,7 +33,7 @@ public: jobData->canceller = this; pk_backend_job_set_user_data (_job, jobData); - pk_backend_job_set_allow_cancel (_job, TRUE); + allowCancel (); } bool cancelIfRequested() { @@ -50,6 +50,9 @@ public: return false; } + void allowCancel() const { pk_backend_job_set_allow_cancel (job, TRUE); } + void disallowCancel() const { pk_backend_job_set_allow_cancel (job, FALSE); } + void abort() { aborting = true; } // No need in destructor, job_data is destroyed in pk_backend_stop_job diff --git a/backends/freebsd/pk-backend-freebsd.cpp b/backends/freebsd/pk-backend-freebsd.cpp index bbf379014..67530d634 100644 --- a/backends/freebsd/pk-backend-freebsd.cpp +++ b/backends/freebsd/pk-backend-freebsd.cpp @@ -784,38 +784,24 @@ pk_backend_install_update_packages_thread (PkBackendJob *job, GVariant *params, PackageDatabase pkgDb (job, lockType, PKGDB_REMOTE); pkgDb.setEventHandler([job, &jc](pkg_event* ev) { + if (jc.cancelIfRequested()) + return true; + switch (ev->type) { case PKG_EVENT_FETCH_BEGIN: pk_backend_job_set_status (job, PK_STATUS_ENUM_DOWNLOAD); pk_backend_job_set_percentage (job, 0); + jc.allowCancel(); break; case PKG_EVENT_INSTALL_BEGIN: pk_backend_job_set_status (job, PK_STATUS_ENUM_INSTALL); pk_backend_job_set_percentage (job, 0); + jc.disallowCancel(); break; case PKG_EVENT_UPGRADE_BEGIN: pk_backend_job_set_status (job, PK_STATUS_ENUM_UPDATE); pk_backend_job_set_percentage (job, 0); - break; - case PKG_EVENT_FETCH_FINISHED: - { - pk_backend_job_set_status (job, PK_STATUS_ENUM_UPDATE); - break; - } - case PKG_EVENT_ALREADY_INSTALLED: - { - pkg* pkg = ev->e_already_installed.pkg; - PackageView pkgView(pkg); - - pk_backend_job_error_code (job, - PK_ERROR_ENUM_PACKAGE_ALREADY_INSTALLED, - "Requested package %s is already installed", pkgView.nameversion()); - break; - } - case PKG_EVENT_NOT_FOUND: - pk_backend_job_error_code (job, - PK_ERROR_ENUM_PACKAGE_NOT_FOUND, - "Requested package %s wasn't found in the repositories", ev->e_not_found.pkg_name); + jc.disallowCancel(); break; case PKG_EVENT_PROGRESS_TICK: { @@ -837,14 +823,27 @@ pk_backend_install_update_packages_thread (PkBackendJob *job, GVariant *params, pk_backend_job_package (job, PK_INFO_ENUM_UPDATING, pkgView.packageKitId(), pkgView.comment()); break; } + case PKG_EVENT_ALREADY_INSTALLED: + { + pkg* pkg = ev->e_already_installed.pkg; + PackageView pkgView(pkg); + + pk_backend_job_error_code (job, + PK_ERROR_ENUM_PACKAGE_ALREADY_INSTALLED, + "Requested package %s is already installed", pkgView.nameversion()); + break; + } + case PKG_EVENT_NOT_FOUND: + pk_backend_job_error_code (job, + PK_ERROR_ENUM_PACKAGE_NOT_FOUND, + "Requested package %s wasn't found in the repositories", ev->e_not_found.pkg_name); + break; default: handleErrnoEvent (job, ev); break; } - // TODO: libpkg doesn't yet support cancelling - //jc.cancelIfRequested(); - (void) jc; - return 0; + + return jc.cancelIfRequested(); }); Jobs jobs (installRole ? PKG_JOBS_INSTALL : PKG_JOBS_UPGRADE, pkgDb.handle(), context); |