xref: /haiku/src/servers/package/PackageFile.h (revision a30a4a41f948ebb03b95dab065a27a584ac0c97a)
1 /*
2  * Copyright 2013-2014, 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 #ifndef PACKAGE_FILE_H
9 #define PACKAGE_FILE_H
10 
11 
12 #include <Node.h>
13 #include <package/PackageInfo.h>
14 
15 #include <NotOwningEntryRef.h>
16 #include <Referenceable.h>
17 #include <util/OpenHashTable.h>
18 
19 
20 using namespace BPackageKit;
21 
22 
23 class PackageFileManager;
24 
25 
26 class PackageFile : public BReferenceable {
27 public:
28 								PackageFile();
29 								~PackageFile();
30 
31 			status_t			Init(const entry_ref& entryRef,
32 									PackageFileManager* owner);
33 
34 			const node_ref&		NodeRef() const
35 									{ return fNodeRef; }
36 			const BString&		FileName() const
37 									{ return fFileName; }
38 
39 			const node_ref&		DirectoryRef() const
40 									{ return fDirectoryRef; }
41 			void				SetDirectoryRef(const node_ref& directoryRef)
42 									{ fDirectoryRef = directoryRef; }
43 
44 			NotOwningEntryRef	EntryRef() const;
45 
46 			const BPackageInfo & Info() const
47 									{ return fInfo; }
48 
49 			BString				RevisionedName() const;
50 			BString				RevisionedNameThrows() const;
51 
52 			int32				EntryCreatedIgnoreLevel() const
53 									{ return fIgnoreEntryCreated; }
54 			void				IncrementEntryCreatedIgnoreLevel()
55 									{ fIgnoreEntryCreated++; }
56 			void				DecrementEntryCreatedIgnoreLevel()
57 									{ fIgnoreEntryCreated--; }
58 
59 			int32				EntryRemovedIgnoreLevel() const
60 									{ return fIgnoreEntryRemoved; }
61 			void				IncrementEntryRemovedIgnoreLevel()
62 									{ fIgnoreEntryRemoved++; }
63 			void				DecrementEntryRemovedIgnoreLevel()
64 									{ fIgnoreEntryRemoved--; }
65 
66 			PackageFile*&		EntryRefHashTableNext()
67 									{ return fEntryRefHashTableNext; }
68 
69 protected:
70 	virtual	void				LastReferenceReleased();
71 
72 private:
73 			node_ref			fNodeRef;
74 			node_ref			fDirectoryRef;
75 			BString				fFileName;
76 			BPackageInfo		fInfo;
77 			PackageFile*		fEntryRefHashTableNext;
78 			PackageFileManager*	fOwner;
79 			int32				fIgnoreEntryCreated;
80 			int32				fIgnoreEntryRemoved;
81 };
82 
83 
84 inline NotOwningEntryRef
85 PackageFile::EntryRef() const
86 {
87 	return NotOwningEntryRef(fDirectoryRef, fFileName);
88 }
89 
90 
91 struct PackageFileEntryRefHashDefinition {
92 	typedef entry_ref		KeyType;
93 	typedef	PackageFile		ValueType;
94 
95 	size_t HashKey(const entry_ref& key) const
96 	{
97 		size_t hash = BString::HashValue(key.name);
98 		hash ^= (size_t)key.device;
99 		hash ^= (size_t)key.directory;
100 		return hash;
101 	}
102 
103 	size_t Hash(const PackageFile* value) const
104 	{
105 		return HashKey(value->EntryRef());
106 	}
107 
108 	bool Compare(const entry_ref& key, const PackageFile* value) const
109 	{
110 		return value->EntryRef() == key;
111 	}
112 
113 	PackageFile*& GetLink(PackageFile* value) const
114 	{
115 		return value->EntryRefHashTableNext();
116 	}
117 };
118 
119 
120 typedef BOpenHashTable<PackageFileEntryRefHashDefinition>
121 	PackageFileEntryRefHashTable;
122 
123 
124 #endif	// PACKAGE_FILE_H
125