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