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 String& name);
24
25	virtual	timespec			ModifiedTime() const;
26
27	virtual	status_t			OpenAttributeDirectory(
28									AttributeDirectoryCookie*& _cookie);
29	virtual	status_t			OpenAttribute(const StringKey& name,
30									int openMode, AttributeCookie*& _cookie);
31
32			void				AddPackage(Package* package,
33									PackageLinksListener* listener);
34			void				RemovePackage(Package* package,
35									PackageLinksListener* listener);
36			void				UpdatePackageDependencies(Package* package,
37									PackageLinksListener* listener);
38
39			bool				IsEmpty() const
40									{ return fPackages.IsEmpty(); }
41
42private:
43			typedef PackageLinkSymlink Link;
44
45			struct DependencyLink : public PackageLinkSymlink {
46				DependencyLink(Package* package)
47					:
48					PackageLinkSymlink(package, TYPE_INSTALLATION_LOCATION)
49				{
50				}
51
52				DoublyLinkedListLink<DependencyLink> fPackageLinkDirectoryLink;
53			};
54
55			typedef DoublyLinkedList<DependencyLink,
56				DoublyLinkedListMemberGetLink<DependencyLink,
57					&DependencyLink::fPackageLinkDirectoryLink> >
58				FamilyDependencyList;
59
60private:
61			status_t			_Update(PackageLinksListener* listener);
62			status_t			_UpdateDependencies(
63									PackageLinksListener* listener);
64
65			status_t			_CreateOrUpdateLink(Link*& link,
66									Package* package, Link::Type type,
67									const String& name,
68									PackageLinksListener* listener);
69			void				_RemoveLink(Link* link,
70									PackageLinksListener* listener);
71
72private:
73			timespec			fModifiedTime;
74			PackageList			fPackages;
75			Link*				fSelfLink;
76			Link*				fSettingsLink;
77			FamilyDependencyList fDependencyLinks;
78};
79
80
81#endif	// PACKAGE_LINK_DIRECTORY_H
82