]> source.dussan.org Git - tigervnc.git/commitdiff
Require all SMsgWriter caller to check capabilities
authorPierre Ossman <ossman@cendio.se>
Mon, 29 Oct 2018 09:03:37 +0000 (10:03 +0100)
committerPierre Ossman <ossman@cendio.se>
Mon, 10 Dec 2018 19:19:43 +0000 (20:19 +0100)
Make the API consisitent by requiring the caller to check what the client
supports before calling any of the write* functions. This avoids the
confusion that the functions might not always do anything.

common/rfb/SMsgWriter.cxx
common/rfb/SMsgWriter.h
common/rfb/VNCSConnectionST.cxx

index dacba8a5710a1273a91a022072d49e6c27e37d99..a12a6d40d2b2a8e12e3b9c040103e3d55ac6751d 100644 (file)
@@ -132,13 +132,12 @@ void SMsgWriter::writeDesktopSize(rdr::U16 reason, rdr::U16 result)
   extendedDesktopSizeMsgs.push_back(msg);
 }
 
-bool SMsgWriter::writeSetDesktopName() {
+void SMsgWriter::writeSetDesktopName()
+{
   if (!client->supportsEncoding(pseudoEncodingDesktopName))
-    return false;
+    throw Exception("Client does not support desktop name changes");
 
   needSetDesktopName = true;
-
-  return true;
 }
 
 void SMsgWriter::writeCursor()
@@ -151,26 +150,22 @@ void SMsgWriter::writeCursor()
   needCursor = true;
 }
 
-bool SMsgWriter::writeLEDState()
+void SMsgWriter::writeLEDState()
 {
   if (!client->supportsEncoding(pseudoEncodingLEDState))
-    return false;
+    throw Exception("Client does not support LED state");
   if (client->ledState() == ledUnknown)
-    return false;
+    throw Exception("Server has not specified LED state");
 
   needLEDState = true;
-
-  return true;
 }
 
-bool SMsgWriter::writeQEMUKeyEvent()
+void SMsgWriter::writeQEMUKeyEvent()
 {
   if (!client->supportsEncoding(pseudoEncodingQEMUKeyEvent))
-    return false;
+    throw Exception("Client does not support QEMU key events");
 
   needQEMUKeyEvent = true;
-
-  return true;
 }
 
 bool SMsgWriter::needFakeUpdate()
index 19b013f6392d4fa6797aacde2d4cd1bf0d77ae1a..80f6de9126d21605436faad4d1837d1b71057bb8 100644 (file)
@@ -69,17 +69,17 @@ namespace rfb {
     // write the relevant pseudo-rectangle as part of the next update.
     void writeDesktopSize(rdr::U16 reason, rdr::U16 result=0);
 
-    bool writeSetDesktopName();
+    void writeSetDesktopName();
 
     // Like setDesktopSize, we can't just write out a cursor message
     // immediately. 
     void writeCursor();
 
     // Same for LED state message
-    bool writeLEDState();
+    void writeLEDState();
 
     // And QEMU keyboard event handshake
-    bool writeQEMUKeyEvent();
+    void writeQEMUKeyEvent();
 
     // needFakeUpdate() returns true when an immediate update is needed in
     // order to flush out pseudo-rectangles to the client.
index d936573df388e843d3da1ec5593c2a480f10bc5e..a58fd09f5bf49607efc14fe98b874672ef80c798 100644 (file)
@@ -829,6 +829,9 @@ void VNCSConnectionST::supportsContinuousUpdates()
 
 void VNCSConnectionST::supportsLEDState()
 {
+  if (client.ledState() == ledUnknown)
+    return;
+
   writer()->writeLEDState();
 }
 
@@ -1157,10 +1160,8 @@ void VNCSConnectionST::setDesktopName(const char *name)
   if (state() != RFBSTATE_NORMAL)
     return;
 
-  if (!writer()->writeSetDesktopName()) {
-    fprintf(stderr, "Client does not support desktop rename\n");
-    return;
-  }
+  if (client.supportsEncoding(pseudoEncodingDesktopName))
+    writer()->writeSetDesktopName();
 }
 
 void VNCSConnectionST::setLEDState(unsigned int ledstate)
@@ -1170,7 +1171,8 @@ void VNCSConnectionST::setLEDState(unsigned int ledstate)
 
   client.setLEDState(ledstate);
 
-  writer()->writeLEDState();
+  if (client.supportsLEDState())
+    writer()->writeLEDState();
 }
 
 void VNCSConnectionST::setSocketTimeouts()