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