add possibility to explicitly specify archive type for ArchiveReader

This commit is contained in:
ohyzha
2024-12-20 17:43:18 +02:00
parent deebb0ef96
commit 40d2a3ff8e
3 changed files with 42 additions and 15 deletions

View File

@@ -20,22 +20,22 @@ namespace OpenVulkano
constexpr int BUFFER_SIZE = 16384;
}
ArchiveReader::ArchiveReader(const std::shared_ptr<spdlog::logger>& logger)
: ArchiveBase(archive_read_new(), nullptr, logger)
ArchiveReader::ArchiveReader(const std::shared_ptr<spdlog::logger>& logger, ArchiveType::Type archiveType)
: ArchiveBase(archive_read_new(), nullptr, logger), m_archiveType(archiveType)
{}
ArchiveReader::ArchiveReader(const std::string& archiveFile, const std::shared_ptr<spdlog::logger>& logger)
: ArchiveReader(archiveFile.c_str(), logger)
ArchiveReader::ArchiveReader(const std::string& archiveFile, const std::shared_ptr<spdlog::logger>& logger, ArchiveType::Type archiveType)
: ArchiveReader(archiveFile.c_str(), logger, archiveType)
{}
ArchiveReader::ArchiveReader(const char* archiveFile, const std::shared_ptr<spdlog::logger>& logger)
: ArchiveReader(logger)
ArchiveReader::ArchiveReader(const char* archiveFile, const std::shared_ptr<spdlog::logger>& logger, ArchiveType::Type archiveType)
: ArchiveReader(logger, archiveType)
{
Open(archiveFile);
}
ArchiveReader::ArchiveReader(const void* archiveBuffer, const size_t size, const std::shared_ptr<spdlog::logger>& logger)
: ArchiveReader(logger)
ArchiveReader::ArchiveReader(const void* archiveBuffer, const size_t size, const std::shared_ptr<spdlog::logger>& 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<int(archive*)> 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;
}

View File

@@ -8,6 +8,7 @@
#include "ArchiveBase.hpp"
#include "Data/Containers/Array.hpp"
#include "ArchiveType.hpp"
#include <string_view>
#include <optional>
#include <functional>
@@ -20,17 +21,17 @@ namespace OpenVulkano
{
bool m_open = false;
bool m_eof = false;
ArchiveType::Type m_archiveType;
std::queue<std::string> m_archivesToRead;
public:
explicit ArchiveReader(const std::shared_ptr<spdlog::logger>& logger = nullptr);
explicit ArchiveReader(const std::shared_ptr<spdlog::logger>& logger = nullptr, ArchiveType::Type archiveType = ArchiveType::ANY);
explicit ArchiveReader(const char* archiveFile, const std::shared_ptr<spdlog::logger>& logger = nullptr);
explicit ArchiveReader(const char* archiveFile, const std::shared_ptr<spdlog::logger>& logger = nullptr, ArchiveType::Type archiveType = ArchiveType::ANY);
explicit ArchiveReader(const std::string& archiveFile, const std::shared_ptr<spdlog::logger>& logger = nullptr);
explicit ArchiveReader(const std::string& archiveFile, const std::shared_ptr<spdlog::logger>& logger = nullptr, ArchiveType::Type archiveType = ArchiveType::ANY);
ArchiveReader(const void* archiveBuffer, size_t size, const std::shared_ptr<spdlog::logger>& logger = nullptr);
ArchiveReader(const void* archiveBuffer, size_t size, const std::shared_ptr<spdlog::logger>& logger = nullptr, ArchiveType::Type archiveType = ArchiveType::ANY);
~ArchiveReader() override;

View File

@@ -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) {}