1/*
2 * Copyright 2009-2011, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef DIRECTORY_H
6#define DIRECTORY_H
7
8
9#include "Node.h"
10
11
12struct DirectoryIterator : DoublyLinkedListLinkImpl<DirectoryIterator> {
13	Node*	node;
14
15	DirectoryIterator()
16		:
17		node(NULL)
18	{
19	}
20};
21
22typedef DoublyLinkedList<DirectoryIterator> DirectoryIteratorList;
23
24
25class Directory : public Node {
26public:
27								Directory(ino_t id);
28	virtual						~Directory();
29
30	virtual	status_t			Init(Directory* parent, const String& name);
31
32	virtual	mode_t				Mode() const;
33	virtual	off_t				FileSize() const;
34
35	virtual	status_t			Read(off_t offset, void* buffer,
36									size_t* bufferSize);
37	virtual	status_t			Read(io_request* request);
38
39	virtual	status_t			ReadSymlink(void* buffer, size_t* bufferSize);
40
41			void				AddChild(Node* node);
42			void				RemoveChild(Node* node);
43			Node*				FindChild(const StringKey& name);
44
45	inline	Node*				FirstChild() const;
46	inline	Node*				NextChild(Node* node) const;
47
48			void				AddDirectoryIterator(
49									DirectoryIterator* iterator);
50			void				RemoveDirectoryIterator(
51									DirectoryIterator* iterator);
52
53private:
54			NodeNameHashTable	fChildTable;
55			NodeList			fChildList;
56			DirectoryIteratorList fIterators;
57};
58
59
60Node*
61Directory::FirstChild() const
62{
63	return fChildList.First();
64}
65
66
67Node*
68Directory::NextChild(Node* node) const
69{
70	return fChildList.GetNext(node);
71}
72
73
74#endif	// DIRECTORY_H
75