xref: /haiku/src/add-ons/kernel/file_systems/packagefs/package/PackageDirectory.cpp (revision d1f885b435e9892ac028f4be2b80536b9dd37413)
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 
11 PackageDirectory::PackageDirectory(Package* package, mode_t mode)
12 	:
13 	PackageNode(package, mode)
14 {
15 }
16 
17 
18 PackageDirectory::~PackageDirectory()
19 {
20 	while (PackageNode* child = fChildren.RemoveHead())
21 		child->ReleaseReference();
22 }
23 
24 
25 void
26 PackageDirectory::AddChild(PackageNode* node)
27 {
28 	fChildren.Add(node);
29 	node->AcquireReference();
30 }
31 
32 
33 void
34 PackageDirectory::RemoveChild(PackageNode* node)
35 {
36 	fChildren.Remove(node);
37 	node->ReleaseReference();
38 }
39 
40 
41 bool
42 PackageDirectory::HasPrecedenceOver(const PackageDirectory* other) const
43 {
44 	// If one of us has the SYSTEM_PACKAGE flag and the other doesn't,
45 	// let PackageNode take care of the comparison.
46 	if ((fPackageFlags & BPackageKit::B_PACKAGE_FLAG_SYSTEM_PACKAGE)
47 			!= (other->fPackageFlags
48 				& BPackageKit::B_PACKAGE_FLAG_SYSTEM_PACKAGE)) {
49 		return PackageNode::HasPrecedenceOver(other);
50 	}
51 
52 	const int32 attrs = fAttributes.Count(),
53 		otherAttrs = other->fAttributes.Count();
54 	if (attrs != otherAttrs)
55 		return attrs > otherAttrs;
56 	return PackageNode::HasPrecedenceOver(other);
57 }
58