/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #pragma once #include "ArchiveBase.hpp" #include "ArchiveConfiguration.hpp" #include "IArchiveWriter.hpp" #include "Base/Observable.hpp" namespace OpenVulkano { class MultiPartArchiveWriter; class ArchiveWriter final : public ArchiveBase, public IArchiveWriter { friend MultiPartArchiveWriter; friend ArchiveStreamBufferWriter; ArchiveConfiguration m_archiveConfig; Observable m_bytesWritten { 0 }; ArchiveOStream::ASBufferPtr m_asBuffer = nullptr; bool m_lastCompressed = true; std::function m_shouldCompress; ArchiveWriter(ArchiveConfiguration archiveConfiguration, const std::shared_ptr& logger, const char* password); public: ArchiveWriter(const char* fileName, const std::shared_ptr& logger = nullptr, const char* password = nullptr) : ArchiveWriter(fileName, ArchiveConfiguration::FromFileName(fileName), logger, password) {} ArchiveWriter(const char* fileName, ArchiveConfiguration archiveConfiguration, const std::shared_ptr& logger = nullptr, const char* password = nullptr); ArchiveWriter(const std::filesystem::path& fileName, const std::shared_ptr& logger = nullptr, const char* password = nullptr) : ArchiveWriter(fileName, ArchiveConfiguration::FromFileName(fileName), logger, password) {} ArchiveWriter(const std::filesystem::path& fileName, ArchiveConfiguration archiveConfiguration, const std::shared_ptr& logger = nullptr, const char* password = nullptr); ArchiveWriter(FILE* file, ArchiveConfiguration archiveConfiguration, const std::shared_ptr& logger = nullptr, const char* password = nullptr); ~ArchiveWriter() override; [[nodiscard]] size_t GetTotalWrittenBytes() const { return m_bytesWritten; } bool AddFile(const FileDescription& description, const void* buffer) override; bool AddFile(const FileDescription& description, const std::span>& buffers) override; bool AddFile(const char* fileName, const char* inArchiveName) override; [[nodiscard]] ArchiveOStream AddFileStream(const FileDescription& description) override; void SetShouldCompressFunction(const std::function& shouldComp) override { m_shouldCompress = shouldComp; } decltype(m_bytesWritten)& GetBytesWrittenObservable() { return m_bytesWritten; } private: void WriteHeader(const FileDescription& fileDescription); void SetUncompressed(); void SetCompressed(); }; }