115 lines
2.7 KiB
C++
115 lines
2.7 KiB
C++
#pragma once
|
|
|
|
#include <stdint.h>
|
|
#include <string>
|
|
|
|
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,
|
|
//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 int32_t getFileCounts(void) const = 0;
|
|
virtual bool getFileItem(int32_t index, FileItemFullInfo* fileItemFullInfo) const = 0;
|
|
virtual void addFileNode(const FileItemFullInfo& fileItemFullInfo) = 0;
|
|
virtual void mergeOtherListInto(const IFileList* sourceFileList) = 0;
|
|
};
|
|
|
|
}
|