Files
dnf-utils/libnpk/libNPK.h
T
2025-09-04 14:30:09 +08:00

123 lines
3.2 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,
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;
};
}