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
9class HierarchicalQueryIterator;
10class Volume;
11
12// QueryIterator
13class QueryIterator : public BReferenceable,
14	public DoublyLinkedListLinkImpl<QueryIterator> {
15public:
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
32protected:
33	virtual	void				LastReferenceReleased();
34
35private:
36			Volume*				fVolume;
37			HierarchicalQueryIterator* fParentIterator;
38			DoublyLinkedListLink<QueryIterator> fVolumeLink;
39};
40
41// HierarchicalQueryIterator
42class HierarchicalQueryIterator : public QueryIterator {
43public:
44								HierarchicalQueryIterator(Volume* volume);
45	virtual						~HierarchicalQueryIterator();
46
47			QueryIterator*		GetCurrentSubIterator() const;
48			QueryIterator*		NextSubIterator();
49			void				RewindSubIterator();
50			void				AddSubIterator(QueryIterator* subIterator);
51			void				RemoveSubIterator(QueryIterator* subIterator);
52			void				RemoveAllSubIterators(
53									DoublyLinkedList<QueryIterator>&
54										subIterators);
55
56private:
57			DoublyLinkedList<QueryIterator> fSubIterators;
58			QueryIterator*		fCurrentSubIterator;
59};
60
61// GetVolumeLink
62struct QueryIterator::GetVolumeLink {
63	DoublyLinkedListLink<QueryIterator>* operator()(
64		QueryIterator* iterator) const
65	{
66		return &iterator->fVolumeLink;
67	}
68
69	const DoublyLinkedListLink<QueryIterator>* operator()(
70		const QueryIterator* iterator) const
71	{
72		return &iterator->fVolumeLink;
73	}
74};
75
76#endif	// NET_FS_QUERY_ITERATOR_H
77