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