summaryrefslogtreecommitdiffstats
path: root/common/rfb
diff options
context:
space:
mode:
authorPierre Ossman <ossman@cendio.se>2018-06-20 11:40:37 +0200
committerPierre Ossman <ossman@cendio.se>2018-11-01 16:11:42 +0100
commit1143ee66e4068f64e8e246bbbf3c38c4861425ef (patch)
tree2bc9a8b8ecc4d0f9853deb5e97ba2895791f4938 /common/rfb
parent96728356628e90ef80dc111269db1593be87aa16 (diff)
downloadtigervnc-1143ee66e4068f64e8e246bbbf3c38c4861425ef.tar.gz
tigervnc-1143ee66e4068f64e8e246bbbf3c38c4861425ef.zip
Use STL list for encoding list
This is a lot safer and cleaner. The old code had a fixed size that we didn't properly keep track of.
Diffstat (limited to 'common/rfb')
-rw-r--r--common/rfb/CConnection.cxx43
-rw-r--r--common/rfb/CMsgWriter.cxx9
-rw-r--r--common/rfb/CMsgWriter.h4
3 files changed, 29 insertions, 27 deletions
diff --git a/common/rfb/CConnection.cxx b/common/rfb/CConnection.cxx
index e1c4ba56..b74f2e76 100644
--- a/common/rfb/CConnection.cxx
+++ b/common/rfb/CConnection.cxx
@@ -568,33 +568,32 @@ void CConnection::requestNewUpdate()
void CConnection::updateEncodings()
{
- int nEncodings = 0;
- rdr::U32 encodings[encodingMax+3];
+ std::list<rdr::U32> encodings;
if (server.supportsLocalCursor) {
- encodings[nEncodings++] = pseudoEncodingCursorWithAlpha;
- encodings[nEncodings++] = pseudoEncodingCursor;
- encodings[nEncodings++] = pseudoEncodingXCursor;
+ encodings.push_back(pseudoEncodingCursorWithAlpha);
+ encodings.push_back(pseudoEncodingCursor);
+ encodings.push_back(pseudoEncodingXCursor);
}
if (server.supportsDesktopResize)
- encodings[nEncodings++] = pseudoEncodingDesktopSize;
+ encodings.push_back(pseudoEncodingDesktopSize);
if (server.supportsExtendedDesktopSize)
- encodings[nEncodings++] = pseudoEncodingExtendedDesktopSize;
+ encodings.push_back(pseudoEncodingExtendedDesktopSize);
if (server.supportsDesktopRename)
- encodings[nEncodings++] = pseudoEncodingDesktopName;
+ encodings.push_back(pseudoEncodingDesktopName);
if (server.supportsLEDState)
- encodings[nEncodings++] = pseudoEncodingLEDState;
+ encodings.push_back(pseudoEncodingLEDState);
- encodings[nEncodings++] = pseudoEncodingLastRect;
- encodings[nEncodings++] = pseudoEncodingContinuousUpdates;
- encodings[nEncodings++] = pseudoEncodingFence;
- encodings[nEncodings++] = pseudoEncodingQEMUKeyEvent;
+ encodings.push_back(pseudoEncodingLastRect);
+ encodings.push_back(pseudoEncodingContinuousUpdates);
+ encodings.push_back(pseudoEncodingFence);
+ encodings.push_back(pseudoEncodingQEMUKeyEvent);
if (Decoder::supported(preferredEncoding)) {
- encodings[nEncodings++] = preferredEncoding;
+ encodings.push_back(preferredEncoding);
}
- encodings[nEncodings++] = encodingCopyRect;
+ encodings.push_back(encodingCopyRect);
/*
* Prefer encodings in this order:
@@ -604,15 +603,15 @@ void CConnection::updateEncodings()
if ((preferredEncoding != encodingTight) &&
Decoder::supported(encodingTight))
- encodings[nEncodings++] = encodingTight;
+ encodings.push_back(encodingTight);
if ((preferredEncoding != encodingZRLE) &&
Decoder::supported(encodingZRLE))
- encodings[nEncodings++] = encodingZRLE;
+ encodings.push_back(encodingZRLE);
if ((preferredEncoding != encodingHextile) &&
Decoder::supported(encodingHextile))
- encodings[nEncodings++] = encodingHextile;
+ encodings.push_back(encodingHextile);
// Remaining encodings
for (int i = encodingMax; i >= 0; i--) {
@@ -625,14 +624,14 @@ void CConnection::updateEncodings()
break;
default:
if ((i != preferredEncoding) && Decoder::supported(i))
- encodings[nEncodings++] = i;
+ encodings.push_back(i);
}
}
if (server.compressLevel >= 0 && server.compressLevel <= 9)
- encodings[nEncodings++] = pseudoEncodingCompressLevel0 + server.compressLevel;
+ encodings.push_back(pseudoEncodingCompressLevel0 + server.compressLevel);
if (server.qualityLevel >= 0 && server.qualityLevel <= 9)
- encodings[nEncodings++] = pseudoEncodingQualityLevel0 + server.qualityLevel;
+ encodings.push_back(pseudoEncodingQualityLevel0 + server.qualityLevel);
- writer()->writeSetEncodings(nEncodings, encodings);
+ writer()->writeSetEncodings(encodings);
}
diff --git a/common/rfb/CMsgWriter.cxx b/common/rfb/CMsgWriter.cxx
index 9fe431ce..d357c976 100644
--- a/common/rfb/CMsgWriter.cxx
+++ b/common/rfb/CMsgWriter.cxx
@@ -52,13 +52,14 @@ 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();
}
diff --git a/common/rfb/CMsgWriter.h b/common/rfb/CMsgWriter.h
index 26251e56..4d533d42 100644
--- a/common/rfb/CMsgWriter.h
+++ b/common/rfb/CMsgWriter.h
@@ -23,6 +23,8 @@
#ifndef __RFB_CMSGWRITER_H__
#define __RFB_CMSGWRITER_H__
+#include <list>
+
#include <rdr/types.h>
namespace rdr { class OutStream; }
@@ -43,7 +45,7 @@ namespace rfb {
void writeClientInit(bool shared);
void writeSetPixelFormat(const PixelFormat& pf);
- void writeSetEncodings(int nEncodings, rdr::U32* encodings);
+ void writeSetEncodings(const std::list<rdr::U32> encodings);
void writeSetDesktopSize(int width, int height, const ScreenSet& layout);
void writeFramebufferUpdateRequest(const Rect& r,bool incremental);