1// QueryManager.h
2
3#ifndef NET_FS_QUERY_MANAGER_H
4#define NET_FS_QUERY_MANAGER_H
5
6#include "Locker.h"
7#include "QueryIterator.h"
8
9class Volume;
10class VolumeManager;
11
12// QueryManager
13class QueryManager {
14public:
15								QueryManager(VolumeManager* volumeManager);
16								~QueryManager();
17
18			status_t			Init();
19
20			status_t			AddIterator(QueryIterator* iterator);
21
22			status_t			AddSubIterator(
23									HierarchicalQueryIterator* iterator,
24									QueryIterator* subIterator);
25private:
26			status_t			RemoveSubIterator(
27									HierarchicalQueryIterator* iterator,
28									QueryIterator* subIterator);
29public:
30// TODO: Remove.
31
32			QueryIterator*		GetCurrentSubIterator(
33									HierarchicalQueryIterator* iterator);
34			void				NextSubIterator(
35									HierarchicalQueryIterator* iterator,
36									QueryIterator* subIterator);
37private:
38			void				RewindSubIterator(
39									HierarchicalQueryIterator* iterator);
40public:
41// TODO: Remove.
42
43			void				PutIterator(QueryIterator* iterator);
44
45			void				VolumeUnmounting(Volume* volume);
46
47private:
48			struct IteratorMap;
49
50			Locker				fLock;
51			VolumeManager*		fVolumeManager;
52			IteratorMap*		fIterators;
53};
54
55// QueryIteratorPutter
56class QueryIteratorPutter {
57public:
58	QueryIteratorPutter(QueryManager* manager, QueryIterator* iterator)
59		: fManager(manager),
60		  fIterator(iterator)
61	{
62	}
63
64	~QueryIteratorPutter()
65	{
66		if (fManager && fIterator)
67			fManager->PutIterator(fIterator);
68	}
69
70	void Detach()
71	{
72		fManager = NULL;
73		fIterator = NULL;
74	}
75
76private:
77	QueryManager*	fManager;
78	QueryIterator*	fIterator;
79};
80
81#endif	// NET_FS_QUERY_MANAGER_H
82