hrev47205 adds 2 changesets to branch 'master' old head: 7fa8b5538c4fae4bbd08664c664ba4d8838e9868 new head: e9eb4df71b2449801d45609cc84d7ab2947a0a27 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=e9eb4df+%5E7fa8b55 ---------------------------------------------------------------------------- c2f3b81: 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. e9eb4df: BDaemonClient: Handle options message fields correctly [ Ingo Weinhold <ingo_weinhold@xxxxxx> ] ---------------------------------------------------------------------------- 4 files changed, 64 insertions(+), 41 deletions(-) src/kits/package/DaemonClient.cpp | 16 ++++-- src/servers/package/CommitTransactionHandler.cpp | 53 +++++++++++++------- src/servers/package/CommitTransactionHandler.h | 16 +++--- src/servers/package/Volume.cpp | 20 ++++---- ############################################################################ Commit: c2f3b81d45f9f1a2a891813f9499818b1d72515e URL: http://cgit.haiku-os.org/haiku/commit/?id=c2f3b81 Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Mon May 5 19:18:44 2014 UTC 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. ---------------------------------------------------------------------------- diff --git a/src/servers/package/CommitTransactionHandler.cpp b/src/servers/package/CommitTransactionHandler.cpp index 7edec19..a7394b5 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(), @@ -77,6 +75,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) { status_t error; @@ -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 ce30f92..e16d18d 100644 --- a/src/servers/package/CommitTransactionHandler.h +++ b/src/servers/package/CommitTransactionHandler.h @@ -25,20 +25,22 @@ typedef std::set<std::string> 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 97a79e2..19044cf 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()); ############################################################################ Revision: hrev47205 Commit: e9eb4df71b2449801d45609cc84d7ab2947a0a27 URL: http://cgit.haiku-os.org/haiku/commit/?id=e9eb4df Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Mon May 5 19:28:28 2014 UTC BDaemonClient: Handle options message fields correctly ---------------------------------------------------------------------------- diff --git a/src/kits/package/DaemonClient.cpp b/src/kits/package/DaemonClient.cpp index 0e7a44d..6aacffc 100644 --- a/src/kits/package/DaemonClient.cpp +++ b/src/kits/package/DaemonClient.cpp @@ -63,11 +63,9 @@ BDaemonClient::GetInstallationLocationInfo( int64 baseDirectoryNode; int32 packagesDirectoryDevice; int64 packagesDirectoryNode; - BString oldStateName; int64 changeCount; BPackageInfoSet latestActivePackages; BPackageInfoSet latestInactivePackages; - BPackageInfoSet currentlyActivePackages; if ((error = reply.FindInt32("base directory device", &baseDirectoryDevice)) != B_OK || (error = reply.FindInt64("base directory node", &baseDirectoryNode)) @@ -80,13 +78,21 @@ BDaemonClient::GetInstallationLocationInfo( latestActivePackages)) != B_OK || (error = _ExtractPackageInfoSet(reply, "latest inactive packages", latestInactivePackages)) != B_OK - || (error = _ExtractPackageInfoSet(reply, "currently active packages", - currentlyActivePackages)) != B_OK - || (error = reply.FindString("old state", &oldStateName)) != B_OK || (error = reply.FindInt64("change count", &changeCount)) != B_OK) { return error; } + BPackageInfoSet currentlyActivePackages; + error = _ExtractPackageInfoSet(reply, "currently active packages", + currentlyActivePackages); + if (error != B_OK && error != B_NAME_NOT_FOUND) + return error; + + BString oldStateName; + error = reply.FindString("old state", &oldStateName); + if (error != B_OK && error != B_NAME_NOT_FOUND) + return error; + _info.Unset(); _info.SetLocation(location); _info.SetBaseDirectoryRef(node_ref(baseDirectoryDevice, baseDirectoryNode));