[Spice-devel] [PATCH spice-gtk] Support name & uuid
Marc-André Lureau
marcandre.lureau at gmail.com
Fri Mar 2 04:48:54 PST 2012
Allows a client to identify the server it is connected to.
---
common/messages.h | 9 ++++++
gtk/channel-main.c | 28 +++++++++++++++++++
gtk/spice-session-priv.h | 5 +++-
gtk/spice-session.c | 63 +++++++++++++++++++++++++++++++++++++++++++
gtk/spice-util-priv.h | 3 ++
gtk/spice-util.c | 11 +++++++
python_modules/demarshal.py | 2 +-
spice-protocol | 2 +-
spice.proto | 9 ++++++
9 files changed, 129 insertions(+), 3 deletions(-)
diff --git a/common/messages.h b/common/messages.h
index 4a69c35..01689cd 100644
--- a/common/messages.h
+++ b/common/messages.h
@@ -156,6 +156,15 @@ typedef struct SpiceMsgChannels {
SpiceChannelId channels[0];
} SpiceMsgChannels;
+typedef struct SpiceMsgMainName {
+ uint32_t name_len;
+ uint8_t name[0];
+} SpiceMsgMainName;
+
+typedef struct SpiceMsgMainUuid {
+ uint8_t uuid[16];
+} SpiceMsgMainUuid;
+
typedef struct SpiceMsgMainMouseMode {
uint32_t supported_modes;
uint32_t current_mode;
diff --git a/gtk/channel-main.c b/gtk/channel-main.c
index 0689368..7eac3c1 100644
--- a/gtk/channel-main.c
+++ b/gtk/channel-main.c
@@ -20,6 +20,7 @@
#include "spice-common.h"
#include "spice-marshal.h"
+#include "spice-util-priv.h"
#include "spice-channel-priv.h"
#include "spice-session-priv.h"
@@ -161,6 +162,8 @@ static void spice_main_channel_init(SpiceMainChannel *channel)
c->agent_msg_queue = g_queue_new();
spice_channel_set_capability(SPICE_CHANNEL(channel), SPICE_MAIN_CAP_SEMI_SEAMLESS_MIGRATE);
+ spice_channel_set_capability(SPICE_CHANNEL(channel), SPICE_MAIN_CAP_NAME);
+ spice_channel_set_capability(SPICE_CHANNEL(channel), SPICE_MAIN_CAP_UUID);
}
static void spice_main_get_property(GObject *object,
@@ -1143,6 +1146,29 @@ static void main_handle_init(SpiceChannel *channel, SpiceMsgIn *in)
}
/* coroutine context */
+static void main_handle_name(SpiceChannel *channel, SpiceMsgIn *in)
+{
+ SpiceMsgMainName *name = spice_msg_in_parsed(in);
+ SpiceSession *session = spice_channel_get_session(channel);
+
+ SPICE_DEBUG("server name: %s", name->name);
+ spice_session_set_name(session, (const gchar *)name->name);
+}
+
+/* coroutine context */
+static void main_handle_uuid(SpiceChannel *channel, SpiceMsgIn *in)
+{
+ SpiceMsgMainUuid *uuid = spice_msg_in_parsed(in);
+ SpiceSession *session = spice_channel_get_session(channel);
+ gchar *uuid_str = spice_uuid_to_string(uuid->uuid);
+
+ SPICE_DEBUG("server uuid: %s", uuid_str);
+ spice_session_set_uuid(session, uuid->uuid);
+
+ g_free(uuid_str);
+}
+
+/* coroutine context */
static void main_handle_mm_time(SpiceChannel *channel, SpiceMsgIn *in)
{
SpiceSession *session;
@@ -1669,6 +1695,8 @@ static void main_handle_migrate_cancel(SpiceChannel *channel,
static const spice_msg_handler main_handlers[] = {
[ SPICE_MSG_MAIN_INIT ] = main_handle_init,
+ [ SPICE_MSG_MAIN_NAME ] = main_handle_name,
+ [ SPICE_MSG_MAIN_UUID ] = main_handle_uuid,
[ SPICE_MSG_MAIN_CHANNELS_LIST ] = main_handle_channels_list,
[ SPICE_MSG_MAIN_MOUSE_MODE ] = main_handle_mouse_mode,
[ SPICE_MSG_MAIN_MULTI_MEDIA_TIME ] = main_handle_mm_time,
diff --git a/gtk/spice-session-priv.h b/gtk/spice-session-priv.h
index a814cfe..5cef264 100644
--- a/gtk/spice-session-priv.h
+++ b/gtk/spice-session-priv.h
@@ -92,7 +92,8 @@ struct _SpiceSessionPrivate {
int glz_window_size;
uint32_t pci_ram_size;
uint32_t display_channels_count;
-
+ guint8 uuid[16];
+ gchar *name;
/* associated objects */
SpiceAudio *audio_manager;
@@ -141,6 +142,8 @@ void spice_session_images_clear(SpiceSession *session);
void spice_session_migrate_end(SpiceSession *session);
gboolean spice_session_migrate_after_main_init(SpiceSession *session);
SpiceChannel* spice_session_lookup_channel(SpiceSession *session, gint id, gint type);
+void spice_session_set_uuid(SpiceSession *session, guint8 uuid[16]);
+void spice_session_set_name(SpiceSession *session, const gchar *name);
G_END_DECLS
diff --git a/gtk/spice-session.c b/gtk/spice-session.c
index 991fb60..420601d 100644
--- a/gtk/spice-session.c
+++ b/gtk/spice-session.c
@@ -103,6 +103,8 @@ enum {
PROP_READ_ONLY,
PROP_CACHE_SIZE,
PROP_GLZ_WINDOW_SIZE,
+ PROP_UUID,
+ PROP_NAME,
};
/* signals */
@@ -416,6 +418,12 @@ static void spice_session_get_property(GObject *gobject,
case PROP_GLZ_WINDOW_SIZE:
g_value_set_int(value, s->glz_window_size);
break;
+ case PROP_NAME:
+ g_value_set_string(value, s->name);
+ break;
+ case PROP_UUID:
+ g_value_set_pointer(value, s->uuid);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
break;
@@ -957,6 +965,33 @@ static void spice_session_class_init(SpiceSessionClass *klass)
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
+ /**
+ * SpiceSession:name:
+ *
+ * Spice server name.
+ **/
+ g_object_class_install_property
+ (gobject_class, PROP_NAME,
+ g_param_spec_string("name",
+ "Name",
+ "Spice server name",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * SpiceSession:uuid:
+ *
+ * Spice server uuid.
+ **/
+ g_object_class_install_property
+ (gobject_class, PROP_UUID,
+ g_param_spec_pointer("uuid",
+ "UUID",
+ "Spice server uuid",
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
g_type_class_add_private(klass, sizeof(SpiceSessionPrivate));
}
@@ -1346,6 +1381,11 @@ void spice_session_disconnect(SpiceSession *session)
}
s->connection_id = 0;
+
+ g_free(s->name);
+ s->name = NULL;
+ memset(s->uuid, 0, sizeof(s->uuid));
+
/* we leave disconnecting = TRUE, so that spice_channel_destroy()
is not called multiple times on channels that are in pending
destroy state. */
@@ -1740,3 +1780,26 @@ void spice_session_set_caches_hints(SpiceSession *session,
s->glz_window_size = MAX(MIN_GLZ_WINDOW_SIZE_DEFAULT, s->glz_window_size);
}
}
+
+G_GNUC_INTERNAL
+void spice_session_set_uuid(SpiceSession *session, guint8 uuid[16])
+{
+ SpiceSessionPrivate *s = SPICE_SESSION_GET_PRIVATE(session);
+
+ g_return_if_fail(s != NULL);
+ memcpy(s->uuid, uuid, sizeof(s->uuid));
+
+ g_object_notify(G_OBJECT(session), "uuid");
+}
+
+G_GNUC_INTERNAL
+void spice_session_set_name(SpiceSession *session, const gchar *name)
+{
+ SpiceSessionPrivate *s = SPICE_SESSION_GET_PRIVATE(session);
+
+ g_return_if_fail(s != NULL);
+ g_free(s->name);
+ s->name = g_strdup(name);
+
+ g_object_notify(G_OBJECT(session), "name");
+}
diff --git a/gtk/spice-util-priv.h b/gtk/spice-util-priv.h
index 90b437c..ee70f64 100644
--- a/gtk/spice-util-priv.h
+++ b/gtk/spice-util-priv.h
@@ -22,7 +22,10 @@
G_BEGIN_DECLS
+#define UUID_FMT "%02hhx%02hhx%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"
+
gboolean spice_strv_contains(const GStrv strv, const gchar *str);
+gchar* spice_uuid_to_string(const guint8 uuid[16]);
G_END_DECLS
diff --git a/gtk/spice-util.c b/gtk/spice-util.c
index f2f30e8..65454ef 100644
--- a/gtk/spice-util.c
+++ b/gtk/spice-util.c
@@ -20,6 +20,7 @@
# include "config.h"
#endif
#include <glib-object.h>
+#include "spice-util-priv.h"
#include "spice-util.h"
/**
@@ -76,6 +77,16 @@ gboolean spice_strv_contains(const GStrv strv, const gchar *str)
return FALSE;
}
+G_GNUC_INTERNAL
+gchar* spice_uuid_to_string(const guint8 uuid[16])
+{
+ return g_strdup_printf(UUID_FMT, uuid[0], uuid[1],
+ uuid[2], uuid[3], uuid[4], uuid[5],
+ uuid[6], uuid[7], uuid[8], uuid[9],
+ uuid[10], uuid[11], uuid[12], uuid[13],
+ uuid[14], uuid[15]);
+}
+
typedef struct {
GObject *instance;
GObject *observer;
diff --git a/python_modules/demarshal.py b/python_modules/demarshal.py
index 9847fb4..c999bd3 100644
--- a/python_modules/demarshal.py
+++ b/python_modules/demarshal.py
@@ -664,7 +664,7 @@ def read_array_len(writer, prefix, array, dest, scope, is_ptr):
nelements = "%s__array__nelements" % prefix
else:
nelements = "%s__nelements" % prefix
- if dest.is_toplevel():
+ if dest.is_toplevel() and scope.variable_defined(nelements):
return nelements # Already there for toplevel, need not recalculate
element_type = array.element_type
scope.variable_def("uint32_t", nelements)
diff --git a/spice-protocol b/spice-protocol
index d5edafd..37593b4 160000
--- a/spice-protocol
+++ b/spice-protocol
@@ -1 +1 @@
-Subproject commit d5edafd28ab762b1b5f663aec449d3e3743f1184
+Subproject commit 37593b420f4b14a95ac2d6d3aa5d62dd5ee3eb7d
diff --git a/spice.proto b/spice.proto
index 28a9435..da01a94 100644
--- a/spice.proto
+++ b/spice.proto
@@ -221,6 +221,15 @@ channel MainChannel : BaseChannel {
Empty migrate_end;
+ message {
+ uint32 name_len;
+ uint8 name[name_len];
+ } name;
+
+ message {
+ uint8 uuid[16];
+ } uuid;
+
client:
message {
uint64 cache_size;
--
1.7.7.6
More information about the Spice-devel
mailing list