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