xref: /haiku/src/add-ons/kernel/file_systems/netfs/client/ShareNode.h (revision 5a1d355fdf2747f80f8c46e2539f844a0b813346)
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