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
14class PackageLinksListener;
15
16
17class PackageLinkDirectory : public Directory {
18public:
19								PackageLinkDirectory();
20	virtual						~PackageLinkDirectory();
21
22			status_t			Init(Directory* parent, Package* package);
23	virtual	status_t			Init(Directory* parent, const char* name,
24									uint32 flags);
25
26	virtual	timespec			ModifiedTime() const;
27
28			void				AddPackage(Package* package,
29									PackageLinksListener* listener);
30			void				RemovePackage(Package* package,
31									PackageLinksListener* listener);
32			void				UpdatePackageDependencies(Package* package,
33									PackageLinksListener* listener);
34
35			void				NotifyDirectoryAdded(
36									PackageLinksListener* listener);
37
38			bool				IsEmpty() const
39									{ return fPackages.IsEmpty(); }
40
41private:
42			typedef PackageLinkSymlink Link;
43
44			struct DependencyLink : public PackageLinkSymlink {
45				DependencyLink(Package* package)
46					:
47					PackageLinkSymlink(package)
48				{
49				}
50
51				DoublyLinkedListLink<DependencyLink> fPackageLinkDirectoryLink;
52			};
53
54			typedef DoublyLinkedList<DependencyLink,
55				DoublyLinkedListMemberGetLink<DependencyLink,
56					&DependencyLink::fPackageLinkDirectoryLink> >
57				FamilyDependencyList;
58
59private:
60			status_t			_Update(PackageLinksListener* listener);
61			status_t			_UpdateDependencies(
62									PackageLinksListener* listener);
63
64private:
65			timespec			fModifiedTime;
66			PackageList			fPackages;
67			Link*				fSelfLink;
68			FamilyDependencyList fDependencyLinks;
69};
70
71
72#endif	// PACKAGE_LINK_DIRECTORY_H
73