Move preferred encoding tracking into a server object

Having it in ConnParams made the linker pull all the encoder objects
into vncviewer, making it larger than necessary and giving it extra
parameters in its help output that weren't relevant.
diff --git a/common/rfb/ConnParams.cxx b/common/rfb/ConnParams.cxx
index cc0a768..615f49a 100644
--- a/common/rfb/ConnParams.cxx
+++ b/common/rfb/ConnParams.cxx
@@ -22,7 +22,6 @@
 #include <rdr/OutStream.h>
 #include <rfb/Exception.h>
 #include <rfb/encodings.h>
-#include <rfb/EncodeManager.h>
 #include <rfb/ConnParams.h>
 #include <rfb/util.h>
 
@@ -37,8 +36,7 @@
     supportsSetDesktopSize(false), supportsFence(false),
     supportsContinuousUpdates(false),
     compressLevel(2), qualityLevel(-1), fineQualityLevel(-1),
-    subsampling(subsampleUndefined), name_(0),
-    preferredEncoding_(encodingRaw), verStrPos(0)
+    subsampling(subsampleUndefined), name_(0), verStrPos(0)
 {
   setName("");
 }
@@ -118,7 +116,6 @@
   qualityLevel = -1;
   fineQualityLevel = -1;
   subsampling = subsampleUndefined;
-  preferredEncoding_ = encodingRaw;
 
   encodings_.clear();
   encodings_.insert(encodingRaw);
@@ -184,9 +181,6 @@
         encodings[i] <= pseudoEncodingFineQualityLevel100)
       fineQualityLevel = encodings[i] - pseudoEncodingFineQualityLevel0;
 
-    if (EncodeManager::supported(encodings[i]))
-      preferredEncoding_ = encodings[i];
-
     if (encodings[i] > 0)
       encodings_.insert(encodings[i]);
   }
diff --git a/common/rfb/ConnParams.h b/common/rfb/ConnParams.h
index 625f265..0b8a89c 100644
--- a/common/rfb/ConnParams.h
+++ b/common/rfb/ConnParams.h
@@ -80,7 +80,6 @@
     const Cursor& cursor() { return cursor_; }
     void setCursor(const Cursor& cursor);
 
-    rdr::S32 preferredEncoding() { return preferredEncoding_; }
     bool supportsEncoding(rdr::S32 encoding);
 
     void setEncodings(int nEncodings, const rdr::S32* encodings);
@@ -108,7 +107,6 @@
     PixelFormat pf_;
     char* name_;
     Cursor cursor_;
-    rdr::S32 preferredEncoding_;
     std::set<rdr::S32> encodings_;
     char verStr[13];
     int verStrPos;
diff --git a/common/rfb/EncodeManager.cxx b/common/rfb/EncodeManager.cxx
index 1bd00c7..ca60da4 100644
--- a/common/rfb/EncodeManager.cxx
+++ b/common/rfb/EncodeManager.cxx
@@ -164,7 +164,7 @@
   indexed = indexedRLE = fullColour = encoderRaw;
 
   // Try to respect the client's wishes
-  preferred = conn->cp.preferredEncoding();
+  preferred = conn->getPreferredEncoding();
   switch (preferred) {
   case encodingRRE:
     // Horrible for anything high frequency and/or lots of colours
diff --git a/common/rfb/SConnection.cxx b/common/rfb/SConnection.cxx
index 48acf0a..eeaeafe 100644
--- a/common/rfb/SConnection.cxx
+++ b/common/rfb/SConnection.cxx
@@ -26,6 +26,8 @@
 #include <rfb/SMsgWriter.h>
 #include <rfb/SConnection.h>
 #include <rfb/ServerCore.h>
+#include <rfb/encodings.h>
+#include <rfb/EncodeManager.h>
 
 #include <rfb/LogWriter.h>
 
@@ -47,7 +49,8 @@
   : readyForSetColourMapEntries(false),
     is(0), os(0), reader_(0), writer_(0),
     security(0), ssecurity(0), state_(RFBSTATE_UNINITIALISED),
-    reverseConnection(reverseConnection_)
+    reverseConnection(reverseConnection_),
+    preferredEncoding(encodingRaw)
 {
   defaultMajorVersion = 3;
   defaultMinorVersion = 8;
@@ -264,6 +267,21 @@
   os->flush();
 }
 
+void SConnection::setEncodings(int nEncodings, rdr::S32* encodings)
+{
+  int i;
+
+  preferredEncoding = encodingRaw;
+  for (i = 0;i < nEncodings;i++) {
+    if (EncodeManager::supported(encodings[i])) {
+      preferredEncoding = encodings[i];
+      break;
+    }
+  }
+
+  SMsgHandler::setEncodings(nEncodings, encodings);
+}
+
 void SConnection::versionReceived()
 {
 }
diff --git a/common/rfb/SConnection.h b/common/rfb/SConnection.h
index b6ff7cd..7718f4c 100644
--- a/common/rfb/SConnection.h
+++ b/common/rfb/SConnection.h
@@ -70,6 +70,11 @@
     void approveConnection(bool accept, const char* reason=0);
 
 
+    // Overridden from SMsgHandler
+
+    virtual void setEncodings(int nEncodings, rdr::S32* encodings);
+
+
     // Methods to be overridden in a derived class
 
     // versionReceived() indicates that the version number has just been read
@@ -173,6 +178,8 @@
 
     stateEnum state() { return state_; }
 
+    rdr::S32 getPreferredEncoding() { return preferredEncoding; }
+
   protected:
     void setState(stateEnum s) { state_ = s; }
     void writeFakeColourMap(void);
@@ -194,6 +201,7 @@
     SSecurity* ssecurity;
     stateEnum state_;
     bool reverseConnection;
+    rdr::S32 preferredEncoding;
   };
 }
 #endif