1/*
2 * Copyright 2008, Axel D��rfler, axeld@pinc-software.de.
3 * This file may be used under the terms of the MIT License.
4 */
5#ifndef DIRECTORY_ITERATOR_H
6#define DIRECTORY_ITERATOR_H
7
8
9#include "ext2.h"
10
11#include <SupportDefs.h>
12
13#include "Transaction.h"
14
15
16class HTreeEntryIterator;
17class Inode;
18
19class DirectoryIterator {
20public:
21						DirectoryIterator(Inode* inode, off_t start = 0,
22							HTreeEntryIterator* parent = NULL);
23						~DirectoryIterator();
24
25			status_t	InitCheck();
26
27
28			status_t	Next();
29			status_t	Get(char* name, size_t* _nameLength, ino_t* id);
30			status_t	GetNext(char* name, size_t* _nameLength, ino_t* id);
31
32			status_t	Rewind();
33			void		Restart();
34
35			status_t	AddEntry(Transaction& transaction, const char* name,
36							size_t nameLength, ino_t id, uint8 type);
37			status_t	FindEntry(const char* name, ino_t* id = NULL);
38			status_t	RemoveEntry(Transaction& transaction);
39
40			status_t	ChangeEntry(Transaction& transaction, ino_t id,
41							uint8 fileType);
42
43private:
44						DirectoryIterator(const DirectoryIterator&);
45						DirectoryIterator &operator=(const DirectoryIterator&);
46							// no implementation
47
48
49protected:
50			status_t	_AllocateBestEntryInBlock(uint8 nameLength, uint16& pos,
51							uint16& newLength);
52			status_t	_AddEntry(Transaction& transaction, const char* name,
53							uint8 nameLength, ino_t id, uint8 fileType,
54							uint16 newLength, uint16 pos,
55							bool hasPrevious = true);
56			status_t	_SplitIndexedBlock(Transaction& transaction,
57							const char* name, uint8 nameLength, ino_t id,
58							uint8 type, uint32 newBlocksPos,
59							bool firstSplit = false);
60
61			status_t	_NextBlock();
62			off_t		_Offset() { return fLogicalBlock * fBlockSize
63							+ fDisplacement; }
64
65
66	Inode*				fDirectory;
67	Volume*				fVolume;
68	uint32				fBlockSize;
69	HTreeEntryIterator*	fParent;
70	bool				fIndexing;
71
72	uint32				fNumBlocks;
73	uint32				fLogicalBlock;
74	fsblock_t			fPhysicalBlock;
75	uint32				fDisplacement;
76	uint32				fPreviousDisplacement;
77
78	off_t				fStartPhysicalBlock;
79	uint32				fStartLogicalBlock;
80	uint32				fStartDisplacement;
81
82	status_t			fInitStatus;
83};
84
85#endif	// DIRECTORY_ITERATOR_H
86
87