From d5ea93d3a8d4463eddb2fdb233d3a5a5640a155b Mon Sep 17 00:00:00 2001 From: Frediano Ziglio Date: Tue, 28 May 2019 19:46:39 +0100 Subject: [PATCH] Make disconnect a virtual function Signed-off-by: Frediano Ziglio --- server/dcc.h | 1 + server/display-channel.cpp | 8 +++----- server/red-channel-client.h | 2 +- server/red-channel.cpp | 13 ++----------- server/red-channel.h | 2 -- 5 files changed, 7 insertions(+), 19 deletions(-) diff --git a/server/dcc.h b/server/dcc.h index e7b7970a..8a4804cd 100644 --- a/server/dcc.h +++ b/server/dcc.h @@ -43,6 +43,7 @@ public: SpiceImageCompression image_compression, spice_wan_compression_t jpeg_state, spice_wan_compression_t zlib_glz_state); + virtual void disconnect() override; protected: virtual bool handle_message(uint16_t type, uint32_t size, void *message) override; diff --git a/server/display-channel.cpp b/server/display-channel.cpp index 5c4d0e50..c2460136 100644 --- a/server/display-channel.cpp +++ b/server/display-channel.cpp @@ -26,7 +26,6 @@ G_DEFINE_TYPE(DisplayChannel, display_channel, TYPE_COMMON_GRAPHICS_CHANNEL) static void display_channel_connect(RedChannel *channel, RedClient *client, RedStream *stream, int migration, RedChannelCapabilities *caps); -static void display_channel_disconnect(RedChannelClient *rcc); enum { PROP0, @@ -2504,7 +2503,6 @@ display_channel_class_init(DisplayChannelClass *klass) // client callbacks channel_class->connect = display_channel_connect; - channel_class->disconnect = display_channel_disconnect; g_object_class_install_property(object_class, PROP_N_SURFACES, @@ -2616,13 +2614,13 @@ display_channel_connect(RedChannel *channel, RedClient *client, dcc_start(dcc); } -static void display_channel_disconnect(RedChannelClient *rcc) +void DisplayChannelClient::disconnect() { - DisplayChannel *display = DISPLAY_CHANNEL(rcc->get_channel()); + DisplayChannel *display = DISPLAY_CHANNEL(get_channel()); guest_set_client_capabilities(display); - rcc->disconnect(); + RedChannelClient::disconnect(); } void DisplayChannelClient::migrate() diff --git a/server/red-channel-client.h b/server/red-channel-client.h index 24ecd267..be3909e6 100644 --- a/server/red-channel-client.h +++ b/server/red-channel-client.h @@ -115,7 +115,7 @@ public: void push(); void receive(); void send(); - void disconnect(); + virtual void disconnect(); /* Note: the valid times to call red_channel_get_marshaller are just during send_item callback. */ SpiceMarshaller *get_marshaller(); diff --git a/server/red-channel.cpp b/server/red-channel.cpp index 7d9c8537..513310b9 100644 --- a/server/red-channel.cpp +++ b/server/red-channel.cpp @@ -216,11 +216,6 @@ static void red_channel_client_default_connect(RedChannel *channel, RedClient *c spice_error("not implemented"); } -static void red_channel_client_default_disconnect(RedChannelClient *base) -{ - base->disconnect(); -} - static void red_channel_class_init(RedChannelClass *klass) { @@ -300,7 +295,6 @@ red_channel_class_init(RedChannelClass *klass) g_object_class_install_property(object_class, PROP_DISPATCHER, spec); klass->connect = red_channel_client_default_connect; - klass->disconnect = red_channel_client_default_disconnect; } static void @@ -732,18 +726,15 @@ typedef struct RedMessageDisconnect { static void handle_dispatcher_disconnect(void *opaque, void *payload) { RedMessageDisconnect *msg = (RedMessageDisconnect*) payload; - RedChannel *channel = msg->rcc->get_channel(); - RedChannelClass *klass = RED_CHANNEL_GET_CLASS(channel); - klass->disconnect(msg->rcc); + msg->rcc->disconnect(); } void RedChannel::disconnect_client(RedChannelClient *rcc) { if (priv->dispatcher == NULL || pthread_equal(pthread_self(), priv->thread_id)) { - RedChannelClass *klass = RED_CHANNEL_GET_CLASS(this); - klass->disconnect(rcc); + rcc->disconnect(); return; } diff --git a/server/red-channel.h b/server/red-channel.h index 1ced241f..6d3d2ba0 100644 --- a/server/red-channel.h +++ b/server/red-channel.h @@ -50,7 +50,6 @@ typedef uint64_t (*channel_handle_migrate_data_get_serial_proc)(RedChannelClient typedef void (*channel_client_connect_proc)(RedChannel *channel, RedClient *client, RedStream *stream, int migration, RedChannelCapabilities *caps); -typedef void (*channel_client_disconnect_proc)(RedChannelClient *base); static inline gboolean test_capability(const uint32_t *caps, int num_caps, uint32_t cap) @@ -78,7 +77,6 @@ struct RedChannelClass * They should be called from the thread that handles the RedClient */ channel_client_connect_proc connect; - channel_client_disconnect_proc disconnect; }; #define FOREACH_CLIENT(_channel, _data) \