1// VirtualDir.h
2
3#ifndef NET_FS_VIRTUAL_DIR_H
4#define NET_FS_VIRTUAL_DIR_H
5
6#include <HashMap.h>
7#include <HashString.h>
8#include <util/DoublyLinkedList.h>
9
10#include "Node.h"
11
12class VirtualDir;
13class VirtualDirEntry;
14
15// VirtualDirIterator
16class VirtualDirIterator : public DoublyLinkedListLinkImpl<VirtualDirIterator> {
17public:
18								VirtualDirIterator();
19								~VirtualDirIterator();
20
21			void				SetDirectory(VirtualDir* directory,
22									bool onlyChildren = false);
23
24			bool				GetCurrentEntry(const char** name, Node** node);
25			VirtualDirEntry*	GetCurrentEntry() const;
26									// for use by VirtualDir only
27			void				NextEntry();
28			void				Rewind();
29
30private:
31			enum {
32				STATE_DOT		= 0,
33				STATE_DOT_DOT	= 1,
34				STATE_OTHERS	= 2,
35			};
36
37			VirtualDir*			fDirectory;
38			VirtualDirEntry*	fCurrentEntry;
39			int					fState;
40};
41
42// VirtualDirEntry
43class VirtualDirEntry : public DoublyLinkedListLinkImpl<VirtualDirEntry> {
44public:
45								VirtualDirEntry();
46								~VirtualDirEntry();
47
48			status_t			SetTo(const char* name, Node* node);
49
50			const char*			GetName() const;
51			Node*				GetNode() const;
52
53private:
54			HashString			fName;
55			Node*				fNode;
56};
57
58// VirtualDir
59class VirtualDir : public Node, public DoublyLinkedListLinkImpl<VirtualDir> {
60public:
61								VirtualDir(Volume* volume, vnode_id nodeID);
62	virtual						~VirtualDir();
63
64			status_t			InitCheck() const;
65
66			void				SetParent(VirtualDir* parent);
67			VirtualDir*			GetParent() const;
68				// TODO: Remove? We don't need it, do we?
69
70			time_t				GetCreationTime() const;
71
72			status_t			AddEntry(const char* name, Node* child);
73			Node*				RemoveEntry(const char* name);
74			VirtualDirEntry*	GetEntry(const char* name) const;
75			Node*				GetChildNode(const char* name) const;
76			VirtualDirEntry*	GetFirstEntry() const;
77			VirtualDirEntry*	GetNextEntry(VirtualDirEntry* entry) const;
78
79			void				AddDirIterator(VirtualDirIterator* iterator);
80			void				RemoveDirIterator(VirtualDirIterator* iterator);
81
82private:
83			typedef HashMap<HashString, VirtualDirEntry*> EntryMap;
84
85			VirtualDir*			fParent;
86			time_t				fCreationTime;
87			EntryMap			fEntries;
88			DoublyLinkedList<VirtualDirEntry> fEntryList;
89			DoublyLinkedList<VirtualDirIterator> fIterators;
90};
91
92#endif	// NET_FS_VIRTUAL_DIR_H
93