[Spice-devel] [spice-server v2 07/14] channel: Remove IncomingHandlerInterface

Christophe Fergeau cfergeau at redhat.com
Tue Feb 14 14:17:32 UTC 2017


This commit removes what remains of IncomingHandlerInterface. The
remaining function pointers were pointing to RedChannel vfuncs.
Moreover the IncomingHandlerInterface abstraction is unused, ie the
codebase only has a single implementation for it, so we can directly
call the relevant methods and make them static instead.

Signed-off-by: Christophe Fergeau <cfergeau at redhat.com>
---
 server/red-channel-client-private.h |  1 -
 server/red-channel-client.c         | 21 ++++++++++++---------
 server/red-channel.c                | 10 ----------
 server/red-channel.h                | 13 -------------
 4 files changed, 12 insertions(+), 33 deletions(-)

diff --git a/server/red-channel-client-private.h b/server/red-channel-client-private.h
index 5d29f32..77766d0 100644
--- a/server/red-channel-client-private.h
+++ b/server/red-channel-client-private.h
@@ -50,7 +50,6 @@ typedef struct OutgoingHandler {
 } OutgoingHandler;
 
 typedef struct IncomingHandler {
-    IncomingHandlerInterface *cb;
     void *opaque;
     uint8_t header_buf[MAX_HEADER_SIZE];
     SpiceDataHeaderOpaque header;
diff --git a/server/red-channel-client.c b/server/red-channel-client.c
index fc82faa..1e071cc 100644
--- a/server/red-channel-client.c
+++ b/server/red-channel-client.c
@@ -269,8 +269,6 @@ static void red_channel_client_constructed(GObject *object)
     RedChannelClient *self =  RED_CHANNEL_CLIENT(object);
 
     self->priv->incoming.opaque = self;
-    self->priv->incoming.cb = red_channel_get_incoming_handler(self->priv->channel);
-
     self->priv->outgoing.opaque = self;
     self->priv->outgoing.pos = 0;
     self->priv->outgoing.size = 0;
@@ -1103,15 +1101,17 @@ static int red_peer_receive(RedsStream *stream, uint8_t *buf, uint32_t size)
     return pos - buf;
 }
 
-static uint8_t *red_channel_client_parse(IncomingHandler *handler, uint8_t *message, size_t message_size,
+static uint8_t *red_channel_client_parse(RedChannelClient *rcc, uint8_t *message, size_t message_size,
                                          uint16_t message_type,
                                          size_t *size_out, message_destructor_t *free_message)
 {
+    RedChannel *channel = red_channel_client_get_channel(rcc);
+    RedChannelClass *klass = RED_CHANNEL_GET_CLASS(channel);
     uint8_t *parsed_message;
 
-    if (handler->cb->parser) {
-        parsed_message = handler->cb->parser(message, message + message_size, message_type,
-                                             SPICE_VERSION_MINOR, size_out, free_message);
+    if (klass->parser) {
+        parsed_message = klass->parser(message, message + message_size, message_type,
+                                       SPICE_VERSION_MINOR, size_out, free_message);
     } else {
         parsed_message = message;
         *size_out = message_size;
@@ -1142,6 +1142,9 @@ static void red_peer_handle_incoming(RedsStream *stream, IncomingHandler *handle
         uint8_t *parsed;
         size_t parsed_size;
         message_destructor_t parsed_free = NULL;
+        RedChannel *channel = red_channel_client_get_channel(handler->opaque);
+        RedChannelClass *klass = RED_CHANNEL_GET_CLASS(channel);
+
         if (handler->header_pos < handler->header.header_size) {
             bytes_read = red_peer_receive(stream,
                                           handler->header.data + handler->header_pos,
@@ -1186,7 +1189,7 @@ static void red_peer_handle_incoming(RedsStream *stream, IncomingHandler *handle
             }
         }
 
-        parsed = red_channel_client_parse(handler,
+        parsed = red_channel_client_parse(handler->opaque,
                                           handler->msg, msg_size,
                                           msg_type,
                                           &parsed_size, &parsed_free);
@@ -1198,8 +1201,8 @@ static void red_peer_handle_incoming(RedsStream *stream, IncomingHandler *handle
             red_channel_client_disconnect(handler->opaque);
             return;
         }
-        ret_handle = handler->cb->handle_message(handler->opaque, msg_type,
-                                                 parsed_size, parsed);
+        ret_handle = klass->handle_message(handler->opaque, msg_type,
+                                           parsed_size, parsed);
         if (parsed_free != NULL) {
             parsed_free(parsed);
         }
diff --git a/server/red-channel.c b/server/red-channel.c
index f7cf589..0f73c7e 100644
--- a/server/red-channel.c
+++ b/server/red-channel.c
@@ -91,8 +91,6 @@ struct RedChannelPrivate
     RedChannelCapabilities local_caps;
     uint32_t migration_flags;
 
-    IncomingHandlerInterface incoming_cb;
-
     ClientCbs client_cbs;
     // TODO: when different channel_clients are in different threads
     // from Channel -> need to protect!
@@ -218,9 +216,6 @@ red_channel_constructed(GObject *object)
                  klass->alloc_recv_buf && klass->release_recv_buf);
     spice_assert(klass->handle_migrate_data ||
                  !(self->priv->migration_flags & SPICE_MIGRATE_NEED_DATA_TRANSFER));
-
-    self->priv->incoming_cb.handle_message = (handle_message_proc)klass->handle_message;
-    self->priv->incoming_cb.parser = klass->parser;
 }
 
 static void red_channel_client_default_connect(RedChannel *channel, RedClient *client,
@@ -760,11 +755,6 @@ void red_channel_send_item(RedChannel *self, RedChannelClient *rcc, RedPipeItem
     klass->send_item(rcc, item);
 }
 
-IncomingHandlerInterface* red_channel_get_incoming_handler(RedChannel *self)
-{
-    return &self->priv->incoming_cb;
-}
-
 void red_channel_reset_thread_id(RedChannel *self)
 {
     self->priv->thread_id = pthread_self();
diff --git a/server/red-channel.h b/server/red-channel.h
index 25ae1a2..80910e3 100644
--- a/server/red-channel.h
+++ b/server/red-channel.h
@@ -59,15 +59,6 @@ struct SpiceDataHeaderOpaque {
     get_msg_size_proc get_msg_size;
 };
 
-typedef int (*handle_message_proc)(void *opaque,
-                                   uint16_t type, uint32_t size, uint8_t *msg);
-
-typedef struct IncomingHandlerInterface {
-    // 'parser' is optional and will not be used if NULL
-    spice_parse_channel_func_t parser;
-    handle_message_proc handle_message;
-} IncomingHandlerInterface;
-
 typedef struct RedChannel RedChannel;
 typedef struct RedChannelClient RedChannelClient;
 typedef struct RedClient RedClient;
@@ -275,10 +266,6 @@ void red_channel_send_item(RedChannel *self, RedChannelClient *rcc, RedPipeItem
 void red_channel_reset_thread_id(RedChannel *self);
 StatNodeRef red_channel_get_stat_node(RedChannel *channel);
 
-/* FIXME: does this even need to be in RedChannel? It's really only used in
- * RedChannelClient. Needs refactoring */
-IncomingHandlerInterface* red_channel_get_incoming_handler(RedChannel *self);
-
 const RedChannelCapabilities* red_channel_get_local_capabilities(RedChannel *self);
 
 /*
-- 
2.9.3



More information about the Spice-devel mailing list