code review refactoring
This commit is contained in:
@@ -20,21 +20,21 @@ namespace OpenVulkano
|
||||
constexpr int BUFFER_SIZE = 16384;
|
||||
}
|
||||
|
||||
ArchiveReader::ArchiveReader(const std::shared_ptr<spdlog::logger>& logger, ArchiveType::Type archiveType)
|
||||
ArchiveReader::ArchiveReader(const std::shared_ptr<spdlog::logger>& logger, std::optional<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, ArchiveType::Type archiveType)
|
||||
ArchiveReader::ArchiveReader(const std::string& archiveFile, const std::shared_ptr<spdlog::logger>& logger, std::optional<ArchiveType::Type> archiveType)
|
||||
: ArchiveReader(archiveFile.c_str(), logger, archiveType)
|
||||
{}
|
||||
|
||||
ArchiveReader::ArchiveReader(const char* archiveFile, const std::shared_ptr<spdlog::logger>& logger, ArchiveType::Type archiveType)
|
||||
ArchiveReader::ArchiveReader(const char* archiveFile, const std::shared_ptr<spdlog::logger>& logger, std::optional<ArchiveType::Type> archiveType)
|
||||
: ArchiveReader(logger, archiveType)
|
||||
{
|
||||
Open(archiveFile);
|
||||
}
|
||||
|
||||
ArchiveReader::ArchiveReader(const void* archiveBuffer, const size_t size, const std::shared_ptr<spdlog::logger>& logger, ArchiveType::Type archiveType)
|
||||
ArchiveReader::ArchiveReader(const void* archiveBuffer, const size_t size, const std::shared_ptr<spdlog::logger>& logger, std::optional<ArchiveType::Type> archiveType)
|
||||
: ArchiveReader(logger, archiveType)
|
||||
{
|
||||
OpenMemory(archiveBuffer, size);
|
||||
@@ -51,32 +51,7 @@ namespace OpenVulkano
|
||||
m_archive = archive_read_new();
|
||||
}
|
||||
ChkErr(archive_read_support_filter_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;
|
||||
}
|
||||
std::function<int(archive*)> pFunc = GetCurrentFormatReadFunc();
|
||||
ChkErr(pFunc(m_archive));
|
||||
m_open = true;
|
||||
}
|
||||
@@ -182,6 +157,33 @@ namespace OpenVulkano
|
||||
}
|
||||
}
|
||||
|
||||
std::function<int(archive*)> ArchiveReader::GetCurrentFormatReadFunc() const
|
||||
{
|
||||
if (!m_archiveType)
|
||||
{
|
||||
return archive_read_support_format_all;
|
||||
}
|
||||
ArchiveType::Type type = *m_archiveType;
|
||||
switch (type)
|
||||
{
|
||||
case ArchiveType::ZIP:
|
||||
return archive_read_support_format_zip;
|
||||
case ArchiveType::SEVEN_ZIP:
|
||||
return archive_read_support_format_7zip;
|
||||
case ArchiveType::CPIO:
|
||||
return archive_read_support_format_cpio;
|
||||
case ArchiveType::ISO:
|
||||
return archive_read_support_format_iso9660;
|
||||
case ArchiveType::TAR:
|
||||
return archive_read_support_format_tar;
|
||||
case ArchiveType::WARC:
|
||||
return archive_read_support_format_warc;
|
||||
case ArchiveType::XAR:
|
||||
return archive_read_support_format_xar;
|
||||
}
|
||||
return archive_read_support_format_all;
|
||||
}
|
||||
|
||||
size_t ArchiveReader::ExtractRemaining(std::string_view targetDir)
|
||||
{
|
||||
size_t count = 0;
|
||||
@@ -289,6 +291,19 @@ namespace OpenVulkano
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
std::optional<std::pair<FileDescription, Array<char>>> ArchiveReader::GetFile(const std::string& path)
|
||||
{
|
||||
while (HasNext())
|
||||
{
|
||||
const std::pair<FileDescription, Array<char>> info = *GetNextFile();
|
||||
if (info.first.path == path)
|
||||
{
|
||||
return info;
|
||||
}
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
bool ArchiveReader::GetNextFileAsStream(const std::function<void(const FileDescription&, std::istream&)>& streamReader)
|
||||
{
|
||||
if (SkipTill(std::filesystem::file_type::regular))
|
||||
|
||||
@@ -21,17 +21,17 @@ namespace OpenVulkano
|
||||
{
|
||||
bool m_open = false;
|
||||
bool m_eof = false;
|
||||
ArchiveType::Type m_archiveType;
|
||||
std::optional<ArchiveType::Type> m_archiveType;
|
||||
std::queue<std::string> m_archivesToRead;
|
||||
|
||||
public:
|
||||
explicit ArchiveReader(const std::shared_ptr<spdlog::logger>& logger = nullptr, ArchiveType::Type archiveType = ArchiveType::ANY);
|
||||
explicit ArchiveReader(const std::shared_ptr<spdlog::logger>& logger = nullptr, std::optional<ArchiveType::Type> archiveType = std::nullopt);
|
||||
|
||||
explicit ArchiveReader(const char* archiveFile, 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, std::optional<ArchiveType::Type> archiveType = std::nullopt);
|
||||
|
||||
explicit ArchiveReader(const std::string& 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, std::optional<ArchiveType::Type> archiveType = std::nullopt);
|
||||
|
||||
ArchiveReader(const void* archiveBuffer, size_t size, 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, std::optional<ArchiveType::Type> archiveType = std::nullopt);
|
||||
|
||||
~ArchiveReader() override;
|
||||
|
||||
@@ -66,13 +66,15 @@ namespace OpenVulkano
|
||||
|
||||
std::optional<std::pair<FileDescription, std::vector<char>>> GetNextFileAsVector();
|
||||
|
||||
std::optional<std::pair<FileDescription, Array<char>>> GetFile(const std::string& path);
|
||||
|
||||
std::optional<FileDescription> StreamNextFile(std::ostream& stream);
|
||||
|
||||
bool GetNextFileAsStream(const std::function<void(const FileDescription&, std::istream&)>& streamReader);
|
||||
|
||||
private:
|
||||
void ReadNextHeader();
|
||||
|
||||
std::function<int(archive*)> GetCurrentFormatReadFunc() const;
|
||||
void PrepOpen();
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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, ANY };
|
||||
enum Type { TAR = 0, CPIO, ISO, ZIP, XAR, SEVEN_ZIP, WARC, SHAR };
|
||||
|
||||
constexpr ArchiveType(Type type) : m_type(type) {}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user