diff options
-rw-r--r-- | Swiften/Compress/ZLibCodecompressor.cpp | 29 | ||||
-rw-r--r-- | Swiften/Compress/ZLibCodecompressor.h | 5 | ||||
-rw-r--r-- | Swiften/Compress/ZLibCodecompressor_Private.h | 17 | ||||
-rw-r--r-- | Swiften/Compress/ZLibCompressor.cpp | 13 | ||||
-rw-r--r-- | Swiften/Compress/ZLibCompressor.h | 10 | ||||
-rw-r--r-- | Swiften/Compress/ZLibDecompressor.cpp | 13 | ||||
-rw-r--r-- | Swiften/Compress/ZLibDecompressor.h | 10 |
7 files changed, 63 insertions, 34 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; } diff --git a/Swiften/Compress/ZLibCodecompressor.h b/Swiften/Compress/ZLibCodecompressor.h index 93babf0..a125fc1 100644 --- a/Swiften/Compress/ZLibCodecompressor.h +++ b/Swiften/Compress/ZLibCodecompressor.h @@ -6,8 +6,6 @@ #pragma once -#include <zlib.h> - #include <Swiften/Base/SafeByteArray.h> namespace Swift { @@ -20,6 +18,7 @@ namespace Swift { virtual int processZStream() = 0; protected: - z_stream stream_; + class Private; + boost::shared_ptr<Private> p; }; } diff --git a/Swiften/Compress/ZLibCodecompressor_Private.h b/Swiften/Compress/ZLibCodecompressor_Private.h new file mode 100644 index 0000000..1f24b83 --- /dev/null +++ b/Swiften/Compress/ZLibCodecompressor_Private.h @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2012 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include <Swiften/Compress/ZLibCodecompressor.h> + +#include <zlib.h> + +namespace Swift { + struct ZLibCodecompressor::Private { + z_stream stream; + }; +} diff --git a/Swiften/Compress/ZLibCompressor.cpp b/Swiften/Compress/ZLibCompressor.cpp index 5d98e38..6af8d83 100644 --- a/Swiften/Compress/ZLibCompressor.cpp +++ b/Swiften/Compress/ZLibCompressor.cpp @@ -7,15 +7,26 @@ #include <Swiften/Compress/ZLibCompressor.h> #include <cassert> +#include <zlib.h> + +#include <Swiften/Compress/ZLibCodecompressor_Private.h> #pragma GCC diagnostic ignored "-Wold-style-cast" namespace Swift { ZLibCompressor::ZLibCompressor() { - int result = deflateInit(&stream_, COMPRESSION_LEVEL); + int result = deflateInit(&p->stream, COMPRESSION_LEVEL); assert(result == Z_OK); (void) result; } +ZLibCompressor::~ZLibCompressor() { + deflateEnd(&p->stream); +} + +int ZLibCompressor::processZStream() { + return deflate(&p->stream, Z_SYNC_FLUSH); +} + } diff --git a/Swiften/Compress/ZLibCompressor.h b/Swiften/Compress/ZLibCompressor.h index 1add725..f4a8d2f 100644 --- a/Swiften/Compress/ZLibCompressor.h +++ b/Swiften/Compress/ZLibCompressor.h @@ -7,20 +7,14 @@ #pragma once #include <Swiften/Compress/ZLibCodecompressor.h> -#include <Swiften/Base/ByteArray.h> namespace Swift { class ZLibCompressor : public ZLibCodecompressor { public: ZLibCompressor(); + ~ZLibCompressor(); - ~ZLibCompressor() { - deflateEnd(&stream_); - } - - virtual int processZStream() { - return deflate(&stream_, Z_SYNC_FLUSH); - } + virtual int processZStream(); private: static const int COMPRESSION_LEVEL = 9; diff --git a/Swiften/Compress/ZLibDecompressor.cpp b/Swiften/Compress/ZLibDecompressor.cpp index ab954f4..f5df9fe 100644 --- a/Swiften/Compress/ZLibDecompressor.cpp +++ b/Swiften/Compress/ZLibDecompressor.cpp @@ -6,16 +6,27 @@ #include <Swiften/Compress/ZLibDecompressor.h> +#include <zlib.h> #include <cassert> +#include <Swiften/Compress/ZLibCodecompressor_Private.h> + #pragma GCC diagnostic ignored "-Wold-style-cast" namespace Swift { ZLibDecompressor::ZLibDecompressor() { - int result = inflateInit(&stream_); + int result = inflateInit(&p->stream); assert(result == Z_OK); (void) result; } +ZLibDecompressor::~ZLibDecompressor() { + inflateEnd(&p->stream); +} + +int ZLibDecompressor::processZStream() { + return inflate(&p->stream, Z_SYNC_FLUSH); +} + } diff --git a/Swiften/Compress/ZLibDecompressor.h b/Swiften/Compress/ZLibDecompressor.h index 67994d1..0726c8b 100644 --- a/Swiften/Compress/ZLibDecompressor.h +++ b/Swiften/Compress/ZLibDecompressor.h @@ -7,19 +7,13 @@ #pragma once #include <Swiften/Compress/ZLibCodecompressor.h> -#include <Swiften/Base/ByteArray.h> namespace Swift { class ZLibDecompressor : public ZLibCodecompressor { public: ZLibDecompressor(); + ~ZLibDecompressor(); - ~ZLibDecompressor() { - inflateEnd(&stream_); - } - - virtual int processZStream() { - return inflate(&stream_, Z_SYNC_FLUSH); - } + virtual int processZStream(); }; } |