1// NodeHandle.h 2 3#ifndef NET_FS_NODE_HANDLE_H 4#define NET_FS_NODE_HANDLE_H 5 6#include <dirent.h> 7 8#include <Query.h> 9#include <Referenceable.h> 10#include <util/DoublyLinkedList.h> 11 12#include "Lockable.h" 13#include "NodeRef.h" 14 15class Directory; 16class Entry; 17class Node; 18 19// NodeHandle 20class NodeHandle : public BReferenceable, public Lockable { 21public: 22 NodeHandle(); 23 virtual ~NodeHandle(); 24 25 virtual status_t GetStat(struct stat* st); 26 27 void SetCookie(int32 cookie); 28 int32 GetCookie() const; 29 30 const NodeRef& GetNodeRef() const; 31 32protected: 33 virtual int GetFD() const; 34 35protected: 36 int32 fCookie; 37 NodeRef fNodeRef; 38}; 39 40// FileHandle 41class FileHandle : public NodeHandle { 42public: 43 FileHandle(); 44 virtual ~FileHandle(); 45 46 status_t Open(Node* node, int openMode); 47 status_t Close(); 48 49 status_t Read(off_t pos, void* buffer, size_t size, 50 size_t* bytesRead); 51 status_t Write(off_t pos, const void* buffer, 52 size_t size, size_t* bytesWritten); 53 54 status_t ReadAttr(const char* name, uint32 type, 55 off_t pos, void* buffer, size_t size, 56 size_t* bytesRead); 57 status_t WriteAttr(const char* name, uint32 type, 58 off_t pos, const void* buffer, size_t size, 59 size_t* bytesWritten); 60 status_t RemoveAttr(const char* name); 61 status_t StatAttr(const char* name, attr_info* info); 62 63protected: 64 virtual int GetFD() const; 65 66private: 67 int fFD; 68}; 69 70// DirIterator 71class DirIterator : public NodeHandle, 72 public DoublyLinkedListLinkImpl<DirIterator> { 73public: 74 DirIterator(); 75 virtual ~DirIterator(); 76 77 bool IsValid() const; 78 79 virtual Entry* NextEntry() = 0; 80 virtual void Rewind() = 0; 81 82 83 // for Directory internal use only 84 virtual status_t SetDirectory(Directory* directory) = 0; 85 86 virtual Entry* GetCurrentEntry() const = 0; 87 88protected: 89 Directory* fDirectory; 90 bool fValid; 91}; 92 93// AttrDirIterator 94class AttrDirIterator : public NodeHandle { 95public: 96 AttrDirIterator(); 97 virtual ~AttrDirIterator(); 98 99 status_t Open(Node* node); 100 status_t Close(); 101 102 virtual status_t ReadDir(dirent* entry, int32 bufferSize, 103 int32 count, int32* countRead, bool *done); 104 virtual status_t RewindDir(); 105 106protected: 107 virtual int GetFD() const; 108 109private: 110 DIR* fDir; 111}; 112 113// Query 114class Query : public BQuery, public DoublyLinkedListLinkImpl<Query> { 115public: 116}; 117 118class QueryHandle; 119 120// QueryListener 121class QueryListener { 122public: 123 QueryListener(); 124 virtual ~QueryListener(); 125 126 virtual void QueryHandleClosed(QueryHandle* handle) = 0; 127}; 128 129// QueryHandle 130class QueryHandle : public NodeHandle { 131public: 132 QueryHandle(port_id remotePort, 133 int32 remoteToken); 134 virtual ~QueryHandle(); 135 136 void SetQueryListener(QueryListener* listener); 137 QueryListener* GetQueryListener() const; 138 139 void AddQuery(Query* query); 140 void RemoveQuery(Query* query); 141 142 port_id GetRemotePort() const; 143 int32 GetRemoteToken() const; 144 145 status_t Close(); 146 147 status_t ReadDir(dirent* entry, int32 count, 148 int32* countRead); 149private: 150 port_id fRemotePort; 151 int32 fRemoteToken; 152 DoublyLinkedList<Query> fQueries; 153 Query* fCurrentQuery; 154 QueryListener* fListener; 155 bool fClosed; 156}; 157 158#endif // NET_FS_NODE_HANDLE_H 159