1 /* 2 * Copyright 2022, Andrew Lindesay <apl@lindesay.co.nz>. 3 * All rights reserved. Distributed under the terms of the MIT License. 4 */ 5 6 #include "PackageUtils.h" 7 8 9 using namespace BPackageKit; 10 11 12 /*static*/ 13 status_t PackageUtils::DeriveLocalFilePath(const PackageInfo* package, 14 BPath& path) 15 { 16 if (package->IsLocalFile()) { 17 path.SetTo(package->LocalFilePath()); 18 return B_OK; 19 } 20 21 path.Unset(); 22 BPackageInstallationLocation installationLocation 23 = DeriveInstallLocation(package); 24 directory_which which; 25 status_t result = _DeriveDirectoryWhich(installationLocation, &which); 26 27 if (result == B_OK) 28 result = find_directory(which, &path); 29 30 if (result == B_OK) 31 path.Append(package->FileName()); 32 33 return result; 34 } 35 36 37 /*static*/ status_t 38 PackageUtils::_DeriveDirectoryWhich( 39 BPackageInstallationLocation location, 40 directory_which* which) 41 { 42 switch (location) { 43 case B_PACKAGE_INSTALLATION_LOCATION_SYSTEM: 44 *which = B_SYSTEM_PACKAGES_DIRECTORY; 45 break; 46 case B_PACKAGE_INSTALLATION_LOCATION_HOME: 47 *which = B_USER_PACKAGES_DIRECTORY; 48 break; 49 default: 50 debugger("illegal state: unsupported package installation" 51 "location"); 52 return B_BAD_VALUE; 53 } 54 return B_OK; 55 } 56 57 58 /*static*/ BPackageInstallationLocation 59 PackageUtils::DeriveInstallLocation(const PackageInfo* package) 60 { 61 const PackageInstallationLocationSet& locations 62 = package->InstallationLocations(); 63 64 // If the package is already installed, return its first installed location 65 if (locations.size() != 0) 66 return static_cast<BPackageInstallationLocation>(*locations.begin()); 67 68 return B_PACKAGE_INSTALLATION_LOCATION_SYSTEM; 69 } 70