diff options
author | dscho <dscho> | 2008-01-31 17:49:13 +0000 |
---|---|---|
committer | dscho <dscho> | 2008-01-31 17:49:13 +0000 |
commit | c17aef31ac3540a04707a7f14f04524cc76c93d0 (patch) | |
tree | 4aec604be32a713c924b28ad38bf2138fb9d076f /libvncserver/rfbserver.c | |
parent | e32ebd64a04fcb15a90835ca461b8098b14125df (diff) | |
download | libtdevnc-c17aef31ac3540a04707a7f14f04524cc76c93d0.tar.gz libtdevnc-c17aef31ac3540a04707a7f14f04524cc76c93d0.zip |
Fix rfbSendSupportedEncodings
There was a long standing TODO to make the counting of the supported
encodings dynamic. It never triggered, until ZYWRLE was added.
Noticed by Christian Ehrlicher.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Diffstat (limited to 'libvncserver/rfbserver.c')
-rw-r--r-- | libvncserver/rfbserver.c | 75 |
1 files changed, 32 insertions, 43 deletions
diff --git a/libvncserver/rfbserver.c b/libvncserver/rfbserver.c index 3dd2f29..2567f23 100644 --- a/libvncserver/rfbserver.c +++ b/libvncserver/rfbserver.c @@ -907,15 +907,6 @@ rfbSendSupportedMessages(rfbClientPtr cl) -static void rfbSendSupporteddEncodings_SendEncoding(rfbClientPtr cl, uint32_t enc) -{ - uint32_t nSwapped=0; - nSwapped = Swap32IfLE(enc); - memcpy(&cl->updateBuf[cl->ublen], (char *)&nSwapped, sizeof(nSwapped)); - cl->ublen+=sizeof(nSwapped); -} - - /* * Send rfbEncodingSupportedEncodings. */ @@ -924,21 +915,38 @@ rfbBool rfbSendSupportedEncodings(rfbClientPtr cl) { rfbFramebufferUpdateRectHeader rect; - uint16_t nEncodings=0; - - /* think rfbSetEncodingsMsg */ - - /* TODO: dynamic way of doing this */ - nEncodings=16; + static uint32_t supported[] = { + rfbEncodingRaw, + rfbEncodingCopyRect, + rfbEncodingRRE, + rfbEncodingCoRRE, + rfbEncodingHextile, #ifdef LIBVNCSERVER_HAVE_LIBZ - nEncodings += 2; + rfbEncodingZlib, + rfbEncodingZRLE, + rfbEncodingZYWRLE, #endif -#ifdef LIBVNCSERVER_HAVE_LIBZ - nEncodings++; +#ifdef LIBVNCSERVER_HAVE_LIBJPEG + rfbEncodingTight, #endif + rfbEncodingUltra, + rfbEncodingUltraZip, + rfbEncodingXCursor, + rfbEncodingRichCursor, + rfbEncodingPointerPos, + rfbEncodingLastRect, + rfbEncodingNewFBSize, + rfbEncodingKeyboardLedState, + rfbEncodingSupportedMessages, + rfbEncodingSupportedEncodings, + rfbEncodingServerIdentity, + }; + uint32_t nEncodings = sizeof(supported) / sizeof(supported[0]), i; + + /* think rfbSetEncodingsMsg */ if (cl->ublen + sz_rfbFramebufferUpdateRectHeader - + (nEncodings*sizeof(uint32_t)) > UPDATE_BUF_SIZE) { + + (nEncodings * sizeof(uint32_t)) > UPDATE_BUF_SIZE) { if (!rfbSendUpdateBuf(cl)) return FALSE; } @@ -953,30 +961,11 @@ rfbSendSupportedEncodings(rfbClientPtr cl) sz_rfbFramebufferUpdateRectHeader); cl->ublen += sz_rfbFramebufferUpdateRectHeader; - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingRaw); - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingCopyRect); - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingRRE); - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingCoRRE); - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingHextile); -#ifdef LIBVNCSERVER_HAVE_LIBZ - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingZlib); - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingTight); -#endif -#ifdef LIBVNCSERVER_HAVE_LIBZ - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingZRLE); - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingZYWRLE); -#endif - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingUltra); - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingUltraZip); - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingXCursor); - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingRichCursor); - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingPointerPos); - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingLastRect); - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingNewFBSize); - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingKeyboardLedState); - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingSupportedMessages); - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingSupportedEncodings); - rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingServerIdentity); + for (i = 0; i < nEncodings; i++) { + uint32_t encoding = Swap32IfLE(supported[i]); + memcpy(&cl->updateBuf[cl->ublen], (char *)&encoding, sizeof(encoding)); + cl->ublen += sizeof(encoding); + } rfbStatRecordEncodingSent(cl, rfbEncodingSupportedEncodings, sz_rfbFramebufferUpdateRectHeader+(nEncodings * sizeof(uint32_t)), |