#ifndef _ENTRY_ITERATOR_H
#define _ENTRY_ITERATOR_H
#include <Directory.h>
#include <ObjectList.h>
#include "NodeWalker.h"
namespace BPrivate {
class EntryListBase : public BEntryList {
public:
EntryListBase();
virtual ~EntryListBase() {}
virtual status_t InitCheck() const;
virtual status_t GetNextEntry(BEntry* entry, bool traverse = false) = 0;
virtual status_t GetNextRef(entry_ref* ref) = 0;
virtual int32 GetNextDirents(struct dirent* buffer, size_t length,
int32 count = INT_MAX) = 0;
virtual status_t Rewind() = 0;
virtual int32 CountEntries() = 0;
static dirent* Next(dirent*);
protected:
status_t fStatus;
};
class TWalkerWrapper : public EntryListBase {
public:
TWalkerWrapper(BTrackerPrivate::TWalker* walker);
virtual ~TWalkerWrapper();
virtual status_t InitCheck() const;
virtual status_t GetNextEntry(BEntry* entry, bool traverse = false);
virtual status_t GetNextRef(entry_ref* ref);
virtual int32 GetNextDirents(struct dirent* buffer, size_t length,
int32 count = INT_MAX);
virtual status_t Rewind();
virtual int32 CountEntries();
protected:
BTrackerPrivate::TWalker* fWalker;
status_t fStatus;
};
const int32 kDirentBufferSize = B_PAGE_SIZE * 2;
class CachedEntryIterator : public EntryListBase {
public:
CachedEntryIterator(BEntryList* iterator, int32 numEntries,
bool sortInodes = false);
virtual ~CachedEntryIterator();
virtual status_t GetNextEntry(BEntry* entry, bool traverse = false);
virtual status_t GetNextRef(entry_ref* ref);
virtual int32 GetNextDirents(struct dirent* buffer, size_t length,
int32 count = INT_MAX);
virtual status_t Rewind();
virtual int32 CountEntries();
virtual void SetTo(BEntryList* iterator);
private:
static int _CompareInodes(const dirent* ent1, const dirent* ent2);
BEntryList* fIterator;
entry_ref* fEntryRefBuffer;
int32 fCacheSize;
int32 fNumEntries;
int32 fIndex;
dirent* fDirentBuffer;
dirent* fCurrentDirent;
bool fSortInodes;
BObjectList<dirent>* fSortedList;
BEntry* fEntryBuffer;
};
class DirectoryEntryList : public EntryListBase {
public:
DirectoryEntryList(const BDirectory &);
virtual status_t GetNextEntry(BEntry* entry, bool traverse = false);
virtual status_t GetNextRef(entry_ref* ref);
virtual int32 GetNextDirents(struct dirent* buffer, size_t length,
int32 count = INT_MAX);
virtual status_t Rewind();
virtual int32 CountEntries();
private:
BDirectory fDirectory;
};
class CachedDirectoryEntryList : public CachedEntryIterator {
public:
CachedDirectoryEntryList(const BDirectory &);
virtual ~CachedDirectoryEntryList();
private:
BDirectory fDirectory;
};
class EntryIteratorList : public EntryListBase {
public:
EntryIteratorList();
virtual ~EntryIteratorList();
void AddItem(BEntryList*);
virtual status_t GetNextEntry(BEntry* entry, bool traverse = false);
virtual status_t GetNextRef(entry_ref* ref);
virtual int32 GetNextDirents(struct dirent* buffer, size_t length,
int32 count = INT_MAX);
virtual status_t Rewind();
virtual int32 CountEntries();
protected:
BObjectList<BEntryList, true> fList;
int32 fCurrentIndex;
};
class CachedEntryIteratorList : public CachedEntryIterator {
public:
CachedEntryIteratorList(bool sortInodes = true);
void AddItem(BEntryList* list);
protected:
EntryIteratorList fIteratorList;
};
}
using namespace BPrivate;
#endif