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 17 namespace BPackageKit { 18 namespace BPrivate { 19 20 21 BActivationTransaction::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 33 BActivationTransaction::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 70 BActivationTransaction::~BActivationTransaction() 71 { 72 } 73 74 75 status_t 76 BActivationTransaction::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 87 status_t 88 BActivationTransaction::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 107 BPackageInstallationLocation 108 BActivationTransaction::Location() const 109 { 110 return fLocation; 111 } 112 113 114 void 115 BActivationTransaction::SetLocation(BPackageInstallationLocation location) 116 { 117 fLocation = location; 118 } 119 120 121 int64 122 BActivationTransaction::ChangeCount() const 123 { 124 return fChangeCount; 125 } 126 127 128 void 129 BActivationTransaction::SetChangeCount(int64 changeCount) 130 { 131 fChangeCount = changeCount; 132 } 133 134 135 const BString& 136 BActivationTransaction::TransactionDirectoryName() const 137 { 138 return fTransactionDirectoryName; 139 } 140 141 142 void 143 BActivationTransaction::SetTransactionDirectoryName( 144 const BString& directoryName) 145 { 146 fTransactionDirectoryName = directoryName; 147 } 148 149 150 const BStringList& 151 BActivationTransaction::PackagesToActivate() const 152 { 153 return fPackagesToActivate; 154 } 155 156 157 bool 158 BActivationTransaction::SetPackagesToActivate(const BStringList& packages) 159 { 160 fPackagesToActivate = packages; 161 return fPackagesToActivate.CountStrings() == packages.CountStrings(); 162 } 163 164 165 bool 166 BActivationTransaction::AddPackageToActivate(const BString& package) 167 { 168 return fPackagesToActivate.Add(package); 169 } 170 171 172 const BStringList& 173 BActivationTransaction::PackagesToDeactivate() const 174 { 175 return fPackagesToDeactivate; 176 } 177 178 179 bool 180 BActivationTransaction::SetPackagesToDeactivate(const BStringList& packages) 181 { 182 fPackagesToDeactivate = packages; 183 return fPackagesToDeactivate.CountStrings() == packages.CountStrings(); 184 } 185 186 187 bool 188 BActivationTransaction::AddPackageToDeactivate(const BString& package) 189 { 190 return fPackagesToDeactivate.Add(package); 191 } 192 193 194 bool 195 BActivationTransaction::FirstBootProcessing() const 196 { 197 return fFirstBootProcessing; 198 } 199 200 201 void 202 BActivationTransaction::SetFirstBootProcessing(bool processingIsOn) 203 { 204 fFirstBootProcessing = processingIsOn; 205 } 206 207 208 status_t 209 BActivationTransaction::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* 233 BActivationTransaction::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 242 BActivationTransaction::_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