1// Index.cpp
2
3#include "Debug.h"
4#include "Directory.h"
5#include "Entry.h"
6#include "Index.h"
7#include "IndexImpl.h"
8
9// Index
10
11// constructor
12Index::Index(Volume *volume, const char *name, uint32 type,
13			 bool fixedKeyLength, size_t keyLength)
14	: fVolume(volume),
15	  fInitStatus(B_OK),
16	  fName(name),
17	  fType(type),
18	  fKeyLength(keyLength),
19	  fFixedKeyLength(fixedKeyLength)
20{
21	if (!fVolume)
22		fInitStatus = B_BAD_VALUE;
23	else if (!fName.GetString())
24		fInitStatus = B_NO_MEMORY;
25}
26
27// destructor
28Index::~Index()
29{
30}
31
32// InitCheck
33status_t
34Index::InitCheck() const
35{
36	return fInitStatus;
37}
38
39// GetIterator
40bool
41Index::GetIterator(IndexEntryIterator *iterator)
42{
43	bool result = false;
44	if (iterator) {
45		AbstractIndexEntryIterator *actualIterator = InternalGetIterator();
46		if (actualIterator) {
47			iterator->SetIterator(actualIterator);
48			result = true;
49		}
50	}
51	return result;
52}
53
54// Find
55bool
56Index::Find(const uint8 *key, size_t length, IndexEntryIterator *iterator)
57{
58	bool result = false;
59	if (key && iterator) {
60		AbstractIndexEntryIterator *actualIterator
61			= InternalFind(key, length);
62		if (actualIterator) {
63			iterator->SetIterator(actualIterator);
64			result = true;
65		}
66	}
67	return result;
68}
69
70// Dump
71void
72Index::Dump()
73{
74	PRINT(("Index: `%s', type: %lx\n", GetName(), GetType()));
75	for (IndexEntryIterator it(this); it.GetCurrent(); it.GetNext()) {
76		Entry *entry = it.GetCurrent();
77		PRINT(("  entry: `%s', dir: %Ld\n", entry->GetName(),
78											entry->GetParent()->GetID()));
79	}
80}
81
82
83// IndexEntryIterator
84
85// constructor
86IndexEntryIterator::IndexEntryIterator()
87	: fIterator(NULL)
88{
89}
90
91// constructor
92IndexEntryIterator::IndexEntryIterator(Index *index)
93	: fIterator(NULL)
94{
95	if (index)
96		index->GetIterator(this);
97}
98
99// destructor
100IndexEntryIterator::~IndexEntryIterator()
101{
102	SetIterator(NULL);
103}
104
105// GetCurrent
106Entry *
107IndexEntryIterator::GetCurrent()
108{
109	return (fIterator ? fIterator->GetCurrent() : NULL);
110}
111
112// GetCurrent
113Entry *
114IndexEntryIterator::GetCurrent(uint8 *buffer, size_t *keyLength)
115{
116	return (fIterator ? fIterator->GetCurrent(buffer, keyLength) : NULL);
117}
118
119// GetPrevious
120Entry *
121IndexEntryIterator::GetPrevious()
122{
123	return (fIterator ? fIterator->GetPrevious() : NULL);
124}
125
126// GetNext
127Entry *
128IndexEntryIterator::GetNext()
129{
130	return (fIterator ? fIterator->GetNext() : NULL);
131}
132
133// GetNext
134Entry *
135IndexEntryIterator::GetNext(uint8 *buffer, size_t *keyLength)
136{
137	Entry *entry = NULL;
138	if (fIterator && fIterator->GetNext())
139		entry = GetCurrent(buffer, keyLength);
140	return entry;
141}
142
143// Suspend
144status_t
145IndexEntryIterator::Suspend()
146{
147	return (fIterator ? fIterator->Suspend() : B_BAD_VALUE);
148}
149
150// Resume
151status_t
152IndexEntryIterator::Resume()
153{
154	return (fIterator ? fIterator->Resume() : B_BAD_VALUE);
155}
156
157// SetIterator
158void
159IndexEntryIterator::SetIterator(AbstractIndexEntryIterator *iterator)
160{
161	if (fIterator)
162		delete fIterator;
163	fIterator = iterator;
164}
165
166
167// AbstractIndexEntryIterator
168
169// constructor
170AbstractIndexEntryIterator::AbstractIndexEntryIterator()
171{
172}
173
174// destructor
175AbstractIndexEntryIterator::~AbstractIndexEntryIterator()
176{
177}
178
179// Suspend
180status_t
181AbstractIndexEntryIterator::Suspend()
182{
183	return B_OK;
184}
185
186// Resume
187status_t
188AbstractIndexEntryIterator::Resume()
189{
190	return B_OK;
191}
192
193