diff options
Diffstat (limited to 'Swiften/Compress/ZLibCodecompressor.cpp')
-rw-r--r-- | Swiften/Compress/ZLibCodecompressor.cpp | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/Swiften/Compress/ZLibCodecompressor.cpp b/Swiften/Compress/ZLibCodecompressor.cpp index 0869d6b..125492a 100644 --- a/Swiften/Compress/ZLibCodecompressor.cpp +++ b/Swiften/Compress/ZLibCodecompressor.cpp @@ -8,18 +8,21 @@ #include <cassert> #include <string.h> +#include <zlib.h> #include <Swiften/Compress/ZLibException.h> +#include <Swiften/Compress/ZLibCodecompressor_Private.h> namespace Swift { static const int CHUNK_SIZE = 1024; // If you change this, also change the unittest -ZLibCodecompressor::ZLibCodecompressor() { - memset(&stream_, 0, sizeof(z_stream)); - stream_.zalloc = Z_NULL; - stream_.zfree = Z_NULL; - stream_.opaque = Z_NULL; + +ZLibCodecompressor::ZLibCodecompressor() : p(boost::make_shared<Private>()) { + memset(&p->stream, 0, sizeof(z_stream)); + p->stream.zalloc = Z_NULL; + p->stream.zfree = Z_NULL; + p->stream.opaque = Z_NULL; } ZLibCodecompressor::~ZLibCodecompressor() { @@ -27,24 +30,24 @@ ZLibCodecompressor::~ZLibCodecompressor() { SafeByteArray ZLibCodecompressor::process(const SafeByteArray& input) { SafeByteArray output; - stream_.avail_in = input.size(); - stream_.next_in = reinterpret_cast<Bytef*>(const_cast<unsigned char*>(vecptr(input))); + p->stream.avail_in = input.size(); + p->stream.next_in = reinterpret_cast<Bytef*>(const_cast<unsigned char*>(vecptr(input))); int outputPosition = 0; do { output.resize(outputPosition + CHUNK_SIZE); - stream_.avail_out = CHUNK_SIZE; - stream_.next_out = reinterpret_cast<Bytef*>(vecptr(output) + outputPosition); + p->stream.avail_out = CHUNK_SIZE; + p->stream.next_out = reinterpret_cast<Bytef*>(vecptr(output) + outputPosition); int result = processZStream(); if (result != Z_OK && result != Z_BUF_ERROR) { - throw ZLibException(/* stream_.msg */); + throw ZLibException(/* p->stream.msg */); } outputPosition += CHUNK_SIZE; } - while (stream_.avail_out == 0); - if (stream_.avail_in != 0) { + while (p->stream.avail_out == 0); + if (p->stream.avail_in != 0) { throw ZLibException(); } - output.resize(outputPosition - stream_.avail_out); + output.resize(outputPosition - p->stream.avail_out); return output; } |