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