From 43129a22452fafcd79345cc2622f2e9ab969e61f Mon Sep 17 00:00:00 2001 From: GeorgH93 Date: Tue, 22 Dec 2020 22:04:06 +0100 Subject: [PATCH] Extend ArchiveReader to allow opening the archive later --- openVulkanoCpp/IO/Archive/ArchiveReader.cpp | 49 ++++++++++++++++----- openVulkanoCpp/IO/Archive/ArchiveReader.hpp | 12 +++++ 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/openVulkanoCpp/IO/Archive/ArchiveReader.cpp b/openVulkanoCpp/IO/Archive/ArchiveReader.cpp index fb57ccb..036facc 100644 --- a/openVulkanoCpp/IO/Archive/ArchiveReader.cpp +++ b/openVulkanoCpp/IO/Archive/ArchiveReader.cpp @@ -17,33 +17,58 @@ namespace openVulkanoCpp constexpr int BUFFER_SIZE = 16384; } + ArchiveReader::ArchiveReader(const std::shared_ptr& logger) + : ArchiveBase(archive_read_new(), nullptr, logger) + {} + ArchiveReader::ArchiveReader(const std::string& archiveFile, const std::shared_ptr& logger) - : ArchiveReader(archiveFile.c_str(), logger) + : ArchiveReader(archiveFile.c_str(), logger) {} ArchiveReader::ArchiveReader(const char* archiveFile, const std::shared_ptr& logger) - : ArchiveBase(archive_read_new(), nullptr, logger) + : ArchiveReader(logger) { - 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)); - ReadNextHeader(); + Open(archiveFile); } ArchiveReader::ArchiveReader(const void* archiveBuffer, const size_t size, const std::shared_ptr& logger) - : ArchiveBase(archive_read_new(), nullptr, logger) + : ArchiveReader(logger) { - ChkErr(archive_read_support_filter_all(m_archive)); - ChkErr(archive_read_support_format_all(m_archive)); - ChkErr(archive_read_open_memory(m_archive, archiveBuffer, size)); - ReadNextHeader(); + Open(archiveBuffer, size); } ArchiveReader::~ArchiveReader() = default; + bool ArchiveReader::Open(const char* archiveFile) + { + 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; + ReadNextHeader(); + return HasNext(); + } + + bool ArchiveReader::Open(const std::string& archiveFile) + { + return Open(archiveFile.c_str()); + } + + 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)); + ChkErr(archive_read_open_memory(m_archive, archiveBuffer, size)); + m_open = true; + ReadNextHeader(); + return HasNext(); + } + void ArchiveReader::ReadNextHeader() { - if (m_eof) + if (m_eof || !m_open) { m_archiveEntry = nullptr; return; diff --git a/openVulkanoCpp/IO/Archive/ArchiveReader.hpp b/openVulkanoCpp/IO/Archive/ArchiveReader.hpp index 4a5e38c..c12ed98 100644 --- a/openVulkanoCpp/IO/Archive/ArchiveReader.hpp +++ b/openVulkanoCpp/IO/Archive/ArchiveReader.hpp @@ -17,10 +17,14 @@ namespace openVulkanoCpp { class ArchiveReader final : public ArchiveBase { + bool m_open = false; bool m_eof = false; + void ReadNextHeader(); public: + explicit ArchiveReader(const std::shared_ptr& logger = nullptr); + explicit ArchiveReader(const char* archiveFile, const std::shared_ptr& logger = nullptr); explicit ArchiveReader(const std::string& archiveFile, const std::shared_ptr& logger = nullptr); @@ -29,6 +33,14 @@ namespace openVulkanoCpp ~ArchiveReader() override; + bool Open(const char* archiveFile); + + bool Open(const std::string& archiveFile); + + bool Open(const void* archiveBuffer, size_t size); + + [[nodiscard]] bool IsOpen() const { return m_open; } + size_t ExtractRemaining(std::string_view targetDir); // Element wise operations