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.
diff --git a/common/rfb/CConnection.cxx b/common/rfb/CConnection.cxx
index e1c4ba5..b74f2e7 100644
--- a/common/rfb/CConnection.cxx
+++ b/common/rfb/CConnection.cxx
@@ -568,33 +568,32 @@
 
 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 @@
 
   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 @@
       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 9fe431c..d357c97 100644
--- a/common/rfb/CMsgWriter.cxx
+++ b/common/rfb/CMsgWriter.cxx
@@ -52,13 +52,14 @@
   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 26251e5..4d533d4 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 @@
     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);