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.
diff --git a/common/rfb/CConnection.cxx b/common/rfb/CConnection.cxx
index 696a124..e1c4ba5 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 @@
}
if (encodingChange) {
- writer()->writeSetEncodings(preferredEncoding, true);
+ updateEncodings();
encodingChange = false;
}
@@ -561,3 +562,77 @@
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 5f953ae..56e6d14 100644
--- a/common/rfb/CConnection.h
+++ b/common/rfb/CConnection.h
@@ -201,6 +201,7 @@
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 5585652..9fe431c 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 @@
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 1f4b92d..26251e5 100644
--- a/common/rfb/CMsgWriter.h
+++ b/common/rfb/CMsgWriter.h
@@ -44,7 +44,6 @@
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 52a1113..d0490de 100644
--- a/common/rfb/SConnection.cxx
+++ b/common/rfb/SConnection.cxx
@@ -355,7 +355,8 @@
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 f4c968e..766b0cb 100644
--- a/common/rfb/SMsgWriter.cxx
+++ b/common/rfb/SMsgWriter.cxx
@@ -47,12 +47,13 @@
{
}
-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 2db147b..ddddb09 100644
--- a/common/rfb/SMsgWriter.h
+++ b/common/rfb/SMsgWriter.h
@@ -32,6 +32,7 @@
namespace rfb {
class ClientParams;
+ class PixelFormat;
struct ScreenSet;
class SMsgWriter {
@@ -41,7 +42,8 @@
// 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