xref: /haiku/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinkDirectory.h (revision 372a66634410cf0450e426716c14ad42d40c0da4)
1 /*
2  * Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef PACKAGE_LINK_DIRECTORY_H
6 #define PACKAGE_LINK_DIRECTORY_H
7 
8 
9 #include "Directory.h"
10 #include "Package.h"
11 #include "PackageLinkSymlink.h"
12 
13 
14 class PackageLinksListener;
15 
16 
17 class PackageLinkDirectory : public Directory {
18 public:
19 								PackageLinkDirectory();
20 	virtual						~PackageLinkDirectory();
21 
22 			status_t			Init(Directory* parent, Package* package);
23 	virtual	status_t			Init(Directory* parent, const String& name);
24 
25 	virtual	timespec			ModifiedTime() const;
26 
27 			void				AddPackage(Package* package,
28 									PackageLinksListener* listener);
29 			void				RemovePackage(Package* package,
30 									PackageLinksListener* listener);
31 			void				UpdatePackageDependencies(Package* package,
32 									PackageLinksListener* listener);
33 
34 			bool				IsEmpty() const
35 									{ return fPackages.IsEmpty(); }
36 
37 private:
38 			typedef PackageLinkSymlink Link;
39 
40 			struct DependencyLink : public PackageLinkSymlink {
41 				DependencyLink(Package* package)
42 					:
43 					PackageLinkSymlink(package, TYPE_INSTALLATION_LOCATION)
44 				{
45 				}
46 
47 				DoublyLinkedListLink<DependencyLink> fPackageLinkDirectoryLink;
48 			};
49 
50 			typedef DoublyLinkedList<DependencyLink,
51 				DoublyLinkedListMemberGetLink<DependencyLink,
52 					&DependencyLink::fPackageLinkDirectoryLink> >
53 				FamilyDependencyList;
54 
55 private:
56 			status_t			_Update(PackageLinksListener* listener);
57 			status_t			_UpdateDependencies(
58 									PackageLinksListener* listener);
59 
60 			status_t			_CreateOrUpdateLink(Link*& link,
61 									Package* package, Link::Type type,
62 									const String& name,
63 									PackageLinksListener* listener);
64 			void				_RemoveLink(Link* link,
65 									PackageLinksListener* listener);
66 
67 private:
68 			timespec			fModifiedTime;
69 			PackageList			fPackages;
70 			Link*				fSelfLink;
71 			Link*				fSettingsLink;
72 			FamilyDependencyList fDependencyLinks;
73 };
74 
75 
76 #endif	// PACKAGE_LINK_DIRECTORY_H
77