/** @file Package.h
@brief 文件打包:包文件类 第一版测试
* Copyright (c) 2007,北京金刚游科技有限公司
* All rights reserved.
*
* 当前版本:2008-08-21
* 作 者:KingKong
* 完成日期:2008-08-
*
* 取代版本:
* 作 者:
* 完成日期:
*/
#if !defined _PACKAGE_H_
#define _PACKAGE_H_
#include
#include "Api.h"
#include "PackageFileReader.h"
#include "PackageFileSystem.h"
class CPackageFileReader;
class CPackageFileSystem;
// 添加新的读包模式 [8/22/2009 hemeng]
#define CURRENT_CODE_VERSION 4
class PACKAGE_ENTRY CPackage
{
public:
CPackage();
~CPackage();
//********************************************************************************************************
//for test only
////////////////////////////////////////////////////////////////////////////////
//函数名:PrintPackInfo
//功能:打印包信息
//入口参数: 无
//出口参数:无
////////////////////////////////////////////////////////////////////////////////
/*void PrintPackInfo();*/
////////////////////////////////////////////////////////////////////////////////
//函数名:CreateNewFileFromPackage
//功能: 从包中读取文件并释放到指定目录
//入口参数: string szFilePath 文件名
// string szFileOutPath 释放路径
//出口参数: bool 成功返回ture,反之返回false
//说明:
////////////////////////////////////////////////////////////////////////////////
bool CreateNewFileFromPackage( string szFilePath, string szFileOutPath );
//********************************************************************************************************
//包打开模式
enum EPackOpenType
{
EO_READ, //只读打开包
EO_WRITE //读写打开包
};
////////////////////////////////////////////////////////////////////////////////
//函数名:OpenPackage
//功能:打开包
//入口参数: string strPackName 包文件绝对路径
// EPackOpenType eOpenType 打开模式,默认为EO_READ
// bool bLoadFileSystem 是否载入包系统信息,默认为 是
//出口参数: bool 打开成功返回 true, 失败返回 false
////////////////////////////////////////////////////////////////////////////////
bool OpenPackage( string strPackName, EPackOpenType eOpenType = EO_READ ,bool bLoadFileSystem = true );
// 特殊打开方式,用于写入方式打开包,从BUFFER中读取配置文件 [8/22/2009 hemeng]
// 必须为载入文件系统模式 [8/22/2009 hemeng]
bool SpecialOpen( string strPackName,char* pConfigFileBuffer);
////////////////////////////////////////////////////////////////////////////////
//函数名:ClosePackage
//功能:关闭包
//入口参数: 无
//出口参数: 无
////////////////////////////////////////////////////////////////////////////////
bool ClosePackage();
bool ReopenPackageFile();
void ClosePackageFile();
////////////////////////////////////////////////////////////////////////////////
//函数名:GetPackageFileSystem
//功能:获得包系统信息指针
//入口参数:无
//出口参数:CPackageFileSystem* 返回包系统信息指针,错误则返回NULL
////////////////////////////////////////////////////////////////////////////////
CPackageFileSystemPtr GetPackageFileSystem() { return m_spPackageFileSystem; };
////////////////////////////////////////////////////////////////////////////////
//函数名:SetPackageFileSystem
//功能:设置包系统信息
//入口参数: CPackageFileSystem* kPackageFileSystem 源包系统信息
//出口参数: bool
////////////////////////////////////////////////////////////////////////////////
bool SetPackageFileSystem( CPackageFileSystemPtr spPackageFileSystem );
////////////////////////////////////////////////////////////////////////////////
//函数名:GetPackageRootDir
//功能:设置包的根目录路径(相对路径)
//入口参数: string strRootDir 路径名
//出口参数:bool
////////////////////////////////////////////////////////////////////////////////
bool SetPackageRootDir(string strRootDir);
////////////////////////////////////////////////////////////////////////////////
//函数名:SetPackageRootDir
//功能:设置包的根目录路径(相对路径)
//入口参数: 无
//出口参数: string 路径名
////////////////////////////////////////////////////////////////////////////////
string GetPackageRootDir() const;
////////////////////////////////////////////////////////////////////////////////
//函数名:AddFile 重载
//功能:向包中添加指定路径的文件
//入口参数: string strFileName 插入文件的绝对路径+文件名
// ,string strDirPath 目录
//出口参数: bool 成功则返回ture,失败返回 false
////////////////////////////////////////////////////////////////////////////////
bool AddFile( string strFileName ,string strDirPath);
////////////////////////////////////////////////////////////////////////////////
//函数名:AddFile 重载
//功能:向包中添加文件
//入口参数: SPackageFileInfo& pFileInfo 文件信息描述
// UINT nBufferSize 数据大小
// bool bDirect 是否直接插入包,默认为 否
// 设置为ture 则不进行加密、压缩等处理直接将数据加入包,主要用于从已有包向当前包添加数据
// 设置为false 则会按照文件加密及压缩类型标志对数据首先进行处理再加入包中
//出口参数: bool 成功则返回ture,失败返回 false
////////////////////////////////////////////////////////////////////////////////
bool AddFile( SPackageFileInfo& pFileInfo,const BYTE* pBuffer, bool bDirect = false );
////////////////////////////////////////////////////////////////////////////////
//函数名:AddDirFiles
//功能:添加指定文件夹所有文件到包
//入口参数: string strDirPath 文件夹绝对路径
//出口参数: bool 成功则返回ture,失败返回 false
//说明:
////////////////////////////////////////////////////////////////////////////////
bool AddDirFiles( string strDirPath );
////////////////////////////////////////////////////////////////////////////////
//函数名:AddFileFromPackage 重载
//功能:从已有包向包中添加文件
//入口参数: string strPackageFileName 源包文件路径
//出口参数: bool 成功则返回true,失败返回 false
////////////////////////////////////////////////////////////////////////////////
bool AddFileFromPackage( string strPackageFileName );
////////////////////////////////////////////////////////////////////////////////
//函数名:AddFileFromPackage
//功能:从已有包向包中添加文件
//入口参数: CPackage* pPackage 源包文件流指针
//出口参数: bool 成功则返回true,失败返回 false
////////////////////////////////////////////////////////////////////////////////
bool AddFileFromPackage( CPackage* pPackage );
////////////////////////////////////////////////////////////////////////////////
//函数名:DeletePackFile
//功能:从包中删除指定文件
//入口参数: string strFileName 删除文件全路径(相对路径)+文件名
//出口参数: bool
////////////////////////////////////////////////////////////////////////////////
bool DeletePackFile( string strFileName );
////////////////////////////////////////////////////////////////////////////////
//函数名:Deflate
//功能:紧缩模式,删除包碎片空间
//入口参数: 无
//出口参数: bool 成功则返回true,失败返回 false
//说明:执行紧缩模式后,无论包原来以何种方式打开
////////////////////////////////////////////////////////////////////////////////
bool Deflate();
////////////////////////////////////////////////////////////////////////////////
//函数名:GetPackageFileReader
//功能:获得包读取指针
//入口参数: string strFileName 读取文件全路径(相对路径)+文件名
//出口参数: CPackageFileReader* 指定文件读取指针
////////////////////////////////////////////////////////////////////////////////
CPackageFileReader* GetPackageFileReader( string strFileName );
////////////////////////////////////////////////////////////////////////////////
//函数名:GetPackageFile
//功能:获得包文件指针
//入口参数: 无
//出口参数: FILE* 当前包的文件指针
////////////////////////////////////////////////////////////////////////////////
FILE* GetPackageFile() { return m_pPackFile; };
////////////////////////////////////////////////////////////////////////////////
//函数名:SetPackVersion
//功能:设置包版本
//入口参数: UINT nVersion 目标版本号
//出口参数: 无
////////////////////////////////////////////////////////////////////////////////
void SetPackCodeVersion( UINT nVersion ) { m_packageHeader.nVersion = nVersion; };
UINT GetPackCodeVersion() const { return m_packageHeader.nVersion;};
////////////////////////////////////////////////////////////////////////////////
//函数名:SetPackContentVersion
//功能:设置包版本
//入口参数: FILETIME 目标版本号
//出口参数: 无
////////////////////////////////////////////////////////////////////////////////
void SetPackContentVersion(FILETIME nContentVersion) { m_packageHeader.nContentVersion = nContentVersion;};
FILETIME GetPackContentVersion() const { return m_packageHeader.nContentVersion;};
////////////////////////////////////////////////////////////////////////////////
//函数名:GetPackFileName
//功能:获得当前包文件绝对路径
//入口参数: 无
//出口参数: string 包文件绝对路径
////////////////////////////////////////////////////////////////////////////////
string GetPackFileName() const { return m_strPackagePath; };
////////////////////////////////////////////////////////////////////////////////
//函数名:GetPackMode
//功能:获得当前包文件读写模式
//入口参数: 无
//出口参数: bool
////////////////////////////////////////////////////////////////////////////////
bool GetPackMode() const { return m_bModified;};
///获取相对包内的路径
bool GetSubPath( const char * szPathByRelPackage, vector< string >& vSubPaths );
////////////////////////////////////////////////////////////////////////////////
//函数名:VerifyPackFile
//功能:验证包合法性
//入口参数: FILE* pPackFile
//出口参数:bool
////////////////////////////////////////////////////////////////////////////////
bool Verify(FILE* pPackFile);
protected:
private:
CPackage(CPackage& kPackage);
////////////////////////////////////////////////////////////////////////////////
//函数名:_WriteOpenPackage
//功能:读写模式打开包
//入口参数:string strPackagePath 包文件绝对路径
//出口参数:bool 成功则返回true,失败返回 false
//说明: 读写模式打开包,打开同时载入包系统信息,如果为新建包在创建包系统信息
////////////////////////////////////////////////////////////////////////////////
bool _WriteOpenPackage( string strPackagePath );
////////////////////////////////////////////////////////////////////////////////
//函数名:_ReadOpen
//功能:只读模式打开包
//入口参数: string strPackagePath 包文件绝对路径
// bool bLoadFileSystem 是否打开包同时载入包系统信息
//出口参数:bool 成功则返回true,失败返回 false
//说明: 如果设置打开包同时不载入系统信息,则在使用包前务必使用
// SetPackageFileSystem函数设置包系统信息再使用
////////////////////////////////////////////////////////////////////////////////
bool _ReadOpen( string strPackagePath, bool bLoadFileSystem );
////////////////////////////////////////////////////////////////////////////////
//函数名:GetPackageHead
//功能:获取包头信息指针
//入口参数: 无
//出口参数: SPackageFileHeader* 包头信息指针
////////////////////////////////////////////////////////////////////////////////
SPackageFileHeader* _GetPackageHead() { return &m_packageHeader; };
////////////////////////////////////////////////////////////////////////////////
//函数名:AddFile
//功能:向包中添加文件
//入口参数: string strFileName 文件全路径+文件名(相对路径)
// EEncryptType eEncryptType 文件加密类型
// const BYTE* pBuffer 指向文件数据的指针
// UINT nBufferSize 数据大小
// bool bDirect 是否直接插入包,默认为 否
// 设置为ture 则不进行加密、压缩等处理直接将数据加入包,主要用于从已有包向当前包添加数据
// 设置为false 则会按照文件加密及压缩类型标志对数据首先进行处理再加入包中
//出口参数: bool 成功则返回ture,失败返回 false
////////////////////////////////////////////////////////////////////////////////
bool _AddFile( string strFileName, EEncryptType eEncryptType, const BYTE* pBuffer, UINT nBufferSize ,bool bDirect = false);
////////////////////////////////////////////////////////////////////////////////
//函数名:_CreatePackage
//功能:创建一个空包
//入口参数: string strRootDir 包根目录
//出口参数: bool 成功则返回true,失败返回 false
////////////////////////////////////////////////////////////////////////////////
bool _CreatePackage( string strRootDir );
////////////////////////////////////////////////////////////////////////////////
//函数名:_CreatePackageHeaderFile
//功能:为当前包创建一个空包头
//入口参数: 无
//出口参数: 无
////////////////////////////////////////////////////////////////////////////////
void _CreatePackageHeaderFile( );
////////////////////////////////////////////////////////////////////////////////
//函数名:_LoadPackageHeader
//功能:从包文件载入包头信息
//入口参数: 无
//出口参数: bool 成功则返回true,失败返回 false
////////////////////////////////////////////////////////////////////////////////
bool _LoadPackageHeader();
////////////////////////////////////////////////////////////////////////////////
//函数名:_AppendFileDataToPackage
//功能:向包数据区尾部添加数据
//入口参数: FILE* pFile 包文件流指针
// const BYTE* pFileBuffer 指向添加数据的指针
// UINT nFileBufferSize 添加数据的大小
//出口参数: bool 成功则返回true,失败返回 false
////////////////////////////////////////////////////////////////////////////////
bool _AppendFileDataToPackage( FILE* pFile,const BYTE* pFileBuffer , UINT nFileBufferSize );
////////////////////////////////////////////////////////////////////////////////
//函数名:_AddFileData
//功能:向包数据区添加数据
//入口参数: const BYTE* pFileBuffer 指向源数据的指针
// SPackageFileInfo& sPackageFileInfo 数据文件描述信息
//出口参数: bool 成功则返回true,失败返回 false
//说明:如果文件已存在则会首先进行删除,然后重新添加
////////////////////////////////////////////////////////////////////////////////
bool _AddFileData( const BYTE* pFileBuffer,SPackageFileInfo& sPackageFileInfo );
////////////////////////////////////////////////////////////////////////////////
//函数名:_CreateFileInfo
//功能:创建文件信息描述
//入口参数: SPackageFileInfo& sFileInfo 目标文件信息描述的引用
// string strFileName 文件全路径(相对路径+文件名)
// EEncryptType eEncryptType 文件加密类型
// EFileType eFileType 文件类型
// UINT nBufferSize 文件数据大小
// UINT nPos 文件数据在包中的存储位置
//出口参数: bool
////////////////////////////////////////////////////////////////////////////////
bool _CreateFileInfo( SPackageFileInfo& sFileInfo,string strFileName, EEncryptType eEncryptType, EFileType eFileType,UINT nBufferSize, UINT nPos );
////////////////////////////////////////////////////////////////////////////////
//函数名:LoadPackageFileSystem
//功能:载入包系统信息
//入口参数: 无
//出口参数: bool 打开成功返回 true, 失败返回 false
////////////////////////////////////////////////////////////////////////////////
bool _LoadPackageFileSystem();
////////////////////////////////////////////////////////////////////////////////
//函数名:LoadConfigFile
//功能: 读取文件加密方式配置文件
//入口参数: string strFilePath 配置文件路径
// map& matConfig 配置参数
//出口参数:bool
//说明:
////////////////////////////////////////////////////////////////////////////////
bool _LoadConfigFile(string strFilePath,map& mapConfig);
bool _LoadConfigFile(char* pBuffer,map& mapConfig);
////////////////////////////////////////////////////////////////////////////////
//函数名:LoadXmlFileData
//功能: 递归读取文件
//入口参数: TiXmlElement* pRootElement 读取根节点
// map& matConfig 配置参数
//出口参数:bool
//说明:
////////////////////////////////////////////////////////////////////////////////
bool _LoadXmlFileData(TiXmlElement* pRootElement, map& mapConfig);
////////////////////////////////////////////////////////////////////////////////
//函数名:_GetCurrWorkDir
//功能: 递归读取文件
//入口参数: 无
//出口参数:string
//说明:
////////////////////////////////////////////////////////////////////////////////
string _GetCurrWorkDir();
////////////////////////////////////////////////////////////////////////////////
//函数名:GetFileEncryptType
//功能:根据文件类型,配置文件压缩及加密类型
//入口参数: string strFileName 文件名
// UINT nFileSize 文件大小
//出口参数:EEncryptType 文件压缩及加密类型 默认为ET_HEADER
////////////////////////////////////////////////////////////////////////////////
EEncryptType _GetFileEncryptType( string strFileName, UINT nFileSize );
//------------------------------------------------------------------------------
//成员变量
CPackageFileSystemPtr m_spPackageFileSystem; //包文件系统指针
SPackageFileHeader m_packageHeader; //包头
UINT m_nCurrDataPos; //包数据区结尾位置
string m_strPackagePath; //包文件名 包绝对路径 + 包文件名
FILE* m_pPackFile; //包文件流指针
bool m_bModified; //包改写标志 true 读写模式 false 只读模式
map m_mapEncryptInfo; // 加密模式
};
//导出函数
PACKAGE_ENTRY bool OpenPackage();
PACKAGE_ENTRY void ClosePackage();
#endif
//end of package.h