#pragma once #include #include namespace NPK { //------------------------------------ //pre-dfine //------------------------------------ class INPKFile; class IFileStream; class IFileList; //------------------------------------ // NPK file error codes //------------------------------------ enum ErrorCode { NPK_ERR_SUCCESS = 0, NPK_ERR_FILE_NOT_FOUND, NPK_ERR_INVALID_FILE_FORMAT, NPK_ERR_INVALID_FILE_HASH, NPK_ERR_FILE_ACCESS, NPK_ERR_FILE_READ, NPK_ERR_FILE_WRITE, NPK_ERR_PARAM, NPK_ERR_INVALID_STATE, NPK_ERR_NEW_FAILED, NPK_ERR_FILE_CREATE, NPK_ERR_DUPLICATE_KEYNAME, //Other errors NPK_ERR_UNKNOWN }; //------------------------------------ //API for NPK file //------------------------------------ // Create a NPK file interface INPKFile* createNPKFile(); // destroy an NPK interface void closeNPKFile(INPKFile* npkFile); // Create empty file list IFileList* createEmptyFileList(); // destroy a file list void destoryFileList(IFileList* fileList); // Get the last error code ErrorCode getLastErrorCode(); // Get the last error message const char* getLastErrorMessage(); //------------------------------------ // define the NPK file interface //------------------------------------ struct FileItemBaseInfo { std::string keyName; // utf8 'common/etc/tribe.img' uint32_t fileOffset = 0; uint32_t fileSize = 0; }; struct FileItemFullInfo { std::string npkName; // utf8 'sprite_interface2_hud.npk' std::string npkBase; // utf8 'd:/dnf/ImagePacks2' std::string keyName; // 'common/etc/tribe.img' uint32_t fileOffset = 0; uint32_t fileSize = 0; uint32_t fileCRC = 0; }; class INPKFile { public: virtual bool openPakFile(const wchar_t* wszNpkPathName) = 0; virtual bool closePakFile(void) = 0; virtual int32_t getFileCounts(void) const = 0; virtual bool getFileItemBaseInfo(int32_t index, FileItemBaseInfo* baseInfo) const = 0; virtual IFileStream* openFileStream(const char* szFileName) = 0; virtual void closeFileStream(IFileStream* fileStream) = 0; virtual IFileList* generateFullInfoList(void) = 0; }; class IFileStream { public: virtual const char* name(void) const = 0; virtual uint32_t size(void) const = 0; virtual uint32_t read(void* buffer, uint32_t size) = 0; virtual bool seek(uint32_t offset) = 0; virtual uint32_t tell(void) const = 0; virtual uint32_t crc32(void) = 0; virtual bool isEOF(void) const = 0; virtual bool writeToDiskFile(const wchar_t* diskPathFile) = 0; }; class IFileList { public: virtual bool loadListFromFile(const wchar_t* wszListFile, const char* prefix, bool bNpkBase, bool bNpkName, bool bFileOffset, bool bFileSize, bool bFileCRC, bool bEnableDuplicate) = 0; virtual bool dumpToLocalFile(const wchar_t* wszListFile, bool bNpkBase, bool bNpkName, bool bFileOffset, bool bFileSize, bool bFileCRC) = 0; virtual bool mergeOtherListInto(const IFileList* sourceFileList, bool bEnableDuplicate) = 0; virtual bool applyToLocalNPKFiles(const wchar_t* wszNPKBase) = 0; virtual int32_t getFileCounts(void) const = 0; virtual bool getFileItem(int32_t index, FileItemFullInfo* fileItemFullInfo) const = 0; virtual bool getFileItem(const char* szKeyName, FileItemFullInfo* fileItemFullInfo) const = 0; }; }