[Spice-devel] [PATCH win32/vd_agent] Support for the VD_AGENT_GUEST_VERSION message

Pavel Grunt pgrunt at redhat.com
Fri Oct 24 07:05:20 PDT 2014


The agent will send an information about its version to the client
when VD_AGENT_CAP_GUEST_VERSION is set.
---
depends on http://lists.freedesktop.org/archives/spice-devel/2014-October/017669.html
---
 vdagent/vdagent.cpp | 41 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 40 insertions(+), 1 deletion(-)

diff --git a/vdagent/vdagent.cpp b/vdagent/vdagent.cpp
index aa44383..2e14f17 100644
--- a/vdagent/vdagent.cpp
+++ b/vdagent/vdagent.cpp
@@ -14,7 +14,9 @@
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
-
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
 #include "vdcommon.h"
 #include "desktop_layout.h"
 #include "display_setting.h"
@@ -122,6 +124,7 @@ private:
     void set_display_depth(uint32_t depth);
     void load_display_setting();
     bool send_announce_capabilities(bool request);
+    void send_version();
     void cleanup_in_msg();
     void cleanup();
 
@@ -835,12 +838,48 @@ bool VDAgent::handle_announce_capabilities(VDAgentAnnounceCapabilities* announce
         _client_caps_size = caps_size;
     }
     memcpy(_client_caps, announce_capabilities->caps, sizeof(_client_caps[0]) * caps_size);
+    send_version();
     if (announce_capabilities->request) {
         return send_announce_capabilities(false);
     }
     return true;
 }
 
+void VDAgent::send_version()
+{
+    wchar_t *tmp;
+    char *version_utf8;
+    int wlen, len;
+
+    if (VD_AGENT_HAS_CAPABILITY(_client_caps, _client_caps_size, VD_AGENT_CAP_GUEST_VERSION)) {
+        /* conversion from locale to utf8 */
+        if (!(wlen = MultiByteToWideChar(CP_ACP, 0, VERSION, strlen(VERSION), NULL, 0)))
+            return;
+        tmp = new wchar_t[wlen+1];
+        tmp[wlen] = 0;
+        if (!(wlen = MultiByteToWideChar(CP_ACP, 0, VERSION, strlen(VERSION), tmp, wlen))) {
+            delete [] tmp;
+            return;
+        }
+        if (!(len = WideCharToMultiByte(CP_UTF8, 0, tmp, wlen, NULL, 0, NULL, NULL))) {
+            delete [] tmp;
+            return;
+        }
+        version_utf8 = new char[len+1];
+        version_utf8[len] = 0;
+        if (!(len = WideCharToMultiByte(CP_UTF8, 0, tmp, wlen, version_utf8, len, NULL, NULL))) {
+            delete [] tmp;
+            delete [] version_utf8;
+            return;
+        }
+        delete [] tmp;
+
+        vd_printf("Sending agent version");
+        write_message(VD_AGENT_GUEST_VERSION, len + 1, version_utf8);
+        delete[] version_utf8;
+    }
+}
+
 bool VDAgent::handle_display_config(VDAgentDisplayConfig* display_config, uint32_t port)
 {
     DisplaySettingOptions disp_setting_opts;
-- 
1.9.3



More information about the Spice-devel mailing list