]> source.dussan.org Git - tigervnc.git/commitdiff
Handle CopyRect like any other encoding
authorPierre Ossman <ossman@cendio.se>
Fri, 31 Jan 2014 10:21:51 +0000 (11:21 +0100)
committerPierre Ossman <ossman@cendio.se>
Mon, 7 Jul 2014 12:42:08 +0000 (14:42 +0200)
Avoids having to special case things. Keeps the code simpler.

common/rfb/CMakeLists.txt
common/rfb/CMsgReader.cxx
common/rfb/CMsgReader.h
common/rfb/CMsgWriter.cxx
common/rfb/CopyRectDecoder.cxx [new file with mode: 0644]
common/rfb/CopyRectDecoder.h [new file with mode: 0644]
common/rfb/Decoder.cxx

index da68a27805bb9328ea6545f248456cae43e87ced..590aea77b8685a3333911574b7fb809d01e6a6b0 100644 (file)
@@ -13,6 +13,7 @@ set(RFB_SOURCES
   ComparingUpdateTracker.cxx
   Configuration.cxx
   ConnParams.cxx
+  CopyRectDecoder.cxx
   Cursor.cxx
   Decoder.cxx
   d3des.c
index 8466c68c1ece38b766aca26e6071b69511a2b660..b39fd09963a159812c27fa6efab8c545dc4c42fb 100644 (file)
@@ -198,35 +198,23 @@ void CMsgReader::readRect(const Rect& r, int encoding)
 
   handler->beginRect(r, encoding);
 
-  if (encoding == encodingCopyRect) {
-    readCopyRect(r);
-  } else {
+  if (!Decoder::supported(encoding)) {
+    fprintf(stderr, "Unknown rect encoding %d\n", encoding);
+    throw Exception("Unknown rect encoding");
+  }
 
-    if (!Decoder::supported(encoding)) {
+  if (!decoders[encoding]) {
+    decoders[encoding] = Decoder::createDecoder(encoding, this);
+    if (!decoders[encoding]) {
       fprintf(stderr, "Unknown rect encoding %d\n", encoding);
       throw Exception("Unknown rect encoding");
     }
-
-    if (!decoders[encoding]) {
-      decoders[encoding] = Decoder::createDecoder(encoding, this);
-      if (!decoders[encoding]) {
-        fprintf(stderr, "Unknown rect encoding %d\n", encoding);
-        throw Exception("Unknown rect encoding");
-      }
-    }
-    decoders[encoding]->readRect(r, handler);
   }
+  decoders[encoding]->readRect(r, handler);
 
   handler->endRect(r, encoding);
 }
 
-void CMsgReader::readCopyRect(const Rect& r)
-{
-  int srcX = is->readU16();
-  int srcY = is->readU16();
-  handler->copyRect(r, srcX, srcY);
-}
-
 void CMsgReader::readSetCursor(int width, int height, const Point& hotspot)
 {
   int data_len = width * height * (handler->cp.pf().bpp/8);
index 650f1642319af9e1035bccc8e620f785a3c67f0f..12846678f0abcd173a824d5fca389890f3fc6f72 100644 (file)
@@ -62,7 +62,6 @@ namespace rfb {
     void readFramebufferUpdate();
 
     void readRect(const Rect& r, int encoding);
-    void readCopyRect(const Rect& r);
 
     void readSetCursor(int width, int height, const Point& hotspot);
     void readSetDesktopName(int x, int y, int w, int h);
index 3d51060f73606d617063a867c0706abd2be9b0b6..6536eaf2013cee3e69a0e8b16bf926a5ea6c6a41 100644 (file)
@@ -113,9 +113,11 @@ void CMsgWriter::writeSetEncodings(int preferredEncoding, bool useCopyRect)
   // Remaining encodings
   for (int i = encodingMax; i >= 0; i--) {
     switch (i) {
+    case encodingCopyRect:
     case encodingTight:
     case encodingZRLE:
     case encodingHextile:
+      /* These have already been sent earlier */
       break;
     default:
       if ((i != preferredEncoding) && Decoder::supported(i))
diff --git a/common/rfb/CopyRectDecoder.cxx b/common/rfb/CopyRectDecoder.cxx
new file mode 100644 (file)
index 0000000..4c83583
--- /dev/null
@@ -0,0 +1,39 @@
+/* Copyright 2014 Pierre Ossman <ossman@cendio.se> for Cendio AB
+ * 
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+#include <rdr/InStream.h>
+#include <rfb/CMsgReader.h>
+#include <rfb/CMsgHandler.h>
+#include <rfb/PixelBuffer.h>
+#include <rfb/CopyRectDecoder.h>
+
+using namespace rfb;
+
+CopyRectDecoder::CopyRectDecoder(CMsgReader* reader) : Decoder(reader)
+{
+}
+
+CopyRectDecoder::~CopyRectDecoder()
+{
+}
+
+void CopyRectDecoder::readRect(const Rect& r, CMsgHandler* handler)
+{
+  int srcX = reader->getInStream()->readU16();
+  int srcY = reader->getInStream()->readU16();
+  handler->copyRect(r, srcX, srcY);
+}
diff --git a/common/rfb/CopyRectDecoder.h b/common/rfb/CopyRectDecoder.h
new file mode 100644 (file)
index 0000000..e265ee4
--- /dev/null
@@ -0,0 +1,32 @@
+/* Copyright 2014 Pierre Ossman <ossman@cendio.se> for Cendio AB
+ * 
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+#ifndef __RFB_COPYRECTDECODER_H__
+#define __RFB_COPYRECTDECODER_H__
+
+#include <rfb/Decoder.h>
+
+namespace rfb {
+
+  class CopyRectDecoder : public Decoder {
+  public:
+    CopyRectDecoder(CMsgReader* reader);
+    virtual ~CopyRectDecoder();
+    virtual void readRect(const Rect& r, CMsgHandler* handler);
+  };
+}
+#endif
index 9982c93205a966a2f2a3df373bf8478d25e9d72b..f774f28cc3a9d0f8c8c7285417028a29e2fbf845 100644 (file)
@@ -20,6 +20,7 @@
 #include <rfb/encodings.h>
 #include <rfb/Decoder.h>
 #include <rfb/RawDecoder.h>
+#include <rfb/CopyRectDecoder.h>
 #include <rfb/RREDecoder.h>
 #include <rfb/HextileDecoder.h>
 #include <rfb/ZRLEDecoder.h>
@@ -39,6 +40,7 @@ bool Decoder::supported(int encoding)
 {
   switch (encoding) {
   case encodingRaw:
+  case encodingCopyRect:
   case encodingRRE:
   case encodingHextile:
   case encodingZRLE:
@@ -54,6 +56,8 @@ Decoder* Decoder::createDecoder(int encoding, CMsgReader* reader)
   switch (encoding) {
   case encodingRaw:
     return new RawDecoder(reader);
+  case encodingCopyRect:
+    return new CopyRectDecoder(reader);
   case encodingRRE:
     return new RREDecoder(reader);
   case encodingHextile: