From c2f3b81d45f9f1a2a891813f9499818b1d72515e Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Mon, 5 May 2014 21:18:44 +0200 Subject: [PATCH] package daemon: Fix manual package [de/]activation CommitTransactionHandler: Since the VolumeState is now always copied (including the contained packages), we can't just use the passed in packagesAlready{Added,Removed} sets, since they refer to the original packages. --- .../package/CommitTransactionHandler.cpp | 53 ++++++++++++------- .../package/CommitTransactionHandler.h | 16 +++--- src/servers/package/Volume.cpp | 20 +++---- 3 files changed, 53 insertions(+), 36 deletions(-) diff --git a/src/servers/package/CommitTransactionHandler.cpp b/src/servers/package/CommitTransactionHandler.cpp index 7edec193d0..a7394b5761 100644 --- a/src/servers/package/CommitTransactionHandler.cpp +++ b/src/servers/package/CommitTransactionHandler.cpp @@ -33,20 +33,18 @@ using namespace BPackageKit::BPrivate; CommitTransactionHandler::CommitTransactionHandler(Volume* volume, - PackageFileManager* packageFileManager, VolumeState* volumeState, - bool isActiveVolumeState, const PackageSet& packagesAlreadyAdded, - const PackageSet& packagesAlreadyRemoved) + PackageFileManager* packageFileManager) : fVolume(volume), fPackageFileManager(packageFileManager), - fVolumeState(volumeState->Clone()), - fVolumeStateIsActive(isActiveVolumeState), + fVolumeState(NULL), + fVolumeStateIsActive(false), fPackagesToActivate(), fPackagesToDeactivate(), fAddedPackages(), fRemovedPackages(), - fPackagesAlreadyAdded(packagesAlreadyAdded), - fPackagesAlreadyRemoved(packagesAlreadyRemoved), + fPackagesAlreadyAdded(), + fPackagesAlreadyRemoved(), fOldStateDirectory(), fOldStateDirectoryRef(), fOldStateDirectoryName(), @@ -76,6 +74,31 @@ CommitTransactionHandler::~CommitTransactionHandler() } +void +CommitTransactionHandler::Init(VolumeState* volumeState, + bool isActiveVolumeState, const PackageSet& packagesAlreadyAdded, + const PackageSet& packagesAlreadyRemoved) +{ + fVolumeState = volumeState->Clone(); + if (fVolumeState == NULL) + throw std::bad_alloc(); + + fVolumeStateIsActive = isActiveVolumeState; + + for (PackageSet::const_iterator it = packagesAlreadyAdded.begin(); + it != packagesAlreadyAdded.end(); ++it) { + Package* package = fVolumeState->FindPackage((*it)->FileName()); + fPackagesAlreadyAdded.insert(package); + } + + for (PackageSet::const_iterator it = packagesAlreadyRemoved.begin(); + it != packagesAlreadyRemoved.end(); ++it) { + Package* package = fVolumeState->FindPackage((*it)->FileName()); + fPackagesAlreadyRemoved.insert(package); + } +} + + void CommitTransactionHandler::HandleRequest(BMessage* request, BMessage* reply) { @@ -118,20 +141,15 @@ CommitTransactionHandler::HandleRequest( void -CommitTransactionHandler::HandleRequest(const PackageSet& packagesAdded, - const PackageSet& packagesRemoved) +CommitTransactionHandler::HandleRequest() { - // Copy package sets to fPackagesToActivate/fPackagesToDeactivate. The - // given sets are assumed to be identical to the ones specified in the - // constructor invocation (fPackagesAlreadyAdded, - // fPackagesAlreadyRemoved). - for (PackageSet::const_iterator it = packagesAdded.begin(); - it != packagesAdded.end(); ++it) { + for (PackageSet::const_iterator it = fPackagesAlreadyAdded.begin(); + it != fPackagesAlreadyAdded.end(); ++it) { if (!fPackagesToActivate.AddItem(*it)) throw std::bad_alloc(); } - fPackagesToDeactivate = packagesRemoved; + fPackagesToDeactivate = fPackagesAlreadyRemoved; _ApplyChanges(NULL); } @@ -263,9 +281,6 @@ CommitTransactionHandler::_ReadPackagesToActivate( void CommitTransactionHandler::_ApplyChanges(BMessage* reply) { - if (fVolumeState == NULL) - throw std::bad_alloc(); - // create an old state directory _CreateOldStateDirectory(reply); diff --git a/src/servers/package/CommitTransactionHandler.h b/src/servers/package/CommitTransactionHandler.h index ce30f921fb..e16d18d11d 100644 --- a/src/servers/package/CommitTransactionHandler.h +++ b/src/servers/package/CommitTransactionHandler.h @@ -25,20 +25,22 @@ typedef std::set StringSet; class CommitTransactionHandler { public: CommitTransactionHandler(Volume* volume, - PackageFileManager* packageFileManager, - VolumeState* volumeState, + PackageFileManager* packageFileManager); + ~CommitTransactionHandler(); + + void Init(VolumeState* volumeState, bool isActiveVolumeState, const PackageSet& packagesAlreadyAdded, const PackageSet& packagesAlreadyRemoved); - ~CommitTransactionHandler(); void HandleRequest(BMessage* request, BMessage* reply); void HandleRequest( const BActivationTransaction& transaction, BMessage* reply); - void HandleRequest(const PackageSet& packagesAdded, - const PackageSet& packagesRemoved); + void HandleRequest(); + // uses packagesAlreadyAdded and + // packagesAlreadyRemoved from Init() void Revert(); @@ -145,8 +147,8 @@ private: PackageSet fPackagesToDeactivate; PackageSet fAddedPackages; PackageSet fRemovedPackages; - const PackageSet& fPackagesAlreadyAdded; - const PackageSet& fPackagesAlreadyRemoved; + PackageSet fPackagesAlreadyAdded; + PackageSet fPackagesAlreadyRemoved; BDirectory fOldStateDirectory; node_ref fOldStateDirectoryRef; BString fOldStateDirectoryName; diff --git a/src/servers/package/Volume.cpp b/src/servers/package/Volume.cpp index 97a79e2c78..19044cffb4 100644 --- a/src/servers/package/Volume.cpp +++ b/src/servers/package/Volume.cpp @@ -526,11 +526,11 @@ Volume::HandleCommitTransactionRequest(BMessage* message) return; // perform the request - PackageSet dummy; - CommitTransactionHandler handler(this, fPackageFileManager, fLatestState, - fLatestState == fActiveState, dummy, dummy); + CommitTransactionHandler handler(this, fPackageFileManager); int32 error; try { + PackageSet dummy; + handler.Init(fLatestState, fLatestState == fActiveState, dummy, dummy); handler.HandleRequest(message, &reply); _SetLatestState(handler.DetachVolumeState(), handler.IsActiveVolumeState()); @@ -709,12 +709,12 @@ Volume::ProcessPendingPackageActivationChanges() return; // perform the request - CommitTransactionHandler handler(this, fPackageFileManager, fLatestState, - fLatestState == fActiveState, fPackagesToBeActivated, - fPackagesToBeDeactivated); + CommitTransactionHandler handler(this, fPackageFileManager); int32 error; try { - handler.HandleRequest(fPackagesToBeActivated, fPackagesToBeDeactivated); + handler.Init(fLatestState, fLatestState == fActiveState, + fPackagesToBeActivated, fPackagesToBeDeactivated); + handler.HandleRequest(); _SetLatestState(handler.DetachVolumeState(), handler.IsActiveVolumeState()); error = B_DAEMON_OK; @@ -797,11 +797,11 @@ Volume::CommitTransaction(const BActivationTransaction& transaction, BDaemonClient::BCommitTransactionResult& _result) { // perform the request - CommitTransactionHandler handler(this, fPackageFileManager, fLatestState, - fLatestState == fActiveState, packagesAlreadyAdded, - packagesAlreadyRemoved); + CommitTransactionHandler handler(this, fPackageFileManager); int32 error; try { + handler.Init(fLatestState, fLatestState == fActiveState, + packagesAlreadyAdded, packagesAlreadyRemoved); handler.HandleRequest(transaction, NULL); _SetLatestState(handler.DetachVolumeState(), handler.IsActiveVolumeState());