10 #include <botan/zlib.h>
11 #include <botan/internal/compress_utils.h>
12 #include <botan/exceptn.h>
20 class Zlib_Stream :
public Zlib_Style_Stream<z_stream, Bytef>
25 streamp()->opaque = alloc();
26 streamp()->zalloc = Compression_Alloc_Info::malloc<unsigned int>;
30 uint32_t run_flag()
const override {
return Z_NO_FLUSH; }
31 uint32_t flush_flag()
const override {
return Z_SYNC_FLUSH; }
32 uint32_t finish_flag()
const override {
return Z_FINISH; }
34 int compute_window_bits(
int wbits,
int wbits_offset)
const
36 if(wbits_offset == -1)
39 return wbits + wbits_offset;
43 class Zlib_Compression_Stream :
public Zlib_Stream
46 Zlib_Compression_Stream(
size_t level,
int wbits,
int wbits_offset = 0)
48 wbits = compute_window_bits(wbits, wbits_offset);
55 int rc = ::deflateInit2(streamp(), level, Z_DEFLATED, wbits, 8, Z_DEFAULT_STRATEGY);
58 throw Exception(
"zlib deflate initialization failed");
61 ~Zlib_Compression_Stream()
63 ::deflateEnd(streamp());
66 bool run(uint32_t
flags)
override
68 int rc = ::deflate(streamp(), flags);
71 throw Exception(
"zlib memory allocation failure");
72 else if(rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR)
75 return (rc == Z_STREAM_END);
79 class Zlib_Decompression_Stream :
public Zlib_Stream
82 Zlib_Decompression_Stream(
int wbits,
int wbits_offset = 0)
84 int rc = ::inflateInit2(streamp(), compute_window_bits(wbits, wbits_offset));
87 throw Exception(
"zlib memory allocation failure");
89 throw Exception(
"zlib inflate initialization failed");
92 ~Zlib_Decompression_Stream()
94 ::inflateEnd(streamp());
97 bool run(uint32_t flags)
override
99 int rc = ::inflate(streamp(), flags);
101 if(rc == Z_MEM_ERROR)
102 throw Exception(
"zlib memory allocation failure");
103 else if(rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR)
106 return (rc == Z_STREAM_END);
110 class Deflate_Compression_Stream :
public Zlib_Compression_Stream
113 Deflate_Compression_Stream(
size_t level,
int wbits) :
114 Zlib_Compression_Stream(level, wbits, -1) {}
117 class Deflate_Decompression_Stream :
public Zlib_Decompression_Stream
120 explicit Deflate_Decompression_Stream(
int wbits) : Zlib_Decompression_Stream(wbits, -1) {}
123 class Gzip_Compression_Stream :
public Zlib_Compression_Stream
126 Gzip_Compression_Stream(
size_t level,
int wbits, uint8_t os_code) :
127 Zlib_Compression_Stream(level, wbits, 16)
133 int rc = deflateSetHeader(streamp(), &
m_header);
135 throw Exception(
"setting gzip header failed");
142 class Gzip_Decompression_Stream :
public Zlib_Decompression_Stream
145 explicit Gzip_Decompression_Stream(
int wbits) : Zlib_Decompression_Stream(wbits, 16) {}
150 Compression_Stream* Zlib_Compression::make_stream(
size_t level)
const
152 return new Zlib_Compression_Stream(level, 15);
155 Compression_Stream* Zlib_Decompression::make_stream()
const
157 return new Zlib_Decompression_Stream(15);
160 Compression_Stream* Deflate_Compression::make_stream(
size_t level)
const
162 return new Deflate_Compression_Stream(level, 15);
165 Compression_Stream* Deflate_Decompression::make_stream()
const
167 return new Deflate_Decompression_Stream(15);
170 Compression_Stream* Gzip_Compression::make_stream(
size_t level)
const
172 return new Gzip_Compression_Stream(level, 15, m_os_code);
175 Compression_Stream* Gzip_Decompression::make_stream()
const
177 return new Gzip_Decompression_Stream(15);
static void free(void *self, void *ptr)
void clear_mem(T *ptr, size_t n)
std::string to_string(const BER_Object &obj)