From ea7ede9838ac51bab0427ecc8b46cc737497a375 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Mon, 18 Jun 2018 16:51:53 +0200 Subject: [PATCH] Move version reading/writing out of ConnParams That object is just a container for the current state. Move the I/O to the classes already doing such stuff. --- common/rfb/CConnection.cxx | 23 +++++++++++++++++++---- common/rfb/ConnParams.cxx | 28 +--------------------------- common/rfb/ConnParams.h | 7 ------- common/rfb/SConnection.cxx | 25 +++++++++++++++++++++---- 4 files changed, 41 insertions(+), 42 deletions(-) diff --git a/common/rfb/CConnection.cxx b/common/rfb/CConnection.cxx index fb953775..7146abc9 100644 --- a/common/rfb/CConnection.cxx +++ b/common/rfb/CConnection.cxx @@ -128,13 +128,25 @@ void CConnection::processMsg() void CConnection::processVersionMsg() { + char verStr[13]; + int majorVersion; + int minorVersion; + vlog.debug("reading protocol version"); - bool done; - if (!cp.readVersion(is, &done)) { + + if (!is->checkNoWait(12)) + return; + + is->readBytes(verStr, 12); + verStr[12] = '\0'; + + if (sscanf(verStr, "RFB %03d.%03d\n", + &majorVersion, &minorVersion) != 2) { state_ = RFBSTATE_INVALID; throw Exception("reading version failed: not an RFB server?"); } - if (!done) return; + + cp.setVersion(majorVersion, minorVersion); vlog.info("Server supports RFB protocol version %d.%d", cp.majorVersion, cp.minorVersion); @@ -152,7 +164,10 @@ void CConnection::processVersionMsg() cp.setVersion(3,8); } - cp.writeVersion(os); + sprintf(verStr, "RFB %03d.%03d\n", cp.majorVersion, cp.minorVersion); + os->writeBytes(verStr, 12); + os->flush(); + state_ = RFBSTATE_SECURITY_TYPES; vlog.info("Using RFB protocol version %d.%d", diff --git a/common/rfb/ConnParams.cxx b/common/rfb/ConnParams.cxx index 80b4a5ac..405a99cc 100644 --- a/common/rfb/ConnParams.cxx +++ b/common/rfb/ConnParams.cxx @@ -18,8 +18,6 @@ * USA. */ #include -#include -#include #include #include #include @@ -39,7 +37,7 @@ ConnParams::ConnParams() supportsSetDesktopSize(false), supportsFence(false), supportsContinuousUpdates(false), compressLevel(2), qualityLevel(-1), fineQualityLevel(-1), - subsampling(subsampleUndefined), name_(0), verStrPos(0), + subsampling(subsampleUndefined), name_(0), ledState_(ledUnknown) { setName(""); @@ -52,30 +50,6 @@ ConnParams::~ConnParams() delete cursor_; } -bool ConnParams::readVersion(rdr::InStream* is, bool* done) -{ - if (verStrPos >= 12) return false; - while (is->checkNoWait(1) && verStrPos < 12) { - verStr[verStrPos++] = is->readU8(); - } - - if (verStrPos < 12) { - *done = false; - return true; - } - *done = true; - verStr[12] = 0; - return (sscanf(verStr, "RFB %03d.%03d\n", &majorVersion,&minorVersion) == 2); -} - -void ConnParams::writeVersion(rdr::OutStream* os) -{ - char str[13]; - sprintf(str, "RFB %03d.%03d\n", majorVersion, minorVersion); - os->writeBytes(str, 12); - os->flush(); -} - void ConnParams::setPF(const PixelFormat& pf) { pf_ = pf; diff --git a/common/rfb/ConnParams.h b/common/rfb/ConnParams.h index b3222936..b56c9407 100644 --- a/common/rfb/ConnParams.h +++ b/common/rfb/ConnParams.h @@ -30,8 +30,6 @@ #include #include -namespace rdr { class InStream; } - namespace rfb { const int subsampleUndefined = -1; @@ -47,9 +45,6 @@ namespace rfb { ConnParams(); ~ConnParams(); - bool readVersion(rdr::InStream* is, bool* done); - void writeVersion(rdr::OutStream* os); - int majorVersion; int minorVersion; @@ -114,8 +109,6 @@ namespace rfb { char* name_; Cursor* cursor_; std::set encodings_; - char verStr[13]; - int verStrPos; unsigned int ledState_; }; } diff --git a/common/rfb/SConnection.cxx b/common/rfb/SConnection.cxx index efc26acf..846e97e4 100644 --- a/common/rfb/SConnection.cxx +++ b/common/rfb/SConnection.cxx @@ -80,7 +80,12 @@ void SConnection::setStreams(rdr::InStream* is_, rdr::OutStream* os_) void SConnection::initialiseProtocol() { - cp.writeVersion(os); + char str[13]; + + sprintf(str, "RFB %03d.%03d\n", defaultMajorVersion, defaultMinorVersion); + os->writeBytes(str, 12); + os->flush(); + state_ = RFBSTATE_PROTOCOL_VERSION; } @@ -104,13 +109,25 @@ void SConnection::processMsg() void SConnection::processVersionMsg() { + char verStr[13]; + int majorVersion; + int minorVersion; + vlog.debug("reading protocol version"); - bool done; - if (!cp.readVersion(is, &done)) { + + if (!is->checkNoWait(12)) + return; + + is->readBytes(verStr, 12); + verStr[12] = '\0'; + + if (sscanf(verStr, "RFB %03d.%03d\n", + &majorVersion, &minorVersion) != 2) { state_ = RFBSTATE_INVALID; throw Exception("reading version failed: not an RFB client?"); } - if (!done) return; + + cp.setVersion(majorVersion, minorVersion); vlog.info("Client needs protocol version %d.%d", cp.majorVersion, cp.minorVersion); -- 2.39.5