aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorPierre Ossman <ossman@cendio.se>2018-06-20 11:35:05 +0200
committerPierre Ossman <ossman@cendio.se>2018-11-01 16:11:42 +0100
commit96728356628e90ef80dc111269db1593be87aa16 (patch)
tree05293401b2ab227be40d07a2e096d8e913d6cdea /common
parentef6881b9db3765ed07db9e1d414b178daae29606 (diff)
downloadtigervnc-96728356628e90ef80dc111269db1593be87aa16.tar.gz
tigervnc-96728356628e90ef80dc111269db1593be87aa16.zip
Make arguments explicit in all message writer methods
Make sure all methods only write what is given as arguments, and avoid side effects by getting data from parameter objects. This keeps things readable in the calling code.
Diffstat (limited to 'common')
-rw-r--r--common/rfb/CConnection.cxx77
-rw-r--r--common/rfb/CConnection.h1
-rw-r--r--common/rfb/CMsgWriter.cxx78
-rw-r--r--common/rfb/CMsgWriter.h1
-rw-r--r--common/rfb/SConnection.cxx3
-rw-r--r--common/rfb/SMsgWriter.cxx11
-rw-r--r--common/rfb/SMsgWriter.h4
7 files changed, 88 insertions, 87 deletions
diff --git a/common/rfb/CConnection.cxx b/common/rfb/CConnection.cxx
index 696a124a..e1c4ba56 100644
--- a/common/rfb/CConnection.cxx
+++ b/common/rfb/CConnection.cxx
@@ -25,6 +25,7 @@
#include <rfb/CMsgReader.h>
#include <rfb/CMsgWriter.h>
#include <rfb/CSecurity.h>
+#include <rfb/Decoder.h>
#include <rfb/Security.h>
#include <rfb/SecurityClient.h>
#include <rfb/CConnection.h>
@@ -547,7 +548,7 @@ void CConnection::requestNewUpdate()
}
if (encodingChange) {
- writer()->writeSetEncodings(preferredEncoding, true);
+ updateEncodings();
encodingChange = false;
}
@@ -561,3 +562,77 @@ void CConnection::requestNewUpdate()
forceNonincremental = false;
}
+
+// Ask for encodings based on which decoders are supported. Assumes higher
+// encoding numbers are more desirable.
+
+void CConnection::updateEncodings()
+{
+ int nEncodings = 0;
+ rdr::U32 encodings[encodingMax+3];
+
+ if (server.supportsLocalCursor) {
+ encodings[nEncodings++] = pseudoEncodingCursorWithAlpha;
+ encodings[nEncodings++] = pseudoEncodingCursor;
+ encodings[nEncodings++] = pseudoEncodingXCursor;
+ }
+ if (server.supportsDesktopResize)
+ encodings[nEncodings++] = pseudoEncodingDesktopSize;
+ if (server.supportsExtendedDesktopSize)
+ encodings[nEncodings++] = pseudoEncodingExtendedDesktopSize;
+ if (server.supportsDesktopRename)
+ encodings[nEncodings++] = pseudoEncodingDesktopName;
+ if (server.supportsLEDState)
+ encodings[nEncodings++] = pseudoEncodingLEDState;
+
+ encodings[nEncodings++] = pseudoEncodingLastRect;
+ encodings[nEncodings++] = pseudoEncodingContinuousUpdates;
+ encodings[nEncodings++] = pseudoEncodingFence;
+ encodings[nEncodings++] = pseudoEncodingQEMUKeyEvent;
+
+ if (Decoder::supported(preferredEncoding)) {
+ encodings[nEncodings++] = preferredEncoding;
+ }
+
+ encodings[nEncodings++] = encodingCopyRect;
+
+ /*
+ * Prefer encodings in this order:
+ *
+ * Tight, ZRLE, Hextile, *
+ */
+
+ if ((preferredEncoding != encodingTight) &&
+ Decoder::supported(encodingTight))
+ encodings[nEncodings++] = encodingTight;
+
+ if ((preferredEncoding != encodingZRLE) &&
+ Decoder::supported(encodingZRLE))
+ encodings[nEncodings++] = encodingZRLE;
+
+ if ((preferredEncoding != encodingHextile) &&
+ Decoder::supported(encodingHextile))
+ encodings[nEncodings++] = encodingHextile;
+
+ // 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))
+ encodings[nEncodings++] = i;
+ }
+ }
+
+ if (server.compressLevel >= 0 && server.compressLevel <= 9)
+ encodings[nEncodings++] = pseudoEncodingCompressLevel0 + server.compressLevel;
+ if (server.qualityLevel >= 0 && server.qualityLevel <= 9)
+ encodings[nEncodings++] = pseudoEncodingQualityLevel0 + server.qualityLevel;
+
+ writer()->writeSetEncodings(nEncodings, encodings);
+}
diff --git a/common/rfb/CConnection.h b/common/rfb/CConnection.h
index 5f953ae1..56e6d143 100644
--- a/common/rfb/CConnection.h
+++ b/common/rfb/CConnection.h
@@ -201,6 +201,7 @@ namespace rfb {
void securityCompleted();
void requestNewUpdate();
+ void updateEncodings();
rdr::InStream* is;
rdr::OutStream* os;
diff --git a/common/rfb/CMsgWriter.cxx b/common/rfb/CMsgWriter.cxx
index 5585652d..9fe431ce 100644
--- a/common/rfb/CMsgWriter.cxx
+++ b/common/rfb/CMsgWriter.cxx
@@ -20,13 +20,11 @@
#include <rdr/OutStream.h>
#include <rfb/msgTypes.h>
#include <rfb/fenceTypes.h>
-#include <rfb/encodings.h>
#include <rfb/qemuTypes.h>
#include <rfb/Exception.h>
#include <rfb/PixelFormat.h>
#include <rfb/Rect.h>
#include <rfb/ServerParams.h>
-#include <rfb/Decoder.h>
#include <rfb/CMsgWriter.h>
using namespace rfb;
@@ -64,82 +62,6 @@ void CMsgWriter::writeSetEncodings(int nEncodings, rdr::U32* encodings)
endMsg();
}
-// Ask for encodings based on which decoders are supported. Assumes higher
-// encoding numbers are more desirable.
-
-void CMsgWriter::writeSetEncodings(int preferredEncoding, bool useCopyRect)
-{
- int nEncodings = 0;
- rdr::U32 encodings[encodingMax+3];
-
- if (server->supportsLocalCursor) {
- encodings[nEncodings++] = pseudoEncodingCursorWithAlpha;
- encodings[nEncodings++] = pseudoEncodingCursor;
- encodings[nEncodings++] = pseudoEncodingXCursor;
- }
- if (server->supportsDesktopResize)
- encodings[nEncodings++] = pseudoEncodingDesktopSize;
- if (server->supportsExtendedDesktopSize)
- encodings[nEncodings++] = pseudoEncodingExtendedDesktopSize;
- if (server->supportsDesktopRename)
- encodings[nEncodings++] = pseudoEncodingDesktopName;
- if (server->supportsLEDState)
- encodings[nEncodings++] = pseudoEncodingLEDState;
-
- encodings[nEncodings++] = pseudoEncodingLastRect;
- encodings[nEncodings++] = pseudoEncodingContinuousUpdates;
- encodings[nEncodings++] = pseudoEncodingFence;
- encodings[nEncodings++] = pseudoEncodingQEMUKeyEvent;
-
- if (Decoder::supported(preferredEncoding)) {
- encodings[nEncodings++] = preferredEncoding;
- }
-
- if (useCopyRect) {
- encodings[nEncodings++] = encodingCopyRect;
- }
-
- /*
- * Prefer encodings in this order:
- *
- * Tight, ZRLE, Hextile, *
- */
-
- if ((preferredEncoding != encodingTight) &&
- Decoder::supported(encodingTight))
- encodings[nEncodings++] = encodingTight;
-
- if ((preferredEncoding != encodingZRLE) &&
- Decoder::supported(encodingZRLE))
- encodings[nEncodings++] = encodingZRLE;
-
- if ((preferredEncoding != encodingHextile) &&
- Decoder::supported(encodingHextile))
- encodings[nEncodings++] = encodingHextile;
-
- // 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))
- encodings[nEncodings++] = i;
- }
- }
-
- if (server->compressLevel >= 0 && server->compressLevel <= 9)
- encodings[nEncodings++] = pseudoEncodingCompressLevel0 + server->compressLevel;
- if (server->qualityLevel >= 0 && server->qualityLevel <= 9)
- encodings[nEncodings++] = pseudoEncodingQualityLevel0 + server->qualityLevel;
-
- writeSetEncodings(nEncodings, encodings);
-}
-
void CMsgWriter::writeSetDesktopSize(int width, int height,
const ScreenSet& layout)
{
diff --git a/common/rfb/CMsgWriter.h b/common/rfb/CMsgWriter.h
index 1f4b92d8..26251e56 100644
--- a/common/rfb/CMsgWriter.h
+++ b/common/rfb/CMsgWriter.h
@@ -44,7 +44,6 @@ namespace rfb {
void writeSetPixelFormat(const PixelFormat& pf);
void writeSetEncodings(int nEncodings, rdr::U32* encodings);
- void writeSetEncodings(int preferredEncoding, bool useCopyRect);
void writeSetDesktopSize(int width, int height, const ScreenSet& layout);
void writeFramebufferUpdateRequest(const Rect& r,bool incremental);
diff --git a/common/rfb/SConnection.cxx b/common/rfb/SConnection.cxx
index 52a1113d..d0490de5 100644
--- a/common/rfb/SConnection.cxx
+++ b/common/rfb/SConnection.cxx
@@ -355,7 +355,8 @@ void SConnection::approveConnection(bool accept, const char* reason)
void SConnection::clientInit(bool shared)
{
- writer_->writeServerInit();
+ writer_->writeServerInit(client.width(), client.height(),
+ client.pf(), client.name());
state_ = RFBSTATE_NORMAL;
}
diff --git a/common/rfb/SMsgWriter.cxx b/common/rfb/SMsgWriter.cxx
index f4c968e3..766b0cb3 100644
--- a/common/rfb/SMsgWriter.cxx
+++ b/common/rfb/SMsgWriter.cxx
@@ -47,12 +47,13 @@ SMsgWriter::~SMsgWriter()
{
}
-void SMsgWriter::writeServerInit()
+void SMsgWriter::writeServerInit(rdr::U16 width, rdr::U16 height,
+ const PixelFormat& pf, const char* name)
{
- os->writeU16(client->width());
- os->writeU16(client->height());
- client->pf().write(os);
- os->writeString(client->name());
+ os->writeU16(width);
+ os->writeU16(height);
+ pf.write(os);
+ os->writeString(name);
endMsg();
}
diff --git a/common/rfb/SMsgWriter.h b/common/rfb/SMsgWriter.h
index 2db147bd..ddddb095 100644
--- a/common/rfb/SMsgWriter.h
+++ b/common/rfb/SMsgWriter.h
@@ -32,6 +32,7 @@ namespace rdr { class OutStream; }
namespace rfb {
class ClientParams;
+ class PixelFormat;
struct ScreenSet;
class SMsgWriter {
@@ -41,7 +42,8 @@ namespace rfb {
// writeServerInit() must only be called at the appropriate time in the
// protocol initialisation.
- void writeServerInit();
+ void writeServerInit(rdr::U16 width, rdr::U16 height,
+ const PixelFormat& pf, const char* name);
// Methods to write normal protocol messages