/** @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