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