From 40d2a3ff8e2e42dc2d7f622b3c0d8c9508d977a6 Mon Sep 17 00:00:00 2001 From: ohyzha Date: Fri, 20 Dec 2024 17:43:18 +0200 Subject: [PATCH] add possibility to explicitly specify archive type for ArchiveReader --- openVulkanoCpp/IO/Archive/ArchiveReader.cpp | 44 ++++++++++++++++----- openVulkanoCpp/IO/Archive/ArchiveReader.hpp | 11 +++--- openVulkanoCpp/IO/Archive/ArchiveType.hpp | 2 +- 3 files changed, 42 insertions(+), 15 deletions(-) diff --git a/openVulkanoCpp/IO/Archive/ArchiveReader.cpp b/openVulkanoCpp/IO/Archive/ArchiveReader.cpp index b8efd2e..47f9e82 100644 --- a/openVulkanoCpp/IO/Archive/ArchiveReader.cpp +++ b/openVulkanoCpp/IO/Archive/ArchiveReader.cpp @@ -20,22 +20,22 @@ namespace OpenVulkano constexpr int BUFFER_SIZE = 16384; } - ArchiveReader::ArchiveReader(const std::shared_ptr& logger) - : ArchiveBase(archive_read_new(), nullptr, logger) + ArchiveReader::ArchiveReader(const std::shared_ptr& logger, ArchiveType::Type archiveType) + : ArchiveBase(archive_read_new(), nullptr, logger), m_archiveType(archiveType) {} - ArchiveReader::ArchiveReader(const std::string& archiveFile, const std::shared_ptr& logger) - : ArchiveReader(archiveFile.c_str(), logger) + ArchiveReader::ArchiveReader(const std::string& archiveFile, const std::shared_ptr& logger, ArchiveType::Type archiveType) + : ArchiveReader(archiveFile.c_str(), logger, archiveType) {} - ArchiveReader::ArchiveReader(const char* archiveFile, const std::shared_ptr& logger) - : ArchiveReader(logger) + ArchiveReader::ArchiveReader(const char* archiveFile, const std::shared_ptr& logger, ArchiveType::Type archiveType) + : ArchiveReader(logger, archiveType) { Open(archiveFile); } - ArchiveReader::ArchiveReader(const void* archiveBuffer, const size_t size, const std::shared_ptr& logger) - : ArchiveReader(logger) + ArchiveReader::ArchiveReader(const void* archiveBuffer, const size_t size, const std::shared_ptr& logger, ArchiveType::Type archiveType) + : ArchiveReader(logger, archiveType) { OpenMemory(archiveBuffer, size); } @@ -51,7 +51,33 @@ namespace OpenVulkano m_archive = archive_read_new(); } ChkErr(archive_read_support_filter_all(m_archive)); - ChkErr(archive_read_support_format_all(m_archive)); + std::function pFunc; + switch (m_archiveType) + { + case ArchiveType::ZIP: + pFunc = archive_read_support_format_zip; + break; + case ArchiveType::SEVEN_ZIP: + pFunc = archive_read_support_format_7zip; + break; + case ArchiveType::CPIO: + pFunc = archive_read_support_format_cpio; + break; + case ArchiveType::ISO: + pFunc = archive_read_support_format_iso9660; + case ArchiveType::TAR: + pFunc = archive_read_support_format_tar; + break; + case ArchiveType::WARC: + pFunc = archive_read_support_format_warc; + break; + case ArchiveType::XAR: + pFunc = archive_read_support_format_xar; + break; + default: + pFunc = archive_read_support_format_all; + } + ChkErr(pFunc(m_archive)); m_open = true; } diff --git a/openVulkanoCpp/IO/Archive/ArchiveReader.hpp b/openVulkanoCpp/IO/Archive/ArchiveReader.hpp index 776a57c..7b78048 100644 --- a/openVulkanoCpp/IO/Archive/ArchiveReader.hpp +++ b/openVulkanoCpp/IO/Archive/ArchiveReader.hpp @@ -8,6 +8,7 @@ #include "ArchiveBase.hpp" #include "Data/Containers/Array.hpp" +#include "ArchiveType.hpp" #include #include #include @@ -20,17 +21,17 @@ namespace OpenVulkano { bool m_open = false; bool m_eof = false; - + ArchiveType::Type m_archiveType; std::queue m_archivesToRead; public: - explicit ArchiveReader(const std::shared_ptr& logger = nullptr); + explicit ArchiveReader(const std::shared_ptr& logger = nullptr, ArchiveType::Type archiveType = ArchiveType::ANY); - explicit ArchiveReader(const char* archiveFile, const std::shared_ptr& logger = nullptr); + explicit ArchiveReader(const char* archiveFile, const std::shared_ptr& logger = nullptr, ArchiveType::Type archiveType = ArchiveType::ANY); - explicit ArchiveReader(const std::string& archiveFile, const std::shared_ptr& logger = nullptr); + explicit ArchiveReader(const std::string& archiveFile, const std::shared_ptr& logger = nullptr, ArchiveType::Type archiveType = ArchiveType::ANY); - ArchiveReader(const void* archiveBuffer, size_t size, const std::shared_ptr& logger = nullptr); + ArchiveReader(const void* archiveBuffer, size_t size, const std::shared_ptr& logger = nullptr, ArchiveType::Type archiveType = ArchiveType::ANY); ~ArchiveReader() override; diff --git a/openVulkanoCpp/IO/Archive/ArchiveType.hpp b/openVulkanoCpp/IO/Archive/ArchiveType.hpp index 739ba1f..91bdc03 100644 --- a/openVulkanoCpp/IO/Archive/ArchiveType.hpp +++ b/openVulkanoCpp/IO/Archive/ArchiveType.hpp @@ -17,7 +17,7 @@ namespace OpenVulkano static inline constexpr std::string_view TYPE_NAMES[] = { ".tar", ".cpio", ".iso", ".zip", ".xar", ".7z", ".warc", ".shar" }; public: - enum Type { TAR = 0, CPIO, ISO, ZIP, XAR, SEVEN_ZIP, WARC, SHAR }; + enum Type { TAR = 0, CPIO, ISO, ZIP, XAR, SEVEN_ZIP, WARC, SHAR, ANY }; constexpr ArchiveType(Type type) : m_type(type) {}