diff options
author | Pierre Ossman <ossman@cendio.se> | 2018-06-20 11:35:05 +0200 |
---|---|---|
committer | Pierre Ossman <ossman@cendio.se> | 2018-11-01 16:11:42 +0100 |
commit | 96728356628e90ef80dc111269db1593be87aa16 (patch) | |
tree | 05293401b2ab227be40d07a2e096d8e913d6cdea /common | |
parent | ef6881b9db3765ed07db9e1d414b178daae29606 (diff) | |
download | tigervnc-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.cxx | 77 | ||||
-rw-r--r-- | common/rfb/CConnection.h | 1 | ||||
-rw-r--r-- | common/rfb/CMsgWriter.cxx | 78 | ||||
-rw-r--r-- | common/rfb/CMsgWriter.h | 1 | ||||
-rw-r--r-- | common/rfb/SConnection.cxx | 3 | ||||
-rw-r--r-- | common/rfb/SMsgWriter.cxx | 11 | ||||
-rw-r--r-- | common/rfb/SMsgWriter.h | 4 |
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 |