summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGleb Popov <6yearold@gmail.com>2023-09-02 11:30:50 +0300
committerNeal Gompa (ニール・ゴンパ) <ngompa13@gmail.com>2023-09-08 08:42:37 -0400
commit6564f759d16d1917521d83799cec6bcc313d4576 (patch)
tree41818de74b37630968891bc8c85e2f7f40ee9b12
parentd16b4f0b5107f706cae89f3f6e801c7820f61dd3 (diff)
freebsd backend: Allow cancelling during package fetching in {install,update}_packages().
-rw-r--r--backends/freebsd/PKJobCanceller.hpp5
-rw-r--r--backends/freebsd/pk-backend-freebsd.cpp47
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);