1/* 2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef LOCATABLE_ENTRY_H 6#define LOCATABLE_ENTRY_H 7 8#include <String.h> 9 10#include <Referenceable.h> 11#include <util/DoublyLinkedList.h> 12#include <util/OpenHashTable.h> 13 14 15enum locatable_entry_state { 16 LOCATABLE_ENTRY_UNLOCATED, 17 LOCATABLE_ENTRY_LOCATED_IMPLICITLY, 18 LOCATABLE_ENTRY_LOCATED_EXPLICITLY 19}; 20 21 22class LocatableDirectory; 23class LocatableEntry; 24 25 26class LocatableEntryOwner { 27public: 28 virtual ~LocatableEntryOwner(); 29 30 virtual bool Lock() = 0; 31 virtual void Unlock() = 0; 32 33 virtual void LocatableEntryUnused(LocatableEntry* entry) = 0; 34}; 35 36 37class LocatableEntry : public BReferenceable, 38 public DoublyLinkedListLinkImpl<LocatableEntry> { 39public: 40 LocatableEntry(LocatableEntryOwner* owner, 41 LocatableDirectory* parent); 42 ~LocatableEntry(); 43 44 LocatableDirectory* Parent() const { return fParent; } 45 virtual const char* Name() const = 0; 46 47 // mutable (requires locking) 48 locatable_entry_state State() const { return fState; } 49 virtual bool GetLocatedPath(BString& _path) const = 0; 50 virtual void SetLocatedPath(const BString& path, 51 bool implicit) = 0; 52 53protected: 54 virtual void LastReferenceReleased(); 55 56protected: 57 LocatableEntryOwner* fOwner; 58 LocatableDirectory* fParent; 59 locatable_entry_state fState; 60 61public: 62 LocatableEntry* fNext; 63}; 64 65 66typedef DoublyLinkedList<LocatableEntry> LocatableEntryList; 67 68 69#endif // LOCATABLE_ENTRY_H 70