#pragma once #ifdef __cplusplus extern "C" { #define this this_ #define new new_ #define delete delete_ #endif #include #include #include typedef struct { const char* fileName; int32_t modified; const char* author; size_t size; size_t totalSize; bool executable; bool directory; bool official; } CC4Group_EntryInfo; typedef struct CC4Group_t CC4Group; typedef void(*CC4Group_CleanupFunc)(void* data); typedef struct { CC4Group_CleanupFunc func; void* data; } CC4Group_CleanupJob; typedef void* (*CC4Group_TmpMemoryStrategy)(CC4Group* const this, const size_t size, CC4Group_CleanupJob* cleanupJob); typedef struct { CC4Group* (*new)(void); bool (*create)(CC4Group* const this); void (*delete)(CC4Group* const this); // only open an existing group on a frehsly created group object bool (*openExisting)(CC4Group* const this, const char* const path); bool (*save)(CC4Group* const this, const char* const path); bool (*saveOverwrite)(CC4Group* const this, const char* const path); // extraction to disk bool (*extractAll)(CC4Group* const this, const char* const targetPath); bool (*extractSingle)(CC4Group* const this, const char* const entryPath, const char* const targetPath); // the group owns the data pointed to. the pointer is valid until the group destructor is called bool (*getEntryData)(CC4Group* const this, const char* const entryPath, const void** const data, size_t* const size); // the returned error message pointer is valid until the next call to getErrorMessage is issued or the group is destructed const char* (*getErrorMessage)(CC4Group* const this); int32_t (*getErrorCode)(const CC4Group* const this); const char* (*getErrorMethod)(const CC4Group* const this); const char* (*getErrorCauser)(const CC4Group* const this); struct { CC4Group_TmpMemoryStrategy Memory; CC4Group_TmpMemoryStrategy File; CC4Group_TmpMemoryStrategy Auto; } const TmpMemoryStrategies; void (*setTmpMemoryStrategy)(const CC4Group_TmpMemoryStrategy strategy); // group metadata handling bool (*setMaker)(CC4Group* const this, const char* const maker, const char* const path, bool const recursive); bool (*setCreation)(CC4Group* const this, int32_t const creation, const char* const path, bool const recursive); bool (*setOfficial)(CC4Group* const this, bool const official, const char* const path, bool const recursive); bool (*setExecutable)(CC4Group* const this, bool const executable, const char* const path); bool (*getEntryInfo)(CC4Group* const this, const char* const path, CC4Group_EntryInfo* const info); bool (*getEntryInfos)(CC4Group* const this, const char* const path, CC4Group_EntryInfo** const infos, size_t* const size); // modifying the group bool (*deleteEntry)(CC4Group* const this, const char* const path, bool const recursive); bool (*renameEntry)(CC4Group* const this, const char* const oldPath, const char* const newPath); bool (*createDirectory)(CC4Group* const this, const char* const path); // ownership of the data is taken by the group bool (*createFile)(CC4Group* const this, const char* const path); // ownership of the data is taken by the group if freeData is true // if freeData is false, the caller must guarantee that the pointer is valid as long as it is used in the group (i.e. until the pointer is changed through another call to setEntryData or the group is destructed) bool (*setEntryData)(CC4Group* const this, const char* const entryPath, const void* const data, size_t const size, bool const freeData); } const CC4Group_API; #ifndef CC4GROUP_DYNAMIC_LOAD extern CC4Group_API cc4group; #endif #ifdef __cplusplus } #undef this #undef new #undef delete #endif