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 char* name,
31									uint32 flags);
32
33	virtual	mode_t				Mode() const;
34	virtual	off_t				FileSize() const;
35
36	virtual	status_t			Read(off_t offset, void* buffer,
37									size_t* bufferSize);
38	virtual	status_t			Read(io_request* request);
39
40	virtual	status_t			ReadSymlink(void* buffer, size_t* bufferSize);
41
42			void				AddChild(Node* node);
43			void				RemoveChild(Node* node);
44			Node*				FindChild(const char* name);
45
46	inline	Node*				FirstChild() const;
47	inline	Node*				NextChild(Node* node) const;
48
49			void				AddDirectoryIterator(
50									DirectoryIterator* iterator);
51			void				RemoveDirectoryIterator(
52									DirectoryIterator* iterator);
53
54private:
55			NodeNameHashTable	fChildTable;
56			NodeList			fChildList;
57			DirectoryIteratorList fIterators;
58};
59
60
61Node*
62Directory::FirstChild() const
63{
64	return fChildList.First();
65}
66
67
68Node*
69Directory::NextChild(Node* node) const
70{
71	return fChildList.GetNext(node);
72}
73
74
75#endif	// DIRECTORY_H
76