/* * Copyright 2013, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: * Ingo Weinhold */ #include #include #include namespace BPackageKit { namespace BPrivate { BActivationTransaction::BActivationTransaction() : fLocation(B_PACKAGE_INSTALLATION_LOCATION_ENUM_COUNT), fChangeCount(0), fTransactionDirectoryName(), fPackagesToActivate(), fPackagesToDeactivate(), fFirstBootProcessing(false) { } BActivationTransaction::BActivationTransaction(BMessage* archive, status_t* _error) : fLocation(B_PACKAGE_INSTALLATION_LOCATION_ENUM_COUNT), fChangeCount(0), fTransactionDirectoryName(), fPackagesToActivate(), fPackagesToDeactivate(), fFirstBootProcessing(false) { status_t error; int32 location; if (archive->FindBool("first boot processing", &fFirstBootProcessing) != B_OK) fFirstBootProcessing = false; // Field is optional for compatibility. if ((error = archive->FindInt32("location", &location)) == B_OK && (error = archive->FindInt64("change count", &fChangeCount)) == B_OK && (error = archive->FindString("transaction", &fTransactionDirectoryName)) == B_OK && (error = _ExtractStringList(archive, "activate", fPackagesToActivate)) == B_OK && (error = _ExtractStringList(archive, "deactivate", fPackagesToDeactivate)) == B_OK) { if (location >= 0 && location <= B_PACKAGE_INSTALLATION_LOCATION_ENUM_COUNT) { fLocation = (BPackageInstallationLocation)location; } else error = B_BAD_VALUE; } if (_error != NULL) *_error = error; } BActivationTransaction::~BActivationTransaction() { } status_t BActivationTransaction::InitCheck() const { if (fLocation < 0 || fLocation >= B_PACKAGE_INSTALLATION_LOCATION_ENUM_COUNT || fTransactionDirectoryName.IsEmpty() || (fPackagesToActivate.IsEmpty() && fPackagesToDeactivate.IsEmpty())) { return B_BAD_VALUE; } return B_OK; } status_t BActivationTransaction::SetTo(BPackageInstallationLocation location, int64 changeCount, const BString& directoryName) { if (location < 0 || location >= B_PACKAGE_INSTALLATION_LOCATION_ENUM_COUNT || directoryName.IsEmpty()) { return B_BAD_VALUE; } fLocation = location; fChangeCount = changeCount; fTransactionDirectoryName = directoryName; fPackagesToActivate.MakeEmpty(); fPackagesToDeactivate.MakeEmpty(); fFirstBootProcessing = false; return B_OK; } BPackageInstallationLocation BActivationTransaction::Location() const { return fLocation; } void BActivationTransaction::SetLocation(BPackageInstallationLocation location) { fLocation = location; } int64 BActivationTransaction::ChangeCount() const { return fChangeCount; } void BActivationTransaction::SetChangeCount(int64 changeCount) { fChangeCount = changeCount; } const BString& BActivationTransaction::TransactionDirectoryName() const { return fTransactionDirectoryName; } void BActivationTransaction::SetTransactionDirectoryName( const BString& directoryName) { fTransactionDirectoryName = directoryName; } const BStringList& BActivationTransaction::PackagesToActivate() const { return fPackagesToActivate; } bool BActivationTransaction::SetPackagesToActivate(const BStringList& packages) { fPackagesToActivate = packages; return fPackagesToActivate.CountStrings() == packages.CountStrings(); } bool BActivationTransaction::AddPackageToActivate(const BString& package) { return fPackagesToActivate.Add(package); } const BStringList& BActivationTransaction::PackagesToDeactivate() const { return fPackagesToDeactivate; } bool BActivationTransaction::SetPackagesToDeactivate(const BStringList& packages) { fPackagesToDeactivate = packages; return fPackagesToDeactivate.CountStrings() == packages.CountStrings(); } bool BActivationTransaction::AddPackageToDeactivate(const BString& package) { return fPackagesToDeactivate.Add(package); } bool BActivationTransaction::FirstBootProcessing() const { return fFirstBootProcessing; } void BActivationTransaction::SetFirstBootProcessing(bool processingIsOn) { fFirstBootProcessing = processingIsOn; } status_t BActivationTransaction::Archive(BMessage* archive, bool deep) const { status_t error = BArchivable::Archive(archive, deep); if (error != B_OK) return error; if ((error = archive->AddInt32("location", fLocation)) != B_OK || (error = archive->AddInt64("change count", fChangeCount)) != B_OK || (error = archive->AddString("transaction", fTransactionDirectoryName)) != B_OK || (error = archive->AddStrings("activate", fPackagesToActivate)) != B_OK || (error = archive->AddStrings("deactivate", fPackagesToDeactivate)) != B_OK || (error = archive->AddBool("first boot processing", fFirstBootProcessing)) != B_OK) { return error; } return B_OK; } /*static*/ BArchivable* BActivationTransaction::Instantiate(BMessage* archive) { if (validate_instantiation(archive, "BActivationTransaction")) return new(std::nothrow) BActivationTransaction(archive); return NULL; } /*static*/ status_t BActivationTransaction::_ExtractStringList(BMessage* archive, const char* field, BStringList& _list) { status_t error = archive->FindStrings(field, &_list); return error == B_NAME_NOT_FOUND ? B_OK : error; // If the field doesn't exist, that's OK. } } // namespace BPrivate } // namespace BPackageKit