[Spice-devel] [PATCH] channel: build adapter for public core interface

Frediano Ziglio fziglio at redhat.com
Mon Jan 11 07:50:50 PST 2016


Add wrapper functions for SpiceCoreInterface in order to present
a SpiceCoreInterfaceInternal. These functions just expect
SpiceCoreInterfaceInternal API and forward request to
SpiceCoreInterface.
This allows to change ABI details of internal one.

See comments in "channel: add interface parameters to
SpiceCoreInterfaceInternal" patch.

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 server/red-common.h |  2 --
 server/reds.c       | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 58 insertions(+), 5 deletions(-)

diff --git a/server/red-common.h b/server/red-common.h
index 40da0b1..3c54fb8 100644
--- a/server/red-common.h
+++ b/server/red-common.h
@@ -42,8 +42,6 @@
 typedef struct SpiceCoreInterfaceInternal SpiceCoreInterfaceInternal;
 
 struct SpiceCoreInterfaceInternal {
-    SpiceBaseInterface base;
-
     SpiceTimer *(*timer_add)(SpiceTimerFunc func, void *opaque);
     void (*timer_start)(SpiceTimer *timer, uint32_t ms);
     void (*timer_cancel)(SpiceTimer *timer);
diff --git a/server/reds.c b/server/reds.c
index 54a398e..d9d0e0a 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -74,6 +74,61 @@
 
 SpiceCoreInterfaceInternal *core = NULL;
 
+static SpiceCoreInterface *core_public = NULL;
+
+static SpiceTimer *adapter_timer_add(SpiceTimerFunc func, void *opaque)
+{
+    return core_public->timer_add(func, opaque);
+}
+
+static void adapter_timer_start(SpiceTimer *timer, uint32_t ms)
+{
+    core_public->timer_start(timer, ms);
+}
+
+static void adapter_timer_cancel(SpiceTimer *timer)
+{
+    core_public->timer_cancel(timer);
+}
+
+static void adapter_timer_remove(SpiceTimer *timer)
+{
+    core_public->timer_remove(timer);
+}
+
+static SpiceWatch *adapter_watch_add(int fd, int event_mask, SpiceWatchFunc func, void *opaque)
+{
+    return core_public->watch_add(fd, event_mask, func, opaque);
+}
+
+static void adapter_watch_update_mask(SpiceWatch *watch, int event_mask)
+{
+    core_public->watch_update_mask(watch, event_mask);
+}
+
+static void adapter_watch_remove(SpiceWatch *watch)
+{
+    core_public->watch_remove(watch);
+}
+
+static void adapter_channel_event(int event, SpiceChannelEventInfo *info)
+{
+    if (core_public->base.minor_version >= 3 && core_public->channel_event != NULL)
+        core_public->channel_event(event, info);
+}
+
+
+static SpiceCoreInterfaceInternal core_interface_adapter = {
+    .timer_add = adapter_timer_add,
+    .timer_start = adapter_timer_start,
+    .timer_cancel = adapter_timer_cancel,
+    .timer_remove = adapter_timer_remove,
+    .watch_add = adapter_watch_add,
+    .watch_update_mask = adapter_watch_update_mask,
+    .watch_remove = adapter_watch_remove,
+    .channel_event = adapter_channel_event,
+};
+
 static SpiceCharDeviceInstance *vdagent = NULL;
 static SpiceMigrateInstance *migration_interface = NULL;
 
@@ -177,8 +232,7 @@ static ChannelSecurityOptions *find_channel_security(int id)
 
 void reds_handle_channel_event(int event, SpiceChannelEventInfo *info)
 {
-    if (core->base.minor_version >= 3 && core->channel_event != NULL)
-        core->channel_event(event, info);
+    core->channel_event(event, info);
 
     if (event == SPICE_CHANNEL_EVENT_DISCONNECTED) {
         free(info);
@@ -3275,7 +3329,8 @@ static int do_spice_init(SpiceCoreInterface *core_interface)
         spice_warning("bad core interface version");
         goto err;
     }
-    core = (SpiceCoreInterfaceInternal *) core_interface;
+    core_public = core_interface;
+    core = &core_interface_adapter;
     reds->listen_socket = -1;
     reds->secure_listen_socket = -1;
     init_vd_agent_resources();
-- 
2.4.3



More information about the Spice-devel mailing list