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			bool		_CheckDirEntry(const ext2_dir_entry* dirEntry,
66							const uint8* buffer);
67			status_t	_CheckBlock(const uint8* buffer);
68			uint32		_MaxSize();
69
70#if 0
71			ext2_dir_entry_tail* _DirEntryTail(uint8* block) const;
72			uint32		_Checksum(uint8* block) const;
73			void		_SetDirEntryChecksum(uint8* block);
74#endif
75			ext2_htree_tail* _HTreeEntryTail(uint8* block, uint16 offset) const;
76			uint32		_HTreeRootChecksum(uint8* block, uint16 offset, uint16 count) const;
77			void		_SetHTreeEntryChecksum(uint8* block, uint16 offset, uint16 count);
78
79
80	Inode*				fDirectory;
81	Volume*				fVolume;
82	uint32				fBlockSize;
83	HTreeEntryIterator*	fParent;
84	bool				fIndexing;
85
86	uint32				fNumBlocks;
87	uint32				fLogicalBlock;
88	fsblock_t			fPhysicalBlock;
89	uint32				fDisplacement;
90	uint32				fPreviousDisplacement;
91
92	off_t				fStartPhysicalBlock;
93	uint32				fStartLogicalBlock;
94	uint32				fStartDisplacement;
95
96	status_t			fInitStatus;
97};
98
99#endif	// DIRECTORY_ITERATOR_H
100
101