#ifndef __DIRECTORYLISTING_H__
#define __DIRECTORYLISTING_H__

class CDirentry
{
public:
	wxString name;
	wxLongLong size;
	wxString permissions;
	wxString ownerGroup;
	bool dir;
	bool link;
	wxString target; // Set to linktarget it link is true

	bool hasDate;
	bool hasTime;
	wxDateTime time;

	bool unsure; // May be true on cached items if any changes were made to the file

	wxString dump() const;
	bool operator==(const CDirentry &op) const;
};

#define UNSURE_UNSURE	0x01
#define UNSURE_ADD		(0x02|UNSURE_UNSURE)
#define UNSURE_REMOVE	(0x04|UNSURE_UNSURE)
#define UNSURE_CHANGE	(0x08|UNSURE_UNSURE)
#define UNSURE_CONFUSED	(0x10|UNSURE_UNSURE)

class CDirentryObject
{
public:
	CDirentryObject(const CDirentryObject& entryObject);
	CDirentryObject(const CDirentry& entry);
	CDirentryObject();
	virtual ~CDirentryObject();
	
	CDirentryObject& operator=(const CDirentryObject &a);

	const CDirentry& GetEntry() const;
	CDirentry& GetEntry();

protected:
	void Unref();
	void Copy();

	int *m_pReferenceCount;
	CDirentry* m_pEntry;
};

class CDirectoryListing
{
public:
	CDirectoryListing();
	CDirectoryListing(const CDirectoryListing& listing);
	~CDirectoryListing();

	CServerPath path;
	CDirectoryListing& operator=(const CDirectoryListing &a);

	const CDirentry& operator[](unsigned int index) const;
	CDirentry& operator[](unsigned int index);

	void SetCount(unsigned int count);
	unsigned int GetCount() const { return m_entryCount; }

	// Lowest bit indicates a file got added
	// Next bit indicates a file got removed
	// 3rd bit indicates a file got changed.
	// 4th bit is set if an update cannot be applied to
	// one of the other categories.
	// 
	// These bits should help the user interface to choose an appropriate sorting
	// algorithm for modified listings
	int m_hasUnsureEntries;
	bool m_failed;
	bool m_hasDirs;

	CTimeEx m_firstListTime;

	void Assign(const std::list<CDirentry> &entries);

	bool RemoveEntry(unsigned int index);

	void GetFilenames(std::vector<wxString> &names) const;

protected:

	void AddRef();
	void Unref();
	void Copy();

	std::vector<CDirentryObject> *m_pEntries;

	unsigned int m_entryCount;

	int *m_referenceCount;
};

#endif


syntax highlighted by Code2HTML, v. 0.9.1