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/solver/SolverRepository.h> 11 12 #include <package/PackageDefs.h> 13 #include <package/PackageRoster.h> 14 #include <package/RepositoryCache.h> 15 #include <package/RepositoryConfig.h> 16 #include <package/solver/SolverPackage.h> 17 18 19 static const int32 kInitialPackageListSize = 40; 20 21 22 namespace BPackageKit { 23 24 25 BSolverRepository::BSolverRepository() 26 : 27 fName(), 28 fPriority(0), 29 fIsInstalled(false), 30 fPackages(kInitialPackageListSize, true), 31 fChangeCount(0) 32 { 33 } 34 35 36 BSolverRepository::BSolverRepository(const BString& name) 37 : 38 fName(), 39 fPriority(0), 40 fIsInstalled(false), 41 fPackages(kInitialPackageListSize, true), 42 fChangeCount(0) 43 { 44 SetTo(name); 45 } 46 47 48 BSolverRepository::BSolverRepository(BPackageInstallationLocation location) 49 : 50 fName(), 51 fPriority(0), 52 fIsInstalled(false), 53 fPackages(kInitialPackageListSize, true), 54 fChangeCount(0) 55 { 56 SetTo(location); 57 } 58 59 60 BSolverRepository::BSolverRepository(BAllInstallationLocations) 61 : 62 fName(), 63 fPriority(0), 64 fIsInstalled(false), 65 fPackages(kInitialPackageListSize, true), 66 fChangeCount(0) 67 { 68 SetTo(B_ALL_INSTALLATION_LOCATIONS); 69 } 70 71 72 BSolverRepository::BSolverRepository(const BRepositoryConfig& config) 73 : 74 fName(), 75 fPriority(0), 76 fIsInstalled(false), 77 fPackages(kInitialPackageListSize, true), 78 fChangeCount(0) 79 { 80 SetTo(config); 81 } 82 83 84 BSolverRepository::~BSolverRepository() 85 { 86 } 87 88 89 status_t 90 BSolverRepository::SetTo(const BString& name) 91 { 92 Unset(); 93 94 fName = name; 95 return fName.IsEmpty() ? B_BAD_VALUE : B_OK; 96 } 97 98 99 status_t 100 BSolverRepository::SetTo(BPackageInstallationLocation location) 101 { 102 Unset(); 103 104 fName = "Installed"; 105 106 status_t error = AddPackages(location); 107 if (error != B_OK) { 108 Unset(); 109 return error; 110 } 111 112 fIsInstalled = true; 113 return B_OK; 114 } 115 116 117 status_t 118 BSolverRepository::SetTo(BAllInstallationLocations) 119 { 120 status_t error = SetTo(B_PACKAGE_INSTALLATION_LOCATION_SYSTEM); 121 if (error != B_OK) 122 return error; 123 124 error = AddPackages(B_PACKAGE_INSTALLATION_LOCATION_COMMON); 125 if (error != B_OK) { 126 Unset(); 127 return error; 128 } 129 130 error = AddPackages(B_PACKAGE_INSTALLATION_LOCATION_HOME); 131 if (error != B_OK) { 132 Unset(); 133 return error; 134 } 135 136 return B_OK; 137 } 138 139 140 status_t 141 BSolverRepository::SetTo(const BRepositoryConfig& config) 142 { 143 Unset(); 144 145 if (config.InitCheck() != B_OK) 146 return B_BAD_VALUE; 147 148 fName = config.Name(); 149 fPriority = config.Priority(); 150 151 BPackageRoster roster; 152 BRepositoryCache cache; 153 status_t error = roster.GetRepositoryCache(config.Name(), &cache); 154 if (error != B_OK) { 155 Unset(); 156 return error; 157 } 158 159 BRepositoryCache::Iterator it = cache.GetIterator(); 160 while (const BPackageInfo* packageInfo = it.Next()) { 161 error = AddPackage(*packageInfo); 162 if (error != B_OK) { 163 Unset(); 164 return error; 165 } 166 } 167 168 return B_OK; 169 } 170 171 172 status_t 173 BSolverRepository::SetTo(const BRepositoryCache& cache) 174 { 175 Unset(); 176 177 const BRepositoryInfo& info = cache.Info(); 178 if (info.InitCheck() != B_OK) 179 return B_BAD_VALUE; 180 181 fName = info.Name(); 182 fPriority = info.Priority(); 183 184 BRepositoryCache::Iterator it = cache.GetIterator(); 185 while (const BPackageInfo* packageInfo = it.Next()) { 186 status_t error = AddPackage(*packageInfo); 187 if (error != B_OK) { 188 Unset(); 189 return error; 190 } 191 } 192 193 return B_OK; 194 } 195 196 197 void 198 BSolverRepository::Unset() 199 { 200 fName = BString(); 201 fPriority = 0; 202 fIsInstalled = false; 203 fPackages.MakeEmpty(); 204 fChangeCount++; 205 } 206 207 208 status_t 209 BSolverRepository::InitCheck() 210 { 211 return fName.IsEmpty() ? B_NO_INIT : B_OK; 212 } 213 214 215 bool 216 BSolverRepository::IsInstalled() const 217 { 218 return fIsInstalled; 219 } 220 221 222 void 223 BSolverRepository::SetInstalled(bool isInstalled) 224 { 225 fIsInstalled = isInstalled; 226 fChangeCount++; 227 } 228 229 230 BString 231 BSolverRepository::Name() const 232 { 233 return fName; 234 } 235 236 237 int32 238 BSolverRepository::Priority() const 239 { 240 return fPriority; 241 } 242 243 244 void 245 BSolverRepository::SetPriority(int32 priority) 246 { 247 fPriority = priority; 248 fChangeCount++; 249 } 250 251 252 bool 253 BSolverRepository::IsEmpty() const 254 { 255 return fPackages.IsEmpty(); 256 } 257 258 259 int32 260 BSolverRepository::CountPackages() const 261 { 262 return fPackages.CountItems(); 263 } 264 265 266 BSolverPackage* 267 BSolverRepository::PackageAt(int32 index) const 268 { 269 return fPackages.ItemAt(index); 270 } 271 272 273 status_t 274 BSolverRepository::AddPackage(const BPackageInfo& info, 275 BSolverPackage** _package) 276 { 277 BSolverPackage* package = new(std::nothrow) BSolverPackage(this, info); 278 if (package == NULL || !fPackages.AddItem(package)) { 279 delete package; 280 return B_NO_MEMORY; 281 } 282 283 fChangeCount++; 284 285 if (_package != NULL) 286 *_package = package; 287 288 return B_OK; 289 } 290 291 292 status_t 293 BSolverRepository::AddPackages(BPackageInstallationLocation location) 294 { 295 BPackageRoster roster; 296 BPackageInfoSet packageInfos; 297 status_t error = roster.GetActivePackages(location, packageInfos); 298 if (error != B_OK) 299 return error; 300 301 BRepositoryCache::Iterator it = packageInfos.GetIterator(); 302 while (const BPackageInfo* packageInfo = it.Next()) { 303 error = AddPackage(*packageInfo); 304 if (error != B_OK) 305 return error; 306 } 307 308 return B_OK; 309 } 310 311 312 bool 313 BSolverRepository::RemovePackage(BSolverPackage* package) 314 { 315 if (!fPackages.RemoveItem(package, false)) 316 return false; 317 318 fChangeCount++; 319 return true; 320 } 321 322 323 bool 324 BSolverRepository::DeletePackage(BSolverPackage* package) 325 { 326 if (!RemovePackage(package)) 327 return false; 328 329 delete package; 330 return true; 331 } 332 333 334 uint64 335 BSolverRepository::ChangeCount() const 336 { 337 return fChangeCount; 338 } 339 340 341 } // namespace BPackageKit 342