1/* 2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7#include "PackageDirectory.h" 8#include "Package.h" 9 10#include "ClassCache.h" 11 12 13CLASS_CACHE(PackageDirectory); 14 15 16PackageDirectory::PackageDirectory(Package* package, mode_t mode) 17 : 18 PackageNode(package, mode) 19{ 20} 21 22 23PackageDirectory::~PackageDirectory() 24{ 25 while (PackageNode* child = fChildren.RemoveHead()) 26 child->ReleaseReference(); 27} 28 29 30void 31PackageDirectory::AddChild(PackageNode* node) 32{ 33 fChildren.Add(node); 34 node->AcquireReference(); 35} 36 37 38void 39PackageDirectory::RemoveChild(PackageNode* node) 40{ 41 fChildren.Remove(node); 42 node->ReleaseReference(); 43} 44 45 46bool 47PackageDirectory::HasPrecedenceOver(const PackageDirectory* other) const 48{ 49 // If one of us has the SYSTEM_PACKAGE flag and the other doesn't, 50 // let PackageNode take care of the comparison. 51 uint32 packageFlags = 0, otherPackageFlags = 0; 52 BReference<Package> package(GetPackage()), otherPackage(other->GetPackage()); 53 if (package) 54 packageFlags = package->Flags(); 55 if (otherPackage) 56 otherPackageFlags = otherPackage->Flags(); 57 if ((packageFlags & BPackageKit::B_PACKAGE_FLAG_SYSTEM_PACKAGE) 58 != (otherPackageFlags 59 & BPackageKit::B_PACKAGE_FLAG_SYSTEM_PACKAGE)) { 60 return PackageNode::HasPrecedenceOver(other); 61 } 62 63 const int32 attrs = fAttributes.Count(), 64 otherAttrs = other->fAttributes.Count(); 65 if (attrs != otherAttrs) 66 return attrs > otherAttrs; 67 return PackageNode::HasPrecedenceOver(other); 68} 69