2
* Filter interface for compression
3
* (C) 2014,2015,2016 Jack Lloyd
6
* Botan is released under the Simplified BSD License (see license.txt)
9
#include <botan/comp_filter.h>
10
#include <botan/exceptn.h>
12
#if defined(BOTAN_HAS_COMPRESSION)
13
#include <botan/compression.h>
18
#if defined(BOTAN_HAS_COMPRESSION)
20
Compression_Filter::Compression_Filter(const std::string& type, size_t level, size_t bs) :
21
m_comp(make_compressor(type)),
22
m_buffersize(std::max<size_t>(bs, 256)),
27
throw Invalid_Argument("Compression type '" + type + "' not found");
31
Compression_Filter::~Compression_Filter() { /* for unique_ptr */ }
33
std::string Compression_Filter::name() const
35
return m_comp->name();
38
void Compression_Filter::start_msg()
40
m_comp->start(m_level);
43
void Compression_Filter::write(const uint8_t input[], size_t input_length)
47
const size_t take = std::min(m_buffersize, input_length);
48
BOTAN_ASSERT(take > 0, "Consumed something");
50
m_buffer.assign(input, input + take);
51
m_comp->update(m_buffer);
60
void Compression_Filter::flush()
63
m_comp->update(m_buffer, 0, true);
67
void Compression_Filter::end_msg()
70
m_comp->finish(m_buffer);
74
Decompression_Filter::Decompression_Filter(const std::string& type, size_t bs) :
75
m_comp(make_decompressor(type)),
76
m_buffersize(std::max<size_t>(bs, 256))
80
throw Invalid_Argument("Compression type '" + type + "' not found");
84
Decompression_Filter::~Decompression_Filter() { /* for unique_ptr */ }
86
std::string Decompression_Filter::name() const
88
return m_comp->name();
91
void Decompression_Filter::start_msg()
96
void Decompression_Filter::write(const uint8_t input[], size_t input_length)
100
const size_t take = std::min(m_buffersize, input_length);
101
BOTAN_ASSERT(take > 0, "Consumed something");
103
m_buffer.assign(input, input + take);
104
m_comp->update(m_buffer);
109
input_length -= take;
113
void Decompression_Filter::end_msg()
116
m_comp->finish(m_buffer);