#ifndef NET_FS_VIRTUAL_DIR_H
#define NET_FS_VIRTUAL_DIR_H
#include <HashMap.h>
#include <HashString.h>
#include <util/DoublyLinkedList.h>
#include "Node.h"
class VirtualDir;
class VirtualDirEntry;
class VirtualDirIterator : public DoublyLinkedListLinkImpl<VirtualDirIterator> {
public:
VirtualDirIterator();
~VirtualDirIterator();
void SetDirectory(VirtualDir* directory,
bool onlyChildren = false);
bool GetCurrentEntry(const char** name, Node** node);
VirtualDirEntry* GetCurrentEntry() const;
void NextEntry();
void Rewind();
private:
enum {
STATE_DOT = 0,
STATE_DOT_DOT = 1,
STATE_OTHERS = 2,
};
VirtualDir* fDirectory;
VirtualDirEntry* fCurrentEntry;
int fState;
};
class VirtualDirEntry : public DoublyLinkedListLinkImpl<VirtualDirEntry> {
public:
VirtualDirEntry();
~VirtualDirEntry();
status_t SetTo(const char* name, Node* node);
const char* GetName() const;
Node* GetNode() const;
private:
HashString fName;
Node* fNode;
};
class VirtualDir : public Node, public DoublyLinkedListLinkImpl<VirtualDir> {
public:
VirtualDir(Volume* volume, vnode_id nodeID);
virtual ~VirtualDir();
status_t InitCheck() const;
void SetParent(VirtualDir* parent);
VirtualDir* GetParent() const;
time_t GetCreationTime() const;
status_t AddEntry(const char* name, Node* child);
Node* RemoveEntry(const char* name);
VirtualDirEntry* GetEntry(const char* name) const;
Node* GetChildNode(const char* name) const;
VirtualDirEntry* GetFirstEntry() const;
VirtualDirEntry* GetNextEntry(VirtualDirEntry* entry) const;
void AddDirIterator(VirtualDirIterator* iterator);
void RemoveDirIterator(VirtualDirIterator* iterator);
private:
typedef HashMap<HashString, VirtualDirEntry*> EntryMap;
VirtualDir* fParent;
time_t fCreationTime;
EntryMap fEntries;
DoublyLinkedList<VirtualDirEntry> fEntryList;
DoublyLinkedList<VirtualDirIterator> fIterators;
};
#endif