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