⛏️ index : haiku.git

// QueryManager.h

#ifndef NET_FS_QUERY_MANAGER_H
#define NET_FS_QUERY_MANAGER_H

#include "Locker.h"
#include "QueryIterator.h"

class Volume;
class VolumeManager;

// QueryManager
class QueryManager {
public:
								QueryManager(VolumeManager* volumeManager);
								~QueryManager();

			status_t			Init();

			status_t			AddIterator(QueryIterator* iterator);

			status_t			AddSubIterator(
									HierarchicalQueryIterator* iterator,
									QueryIterator* subIterator);
private:
			status_t			RemoveSubIterator(
									HierarchicalQueryIterator* iterator,
									QueryIterator* subIterator);
public:
// TODO: Remove.

			QueryIterator*		GetCurrentSubIterator(
									HierarchicalQueryIterator* iterator);
			void				NextSubIterator(
									HierarchicalQueryIterator* iterator,
									QueryIterator* subIterator);
private:
			void				RewindSubIterator(
									HierarchicalQueryIterator* iterator);
public:
// TODO: Remove.

			void				PutIterator(QueryIterator* iterator);

			void				VolumeUnmounting(Volume* volume);

private:
			struct IteratorMap;

			Locker				fLock;
			VolumeManager*		fVolumeManager;
			IteratorMap*		fIterators;
};

// QueryIteratorPutter
class QueryIteratorPutter {
public:
	QueryIteratorPutter(QueryManager* manager, QueryIterator* iterator)
		: fManager(manager),
		  fIterator(iterator)
	{
	}

	~QueryIteratorPutter()
	{
		if (fManager && fIterator)
			fManager->PutIterator(fIterator);
	}

	void Detach()
	{
		fManager = NULL;
		fIterator = NULL;
	}

private:
	QueryManager*	fManager;
	QueryIterator*	fIterator;
};

#endif	// NET_FS_QUERY_MANAGER_H