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