Implemented support for DesktopName pseudo encoding, which allows
updating the desktop name on the fly.

Tested in ThinLinc since 2008-01-07. 



git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@3549 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/common/rfb/SMsgWriterV3.cxx b/common/rfb/SMsgWriterV3.cxx
index a85f85e..1271619 100644
--- a/common/rfb/SMsgWriterV3.cxx
+++ b/common/rfb/SMsgWriterV3.cxx
@@ -27,7 +27,7 @@
 SMsgWriterV3::SMsgWriterV3(ConnParams* cp, rdr::OutStream* os)
   : SMsgWriter(cp, os), updateOS(0), realOS(os), nRectsInUpdate(0),
     nRectsInHeader(0), wsccb(0),
-    needSetDesktopSize(false)
+    needSetDesktopSize(false), needSetDesktopName(false)
 {
 }
 
@@ -64,6 +64,12 @@
   return true;
 }
 
+bool SMsgWriterV3::writeSetDesktopName() {
+  if (!cp->supportsDesktopRename) return false;
+  needSetDesktopName = true;
+  return true;
+}
+
 void SMsgWriterV3::cursorChange(WriteSetCursorCallback* cb)
 {
   wsccb = cb;
@@ -118,6 +124,7 @@
   os->pad(1);
   if (wsccb) nRects++;
   if (needSetDesktopSize) nRects++;
+  if (needSetDesktopName) nRects++;
   os->writeU16(nRects);
   nRectsInUpdate = 0;
   nRectsInHeader = nRects;
@@ -150,6 +157,18 @@
     needSetDesktopSize = false;
   }
 
+  if (needSetDesktopName) {
+    if (++nRectsInUpdate > nRectsInHeader && nRectsInHeader)
+      throw Exception("SMsgWriterV3 setDesktopName: nRects out of sync");
+    os->writeS16(0);
+    os->writeS16(0);
+    os->writeU16(0);
+    os->writeU16(0);
+    os->writeU32(pseudoEncodingDesktopName);
+    os->writeString(cp->name());
+    needSetDesktopName = false;
+  }
+
   if (nRectsInUpdate != nRectsInHeader && nRectsInHeader)
     throw Exception("SMsgWriterV3::writeFramebufferUpdateEnd: "
                     "nRects out of sync");
@@ -168,7 +187,7 @@
 
 bool SMsgWriterV3::needFakeUpdate()
 {
-  return wsccb || needSetDesktopSize;
+  return wsccb || needSetDesktopSize || needSetDesktopName;
 }
 
 void SMsgWriterV3::startRect(const Rect& r, unsigned int encoding)