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