#pragma once #include #include #include #include class CppC4Group { struct Private; std::unique_ptr p; public: struct Data { const void* data; size_t size; Data(); Data(const void* const data, const size_t size); }; struct EntryInfo { std::string fileName; int32_t modified; std::string author; size_t size; size_t totalSize; bool executable; bool directory; bool official; }; public: using ReadCallback = bool(*)(const void** const data, size_t* const size, void* const arg); enum TmpMemoryStrategy { Memory, File, Auto }; enum MemoryManagement { Take, Copy, Reference }; static void setTmpMemoryStrategy(const TmpMemoryStrategy strategy); public: CppC4Group(); ~CppC4Group(); void create(); bool openExisting(const std::string& path); bool openFd(const int fd); bool openFilePointer(FILE* file); bool openMemory(const void* const data, const size_t size, const MemoryManagement management = Reference); bool openWithReadCallback(const ReadCallback callback, void* const callbackArg, const MemoryManagement management = Take); bool save(const std::string& path, const bool overwrite = false); bool extractAll(const std::string& path); bool extractSingle(const std::string& entryPath, const std::string& targetPath); std::optional getEntryData(const std::string& path); std::string getErrorMessage(); int32_t getErrorCode(); std::string getErrorMethod(); std::string getErrorCauser(); bool setMaker(const std::string& maker, const std::string& path = "", const bool recursive = false); bool setCreation(const int32_t creation, const std::string& path = "", const bool recursive = false); bool setOfficial(const bool official, const std::string& path = "", const bool recursive = false); bool setExecutable(const bool executable, const std::string& path); std::optional getEntryInfo(const std::string& path = ""); std::optional> getEntryInfos(const std::string& path = ""); bool deleteEntry(const std::string& path, const bool recursive = false); bool renameEntry(const std::string& oldPath, const std::string& newPath); bool createDirectory(const std::string& path); bool createFile(const std::string& path); bool setEntryData(const std::string& path, const void* const data = nullptr, const size_t size = 0, const MemoryManagement management = Copy); };