Botan
1.11.15
|
00001 /* 00002 * Filter interface for compression 00003 * (C) 2014 Jack Lloyd 00004 * 00005 * Botan is released under the Simplified BSD License (see license.txt) 00006 */ 00007 00008 #include <botan/comp_filter.h> 00009 #include <botan/compression.h> 00010 00011 namespace Botan { 00012 00013 Compression_Filter::Compression_Filter(const std::string& type, size_t level) : 00014 Compression_Decompression_Filter(make_compressor(type, level)) 00015 { 00016 } 00017 00018 Decompression_Filter::Decompression_Filter(const std::string& type) : 00019 Compression_Decompression_Filter(make_decompressor(type)) 00020 { 00021 } 00022 00023 Compression_Decompression_Filter::Compression_Decompression_Filter(Transform* transform) 00024 { 00025 m_transform.reset(dynamic_cast<Compressor_Transform*>(transform)); 00026 if(!m_transform) 00027 throw std::invalid_argument("Transform " + transform->name() + " is not a compressor"); 00028 } 00029 00030 std::string Compression_Decompression_Filter::name() const 00031 { 00032 return m_transform->name(); 00033 } 00034 00035 void Compression_Decompression_Filter::start_msg() 00036 { 00037 send(m_transform->start()); 00038 } 00039 00040 void Compression_Decompression_Filter::write(const byte input[], size_t input_length) 00041 { 00042 while(input_length) 00043 { 00044 const size_t take = std::min<size_t>({4096, m_buffer.capacity(), input_length}); 00045 00046 m_buffer.assign(input, input + take); 00047 m_transform->update(m_buffer); 00048 00049 send(m_buffer); 00050 00051 input += take; 00052 input_length -= take; 00053 } 00054 } 00055 00056 void Compression_Decompression_Filter::flush() 00057 { 00058 m_buffer.clear(); 00059 m_transform->flush(m_buffer); 00060 send(m_buffer); 00061 } 00062 00063 void Compression_Decompression_Filter::end_msg() 00064 { 00065 m_buffer.clear(); 00066 m_transform->finish(m_buffer); 00067 send(m_buffer); 00068 } 00069 00070 }