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