1/* 2 * Copyright 2013, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Ingo Weinhold <ingo_weinhold@gmx.de> 7 */ 8 9 10#include <package/ActivationTransaction.h> 11 12#include <new> 13 14#include <Message.h> 15 16 17namespace BPackageKit { 18namespace BPrivate { 19 20 21BActivationTransaction::BActivationTransaction() 22 : 23 fLocation(B_PACKAGE_INSTALLATION_LOCATION_ENUM_COUNT), 24 fChangeCount(0), 25 fTransactionDirectoryName(), 26 fPackagesToActivate(), 27 fPackagesToDeactivate(), 28 fFirstBootProcessing(false) 29{ 30} 31 32 33BActivationTransaction::BActivationTransaction(BMessage* archive, 34 status_t* _error) 35 : 36 fLocation(B_PACKAGE_INSTALLATION_LOCATION_ENUM_COUNT), 37 fChangeCount(0), 38 fTransactionDirectoryName(), 39 fPackagesToActivate(), 40 fPackagesToDeactivate(), 41 fFirstBootProcessing(false) 42{ 43 status_t error; 44 int32 location; 45 46 if (archive->FindBool("first boot processing", &fFirstBootProcessing) 47 != B_OK) 48 fFirstBootProcessing = false; // Field is optional for compatibility. 49 50 if ((error = archive->FindInt32("location", &location)) == B_OK 51 && (error = archive->FindInt64("change count", &fChangeCount)) == B_OK 52 && (error = archive->FindString("transaction", 53 &fTransactionDirectoryName)) == B_OK 54 && (error = _ExtractStringList(archive, "activate", 55 fPackagesToActivate)) == B_OK 56 && (error = _ExtractStringList(archive, "deactivate", 57 fPackagesToDeactivate)) == B_OK) { 58 if (location >= 0 59 && location <= B_PACKAGE_INSTALLATION_LOCATION_ENUM_COUNT) { 60 fLocation = (BPackageInstallationLocation)location; 61 } else 62 error = B_BAD_VALUE; 63 } 64 65 if (_error != NULL) 66 *_error = error; 67} 68 69 70BActivationTransaction::~BActivationTransaction() 71{ 72} 73 74 75status_t 76BActivationTransaction::InitCheck() const 77{ 78 if (fLocation < 0 || fLocation >= B_PACKAGE_INSTALLATION_LOCATION_ENUM_COUNT 79 || fTransactionDirectoryName.IsEmpty() 80 || (fPackagesToActivate.IsEmpty() && fPackagesToDeactivate.IsEmpty())) { 81 return B_BAD_VALUE; 82 } 83 return B_OK; 84} 85 86 87status_t 88BActivationTransaction::SetTo(BPackageInstallationLocation location, 89 int64 changeCount, const BString& directoryName) 90{ 91 if (location < 0 || location >= B_PACKAGE_INSTALLATION_LOCATION_ENUM_COUNT 92 || directoryName.IsEmpty()) { 93 return B_BAD_VALUE; 94 } 95 96 fLocation = location; 97 fChangeCount = changeCount; 98 fTransactionDirectoryName = directoryName; 99 fPackagesToActivate.MakeEmpty(); 100 fPackagesToDeactivate.MakeEmpty(); 101 fFirstBootProcessing = false; 102 103 return B_OK; 104} 105 106 107BPackageInstallationLocation 108BActivationTransaction::Location() const 109{ 110 return fLocation; 111} 112 113 114void 115BActivationTransaction::SetLocation(BPackageInstallationLocation location) 116{ 117 fLocation = location; 118} 119 120 121int64 122BActivationTransaction::ChangeCount() const 123{ 124 return fChangeCount; 125} 126 127 128void 129BActivationTransaction::SetChangeCount(int64 changeCount) 130{ 131 fChangeCount = changeCount; 132} 133 134 135const BString& 136BActivationTransaction::TransactionDirectoryName() const 137{ 138 return fTransactionDirectoryName; 139} 140 141 142void 143BActivationTransaction::SetTransactionDirectoryName( 144 const BString& directoryName) 145{ 146 fTransactionDirectoryName = directoryName; 147} 148 149 150const BStringList& 151BActivationTransaction::PackagesToActivate() const 152{ 153 return fPackagesToActivate; 154} 155 156 157bool 158BActivationTransaction::SetPackagesToActivate(const BStringList& packages) 159{ 160 fPackagesToActivate = packages; 161 return fPackagesToActivate.CountStrings() == packages.CountStrings(); 162} 163 164 165bool 166BActivationTransaction::AddPackageToActivate(const BString& package) 167{ 168 return fPackagesToActivate.Add(package); 169} 170 171 172const BStringList& 173BActivationTransaction::PackagesToDeactivate() const 174{ 175 return fPackagesToDeactivate; 176} 177 178 179bool 180BActivationTransaction::SetPackagesToDeactivate(const BStringList& packages) 181{ 182 fPackagesToDeactivate = packages; 183 return fPackagesToDeactivate.CountStrings() == packages.CountStrings(); 184} 185 186 187bool 188BActivationTransaction::AddPackageToDeactivate(const BString& package) 189{ 190 return fPackagesToDeactivate.Add(package); 191} 192 193 194bool 195BActivationTransaction::FirstBootProcessing() const 196{ 197 return fFirstBootProcessing; 198} 199 200 201void 202BActivationTransaction::SetFirstBootProcessing(bool processingIsOn) 203{ 204 fFirstBootProcessing = processingIsOn; 205} 206 207 208status_t 209BActivationTransaction::Archive(BMessage* archive, bool deep) const 210{ 211 status_t error = BArchivable::Archive(archive, deep); 212 if (error != B_OK) 213 return error; 214 215 if ((error = archive->AddInt32("location", fLocation)) != B_OK 216 || (error = archive->AddInt64("change count", fChangeCount)) != B_OK 217 || (error = archive->AddString("transaction", 218 fTransactionDirectoryName)) != B_OK 219 || (error = archive->AddStrings("activate", fPackagesToActivate)) 220 != B_OK 221 || (error = archive->AddStrings("deactivate", fPackagesToDeactivate)) 222 != B_OK 223 || (error = archive->AddBool("first boot processing", 224 fFirstBootProcessing)) != B_OK) { 225 return error; 226 } 227 228 return B_OK; 229} 230 231 232/*static*/ BArchivable* 233BActivationTransaction::Instantiate(BMessage* archive) 234{ 235 if (validate_instantiation(archive, "BActivationTransaction")) 236 return new(std::nothrow) BActivationTransaction(archive); 237 return NULL; 238} 239 240 241/*static*/ status_t 242BActivationTransaction::_ExtractStringList(BMessage* archive, const char* field, 243 BStringList& _list) 244{ 245 status_t error = archive->FindStrings(field, &_list); 246 return error == B_NAME_NOT_FOUND ? B_OK : error; 247 // If the field doesn't exist, that's OK. 248} 249 250 251} // namespace BPrivate 252} // namespace BPackageKit 253