#ifndef __INC_MAPPEDFILE_H__
#define __INC_MAPPEDFILE_H__

#include "lzo.h"
#include "FileBase.h"

class CMappedFile : public CFileBase
{
public:
	enum ESeekType
	{
		SEEK_TYPE_BEGIN,
		SEEK_TYPE_CURRENT,
		SEEK_TYPE_END
	};

public:
	CMappedFile();
	virtual ~CMappedFile();
	
	void		Link(DWORD dwBufSize, const void* c_pvBufData);

	BOOL		Create(const char* filename);
	BOOL		Create(const char* filename, const void** dest, int offset, int size);
	LPCVOID		Get();
	void		Destroy();
	int			Seek(DWORD offset, int iSeekType = SEEK_TYPE_BEGIN);
	int			Map(const void **dest, int offset=0, int size=0);
	DWORD		Size();
	DWORD		GetPosition();
	BOOL		Read(void* dest, int bytes);
	DWORD		GetSeekPosition();
	void		BindLZObject(CLZObject * pLZObj);
	void		BindLZObjectWithBufferedSize(CLZObject * pLZObj);
	BYTE*		AppendDataBlock( const void* pBlock, DWORD dwBlockSize );

	BYTE * GetCurrentSeekPoint();

private:
	void		Unmap(LPCVOID data);
	
private:
	BYTE*		m_pbBufLinkData;
	DWORD		m_dwBufLinkSize;

	BYTE*		m_pbAppendResultDataBlock; 
	DWORD		m_dwAppendResultDataSize;

	DWORD		m_seekPosition;
	HANDLE		m_hFM;
	DWORD		m_dataOffset;
	DWORD		m_mapSize;
	LPVOID		m_lpMapData;
	LPVOID		m_lpData;

	CLZObject *	m_pLZObj;
};

#endif