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.
This commit is contained in:
Ingo Weinhold
2014-05-05 21:29:25 +02:00
parent 7fa8b5538c
commit c2f3b81d45
3 changed files with 53 additions and 36 deletions
@@ -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);
@@ -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;
+10 -10
View File
@@ -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());