diff --git a/openVulkanoCpp/IO/Archive/ArchiveReader.cpp b/openVulkanoCpp/IO/Archive/ArchiveReader.cpp index b392842..3240ad0 100644 --- a/openVulkanoCpp/IO/Archive/ArchiveReader.cpp +++ b/openVulkanoCpp/IO/Archive/ArchiveReader.cpp @@ -18,6 +18,12 @@ namespace OpenVulkano namespace { constexpr int BUFFER_SIZE = 16384; + + const char* ArchivePasswordCallbackHandler(struct archive *, void *_client_data) + { + ArchiveReader* reader = static_cast(_client_data); + return reader->GetPasswordCallback()(); + } } ArchiveReader::ArchiveReader(const std::shared_ptr& logger, std::optional archiveType) @@ -42,6 +48,11 @@ namespace OpenVulkano ArchiveReader::~ArchiveReader() = default; + void ArchiveReader::SetPasswordCallback(const decltype(m_passwordCallback)& callback) + { + archive_read_set_passphrase_callback(m_archive, this, &ArchivePasswordCallbackHandler); + } + void ArchiveReader::PrepOpen() { if (m_open) diff --git a/openVulkanoCpp/IO/Archive/ArchiveReader.hpp b/openVulkanoCpp/IO/Archive/ArchiveReader.hpp index b2f0642..09e1eaf 100644 --- a/openVulkanoCpp/IO/Archive/ArchiveReader.hpp +++ b/openVulkanoCpp/IO/Archive/ArchiveReader.hpp @@ -19,10 +19,11 @@ namespace OpenVulkano { class ArchiveReader final : public ArchiveBase { - bool m_open = false; - bool m_eof = false; std::optional m_archiveType; std::queue m_archivesToRead; + std::function m_passwordCallback; + bool m_open = false; + bool m_eof = false; public: explicit ArchiveReader(const std::shared_ptr& logger = nullptr, std::optional archiveType = std::nullopt); @@ -35,6 +36,8 @@ namespace OpenVulkano ~ArchiveReader() override; + void SetPasswordCallback(const decltype(m_passwordCallback)& callback); + bool Open(const char* archiveFile); bool Open(const std::string& archiveFile); @@ -72,6 +75,8 @@ namespace OpenVulkano bool GetNextFileAsStream(const std::function& streamReader); + const decltype(m_passwordCallback)& GetPasswordCallback() const { return m_passwordCallback; } + private: void ReadNextHeader(); std::function GetCurrentFormatReadFunc() const; diff --git a/openVulkanoCpp/IO/Archive/IArchiveWriter.hpp b/openVulkanoCpp/IO/Archive/IArchiveWriter.hpp index 7c6a775..efa82da 100644 --- a/openVulkanoCpp/IO/Archive/IArchiveWriter.hpp +++ b/openVulkanoCpp/IO/Archive/IArchiveWriter.hpp @@ -64,7 +64,7 @@ namespace OpenVulkano if (buffer.first == nullptr) continue; size += buffer.second; } - FileDescription description = FileDescription::MakeDescriptionForFile(fileName, size); + const FileDescription description = FileDescription::MakeDescriptionForFile(fileName, size); return AddFile(description, buffers); }