diff options
Diffstat (limited to 'Swiften/Compress/ZLibCodecompressor.cpp')
-rw-r--r-- | Swiften/Compress/ZLibCodecompressor.cpp | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/Swiften/Compress/ZLibCodecompressor.cpp b/Swiften/Compress/ZLibCodecompressor.cpp index 0869d6b..85d0174 100644 --- a/Swiften/Compress/ZLibCodecompressor.cpp +++ b/Swiften/Compress/ZLibCodecompressor.cpp @@ -1,4 +1,4 @@ /* - * Copyright (c) 2010 Remko Tronçon + * Copyright (c) 2010-2013 Remko Tronçon * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. @@ -9,16 +9,20 @@ #include <cassert> #include <string.h> +#include <zlib.h> +#include <boost/numeric/conversion/cast.hpp> #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 +static const size_t 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; } @@ -28,22 +32,22 @@ 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))); - int outputPosition = 0; + p->stream.avail_in = static_cast<unsigned int>(input.size()); + p->stream.next_in = reinterpret_cast<Bytef*>(const_cast<unsigned char*>(vecptr(input))); + size_t 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; } |