1// Node.h 2 3#ifndef NET_FS_SHARE_NODE_H 4#define NET_FS_SHARE_NODE_H 5 6#include "DLList.h" 7#include "Node.h" 8#include "NodeInfo.h" 9#include "Referencable.h" 10#include "SLList.h" 11 12class ShareAttrDir; 13class ShareDir; 14class ShareNode; 15 16static const int32 kRemoteShareDirIteratorCapacity = 32; 17 18// ShareDirEntry 19class ShareDirEntry : public Referencable, 20 public DLListLinkImpl<ShareDirEntry>, public SLListLinkImpl<ShareDirEntry> { 21public: 22 ShareDirEntry(ShareDir* directory, 23 const char* name, ShareNode* node); 24 ~ShareDirEntry(); 25 26 status_t InitCheck() const; 27 28 ShareDir* GetDirectory() const; 29 const char* GetName() const; 30 ShareNode* GetNode() const; 31 32 void SetRevision(int64 revision); 33 int64 GetRevision() const; 34 35 bool IsActualEntry() const; 36 37private: 38 ShareDir* fDirectory; 39 String fName; 40 ShareNode* fNode; 41 int64 fRevision; 42}; 43 44// ShareNode 45class ShareNode : public Node { 46public: 47 ShareNode(Volume* volume, vnode_id id, 48 const NodeInfo* nodeInfo); 49 virtual ~ShareNode(); 50 51 const NodeInfo& GetNodeInfo() const; 52 53 NodeID GetRemoteID() const; 54 55 void Update(const NodeInfo& nodeInfo); 56 57 void AddReferringEntry(ShareDirEntry* entry); 58 void RemoveReferringEntry(ShareDirEntry* entry); 59 ShareDirEntry* GetFirstReferringEntry() const; 60 ShareDirEntry* GetNextReferringEntry( 61 ShareDirEntry* entry) const; 62 ShareDirEntry* GetActualReferringEntry() const; 63 64 void SetAttrDir(ShareAttrDir* attrDir); 65 ShareAttrDir* GetAttrDir() const; 66 67private: 68 NodeInfo fInfo; 69 SLList<ShareDirEntry> fReferringEntries; 70 ShareAttrDir* fAttrDir; 71}; 72 73// ShareDirIterator 74class ShareDirIterator { 75public: 76 ShareDirIterator(); 77 virtual ~ShareDirIterator(); 78 79 virtual ShareDirEntry* GetCurrentEntry() const = 0; 80 virtual void NextEntry() = 0; 81 virtual void Rewind() = 0; 82 virtual bool IsDone() const = 0; 83}; 84 85// LocalShareDirIterator 86class LocalShareDirIterator : public ShareDirIterator, 87 public DLListLinkImpl<LocalShareDirIterator> { 88public: 89 LocalShareDirIterator(); 90 ~LocalShareDirIterator(); 91 92 void SetDirectory(ShareDir* directory); 93 94 virtual ShareDirEntry* GetCurrentEntry() const; 95 virtual void NextEntry(); 96 virtual void Rewind(); 97 virtual bool IsDone() const; 98 99private: 100 ShareDir* fDirectory; 101 ShareDirEntry* fCurrentEntry; 102}; 103 104// RemoteShareDirIterator 105class RemoteShareDirIterator : public ShareDirIterator { 106public: 107 RemoteShareDirIterator(); 108 ~RemoteShareDirIterator(); 109 110 virtual ShareDirEntry* GetCurrentEntry() const; 111 virtual void NextEntry(); 112 virtual void Rewind(); 113 virtual bool IsDone() const; 114 115 int32 GetCapacity() const; 116 117 void SetCookie(int32 cookie); 118 int32 GetCookie() const; 119 120 void Clear(); 121 bool AddEntry(ShareDirEntry* entry); 122 123 void SetRevision(int64 revision); 124 int64 GetRevision() const; 125 126 void SetDone(bool done); 127 128 bool GetRewind() const; 129 130private: 131 int32 fCookie; 132 ShareDirEntry* fEntries[kRemoteShareDirIteratorCapacity]; 133 int32 fCapacity; 134 int32 fCount; 135 int32 fIndex; 136 int64 fRevision; 137 bool fDone; 138 bool fRewind; 139}; 140 141// ShareDir 142class ShareDir : public ShareNode { 143public: 144 ShareDir(Volume* volume, vnode_id id, 145 const NodeInfo* nodeInfo); 146 virtual ~ShareDir(); 147 148 void UpdateEntryCreatedEventRevision(int64 revision); 149 int64 GetEntryCreatedEventRevision() const; 150 151 void UpdateEntryRemovedEventRevision(int64 revision); 152 int64 GetEntryRemovedEventRevision() const; 153 154 void SetComplete(bool complete); 155 bool IsComplete() const; 156 157 void AddEntry(ShareDirEntry* entry); 158 void RemoveEntry(ShareDirEntry* entry); 159 160 ShareDirEntry* GetFirstEntry() const; 161 ShareDirEntry* GetNextEntry(ShareDirEntry* entry) const; 162 163 void AddDirIterator(LocalShareDirIterator* iterator); 164 void RemoveDirIterator( 165 LocalShareDirIterator* iterator); 166 167private: 168 DLList<ShareDirEntry> fEntries; 169 DLList<LocalShareDirIterator> fIterators; 170 int64 fEntryCreatedEventRevision; 171 // The revision of the latest "created" or 172 // "moved" (destination entry) event for 173 // which the entry could not be created 174 // (for whatever reason -- missing entry 175 // info in the event request most likely). 176 // To be compared with remote dir iterator 177 // revisions to set fIsComplete. 178 int64 fEntryRemovedEventRevision; 179 // The revision of the latest "removed" or 180 // "moved" (source entry) event. To be 181 // compared with entry info revisions 182 // returned by client request replies. 183 // Such an info is to be considered invalid, 184 // if its revision is less than this 185 // revision, and must be reloaded from the 186 // server. 187 bool fIsComplete; 188}; 189 190#endif // NET_FS_SHARE_NODE_H 191