Files
OpenVulkano/openVulkanoCpp/IO/Archive/ArchiveStreamBufferWriter.hpp

54 lines
1.3 KiB
C++

/*
* 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 "ArchiveWriter.hpp"
#include <archive.h>
#include <ostream>
namespace OpenVulkano
{
class ArchiveStreamBufferWriter final : public std::streambuf
{
ArchiveWriter* m_archive;
size_t m_maxSize, m_written;
public:
ArchiveStreamBufferWriter(ArchiveWriter* archive, size_t size)
: m_archive(archive), m_maxSize(size), m_written(0)
{}
std::streamsize xsputn(const char* s, std::streamsize n) override
{
if (!m_archive) return 0;
if (m_maxSize < m_written + n) n = m_maxSize - m_written;
if (n == 0) return 0;
m_archive->ChkErr(archive_write_data(m_archive->m_archive, s, n));
m_written += n;
if (m_written == m_maxSize) Close();
return n;
}
void Close()
{
if (!m_archive) return;
if (m_maxSize > m_written && m_maxSize != FileDescription::UNKNOWN_SIZE)
{ //Zero fill till eof
std::vector<char> data(m_maxSize - m_written, 0);
archive_write_data(m_archive->m_archive, data.data(), data.size());
}
m_archive->ChkErr(archive_write_finish_entry(m_archive->m_archive));
m_archive = nullptr;
}
~ArchiveStreamBufferWriter() override
{
if (m_archive) Close();
}
};
}