/*
 * Copyright 2011, Jérôme Duval, korli@users.berlios.de.
 * Copyright 2014 Haiku, Inc. All rights reserved.
 *
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Jérôme Duval, korli@users.berlios.de
 *		John Scipione, jscipione@gmail.com
 */
#ifndef DIRECTORYITERATOR_H
#define DIRECTORYITERATOR_H


#include "CachedBlock.h"
#include "exfat.h"

class Inode;

class EntryVisitor {
public:
								EntryVisitor() {};
		virtual					~EntryVisitor() {};
		virtual bool			VisitBitmap(struct exfat_entry*)
									{ return false; }
		virtual bool			VisitUppercase(struct exfat_entry*)
									{ return false; }
		virtual bool			VisitLabel(struct exfat_entry*)
									{ return false; }
		virtual bool			VisitFilename(struct exfat_entry*)
									{ return false; }
		virtual bool			VisitFile(struct exfat_entry*)
									{ return false; }
		virtual bool			VisitFileInfo(struct exfat_entry*)
									{ return false; }
};


class DirectoryIterator {
public:
								DirectoryIterator(Inode* inode);
								~DirectoryIterator();

			status_t			InitCheck();

			status_t			GetNext(char* name, size_t* _nameLength,
									ino_t* _id, EntryVisitor* visitor = NULL);
			status_t			Lookup(const char* name, size_t nameLength,
									ino_t* _id);
			status_t			LookupEntry(EntryVisitor* visitor);
			status_t			Rewind();

			void				Iterate(EntryVisitor &visitor);
private:
			status_t			_GetNext(uint16* unicodeName,
									size_t* _codeUnitCount, ino_t* _id,
									EntryVisitor* visitor = NULL);
			status_t			_NextEntry();

			int64				fOffset;
			cluster_t			fCluster;
			Inode* 				fInode;
			CachedBlock			fBlock;
			struct exfat_entry*	fCurrent;
};


#endif	// DIRECTORYITERATOR_H