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:
@@ -33,20 +33,18 @@ using namespace BPackageKit::BPrivate;
|
|||||||
|
|
||||||
|
|
||||||
CommitTransactionHandler::CommitTransactionHandler(Volume* volume,
|
CommitTransactionHandler::CommitTransactionHandler(Volume* volume,
|
||||||
PackageFileManager* packageFileManager, VolumeState* volumeState,
|
PackageFileManager* packageFileManager)
|
||||||
bool isActiveVolumeState, const PackageSet& packagesAlreadyAdded,
|
|
||||||
const PackageSet& packagesAlreadyRemoved)
|
|
||||||
:
|
:
|
||||||
fVolume(volume),
|
fVolume(volume),
|
||||||
fPackageFileManager(packageFileManager),
|
fPackageFileManager(packageFileManager),
|
||||||
fVolumeState(volumeState->Clone()),
|
fVolumeState(NULL),
|
||||||
fVolumeStateIsActive(isActiveVolumeState),
|
fVolumeStateIsActive(false),
|
||||||
fPackagesToActivate(),
|
fPackagesToActivate(),
|
||||||
fPackagesToDeactivate(),
|
fPackagesToDeactivate(),
|
||||||
fAddedPackages(),
|
fAddedPackages(),
|
||||||
fRemovedPackages(),
|
fRemovedPackages(),
|
||||||
fPackagesAlreadyAdded(packagesAlreadyAdded),
|
fPackagesAlreadyAdded(),
|
||||||
fPackagesAlreadyRemoved(packagesAlreadyRemoved),
|
fPackagesAlreadyRemoved(),
|
||||||
fOldStateDirectory(),
|
fOldStateDirectory(),
|
||||||
fOldStateDirectoryRef(),
|
fOldStateDirectoryRef(),
|
||||||
fOldStateDirectoryName(),
|
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
|
void
|
||||||
CommitTransactionHandler::HandleRequest(BMessage* request, BMessage* reply)
|
CommitTransactionHandler::HandleRequest(BMessage* request, BMessage* reply)
|
||||||
{
|
{
|
||||||
@@ -118,20 +141,15 @@ CommitTransactionHandler::HandleRequest(
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CommitTransactionHandler::HandleRequest(const PackageSet& packagesAdded,
|
CommitTransactionHandler::HandleRequest()
|
||||||
const PackageSet& packagesRemoved)
|
|
||||||
{
|
{
|
||||||
// Copy package sets to fPackagesToActivate/fPackagesToDeactivate. The
|
for (PackageSet::const_iterator it = fPackagesAlreadyAdded.begin();
|
||||||
// given sets are assumed to be identical to the ones specified in the
|
it != fPackagesAlreadyAdded.end(); ++it) {
|
||||||
// constructor invocation (fPackagesAlreadyAdded,
|
|
||||||
// fPackagesAlreadyRemoved).
|
|
||||||
for (PackageSet::const_iterator it = packagesAdded.begin();
|
|
||||||
it != packagesAdded.end(); ++it) {
|
|
||||||
if (!fPackagesToActivate.AddItem(*it))
|
if (!fPackagesToActivate.AddItem(*it))
|
||||||
throw std::bad_alloc();
|
throw std::bad_alloc();
|
||||||
}
|
}
|
||||||
|
|
||||||
fPackagesToDeactivate = packagesRemoved;
|
fPackagesToDeactivate = fPackagesAlreadyRemoved;
|
||||||
|
|
||||||
_ApplyChanges(NULL);
|
_ApplyChanges(NULL);
|
||||||
}
|
}
|
||||||
@@ -263,9 +281,6 @@ CommitTransactionHandler::_ReadPackagesToActivate(
|
|||||||
void
|
void
|
||||||
CommitTransactionHandler::_ApplyChanges(BMessage* reply)
|
CommitTransactionHandler::_ApplyChanges(BMessage* reply)
|
||||||
{
|
{
|
||||||
if (fVolumeState == NULL)
|
|
||||||
throw std::bad_alloc();
|
|
||||||
|
|
||||||
// create an old state directory
|
// create an old state directory
|
||||||
_CreateOldStateDirectory(reply);
|
_CreateOldStateDirectory(reply);
|
||||||
|
|
||||||
|
|||||||
@@ -25,20 +25,22 @@ typedef std::set<std::string> StringSet;
|
|||||||
class CommitTransactionHandler {
|
class CommitTransactionHandler {
|
||||||
public:
|
public:
|
||||||
CommitTransactionHandler(Volume* volume,
|
CommitTransactionHandler(Volume* volume,
|
||||||
PackageFileManager* packageFileManager,
|
PackageFileManager* packageFileManager);
|
||||||
VolumeState* volumeState,
|
~CommitTransactionHandler();
|
||||||
|
|
||||||
|
void Init(VolumeState* volumeState,
|
||||||
bool isActiveVolumeState,
|
bool isActiveVolumeState,
|
||||||
const PackageSet& packagesAlreadyAdded,
|
const PackageSet& packagesAlreadyAdded,
|
||||||
const PackageSet& packagesAlreadyRemoved);
|
const PackageSet& packagesAlreadyRemoved);
|
||||||
~CommitTransactionHandler();
|
|
||||||
|
|
||||||
void HandleRequest(BMessage* request,
|
void HandleRequest(BMessage* request,
|
||||||
BMessage* reply);
|
BMessage* reply);
|
||||||
void HandleRequest(
|
void HandleRequest(
|
||||||
const BActivationTransaction& transaction,
|
const BActivationTransaction& transaction,
|
||||||
BMessage* reply);
|
BMessage* reply);
|
||||||
void HandleRequest(const PackageSet& packagesAdded,
|
void HandleRequest();
|
||||||
const PackageSet& packagesRemoved);
|
// uses packagesAlreadyAdded and
|
||||||
|
// packagesAlreadyRemoved from Init()
|
||||||
|
|
||||||
void Revert();
|
void Revert();
|
||||||
|
|
||||||
@@ -145,8 +147,8 @@ private:
|
|||||||
PackageSet fPackagesToDeactivate;
|
PackageSet fPackagesToDeactivate;
|
||||||
PackageSet fAddedPackages;
|
PackageSet fAddedPackages;
|
||||||
PackageSet fRemovedPackages;
|
PackageSet fRemovedPackages;
|
||||||
const PackageSet& fPackagesAlreadyAdded;
|
PackageSet fPackagesAlreadyAdded;
|
||||||
const PackageSet& fPackagesAlreadyRemoved;
|
PackageSet fPackagesAlreadyRemoved;
|
||||||
BDirectory fOldStateDirectory;
|
BDirectory fOldStateDirectory;
|
||||||
node_ref fOldStateDirectoryRef;
|
node_ref fOldStateDirectoryRef;
|
||||||
BString fOldStateDirectoryName;
|
BString fOldStateDirectoryName;
|
||||||
|
|||||||
@@ -526,11 +526,11 @@ Volume::HandleCommitTransactionRequest(BMessage* message)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// perform the request
|
// perform the request
|
||||||
PackageSet dummy;
|
CommitTransactionHandler handler(this, fPackageFileManager);
|
||||||
CommitTransactionHandler handler(this, fPackageFileManager, fLatestState,
|
|
||||||
fLatestState == fActiveState, dummy, dummy);
|
|
||||||
int32 error;
|
int32 error;
|
||||||
try {
|
try {
|
||||||
|
PackageSet dummy;
|
||||||
|
handler.Init(fLatestState, fLatestState == fActiveState, dummy, dummy);
|
||||||
handler.HandleRequest(message, &reply);
|
handler.HandleRequest(message, &reply);
|
||||||
_SetLatestState(handler.DetachVolumeState(),
|
_SetLatestState(handler.DetachVolumeState(),
|
||||||
handler.IsActiveVolumeState());
|
handler.IsActiveVolumeState());
|
||||||
@@ -709,12 +709,12 @@ Volume::ProcessPendingPackageActivationChanges()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// perform the request
|
// perform the request
|
||||||
CommitTransactionHandler handler(this, fPackageFileManager, fLatestState,
|
CommitTransactionHandler handler(this, fPackageFileManager);
|
||||||
fLatestState == fActiveState, fPackagesToBeActivated,
|
|
||||||
fPackagesToBeDeactivated);
|
|
||||||
int32 error;
|
int32 error;
|
||||||
try {
|
try {
|
||||||
handler.HandleRequest(fPackagesToBeActivated, fPackagesToBeDeactivated);
|
handler.Init(fLatestState, fLatestState == fActiveState,
|
||||||
|
fPackagesToBeActivated, fPackagesToBeDeactivated);
|
||||||
|
handler.HandleRequest();
|
||||||
_SetLatestState(handler.DetachVolumeState(),
|
_SetLatestState(handler.DetachVolumeState(),
|
||||||
handler.IsActiveVolumeState());
|
handler.IsActiveVolumeState());
|
||||||
error = B_DAEMON_OK;
|
error = B_DAEMON_OK;
|
||||||
@@ -797,11 +797,11 @@ Volume::CommitTransaction(const BActivationTransaction& transaction,
|
|||||||
BDaemonClient::BCommitTransactionResult& _result)
|
BDaemonClient::BCommitTransactionResult& _result)
|
||||||
{
|
{
|
||||||
// perform the request
|
// perform the request
|
||||||
CommitTransactionHandler handler(this, fPackageFileManager, fLatestState,
|
CommitTransactionHandler handler(this, fPackageFileManager);
|
||||||
fLatestState == fActiveState, packagesAlreadyAdded,
|
|
||||||
packagesAlreadyRemoved);
|
|
||||||
int32 error;
|
int32 error;
|
||||||
try {
|
try {
|
||||||
|
handler.Init(fLatestState, fLatestState == fActiveState,
|
||||||
|
packagesAlreadyAdded, packagesAlreadyRemoved);
|
||||||
handler.HandleRequest(transaction, NULL);
|
handler.HandleRequest(transaction, NULL);
|
||||||
_SetLatestState(handler.DetachVolumeState(),
|
_SetLatestState(handler.DetachVolumeState(),
|
||||||
handler.IsActiveVolumeState());
|
handler.IsActiveVolumeState());
|
||||||
|
|||||||
Reference in New Issue
Block a user