xref: /haiku/src/add-ons/kernel/file_systems/netfs/client/QueryIterator.h (revision b289aaf66bbf6e173aa90fa194fc256965f1b34d)
1 // QueryIterator.h
2 
3 #ifndef NET_FS_QUERY_ITERATOR_H
4 #define NET_FS_QUERY_ITERATOR_H
5 
6 #include <Referenceable.h>
7 #include <util/DoublyLinkedList.h>
8 
9 class HierarchicalQueryIterator;
10 class Volume;
11 
12 // QueryIterator
13 class QueryIterator : public BReferenceable,
14 	public DoublyLinkedListLinkImpl<QueryIterator> {
15 public:
16 								QueryIterator(Volume* volume);
17 	virtual						~QueryIterator();
18 
19 			Volume*				GetVolume() const;
20 
21 			void				SetParentIterator(
22 										HierarchicalQueryIterator* parent);
23 			HierarchicalQueryIterator* GetParentIterator() const;
24 
25 	virtual	status_t			ReadQuery(struct dirent* buffer,
26 									size_t bufferSize, int32 count,
27 									int32* countRead, bool* done);
28 
29 			struct GetVolumeLink;
30 			friend struct GetVolumeLink;
31 
32 private:
33 			Volume*				fVolume;
34 			HierarchicalQueryIterator* fParentIterator;
35 			DoublyLinkedListLink<QueryIterator> fVolumeLink;
36 };
37 
38 // HierarchicalQueryIterator
39 class HierarchicalQueryIterator : public QueryIterator {
40 public:
41 								HierarchicalQueryIterator(Volume* volume);
42 	virtual						~HierarchicalQueryIterator();
43 
44 			QueryIterator*		GetCurrentSubIterator() const;
45 			QueryIterator*		NextSubIterator();
46 			void				RewindSubIterator();
47 			void				AddSubIterator(QueryIterator* subIterator);
48 			void				RemoveSubIterator(QueryIterator* subIterator);
49 			void				RemoveAllSubIterators(
50 									DoublyLinkedList<QueryIterator>&
51 										subIterators);
52 
53 private:
54 			DoublyLinkedList<QueryIterator> fSubIterators;
55 			QueryIterator*		fCurrentSubIterator;
56 };
57 
58 // GetVolumeLink
59 struct QueryIterator::GetVolumeLink {
60 	DoublyLinkedListLink<QueryIterator>* operator()(
61 		QueryIterator* iterator) const
62 	{
63 		return &iterator->fVolumeLink;
64 	}
65 
66 	const DoublyLinkedListLink<QueryIterator>* operator()(
67 		const QueryIterator* iterator) const
68 	{
69 		return &iterator->fVolumeLink;
70 	}
71 };
72 
73 #endif	// NET_FS_QUERY_ITERATOR_H
74