Extend ArchiveReader to allow opening the archive later

This commit is contained in:
2020-12-22 22:04:06 +01:00
parent 4505aed2f8
commit 43129a2245
2 changed files with 49 additions and 12 deletions

View File

@@ -17,33 +17,58 @@ namespace openVulkanoCpp
constexpr int BUFFER_SIZE = 16384;
}
ArchiveReader::ArchiveReader(const std::shared_ptr<spdlog::logger>& logger)
: ArchiveBase(archive_read_new(), nullptr, logger)
{}
ArchiveReader::ArchiveReader(const std::string& archiveFile, const std::shared_ptr<spdlog::logger>& logger)
: ArchiveReader(archiveFile.c_str(), logger)
: ArchiveReader(archiveFile.c_str(), logger)
{}
ArchiveReader::ArchiveReader(const char* archiveFile, const std::shared_ptr<spdlog::logger>& 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<spdlog::logger>& 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;

View File

@@ -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<spdlog::logger>& logger = nullptr);
explicit ArchiveReader(const char* archiveFile, const std::shared_ptr<spdlog::logger>& logger = nullptr);
explicit ArchiveReader(const std::string& archiveFile, const std::shared_ptr<spdlog::logger>& 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