Make disconnect a virtual function

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
This commit is contained in:
Frediano Ziglio 2019-05-28 19:46:39 +01:00 committed by Frediano Ziglio
parent 70367fd460
commit d5ea93d3a8
5 changed files with 7 additions and 19 deletions

View File

@ -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;

View File

@ -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()

View File

@ -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();

View File

@ -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;
}

View File

@ -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) \