void zlib_compression_writer::write_impl()

in src/native/io/compressed/zlib_compression_writer.cpp [41:84]


void zlib_compression_writer::write_impl(std::string_view buffer)
{
	if (buffer.size() == 0)
	{
		return;
	}

	auto new_processed_bytes = m_processed_bytes + buffer.size();

	m_zstr.next_in  = const_cast<Bytef *>(reinterpret_cast<const Bytef *>(buffer.data()));
	m_zstr.avail_in = static_cast<uInt>(buffer.size());

	while (true)
	{
		reset_output();

		// ADU_LOG(
		//	"zlib_compression_writer::write_impl: Calling deflate. m_zstr.avail_in: {}, m_processed_bytes: {}",
		//	m_zstr.avail_in,
		//	m_processed_bytes);

		auto ret = deflate(&m_zstr, Z_NO_FLUSH);

		if (ret == Z_BUF_ERROR && m_zstr.avail_in == 0)
		{
			break;
		}

		if (ret != Z_OK && ret != Z_STREAM_END)
		{
			auto msg = "zlib_compression_writer::write_impl: deflate() failed. ret: " + std::to_string(ret);
			throw errors::user_exception(errors::error_code::io_zlib_writer_deflate_failed, msg);
		}

		handle_output();

		if (ret == Z_STREAM_END)
		{
			break;
		}
	}

	m_processed_bytes = new_processed_bytes;
}