#ifndef CLASS_FILEPACKAGE_H
#define CLASS_FILEPACKAGE_H

#define FILEPACKAGE_MAGIC		0x464442					// 檔案類型檢查碼

#include "cImgFile.h"
#include <vector>
#include <map>
#include <string>

using namespace std;

struct FileDbIndex
{	
	FileType	m_fileType;					// 檔案類型
	FILETIME	m_fileTime;					// 檔案時間
	HANDLE		m_hFile;					// 檔案指標
	int			m_offset;					// 該筆資料在檔案內偏移值	
	bool		m_isFromDB;					// 來自資料庫
};

class cFilePackage
{
public:
	cFilePackage();
	virtual ~cFilePackage();

	/*
	struct lstr
	{
		operator () (const char* p1, const char* p2) const
		{
			return strcmp(p2, p2) < 0;
		}
	};
	*/

	/**
	* 釋放所有資料
	*/
	void Destroy();

	/**
	* 取得檔案資料
	*
	* @param keyStr  檔案名稱
	* @param pFileObj  空的基礎檔案類別指標的指標位置
	* @param loadDataBool  是否讀取所有資料(true 會讀入所有資料, false 忽略檔案資料,只讀取檔頭資訊)
	*
	* @return true 成功時需檢查cFileObj檔案類型,以及資料是否為壓縮格式  false 失敗
	*/
	cFileObj* GetFileObj(const char *filename);

#if RUSTREAMIO
	/**
	* 取得 IRuStream 界面類別指標,使用完後需 Delete
	*
	* @param keyStr  檔案名稱
	*
	* @return 失敗傳回NULL, 成功傳回類別指標,在使用時需檢查檔案類型是否為圖形檔案
	*/
	IRuStream *GetIRuStream( const char *keyStr );
#endif

	/**
	* 動態增加檔案至索引表格內
	*
	* @param fileNameStr  檔案名稱
	* @param pSpecialData  載入檔案參數設定
	* @param format  壓縮格式
	*
	* @return true 成功  false 失敗
	*/
	bool AddFile( const TCHAR *fileNameStr, void *pSpecialData = NULL, CompressFormat format = COMPRESS_FMT_NORMAL );

	/**
	* 載入資料庫檔案
	*
	* @param fileNameStr  檔案名稱
	*
	* @return true 成功  false 失敗
	*/
	bool LoadFromFile( const TCHAR *fileNameStr );

	/**
	* 寫入資料庫檔案
	*
	* @param fileNameStr  檔案名稱
	*
	* @return 失敗傳回 -1資料庫內無資料 -2開檔失敗  成功傳回總儲存筆數
	*/
	int SaveToFile( const TCHAR *fileNameStr );

	/**
	* 設定工作路徑,只有在載入動態檔案時才會用到
	*/
	void SetDirectory( const TCHAR *dirStr );

	/**
	* 取得工作路徑
	*/
	TCHAR *GetDirectory() { return m_dirStr; }
	
	/**
	*/
	//FileDbIndex *GetFirstItem();

	/**
	*/
	//FileDbIndex *GetNextItem();

protected:

	/**
	* 增加檔案至索引表格內
	*
	* @param pInfo  檔案表格結構指標
	*
	* @return true  成功  false 失敗
	*/
	bool AddToTable(string filename, FileDbIndex &fileInfo);

	/**
	*/
	FileDbIndex *Find(string filename);

	/**
	* 取得完整檔案名稱
	*/
	TCHAR *GetFullNameStr( const TCHAR *fileNameStr );

protected:

	TCHAR m_dirStr[MAX_PATH];							// 工作路徑
	map<string, FileDbIndex>		m_table;
	vector<HANDLE>					m_fileHandle;
};

#endif //CLASS_FILEPACKAGE_H




