]> source.dussan.org Git - tigervnc.git/commitdiff
Clear up ZlibInStream::reset() behaviour
authorPierre Ossman <ossman@cendio.se>
Wed, 11 Nov 2015 12:11:09 +0000 (13:11 +0100)
committerPierre Ossman <ossman@cendio.se>
Fri, 27 Nov 2015 10:00:55 +0000 (11:00 +0100)
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).

common/rdr/ZlibInStream.cxx
common/rdr/ZlibInStream.h
common/rfb/TightDecoder.cxx
common/rfb/zrleDecode.h

index 6f3a7d02fb7b33181004bc0ce82fef0cc01b55bb..4053bd1918ae2447d42b1da5491aefaea492c37a 100644 (file)
@@ -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)
index c26b6d638bc1fb96b1f02b98160c7a50fc9512fa..6bd4da4c651fd9b2132f76396cf5e3b2dfe2fb5a 100644 (file)
@@ -38,11 +38,15 @@ namespace rdr {
     virtual ~ZlibInStream();
 
     void setUnderlying(InStream* is, int bytesIn);
-    void reset();
+    void removeUnderlying();
     int pos();
+    void reset();
 
   private:
 
+    void init();
+    void deinit();
+
     int overrun(int itemSize, int nItems, bool wait);
     bool decompress(bool wait);
 
index cab49fdf16437217a5bc68a33465d64e00fa8739..1bfa7a9f02de6e22944a57d40882b0141397c490 100644 (file)
@@ -165,7 +165,7 @@ void TightDecoder::decodeRect(const Rect& r, const void* buffer,
   bufptr += 1;
   buflen -= 1;
 
-  // Flush zlib streams if we are told by the server to do so.
+  // Reset zlib streams if we are told by the server to do so.
   for (int i = 0; i < 4; i++) {
     if (comp_ctl & 1) {
       zis[i].reset();
@@ -309,8 +309,8 @@ void TightDecoder::decodeRect(const Rect& r, const void* buffer,
     netbuf = new rdr::U8[dataSize];
 
     zis[streamId].readBytes(netbuf, dataSize);
-    zis[streamId].reset();
 
+    zis[streamId].removeUnderlying();
     delete ms;
 
     bufptr = netbuf;
index 256617116c834d1e4b0484b1aa5937663f1ea7bf..07d6795a01f261dbd125ed47d510f82fb827d372 100644 (file)
@@ -177,7 +177,7 @@ void ZRLE_DECODE (const Rect& r, rdr::InStream* is,
     }
   }
 
-  zis->reset();
+  zis->removeUnderlying();
 }
 
 #undef ZRLE_DECODE