From c06aefa0eee4a28ae2db357d86891daadc82e2e2 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Thu, 22 Oct 2015 10:44:27 -0700 Subject: [PATCH] HaikuDepot: Reset package state on failure * Save the package state before attempting to install/uninstall the package. * In the case of failure set the package state back to what it was. * Use the synchronous version of BAlert so that the package state won't change until the user clicks the Close button on the dialog. Fixes #10838 --- src/apps/haikudepot/model/PackageManager.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/apps/haikudepot/model/PackageManager.cpp b/src/apps/haikudepot/model/PackageManager.cpp index 6abcab20ee..4e38e7ff7d 100644 --- a/src/apps/haikudepot/model/PackageManager.cpp +++ b/src/apps/haikudepot/model/PackageManager.cpp @@ -125,6 +125,7 @@ public: | BPackageManager::B_ADD_REMOTE_REPOSITORIES | BPackageManager::B_REFRESH_REPOSITORIES); PackageInfoRef ref(Package()); + PackageState state = ref->State(); ref->SetState(PENDING); fPackageManager->SetCurrentActionPackage(ref, true); @@ -140,7 +141,6 @@ public: try { fPackageManager->Install(&packageNameString, 1); } catch (BFatalErrorException ex) { - _SetDownloadedPackagesState(NONE); BString errorString; errorString.SetToFormat( "Fatal error occurred while installing package %s: " @@ -150,13 +150,16 @@ public: errorString, B_TRANSLATE("Close"), NULL, NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT)); if (alert != NULL) - alert->Go(NULL); + alert->Go(); + _SetDownloadedPackagesState(NONE); + ref->SetState(state); return ex.Error(); } catch (BAbortedByUserException ex) { fprintf(stderr, "Installation of package " "%s aborted by user: %s\n", packageNameString, ex.Message().String()); _SetDownloadedPackagesState(NONE); + ref->SetState(state); return B_OK; } catch (BNothingToDoException ex) { fprintf(stderr, "Nothing to do while installing package " @@ -166,6 +169,7 @@ public: fprintf(stderr, "Exception occurred while installing package " "%s: %s\n", packageNameString, ex.Message().String()); _SetDownloadedPackagesState(NONE); + ref->SetState(state); return B_ERROR; } @@ -241,6 +245,7 @@ public: { fPackageManager->Init(BPackageManager::B_ADD_INSTALLED_REPOSITORIES); PackageInfoRef ref(Package()); + PackageState state = ref->State(); fPackageManager->SetCurrentActionPackage(ref, false); fPackageManager->AddProgressListener(this); const char* packageName = ref->Name().String(); @@ -256,7 +261,8 @@ public: errorString, B_TRANSLATE("Close"), NULL, NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT)); if (alert != NULL) - alert->Go(NULL); + alert->Go(); + ref->SetState(state); return ex.Error(); } catch (BAbortedByUserException ex) { return B_OK; @@ -265,6 +271,7 @@ public: } catch (BException ex) { fprintf(stderr, "Exception occurred while uninstalling package " "%s: %s\n", packageName, ex.Message().String()); + ref->SetState(state); return B_ERROR; }