Botan  1.11.15
src/lib/filters/comp_filter.cpp
Go to the documentation of this file.
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 }