From 7ab0d0255aace2a2c6493270f2918bd82e3a3bb2 Mon Sep 17 00:00:00 2001 From: GeorgH93 Date: Wed, 23 Dec 2020 22:39:07 +0100 Subject: [PATCH] Add support for multipart archives --- openVulkanoCpp/IO/Archive/ArchiveReader.cpp | 43 ++++++++++++++++++--- openVulkanoCpp/IO/Archive/ArchiveReader.hpp | 11 +++++- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/openVulkanoCpp/IO/Archive/ArchiveReader.cpp b/openVulkanoCpp/IO/Archive/ArchiveReader.cpp index 036facc..cdd0088 100644 --- a/openVulkanoCpp/IO/Archive/ArchiveReader.cpp +++ b/openVulkanoCpp/IO/Archive/ArchiveReader.cpp @@ -6,9 +6,11 @@ #include "ArchiveReader.hpp" #include "LibArchiveHelper.hpp" +#include "Base/Utils.hpp" #include #include #include +#include namespace openVulkanoCpp { @@ -39,13 +41,18 @@ namespace openVulkanoCpp ArchiveReader::~ArchiveReader() = default; - bool ArchiveReader::Open(const char* archiveFile) + void ArchiveReader::PrepOpen() { if (m_open) ChkErr(archive_read_close(m_archive)); ChkErr(archive_read_support_filter_all(m_archive)); ChkErr(archive_read_support_format_all(m_archive)); - ChkErr(archive_read_open_filename(m_archive, archiveFile, BUFFER_SIZE)); m_open = true; + } + + bool ArchiveReader::Open(const char* archiveFile) + { + PrepOpen(); + ChkErr(archive_read_open_filename(m_archive, archiveFile, BUFFER_SIZE)); ReadNextHeader(); return HasNext(); } @@ -57,15 +64,39 @@ namespace openVulkanoCpp bool ArchiveReader::Open(const void* archiveBuffer, size_t size) { - if (m_open) ChkErr(archive_read_close(m_archive)); - ChkErr(archive_read_support_filter_all(m_archive)); - ChkErr(archive_read_support_format_all(m_archive)); + PrepOpen(); ChkErr(archive_read_open_memory(m_archive, archiveBuffer, size)); - m_open = true; ReadNextHeader(); return HasNext(); } + bool ArchiveReader::Open(const std::vector& archiveFiles) + { + auto files = Utils::toCString(archiveFiles); + files.push_back(nullptr); + PrepOpen(); + ChkErr(archive_read_open_filenames(m_archive, files.data(), BUFFER_SIZE)); + ReadNextHeader(); + return HasNext(); + } + + bool ArchiveReader::Open(const std::filesystem::path& dir, const std::string& fileNamePattern) + { + std::vector files; + + std::regex fileRegex(fileNamePattern); + for(auto const& dirEntry : std::filesystem::directory_iterator(dir)) + { + if (std::regex_match(dirEntry.path().native(), fileRegex)) + { + files.push_back(dirEntry.path().native()); + } + } + + std::sort(files.begin(), files.end()); + return Open(files); + } + void ArchiveReader::ReadNextHeader() { if (m_eof || !m_open) diff --git a/openVulkanoCpp/IO/Archive/ArchiveReader.hpp b/openVulkanoCpp/IO/Archive/ArchiveReader.hpp index c12ed98..9f634af 100644 --- a/openVulkanoCpp/IO/Archive/ArchiveReader.hpp +++ b/openVulkanoCpp/IO/Archive/ArchiveReader.hpp @@ -20,8 +20,6 @@ namespace openVulkanoCpp bool m_open = false; bool m_eof = false; - void ReadNextHeader(); - public: explicit ArchiveReader(const std::shared_ptr& logger = nullptr); @@ -39,6 +37,10 @@ namespace openVulkanoCpp bool Open(const void* archiveBuffer, size_t size); + bool Open(const std::vector& archiveFiles); + + bool Open(const std::filesystem::path& dir, const std::string& fileNamePattern); + [[nodiscard]] bool IsOpen() const { return m_open; } size_t ExtractRemaining(std::string_view targetDir); @@ -61,5 +63,10 @@ namespace openVulkanoCpp std::optional StreamNextFile(std::ostream& stream); bool GetNextFileAsStream(const std::function& streamReader); + + private: + void ReadNextHeader(); + + void PrepOpen(); }; }