#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)(const 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, void* const data, size_t const size); // ownership of the data is taken by the group bool (*setEntryData)(const CC4Group* const this, const char* const entryPath, void* const data, size_t const size); } const CC4Group_API; #ifndef CC4GROUP_DYNAMIC_LOAD extern CC4Group_API cc4group; #endif #ifdef __cplusplus } #undef this #undef new #undef delete #endif