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