/* * Copyright 2007, Ingo Weinhold, ingo_weinhold@gmx.de. * All rights reserved. Distributed under the terms of the MIT license. */ #include "DebugSupport.h" #include "Directory.h" #include "Entry.h" #include "Index.h" #include "IndexImpl.h" // Index // constructor Index::Index(Volume *volume, const char *name, uint32 type, bool fixedKeyLength, size_t keyLength) : fVolume(volume), fInitStatus(B_OK), fName(name), fType(type), fKeyLength(keyLength), fFixedKeyLength(fixedKeyLength) { if (!fVolume) fInitStatus = B_BAD_VALUE; else if (!fName.GetString()) fInitStatus = B_NO_MEMORY; } // destructor Index::~Index() { } // InitCheck status_t Index::InitCheck() const { return fInitStatus; } // GetIterator bool Index::GetIterator(IndexEntryIterator *iterator) { bool result = false; if (iterator) { AbstractIndexEntryIterator *actualIterator = InternalGetIterator(); if (actualIterator) { iterator->SetIterator(actualIterator); result = true; } } return result; } // Find bool Index::Find(const uint8 *key, size_t length, IndexEntryIterator *iterator) { bool result = false; if (key && iterator) { AbstractIndexEntryIterator *actualIterator = InternalFind(key, length); if (actualIterator) { iterator->SetIterator(actualIterator); result = true; } } return result; } // Dump void Index::Dump() { D( PRINT("Index: `%s', type: %lx\n", GetName(), GetType()); for (IndexEntryIterator it(this); it.GetCurrent(); it.GetNext()) { Entry *entry = it.GetCurrent(); PRINT(" entry: `%s', dir: %lld\n", entry->GetName(), entry->GetParent()->GetID()); } ) } // IndexEntryIterator // constructor IndexEntryIterator::IndexEntryIterator() : fIterator(NULL) { } // constructor IndexEntryIterator::IndexEntryIterator(Index *index) : fIterator(NULL) { if (index) index->GetIterator(this); } // destructor IndexEntryIterator::~IndexEntryIterator() { SetIterator(NULL); } // GetCurrent Entry * IndexEntryIterator::GetCurrent() { return (fIterator ? fIterator->GetCurrent() : NULL); } // GetCurrent Entry * IndexEntryIterator::GetCurrent(uint8 *buffer, size_t *keyLength) { return (fIterator ? fIterator->GetCurrent(buffer, keyLength) : NULL); } // GetPrevious Entry * IndexEntryIterator::GetPrevious() { return (fIterator ? fIterator->GetPrevious() : NULL); } // GetNext Entry * IndexEntryIterator::GetNext() { return (fIterator ? fIterator->GetNext() : NULL); } // GetNext Entry * IndexEntryIterator::GetNext(uint8 *buffer, size_t *keyLength) { Entry *entry = NULL; if (fIterator && fIterator->GetNext()) entry = GetCurrent(buffer, keyLength); return entry; } // Suspend status_t IndexEntryIterator::Suspend() { return (fIterator ? fIterator->Suspend() : B_BAD_VALUE); } // Resume status_t IndexEntryIterator::Resume() { return (fIterator ? fIterator->Resume() : B_BAD_VALUE); } // SetIterator void IndexEntryIterator::SetIterator(AbstractIndexEntryIterator *iterator) { if (fIterator) delete fIterator; fIterator = iterator; } // AbstractIndexEntryIterator // constructor AbstractIndexEntryIterator::AbstractIndexEntryIterator() { } // destructor AbstractIndexEntryIterator::~AbstractIndexEntryIterator() { } // Suspend status_t AbstractIndexEntryIterator::Suspend() { return B_OK; } // Resume status_t AbstractIndexEntryIterator::Resume() { return B_OK; }