⛏️ index : haiku.git

/*
 * Copyright 2010, Haiku Inc. All rights reserved.
 * This file may be used under the terms of the MIT License.
 *
 * Authors:
 *		Janito V. Ferreira Filho
 */
#ifndef HTREE_ENTRY_ITERATOR_H
#define HTREE_ENTRY_ITERATOR_H


#include <AutoDeleter.h>

#include "DirectoryIterator.h"


class Volume;


class HTreeEntryIterator {
public:
								HTreeEntryIterator(off_t offset,
									Inode* directory);
								~HTreeEntryIterator();

			status_t			Init();
			
			status_t			Lookup(uint32 hash, int indirections,
									DirectoryIterator**	iterator,
									bool& detachRoot);
			bool				HasCollision() { return fHasCollision; }
						
			status_t			GetNext(uint32& offset);

			uint32				BlocksNeededForNewEntry();
			status_t			InsertEntry(Transaction& transaction,
									uint32 hash, off_t block,
									off_t newBlocksPos, bool hasCollision);
private:
								HTreeEntryIterator(uint32 block,
									uint32 blockSize, Inode* directory,
									HTreeEntryIterator* parent,
									bool hasCollision);

			ext2_htree_tail*	_HTreeEntryTail(uint8* block) const;
			uint32				_Checksum(uint8* block) const;
			void				_SetHTreeEntryChecksum(uint8* block);

private:
			Inode*				fDirectory;
			Volume*				fVolume;
			status_t			fInitStatus;

			bool				fHasCollision;
			uint16				fLimit, fCount;
			uint16				fFirstEntry;
			uint16				fCurrentEntry;

			uint32				fBlockSize;
			fsblock_t			fBlockNum;

			HTreeEntryIterator*	fParent;
			HTreeEntryIterator*	fChild;
};

#endif	// HTREE_ENTRY_ITERATOR_H