summaryrefslogtreecommitdiffstats
path: root/common/rfb/CMsgWriter.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'common/rfb/CMsgWriter.cxx')
-rw-r--r--common/rfb/CMsgWriter.cxx105
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);