10 #include <botan/bzip2.h>
11 #include <botan/exceptn.h>
12 #include <botan/internal/compress_utils.h>
21 class Bzip2_Stream :
public Zlib_Style_Stream<bz_stream, char>
26 streamp()->opaque = alloc();
27 streamp()->bzalloc = Compression_Alloc_Info::malloc<int>;
31 uint32_t run_flag()
const override {
return BZ_RUN; }
32 uint32_t flush_flag()
const override {
return BZ_FLUSH; }
33 uint32_t finish_flag()
const override {
return BZ_FINISH; }
36 class Bzip2_Compression_Stream :
public Bzip2_Stream
39 explicit Bzip2_Compression_Stream(
size_t block_size)
46 if(block_size == 0 || block_size >= 9)
49 int rc = BZ2_bzCompressInit(streamp(), block_size, 0, 0);
51 if(rc == BZ_MEM_ERROR)
52 throw Exception(
"bzip memory allocation failure");
54 throw Exception(
"bzip compress initialization failed");
57 ~Bzip2_Compression_Stream()
59 BZ2_bzCompressEnd(streamp());
62 bool run(uint32_t
flags)
override
64 int rc = BZ2_bzCompress(streamp(), flags);
66 if(rc == BZ_MEM_ERROR)
67 throw Exception(
"bzip memory allocation failure");
71 return (rc == BZ_STREAM_END);
75 class Bzip2_Decompression_Stream :
public Bzip2_Stream
78 Bzip2_Decompression_Stream()
80 int rc = BZ2_bzDecompressInit(streamp(), 0, 0);
82 if(rc == BZ_MEM_ERROR)
83 throw Exception(
"bzip memory allocation failure");
85 throw Exception(
"bzip decompress initialization failed");
88 ~Bzip2_Decompression_Stream()
90 BZ2_bzDecompressEnd(streamp());
93 bool run(uint32_t)
override
95 int rc = BZ2_bzDecompress(streamp());
97 if(rc == BZ_MEM_ERROR)
98 throw Exception(
"bzip memory allocation failure");
99 else if(rc != BZ_OK && rc != BZ_STREAM_END)
102 return (rc == BZ_STREAM_END);
108 Compression_Stream* Bzip2_Compression::make_stream(
size_t comp_level)
const
110 return new Bzip2_Compression_Stream(comp_level);
113 Compression_Stream* Bzip2_Decompression::make_stream()
const
115 return new Bzip2_Decompression_Stream;
static void free(void *self, void *ptr)
std::string to_string(const BER_Object &obj)