root/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinkDirectory.h
/*
 * Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef PACKAGE_LINK_DIRECTORY_H
#define PACKAGE_LINK_DIRECTORY_H


#include "Directory.h"
#include "Package.h"
#include "PackageLinkSymlink.h"


class PackageLinksListener;


class PackageLinkDirectory : public Directory {
public:
                                                                PackageLinkDirectory();
        virtual                                         ~PackageLinkDirectory();

                        status_t                        Init(Package* package);
        virtual status_t                        Init(const String& name);

        virtual timespec                        ModifiedTime() const;

        virtual status_t                        OpenAttributeDirectory(
                                                                        AttributeDirectoryCookie*& _cookie);
        virtual status_t                        OpenAttribute(const StringKey& name,
                                                                        int openMode, AttributeCookie*& _cookie);

                        void                            AddPackage(Package* package,
                                                                        PackageLinksListener* listener);
                        void                            RemovePackage(Package* package,
                                                                        PackageLinksListener* listener);
                        void                            UpdatePackageDependencies(Package* package,
                                                                        PackageLinksListener* listener);

                        bool                            IsEmpty() const
                                                                        { return fPackages.IsEmpty(); }

private:
                        typedef PackageLinkSymlink Link;

                        struct DependencyLink : public PackageLinkSymlink {
                                DependencyLink(Package* package)
                                        :
                                        PackageLinkSymlink(package, TYPE_INSTALLATION_LOCATION)
                                {
                                }

                                DoublyLinkedListLink<DependencyLink> fPackageLinkDirectoryLink;
                        };

                        typedef DoublyLinkedList<DependencyLink,
                                DoublyLinkedListMemberGetLink<DependencyLink,
                                        &DependencyLink::fPackageLinkDirectoryLink> >
                                FamilyDependencyList;

private:
                        status_t                        _Update(PackageLinksListener* listener);
                        status_t                        _UpdateDependencies(
                                                                        PackageLinksListener* listener);

                        status_t                        _CreateOrUpdateLink(Link*& link,
                                                                        Package* package, Link::Type type,
                                                                        const String& name,
                                                                        PackageLinksListener* listener);
                        void                            _RemoveLink(Link* link,
                                                                        PackageLinksListener* listener);

private:
                        timespec                        fModifiedTime;
                        PackageList                     fPackages;
                        Link*                           fSelfLink;
                        Link*                           fSettingsLink;
                        FamilyDependencyList fDependencyLinks;
};


#endif  // PACKAGE_LINK_DIRECTORY_H