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