[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