1// QueryIterator.cpp
2
3#include "QueryIterator.h"
4
5// constructor
6QueryIterator::QueryIterator(Volume* volume)
7	: Referencable(false),
8	  fVolume(volume),
9	  fParentIterator(NULL),
10	  fVolumeLink()
11{
12}
13
14// destructor
15QueryIterator::~QueryIterator()
16{
17}
18
19// GetVolume
20Volume*
21QueryIterator::GetVolume() const
22{
23	return fVolume;
24}
25
26// SetParentIterator
27void
28QueryIterator::SetParentIterator(HierarchicalQueryIterator* parent)
29{
30	fParentIterator = parent;
31}
32
33// GetParentIterator
34HierarchicalQueryIterator*
35QueryIterator::GetParentIterator() const
36{
37	return fParentIterator;
38}
39
40// ReadQuery
41status_t
42QueryIterator::ReadQuery(struct dirent* buffer, size_t bufferSize, int32 count,
43	int32* countRead, bool* done)
44{
45	*countRead = 0;
46	*done = true;
47	return B_OK;
48}
49
50
51// #pragma mark -
52
53// constructor
54HierarchicalQueryIterator::HierarchicalQueryIterator(Volume* volume)
55	: QueryIterator(volume),
56	  fSubIterators(),
57	  fCurrentSubIterator(NULL)
58{
59}
60
61// destructor
62HierarchicalQueryIterator::~HierarchicalQueryIterator()
63{
64}
65
66// GetCurrentSubIterator
67QueryIterator*
68HierarchicalQueryIterator::GetCurrentSubIterator() const
69{
70	return fCurrentSubIterator;
71}
72
73// NextSubIterator
74QueryIterator*
75HierarchicalQueryIterator::NextSubIterator()
76{
77	if (fCurrentSubIterator)
78		fCurrentSubIterator = fSubIterators.GetNext(fCurrentSubIterator);
79	return fCurrentSubIterator;
80}
81
82// RewindSubIterator
83void
84HierarchicalQueryIterator::RewindSubIterator()
85{
86	fCurrentSubIterator = fSubIterators.GetFirst();
87}
88
89// AddSubIterator
90void
91HierarchicalQueryIterator::AddSubIterator(QueryIterator* subIterator)
92{
93	if (!subIterator)
94		return;
95
96	fSubIterators.Insert(subIterator);
97	subIterator->SetParentIterator(this);
98	if (!fCurrentSubIterator)
99		fCurrentSubIterator = subIterator;
100}
101
102// RemoveSubIterator
103void
104HierarchicalQueryIterator::RemoveSubIterator(QueryIterator* subIterator)
105{
106	if (!subIterator)
107		return;
108
109	if (fCurrentSubIterator == subIterator)
110		NextSubIterator();
111	subIterator->SetParentIterator(NULL);
112	fSubIterators.Remove(subIterator);
113}
114
115// RemoveAllSubIterators
116void
117HierarchicalQueryIterator::RemoveAllSubIterators(
118	DLList<QueryIterator>& subIterators)
119{
120	while (QueryIterator* iterator = fSubIterators.GetFirst()) {
121		RemoveSubIterator(iterator);
122		subIterators.Insert(iterator);
123	}
124}
125
126