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