[Spice-devel] [PATCH spice-gtk 2/2] Support for VD_AGENT_INFORMATION message
Pavel Grunt
pgrunt at redhat.com
Thu Oct 23 09:29:02 PDT 2014
The client will ask the agent for its version and save the agent's answer
in the "agent-version" property of SpiceSession
---
depends on http://lists.freedesktop.org/archives/spice-devel/2014-October/017654.html
and on http://lists.freedesktop.org/archives/spice-devel/2014-October/017655.html
or on http://lists.freedesktop.org/archives/spice-devel/2014-October/017656.html
---
gtk/channel-main.c | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/gtk/channel-main.c b/gtk/channel-main.c
index 1ad090f..f7fd3c1 100644
--- a/gtk/channel-main.c
+++ b/gtk/channel-main.c
@@ -187,6 +187,7 @@ static const char *agent_msg_types[] = {
[ VD_AGENT_CLIPBOARD_GRAB ] = "clipboard grab",
[ VD_AGENT_CLIPBOARD_REQUEST ] = "clipboard request",
[ VD_AGENT_CLIPBOARD_RELEASE ] = "clipboard release",
+ [ VD_AGENT_INFORMATION ] = "version informations",
};
static const char *agent_caps[] = {
@@ -1149,6 +1150,19 @@ static void agent_announce_caps(SpiceMainChannel *channel)
/* any context: the message is not flushed immediately,
you can wakeup() the channel coroutine or send_msg_queue() */
+static void agent_version_info(SpiceMainChannel *channel)
+{
+ SpiceMainChannelPrivate *c = channel->priv;
+ VDAgentInformation msg;
+ if (!c->agent_connected)
+ return;
+
+ msg.type = VD_AGENT_INFORMATION_VERSION;
+ agent_msg_queue(channel, VD_AGENT_INFORMATION, sizeof(VDAgentInformation), &msg);
+}
+
+/* any context: the message is not flushed immediately,
+ you can wakeup() the channel coroutine or send_msg_queue() */
static void agent_clipboard_grab(SpiceMainChannel *channel, guint selection,
guint32 *types, int ntypes)
{
@@ -1354,6 +1368,7 @@ static void agent_start(SpiceMainChannel *channel)
if (c->agent_connected) {
agent_announce_caps(channel);
+ agent_version_info(channel);
agent_send_msg_queue(channel);
}
}
@@ -1745,6 +1760,16 @@ static void spice_main_set_max_clipboard(SpiceMainChannel *self, gint max)
agent_max_clipboard(self);
spice_channel_wakeup(SPICE_CHANNEL(self), FALSE);
}
+/* coroutine context */
+static void agent_information(SpiceChannel *channel, VDAgentInformation *msg)
+{
+ SpiceSession *session = spice_channel_get_session(channel);
+
+ if (msg->type == VD_AGENT_INFORMATION_VERSION) {
+ SPICE_DEBUG("agent version: %s", (gchar *) msg->data);
+ spice_session_set_agent_version(session, (gchar *) msg->data);
+ }
+}
/* coroutine context */
static void main_agent_handle_msg(SpiceChannel *channel,
@@ -1855,6 +1880,12 @@ static void main_agent_handle_msg(SpiceChannel *channel,
reply->error == VD_AGENT_SUCCESS ? "success" : "error");
break;
}
+ case VD_AGENT_INFORMATION:
+ {
+ VDAgentInformation *info = payload;
+ agent_information(channel, info);
+ break;
+ }
case VD_AGENT_FILE_XFER_STATUS:
file_xfer_handle_status(self, payload);
break;
--
1.9.3
More information about the Spice-devel
mailing list