diff options
author | Pierre Ossman <ossman@cendio.se> | 2015-11-11 13:11:09 +0100 |
---|---|---|
committer | Pierre Ossman <ossman@cendio.se> | 2015-11-27 11:00:55 +0100 |
commit | 6f318e4451fcb45054408eaf568ca1c30c2d1ab6 (patch) | |
tree | 733597f9656ed8b586c0ba23ebb57aa8f7ecc8c2 /common/rdr/ZlibInStream.cxx | |
parent | 80b4209b547f030dad14b2ce9456b2a4220b9a65 (diff) | |
download | tigervnc-6f318e4451fcb45054408eaf568ca1c30c2d1ab6.tar.gz tigervnc-6f318e4451fcb45054408eaf568ca1c30c2d1ab6.zip |
Clear up ZlibInStream::reset() behaviour
It previously only did a reset of the ZlibInStream object, not the
underlying zlib stream. It also had the side effect of flushing
the underlying stream and disassociating from it.
Clear things up by changing the naming, and introducing a proper
reset function (which is needed by the Tight decoder).
Diffstat (limited to 'common/rdr/ZlibInStream.cxx')
-rw-r--r-- | common/rdr/ZlibInStream.cxx | 52 |
1 files changed, 38 insertions, 14 deletions
diff --git a/common/rdr/ZlibInStream.cxx b/common/rdr/ZlibInStream.cxx index 6f3a7d02..4053bd19 100644 --- a/common/rdr/ZlibInStream.cxx +++ b/common/rdr/ZlibInStream.cxx @@ -16,6 +16,8 @@ * USA. */ +#include <assert.h> + #include <rdr/ZlibInStream.h> #include <rdr/Exception.h> #include <zlib.h> @@ -26,26 +28,16 @@ enum { DEFAULT_BUF_SIZE = 16384 }; ZlibInStream::ZlibInStream(int bufSize_) : underlying(0), bufSize(bufSize_ ? bufSize_ : DEFAULT_BUF_SIZE), offset(0), - bytesIn(0) + zs(NULL), bytesIn(0) { - zs = new z_stream; - zs->zalloc = Z_NULL; - zs->zfree = Z_NULL; - zs->opaque = Z_NULL; - zs->next_in = Z_NULL; - zs->avail_in = 0; - if (inflateInit(zs) != Z_OK) { - delete zs; - throw Exception("ZlibInStream: inflateInit failed"); - } ptr = end = start = new U8[bufSize]; + init(); } ZlibInStream::~ZlibInStream() { + deinit(); delete [] start; - inflateEnd(zs); - delete zs; } void ZlibInStream::setUnderlying(InStream* is, int bytesIn_) @@ -60,7 +52,7 @@ int ZlibInStream::pos() return offset + ptr - start; } -void ZlibInStream::reset() +void ZlibInStream::removeUnderlying() { ptr = end = start; if (!underlying) return; @@ -72,6 +64,38 @@ void ZlibInStream::reset() underlying = 0; } +void ZlibInStream::reset() +{ + deinit(); + init(); +} + +void ZlibInStream::init() +{ + assert(zs == NULL); + + zs = new z_stream; + zs->zalloc = Z_NULL; + zs->zfree = Z_NULL; + zs->opaque = Z_NULL; + zs->next_in = Z_NULL; + zs->avail_in = 0; + if (inflateInit(zs) != Z_OK) { + delete zs; + zs = NULL; + throw Exception("ZlibInStream: inflateInit failed"); + } +} + +void ZlibInStream::deinit() +{ + assert(zs != NULL); + removeUnderlying(); + inflateEnd(zs); + delete zs; + zs = NULL; +} + int ZlibInStream::overrun(int itemSize, int nItems, bool wait) { if (itemSize > bufSize) |