diff --git a/openVulkanoCpp/IO/Archive/ArchiveConfiguration.cpp b/openVulkanoCpp/IO/Archive/ArchiveConfiguration.cpp index a965570..6692df0 100644 --- a/openVulkanoCpp/IO/Archive/ArchiveConfiguration.cpp +++ b/openVulkanoCpp/IO/Archive/ArchiveConfiguration.cpp @@ -7,6 +7,7 @@ #include "ArchiveConfiguration.hpp" #include "Base/Utils.hpp" #include +#include namespace OpenVulkano { @@ -34,9 +35,9 @@ namespace OpenVulkano return std::string(tName); } - ArchiveConfiguration ArchiveConfiguration::FromFileName(const char* fileName) + ArchiveConfiguration ArchiveConfiguration::FromFileName(std::filesystem::path fileName) { - std::string_view fName = fileName; + std::string_view fName = fileName.string(); ArchiveConfiguration ac; if (auto type = ArchiveType::FromExtension(fName)) { @@ -77,4 +78,4 @@ namespace OpenVulkano { return COMP_MAP[static_cast(compression)]; } -} \ No newline at end of file +} diff --git a/openVulkanoCpp/IO/Archive/ArchiveConfiguration.hpp b/openVulkanoCpp/IO/Archive/ArchiveConfiguration.hpp index 9a4d879..2ea5abd 100644 --- a/openVulkanoCpp/IO/Archive/ArchiveConfiguration.hpp +++ b/openVulkanoCpp/IO/Archive/ArchiveConfiguration.hpp @@ -6,6 +6,8 @@ #pragma once +#include + #include "ArchiveType.hpp" #include @@ -25,7 +27,7 @@ namespace OpenVulkano : type(archiveType), compression(compressionType), compressionLevel(level) {} - [[nodiscard]] static ArchiveConfiguration FromFileName(const char* fileName); + [[nodiscard]] static ArchiveConfiguration FromFileName(std::filesystem::path fileName); [[nodiscard]] std::string GetFileExtension() const; diff --git a/openVulkanoCpp/IO/Archive/ArchiveWriter.cpp b/openVulkanoCpp/IO/Archive/ArchiveWriter.cpp index 153f1ce..9d0493d 100644 --- a/openVulkanoCpp/IO/Archive/ArchiveWriter.cpp +++ b/openVulkanoCpp/IO/Archive/ArchiveWriter.cpp @@ -35,6 +35,29 @@ namespace OpenVulkano ChkErr(archive_write_open_filename(m_archive, fileName)); } + ArchiveWriter::ArchiveWriter(const std::filesystem::path& fileName, ArchiveConfiguration archiveConfiguration, const std::shared_ptr& logger, const char* password) + : ArchiveBase(archive_write_new(), archive_entry_new(), logger) + , m_archiveConfig(archiveConfiguration) + , m_shouldCompress(&SimpleFileTypeShouldCompressChecker) + { //TODO error handling + ChkErr(archive_write_set_format(m_archive, archiveConfiguration.GetLibArchiveArchiveType())); + if (archiveConfiguration.type == ArchiveType::TAR) + { + ChkErr(archive_write_add_filter(m_archive, archiveConfiguration.GetLibArchiveCompressionType())); + } + if (archiveConfiguration.compression != CompressionType::NONE && + archiveConfiguration.compressionLevel > 0) + { + std::string level = "compression-level=" + std::to_string(archiveConfiguration.compressionLevel); + ChkErr(archive_write_set_options(m_archive, level.c_str())); + } + if (password) ChkErr(archive_write_set_passphrase(m_archive, password)); + if constexpr (std::is_same_v) + ChkErr(archive_write_open_filename(m_archive, (const char*)fileName.c_str())); + else + ChkErr(archive_write_open_filename_w(m_archive, (const wchar_t*)fileName.c_str())); + } + ArchiveWriter::~ArchiveWriter() { if (m_asBuffer) { m_asBuffer->Close(); m_asBuffer = nullptr; } diff --git a/openVulkanoCpp/IO/Archive/ArchiveWriter.hpp b/openVulkanoCpp/IO/Archive/ArchiveWriter.hpp index d13afeb..c5aa5c0 100644 --- a/openVulkanoCpp/IO/Archive/ArchiveWriter.hpp +++ b/openVulkanoCpp/IO/Archive/ArchiveWriter.hpp @@ -32,6 +32,12 @@ namespace OpenVulkano ArchiveWriter(const char* fileName, ArchiveConfiguration archiveConfiguration, const std::shared_ptr& logger = nullptr, const char* password = nullptr); + ArchiveWriter(const std::filesystem::path& fileName, const std::shared_ptr& logger = nullptr, const char* password = nullptr) + : ArchiveWriter(fileName, ArchiveConfiguration::FromFileName(fileName), logger, password) + {} + + ArchiveWriter(const std::filesystem::path& fileName, ArchiveConfiguration archiveConfiguration, const std::shared_ptr& logger = nullptr, const char* password = nullptr); + ~ArchiveWriter() override; [[nodiscard]] size_t GetTotalWrittenBytes() const { return m_bytesWritten; } diff --git a/tests/IO/Archive/ArchiveReaderTest.cpp b/tests/IO/Archive/ArchiveReaderTest.cpp index 4e0a434..73ec031 100644 --- a/tests/IO/Archive/ArchiveReaderTest.cpp +++ b/tests/IO/Archive/ArchiveReaderTest.cpp @@ -30,7 +30,7 @@ namespace void makeDummyArchive() { - ArchiveWriter writer(dummyArchivePath().c_str()); + ArchiveWriter writer(dummyArchivePath()); FileDescription desc; desc.path = "stream1.txt"; @@ -70,7 +70,7 @@ TEST_CASE("Dummy archive creation, default constructor", "[ArchiveReader]") TEST_CASE("Open Archive from File", "[ArchiveReader]") { { - std::string testArchive = dummyArchivePath(); + auto testArchive = dummyArchivePath(); ArchiveReader reader; bool opened = reader.Open(testArchive); REQUIRE(opened == true); @@ -112,7 +112,7 @@ TEST_CASE("Open Archive from Directory with Pattern", "[ArchiveReader]") TEST_CASE("ExtractNext and Skip Functions", "[ArchiveReader]") { - std::string testArchive = dummyArchivePath(); + auto testArchive = dummyArchivePath(); ArchiveReader reader(testArchive); size_t extractedFiles = reader.ExtractRemaining(dummyArchiveDir()); @@ -127,7 +127,7 @@ TEST_CASE("ExtractNext and Skip Functions", "[ArchiveReader]") TEST_CASE("Get Next File Operations", "[ArchiveReader]") { - std::string testArchive = dummyArchivePath(); + auto testArchive = dummyArchivePath(); ArchiveReader reader(testArchive);