/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #pragma once #include "ArchiveBase.hpp" #include "IO/FileDescription.hpp" #include #include namespace openVulkanoCpp { struct ArchiveConfiguration { enum class ArchiveType { TAR = 0, CPIO, ISO, ZIP, XAR, SEVEN_ZIP, WARC, SHAR }; enum class CompressionType { AUTO, NONE, GZIP, BZIP2, XZ, LZ4, ZSTD }; ArchiveType type = ArchiveType::TAR; CompressionType compression = CompressionType::AUTO; int compressionLevel = -1; [[nodiscard]] std::string GetFileExtension() const; static ArchiveConfiguration FromFileName(const char* fileName); }; class ArchiveWriter final : public ArchiveBase { size_t m_bytesWritten = 0; public: ArchiveWriter(const char* fileName, const std::shared_ptr& logger = nullptr); ArchiveWriter(const char* fileName, ArchiveConfiguration archiveConfiguration, const std::shared_ptr& logger = nullptr); ~ArchiveWriter() override; void Close(); [[nodiscard]] size_t GetTotalWrittenBytes() const { return m_bytesWritten; } bool AddFile(const char* fileName); bool AddFile(const char* fileName, const char* inArchiveName); bool AddFile(const char* inArchiveName, const void* buffer, size_t length); bool AddFile(const FileDescription& description, const void* buffer); bool AddFile(const char* fileName, const std::vector>& buffers); bool AddFile(const FileDescription& description, const std::vector>& buffers); bool AddFiles(const char* dirName); bool AddFiles(const char* dirName, const char* inArchiveDirName); bool AddFiles(const std::filesystem::path& dirName, const std::string& inArchiveDirName); private: void WriteHeader(const FileDescription& fileDescription); }; }