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;