diff options
Diffstat (limited to 'common/rfb/CMsgWriter.cxx')
-rw-r--r-- | common/rfb/CMsgWriter.cxx | 105 |
1 files changed, 14 insertions, 91 deletions
diff --git a/common/rfb/CMsgWriter.cxx b/common/rfb/CMsgWriter.cxx index 44b73dab..d357c976 100644 --- a/common/rfb/CMsgWriter.cxx +++ b/common/rfb/CMsgWriter.cxx @@ -20,19 +20,17 @@ #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/ConnParams.h> -#include <rfb/Decoder.h> +#include <rfb/ServerParams.h> #include <rfb/CMsgWriter.h> using namespace rfb; -CMsgWriter::CMsgWriter(ConnParams* cp_, rdr::OutStream* os_) - : cp(cp_), os(os_) +CMsgWriter::CMsgWriter(ServerParams* server_, rdr::OutStream* os_) + : server(server_), os(os_) { } @@ -54,96 +52,21 @@ void CMsgWriter::writeSetPixelFormat(const PixelFormat& pf) endMsg(); } -void CMsgWriter::writeSetEncodings(int nEncodings, rdr::U32* encodings) +void CMsgWriter::writeSetEncodings(const std::list<rdr::U32> encodings) { + std::list<rdr::U32>::const_iterator iter; startMsg(msgTypeSetEncodings); os->skip(1); - os->writeU16(nEncodings); - for (int i = 0; i < nEncodings; i++) - os->writeU32(encodings[i]); + os->writeU16(encodings.size()); + for (iter = encodings.begin(); iter != encodings.end(); ++iter) + os->writeU32(*iter); 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 (cp->supportsLocalCursor) { - encodings[nEncodings++] = pseudoEncodingCursorWithAlpha; - encodings[nEncodings++] = pseudoEncodingCursor; - encodings[nEncodings++] = pseudoEncodingXCursor; - } - if (cp->supportsDesktopResize) - encodings[nEncodings++] = pseudoEncodingDesktopSize; - if (cp->supportsExtendedDesktopSize) - encodings[nEncodings++] = pseudoEncodingExtendedDesktopSize; - if (cp->supportsDesktopRename) - encodings[nEncodings++] = pseudoEncodingDesktopName; - if (cp->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 (cp->compressLevel >= 0 && cp->compressLevel <= 9) - encodings[nEncodings++] = pseudoEncodingCompressLevel0 + cp->compressLevel; - if (cp->qualityLevel >= 0 && cp->qualityLevel <= 9) - encodings[nEncodings++] = pseudoEncodingQualityLevel0 + cp->qualityLevel; - - writeSetEncodings(nEncodings, encodings); -} - void CMsgWriter::writeSetDesktopSize(int width, int height, const ScreenSet& layout) { - if (!cp->supportsSetDesktopSize) + if (!server->supportsSetDesktopSize) throw Exception("Server does not support SetDesktopSize"); startMsg(msgTypeSetDesktopSize); @@ -182,7 +105,7 @@ void CMsgWriter::writeFramebufferUpdateRequest(const Rect& r, bool incremental) void CMsgWriter::writeEnableContinuousUpdates(bool enable, int x, int y, int w, int h) { - if (!cp->supportsContinuousUpdates) + if (!server->supportsContinuousUpdates) throw Exception("Server does not support continuous updates"); startMsg(msgTypeEnableContinuousUpdates); @@ -199,7 +122,7 @@ void CMsgWriter::writeEnableContinuousUpdates(bool enable, void CMsgWriter::writeFence(rdr::U32 flags, unsigned len, const char data[]) { - if (!cp->supportsFence) + if (!server->supportsFence) throw Exception("Server does not support fences"); if (len > 64) throw Exception("Too large fence payload"); @@ -219,7 +142,7 @@ void CMsgWriter::writeFence(rdr::U32 flags, unsigned len, const char data[]) void CMsgWriter::writeKeyEvent(rdr::U32 keysym, rdr::U32 keycode, bool down) { - if (!cp->supportsQEMUKeyEvent || !keycode) { + if (!server->supportsQEMUKeyEvent || !keycode) { /* This event isn't meaningful without a valid keysym */ if (!keysym) return; @@ -245,8 +168,8 @@ void CMsgWriter::writePointerEvent(const Point& pos, int buttonMask) Point p(pos); if (p.x < 0) p.x = 0; if (p.y < 0) p.y = 0; - if (p.x >= cp->width) p.x = cp->width - 1; - if (p.y >= cp->height) p.y = cp->height - 1; + if (p.x >= server->width()) p.x = server->width() - 1; + if (p.y >= server->height()) p.y = server->height() - 1; startMsg(msgTypePointerEvent); os->writeU8(buttonMask); |