root/src/add-ons/kernel/file_systems/netfs/client/QueryManager.h
// 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