diff options
author | lloyd <[email protected]> | 2014-11-19 02:52:04 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2014-11-19 02:52:04 +0000 |
commit | dfe33209a78f28e1b5b5b9a43d99d360fd029889 (patch) | |
tree | c19115343f564c00eaabe2dfb45822ba089b0742 /src/lib/compression/zlib | |
parent | 173ccf53649b4635df5fd51974c44dd59eaf9e95 (diff) |
Add gzip compression transform and compress command line prog.
Diffstat (limited to 'src/lib/compression/zlib')
-rw-r--r-- | src/lib/compression/zlib/zlib.cpp | 77 | ||||
-rw-r--r-- | src/lib/compression/zlib/zlib.h | 37 |
2 files changed, 106 insertions, 8 deletions
diff --git a/src/lib/compression/zlib/zlib.cpp b/src/lib/compression/zlib/zlib.cpp index b18621640..c8f8757b1 100644 --- a/src/lib/compression/zlib/zlib.cpp +++ b/src/lib/compression/zlib/zlib.cpp @@ -9,6 +9,7 @@ #include <botan/zlib.h> #include <botan/internal/comp_util.h> +#include <ctime> #include <zlib.h> namespace Botan { @@ -28,16 +29,24 @@ class Zlib_Stream : public Zlib_Style_Stream<z_stream, Bytef> u32bit run_flag() const override { return Z_NO_FLUSH; } u32bit flush_flag() const override { return Z_FULL_FLUSH; } u32bit finish_flag() const override { return Z_FINISH; } + + int compute_window_bits(int wbits, int wbits_offset) const + { + if(wbits_offset == -1) + return -wbits; + else + return wbits + wbits_offset; + } }; class Zlib_Compression_Stream : public Zlib_Stream { public: - Zlib_Compression_Stream(size_t level, bool raw_deflate) + Zlib_Compression_Stream(size_t level, int wbits, int wbits_offset = 0) { - // FIXME: allow specifiying memLevel and strategy int rc = deflateInit2(streamp(), level, Z_DEFLATED, - (raw_deflate ? -15 : 15), 8, Z_DEFAULT_STRATEGY); + compute_window_bits(wbits, wbits_offset), + 8, Z_DEFAULT_STRATEGY); if(rc != Z_OK) throw std::runtime_error("zlib deflate initialization failed"); } @@ -63,9 +72,9 @@ class Zlib_Compression_Stream : public Zlib_Stream class Zlib_Decompression_Stream : public Zlib_Stream { public: - Zlib_Decompression_Stream(bool raw_deflate) + Zlib_Decompression_Stream(int wbits, int wbits_offset = 0) { - int rc = inflateInit2(streamp(), (raw_deflate ? -15 : 15)); + int rc = inflateInit2(streamp(), compute_window_bits(wbits, wbits_offset)); if(rc == Z_MEM_ERROR) throw std::bad_alloc(); @@ -91,16 +100,70 @@ class Zlib_Decompression_Stream : public Zlib_Stream } }; +class Deflate_Compression_Stream : public Zlib_Compression_Stream + { + public: + Deflate_Compression_Stream(size_t level, int wbits) : + Zlib_Compression_Stream(level, wbits, -1) {} + }; + +class Deflate_Decompression_Stream : public Zlib_Decompression_Stream + { + public: + Deflate_Decompression_Stream(int wbits) : Zlib_Decompression_Stream(wbits, -1) {} + }; + +class Gzip_Compression_Stream : public Zlib_Compression_Stream + { + public: + Gzip_Compression_Stream(size_t level, int wbits, byte os_code) : + Zlib_Compression_Stream(level, wbits, 16) + { + std::memset(&m_header, 0, sizeof(m_header)); + m_header.os = os_code; + m_header.time = std::time(0); + + int rc = deflateSetHeader(streamp(), &m_header); + if(rc != Z_OK) + throw std::runtime_error("setting gzip header failed"); + } + + private: + ::gz_header m_header; + }; + +class Gzip_Decompression_Stream : public Zlib_Decompression_Stream + { + public: + Gzip_Decompression_Stream(int wbits) : Zlib_Decompression_Stream(wbits, 16) {} + }; + } Compression_Stream* Zlib_Compression::make_stream() const { - return new Zlib_Compression_Stream(m_level, m_raw_deflate); + if(m_raw_deflate) + return new Deflate_Compression_Stream(m_level, 15); + else + return new Zlib_Compression_Stream(m_level, 15); } Compression_Stream* Zlib_Decompression::make_stream() const { - return new Zlib_Decompression_Stream(m_raw_deflate); + if(m_raw_deflate) + return new Deflate_Decompression_Stream(15); + else + return new Zlib_Decompression_Stream(15); + } + +Compression_Stream* Gzip_Compression::make_stream() const + { + return new Gzip_Compression_Stream(m_level, 15, m_os_code); + } + +Compression_Stream* Gzip_Decompression::make_stream() const + { + return new Gzip_Decompression_Stream(15); } } diff --git a/src/lib/compression/zlib/zlib.h b/src/lib/compression/zlib/zlib.h index 55da47a0d..5805efb57 100644 --- a/src/lib/compression/zlib/zlib.h +++ b/src/lib/compression/zlib/zlib.h @@ -46,7 +46,7 @@ class BOTAN_DLL Zlib_Decompression : public Stream_Decompression /** * @param raw_deflate if true no zlib header/trailer will be used */ - Zlib_Decompression( bool raw_deflate = false) : m_raw_deflate(raw_deflate) {} + Zlib_Decompression(bool raw_deflate = false) : m_raw_deflate(raw_deflate) {} std::string name() const override { return "Zlib_Decompression"; } @@ -56,6 +56,41 @@ class BOTAN_DLL Zlib_Decompression : public Stream_Decompression const bool m_raw_deflate; }; +/** +* Gzip Compression +*/ +class BOTAN_DLL Gzip_Compression : public Stream_Compression + { + public: + /** + * @param level how much effort to use on compressing (0 to 9); + * higher levels are slower but tend to give better + * compression + */ + Gzip_Compression(size_t level = 6, byte os_code = 255) : + m_level(level), m_os_code(os_code) {} + + std::string name() const override { return "Gzip_Compression"; } + + private: + Compression_Stream* make_stream() const; + + const size_t m_level; + const byte m_os_code; + }; + +/** +* Gzip Decompression +*/ +class BOTAN_DLL Gzip_Decompression : public Stream_Compression + { + public: + std::string name() const override { return "Gzip_Decompression"; } + + private: + Compression_Stream* make_stream() const; + }; + } #endif |