root/src/add-ons/kernel/file_systems/ext2/HTreeEntryIterator.h
/*
 * 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