mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2025-12-26 14:41:25 +00:00
channel: Move RedChannel::on_disconnect to RedChannelClient
This vfunc only has a RedChannelClient * argument, and most of the time, it operates on RedChannelClient, not on RedChannel. Moreover, the only time it's used is from RedChannelClient. This commit moves the vfunc to RedChannelClient, which seems like a better fit for it. Signed-off-by: Christophe Fergeau <cfergeau@redhat.com> Acked-by: Frediano Ziglio <fziglio@redhat.com>
This commit is contained in:
parent
14aee7cd74
commit
5dbfbb4d78
@ -48,10 +48,16 @@ struct CursorChannelClientPrivate
|
||||
uint32_t cursor_cache_items;
|
||||
};
|
||||
|
||||
static void cursor_channel_client_on_disconnect(RedChannelClient *rcc);
|
||||
|
||||
static void
|
||||
cursor_channel_client_class_init(CursorChannelClientClass *klass)
|
||||
{
|
||||
RedChannelClientClass *client_class = RED_CHANNEL_CLIENT_CLASS(klass);
|
||||
|
||||
g_type_class_add_private(klass, sizeof(CursorChannelClientPrivate));
|
||||
|
||||
client_class->on_disconnect = cursor_channel_client_on_disconnect;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -75,7 +81,7 @@ void cursor_channel_client_reset_cursor_cache(RedChannelClient *rcc)
|
||||
red_cursor_cache_reset(CURSOR_CHANNEL_CLIENT(rcc), CLIENT_CURSOR_CACHE_SIZE);
|
||||
}
|
||||
|
||||
void cursor_channel_client_on_disconnect(RedChannelClient *rcc)
|
||||
static void cursor_channel_client_on_disconnect(RedChannelClient *rcc)
|
||||
{
|
||||
if (!rcc) {
|
||||
return;
|
||||
|
||||
@ -66,7 +66,6 @@ CursorChannelClient* cursor_channel_client_new(CursorChannel *cursor,
|
||||
RedChannelCapabilities *caps);
|
||||
|
||||
void cursor_channel_client_reset_cursor_cache(RedChannelClient *rcc);
|
||||
void cursor_channel_client_on_disconnect(RedChannelClient *rcc);
|
||||
RedCacheItem* cursor_channel_client_cache_find(CursorChannelClient *ccc, uint64_t id);
|
||||
int cursor_channel_client_cache_add(CursorChannelClient *ccc, uint64_t id, size_t size);
|
||||
|
||||
|
||||
@ -448,7 +448,6 @@ cursor_channel_class_init(CursorChannelClass *klass)
|
||||
channel_class->parser = spice_get_client_channel_parser(SPICE_CHANNEL_CURSOR, NULL);
|
||||
channel_class->handle_message = red_channel_client_handle_message;
|
||||
|
||||
channel_class->on_disconnect = cursor_channel_client_on_disconnect;
|
||||
channel_class->send_item = cursor_channel_send_item;
|
||||
}
|
||||
|
||||
|
||||
22
server/dcc.c
22
server/dcc.c
@ -42,6 +42,7 @@ enum
|
||||
|
||||
static void on_display_video_codecs_update(GObject *gobject, GParamSpec *pspec, gpointer user_data);
|
||||
static bool dcc_config_socket(RedChannelClient *rcc);
|
||||
static void dcc_on_disconnect(RedChannelClient *rcc);
|
||||
|
||||
static void
|
||||
display_channel_client_get_property(GObject *object,
|
||||
@ -133,6 +134,7 @@ display_channel_client_class_init(DisplayChannelClientClass *klass)
|
||||
object_class->finalize = display_channel_client_finalize;
|
||||
|
||||
client_class->config_socket = dcc_config_socket;
|
||||
client_class->on_disconnect = dcc_on_disconnect;
|
||||
|
||||
g_object_class_install_property(object_class,
|
||||
PROP_IMAGE_COMPRESSION,
|
||||
@ -1429,6 +1431,26 @@ static bool dcc_config_socket(RedChannelClient *rcc)
|
||||
return common_channel_client_config_socket(rcc);
|
||||
}
|
||||
|
||||
static void dcc_on_disconnect(RedChannelClient *rcc)
|
||||
{
|
||||
DisplayChannel *display;
|
||||
DisplayChannelClient *dcc;
|
||||
|
||||
spice_debug("trace");
|
||||
spice_return_if_fail(rcc != NULL);
|
||||
|
||||
dcc = DISPLAY_CHANNEL_CLIENT(rcc);
|
||||
display = DCC_TO_DC(dcc);
|
||||
|
||||
dcc_stop(dcc); // TODO: start/stop -> connect/disconnect?
|
||||
display_channel_compress_stats_print(display);
|
||||
|
||||
// this was the last channel client
|
||||
spice_debug("#draw=%d, #glz_draw=%d",
|
||||
display->priv->drawable_count,
|
||||
display->priv->encoder_shared_data.glz_drawable_count);
|
||||
}
|
||||
|
||||
gboolean dcc_is_low_bandwidth(DisplayChannelClient *dcc)
|
||||
{
|
||||
return dcc->is_low_bandwidth;
|
||||
|
||||
@ -2189,26 +2189,6 @@ void display_channel_create_surface(DisplayChannel *display, uint32_t surface_id
|
||||
send_create_surface(display, surface_id, data_is_valid);
|
||||
}
|
||||
|
||||
static void on_disconnect(RedChannelClient *rcc)
|
||||
{
|
||||
DisplayChannel *display;
|
||||
DisplayChannelClient *dcc;
|
||||
|
||||
spice_debug("trace");
|
||||
spice_return_if_fail(rcc != NULL);
|
||||
|
||||
dcc = DISPLAY_CHANNEL_CLIENT(rcc);
|
||||
display = DCC_TO_DC(dcc);
|
||||
|
||||
dcc_stop(dcc); // TODO: start/stop -> connect/disconnect?
|
||||
display_channel_compress_stats_print(display);
|
||||
|
||||
// this was the last channel client
|
||||
spice_debug("#draw=%d, #glz_draw=%d",
|
||||
display->priv->drawable_count,
|
||||
display->priv->encoder_shared_data.glz_drawable_count);
|
||||
}
|
||||
|
||||
static bool handle_migrate_flush_mark(RedChannelClient *rcc)
|
||||
{
|
||||
RedChannel *channel = red_channel_client_get_channel(rcc);
|
||||
@ -2510,7 +2490,6 @@ display_channel_class_init(DisplayChannelClass *klass)
|
||||
channel_class->parser = spice_get_client_channel_parser(SPICE_CHANNEL_DISPLAY, NULL);
|
||||
channel_class->handle_message = dcc_handle_message;
|
||||
|
||||
channel_class->on_disconnect = on_disconnect;
|
||||
channel_class->send_item = dcc_send_item;
|
||||
channel_class->handle_migrate_flush_mark = handle_migrate_flush_mark;
|
||||
channel_class->handle_migrate_data = handle_migrate_data;
|
||||
|
||||
@ -63,6 +63,14 @@ inputs_channel_client_release_msg_rcv_buf(RedChannelClient *rcc,
|
||||
{
|
||||
}
|
||||
|
||||
static void inputs_channel_client_on_disconnect(RedChannelClient *rcc)
|
||||
{
|
||||
if (!rcc) {
|
||||
return;
|
||||
}
|
||||
inputs_release_keys(INPUTS_CHANNEL(red_channel_client_get_channel(rcc)));
|
||||
}
|
||||
|
||||
static void
|
||||
inputs_channel_client_class_init(InputsChannelClientClass *klass)
|
||||
{
|
||||
@ -72,6 +80,7 @@ inputs_channel_client_class_init(InputsChannelClientClass *klass)
|
||||
|
||||
client_class->alloc_recv_buf = inputs_channel_client_alloc_msg_rcv_buf;
|
||||
client_class->release_recv_buf = inputs_channel_client_release_msg_rcv_buf;
|
||||
client_class->on_disconnect = inputs_channel_client_on_disconnect;
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@ -405,7 +405,7 @@ static bool inputs_channel_handle_message(RedChannelClient *rcc, uint16_t type,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void inputs_release_keys(InputsChannel *inputs)
|
||||
void inputs_release_keys(InputsChannel *inputs)
|
||||
{
|
||||
int i;
|
||||
SpiceKbdState *st;
|
||||
@ -434,14 +434,6 @@ static void inputs_release_keys(InputsChannel *inputs)
|
||||
}
|
||||
}
|
||||
|
||||
static void inputs_channel_on_disconnect(RedChannelClient *rcc)
|
||||
{
|
||||
if (!rcc) {
|
||||
return;
|
||||
}
|
||||
inputs_release_keys(INPUTS_CHANNEL(red_channel_client_get_channel(rcc)));
|
||||
}
|
||||
|
||||
static void inputs_pipe_add_init(RedChannelClient *rcc)
|
||||
{
|
||||
RedInputsInitPipeItem *item = spice_malloc(sizeof(RedInputsInitPipeItem));
|
||||
@ -594,7 +586,6 @@ inputs_channel_class_init(InputsChannelClass *klass)
|
||||
channel_class->handle_message = inputs_channel_handle_message;
|
||||
|
||||
/* channel callbacks */
|
||||
channel_class->on_disconnect = inputs_channel_on_disconnect;
|
||||
channel_class->send_item = inputs_channel_send_item;
|
||||
channel_class->handle_migrate_data = inputs_channel_handle_migrate_data;
|
||||
channel_class->handle_migrate_flush_mark = inputs_channel_handle_migrate_flush_mark;
|
||||
|
||||
@ -58,6 +58,7 @@ void inputs_channel_detach_tablet(InputsChannel *inputs, SpiceTabletInstance *ta
|
||||
RedsState* spice_tablet_state_get_server(SpiceTabletState *dev);
|
||||
RedsState* spice_kbd_state_get_server(SpiceKbdState *dev);
|
||||
gboolean inputs_channel_is_src_during_migrate(InputsChannel *inputs);
|
||||
void inputs_release_keys(InputsChannel *inputs);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
||||
@ -189,6 +189,17 @@ main_channel_client_release_msg_rcv_buf(RedChannelClient *rcc,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* When the main channel is disconnected, disconnect the entire client.
|
||||
*/
|
||||
static void main_channel_client_on_disconnect(RedChannelClient *rcc)
|
||||
{
|
||||
RedsState *reds = red_channel_get_server(red_channel_client_get_channel(rcc));
|
||||
spice_printerr("rcc=%p", rcc);
|
||||
main_dispatcher_client_disconnect(reds_get_main_dispatcher(reds),
|
||||
red_channel_client_get_client(rcc));
|
||||
}
|
||||
|
||||
static void main_channel_client_class_init(MainChannelClientClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS(klass);
|
||||
@ -201,6 +212,7 @@ static void main_channel_client_class_init(MainChannelClientClass *klass)
|
||||
|
||||
client_class->alloc_recv_buf = main_channel_client_alloc_msg_rcv_buf;
|
||||
client_class->release_recv_buf = main_channel_client_release_msg_rcv_buf;
|
||||
client_class->on_disconnect = main_channel_client_on_disconnect;
|
||||
|
||||
g_object_class_install_property(object_class,
|
||||
PROP_CONNECTION_ID,
|
||||
|
||||
@ -49,17 +49,6 @@ int main_channel_is_connected(MainChannel *main_chan)
|
||||
return red_channel_is_connected(RED_CHANNEL(main_chan));
|
||||
}
|
||||
|
||||
/*
|
||||
* When the main channel is disconnected, disconnect the entire client.
|
||||
*/
|
||||
static void main_channel_client_on_disconnect(RedChannelClient *rcc)
|
||||
{
|
||||
RedsState *reds = red_channel_get_server(red_channel_client_get_channel(rcc));
|
||||
spice_printerr("rcc=%p", rcc);
|
||||
main_dispatcher_client_disconnect(reds_get_main_dispatcher(reds),
|
||||
red_channel_client_get_client(rcc));
|
||||
}
|
||||
|
||||
RedClient *main_channel_get_client_by_link_id(MainChannel *main_chan, uint32_t connection_id)
|
||||
{
|
||||
RedChannelClient *rcc;
|
||||
@ -315,7 +304,6 @@ main_channel_class_init(MainChannelClass *klass)
|
||||
channel_class->handle_message = main_channel_handle_message;
|
||||
|
||||
/* channel callbacks */
|
||||
channel_class->on_disconnect = main_channel_client_on_disconnect;
|
||||
channel_class->send_item = main_channel_client_send_item;
|
||||
channel_class->handle_migrate_flush_mark = main_channel_handle_migrate_flush_mark;
|
||||
channel_class->handle_migrate_data = main_channel_handle_migrate_data;
|
||||
|
||||
@ -1665,6 +1665,13 @@ void red_channel_client_push_set_ack(RedChannelClient *rcc)
|
||||
red_channel_client_pipe_add_type(rcc, RED_PIPE_ITEM_TYPE_SET_ACK);
|
||||
}
|
||||
|
||||
static void red_channel_client_on_disconnect(RedChannelClient *rcc)
|
||||
{
|
||||
RedChannelClientClass *klass = RED_CHANNEL_CLIENT_GET_CLASS(rcc);
|
||||
|
||||
klass->on_disconnect(rcc);
|
||||
}
|
||||
|
||||
void red_channel_client_disconnect(RedChannelClient *rcc)
|
||||
{
|
||||
RedChannel *channel = rcc->priv->channel;
|
||||
@ -1691,7 +1698,7 @@ void red_channel_client_disconnect(RedChannelClient *rcc)
|
||||
rcc->priv->connectivity_monitor.timer = NULL;
|
||||
}
|
||||
red_channel_remove_client(channel, rcc);
|
||||
red_channel_on_disconnect(channel, rcc);
|
||||
red_channel_client_on_disconnect(rcc);
|
||||
}
|
||||
|
||||
gboolean red_channel_client_is_blocked(RedChannelClient *rcc)
|
||||
|
||||
@ -168,6 +168,8 @@ struct RedChannelClientClass
|
||||
bool (*config_socket)(RedChannelClient *rcc);
|
||||
uint8_t *(*alloc_recv_buf)(RedChannelClient *channel, uint16_t type, uint32_t size);
|
||||
void (*release_recv_buf)(RedChannelClient *channel, uint16_t type, uint32_t size, uint8_t *msg);
|
||||
|
||||
void (*on_disconnect)(RedChannelClient *rcc);
|
||||
};
|
||||
|
||||
#define SPICE_SERVER_ERROR spice_server_error_quark()
|
||||
|
||||
@ -198,7 +198,6 @@ red_channel_constructed(GObject *object)
|
||||
|
||||
G_OBJECT_CLASS(red_channel_parent_class)->constructed(object);
|
||||
|
||||
spice_assert(klass->on_disconnect);
|
||||
spice_assert(klass->handle_migrate_data ||
|
||||
!(self->priv->migration_flags & SPICE_MIGRATE_NEED_DATA_TRANSFER));
|
||||
}
|
||||
@ -692,13 +691,6 @@ SpiceCoreInterfaceInternal* red_channel_get_core_interface(RedChannel *channel)
|
||||
return channel->priv->core;
|
||||
}
|
||||
|
||||
void red_channel_on_disconnect(RedChannel *self, RedChannelClient *rcc)
|
||||
{
|
||||
RedChannelClass *klass = RED_CHANNEL_GET_CLASS(self);
|
||||
|
||||
klass->on_disconnect(rcc);
|
||||
}
|
||||
|
||||
void red_channel_send_item(RedChannel *self, RedChannelClient *rcc, RedPipeItem *item)
|
||||
{
|
||||
RedChannelClass *klass = RED_CHANNEL_GET_CLASS(self);
|
||||
|
||||
@ -45,7 +45,6 @@ typedef struct MainChannelClient MainChannelClient;
|
||||
|
||||
typedef bool (*channel_handle_message_proc)(RedChannelClient *rcc, uint16_t type,
|
||||
uint32_t size, void *msg);
|
||||
typedef void (*channel_disconnect_proc)(RedChannelClient *rcc);
|
||||
typedef bool (*channel_configure_socket_proc)(RedChannelClient *rcc);
|
||||
typedef void (*channel_send_pipe_item_proc)(RedChannelClient *rcc, RedPipeItem *item);
|
||||
|
||||
@ -115,7 +114,6 @@ struct RedChannelClass
|
||||
* callbacks that are triggered from channel client stream events.
|
||||
* They are called from the thread that listen to the stream events.
|
||||
*/
|
||||
channel_disconnect_proc on_disconnect;
|
||||
channel_send_pipe_item_proc send_item;
|
||||
channel_handle_migrate_flush_mark_proc handle_migrate_flush_mark;
|
||||
channel_handle_migrate_data_proc handle_migrate_data;
|
||||
@ -217,7 +215,6 @@ struct RedsState* red_channel_get_server(RedChannel *channel);
|
||||
SpiceCoreInterfaceInternal* red_channel_get_core_interface(RedChannel *channel);
|
||||
|
||||
/* channel callback function */
|
||||
void red_channel_on_disconnect(RedChannel *self, RedChannelClient *rcc);
|
||||
void red_channel_send_item(RedChannel *self, RedChannelClient *rcc, RedPipeItem *item);
|
||||
void red_channel_reset_thread_id(RedChannel *self);
|
||||
const RedStatNode *red_channel_get_stat_node(RedChannel *channel);
|
||||
|
||||
@ -48,6 +48,7 @@ smartcard_channel_client_alloc_msg_rcv_buf(RedChannelClient *rcc, uint16_t type,
|
||||
static void
|
||||
smartcard_channel_client_release_msg_rcv_buf(RedChannelClient *rcc, uint16_t type,
|
||||
uint32_t size, uint8_t *msg);
|
||||
static void smartcard_channel_client_on_disconnect(RedChannelClient *rcc);
|
||||
|
||||
static void smart_card_channel_client_get_property(GObject *object,
|
||||
guint property_id,
|
||||
@ -92,6 +93,7 @@ static void smart_card_channel_client_class_init(SmartCardChannelClientClass *kl
|
||||
RedChannelClientClass *client_class = RED_CHANNEL_CLIENT_CLASS(klass);
|
||||
client_class->alloc_recv_buf = smartcard_channel_client_alloc_msg_rcv_buf;
|
||||
client_class->release_recv_buf = smartcard_channel_client_release_msg_rcv_buf;
|
||||
client_class->on_disconnect = smartcard_channel_client_on_disconnect;
|
||||
|
||||
object_class->get_property = smart_card_channel_client_get_property;
|
||||
object_class->set_property = smart_card_channel_client_set_property;
|
||||
@ -176,7 +178,7 @@ smartcard_channel_client_release_msg_rcv_buf(RedChannelClient *rcc,
|
||||
}
|
||||
}
|
||||
|
||||
void smartcard_channel_client_on_disconnect(RedChannelClient *rcc)
|
||||
static void smartcard_channel_client_on_disconnect(RedChannelClient *rcc)
|
||||
{
|
||||
SmartCardChannelClient *scc = SMARTCARD_CHANNEL_CLIENT(rcc);
|
||||
RedCharDeviceSmartcard *device = scc->priv->smartcard;
|
||||
|
||||
@ -61,8 +61,6 @@ SmartCardChannelClient* smartcard_channel_client_create(RedChannel *channel,
|
||||
|
||||
bool smartcard_channel_client_handle_migrate_flush_mark(RedChannelClient *rcc);
|
||||
|
||||
void smartcard_channel_client_on_disconnect(RedChannelClient *rcc);
|
||||
|
||||
void smartcard_channel_client_send_data(RedChannelClient *rcc,
|
||||
SpiceMarshaller *m,
|
||||
RedPipeItem *item,
|
||||
|
||||
@ -574,7 +574,6 @@ red_smartcard_channel_class_init(RedSmartcardChannelClass *klass)
|
||||
|
||||
channel_class->handle_message = smartcard_channel_client_handle_message,
|
||||
|
||||
channel_class->on_disconnect = smartcard_channel_client_on_disconnect;
|
||||
channel_class->send_item = smartcard_channel_send_item;
|
||||
channel_class->handle_migrate_flush_mark = smartcard_channel_client_handle_migrate_flush_mark;
|
||||
channel_class->handle_migrate_data = smartcard_channel_client_handle_migrate_data;
|
||||
|
||||
@ -789,7 +789,7 @@ static bool snd_channel_client_config_socket(RedChannelClient *rcc)
|
||||
return true;
|
||||
}
|
||||
|
||||
static void snd_channel_on_disconnect(RedChannelClient *rcc)
|
||||
static void snd_channel_client_on_disconnect(RedChannelClient *rcc)
|
||||
{
|
||||
}
|
||||
|
||||
@ -1316,11 +1316,8 @@ static void
|
||||
snd_channel_class_init(SndChannelClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS(klass);
|
||||
RedChannelClass *channel_class = RED_CHANNEL_CLASS(klass);
|
||||
|
||||
object_class->finalize = snd_channel_finalize;
|
||||
|
||||
channel_class->on_disconnect = snd_channel_on_disconnect;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1478,6 +1475,7 @@ snd_channel_client_class_init(SndChannelClientClass *klass)
|
||||
client_class->config_socket = snd_channel_client_config_socket;
|
||||
client_class->alloc_recv_buf = snd_channel_client_alloc_recv_buf;
|
||||
client_class->release_recv_buf = snd_channel_client_release_recv_buf;
|
||||
client_class->on_disconnect = snd_channel_client_on_disconnect;
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@ -763,7 +763,6 @@ red_vmc_channel_class_init(RedVmcChannelClass *klass)
|
||||
|
||||
channel_class->handle_message = spicevmc_red_channel_client_handle_message;
|
||||
|
||||
channel_class->on_disconnect = spicevmc_red_channel_client_on_disconnect;
|
||||
channel_class->send_item = spicevmc_red_channel_send_item;
|
||||
channel_class->handle_migrate_flush_mark = spicevmc_channel_client_handle_migrate_flush_mark;
|
||||
channel_class->handle_migrate_data = spicevmc_channel_client_handle_migrate_data;
|
||||
@ -986,6 +985,7 @@ vmc_channel_client_class_init(VmcChannelClientClass *klass)
|
||||
|
||||
client_class->alloc_recv_buf = spicevmc_red_channel_alloc_msg_rcv_buf;
|
||||
client_class->release_recv_buf = spicevmc_red_channel_release_msg_rcv_buf;
|
||||
client_class->on_disconnect = spicevmc_red_channel_client_on_disconnect;
|
||||
}
|
||||
|
||||
static RedChannelClient *
|
||||
|
||||
Loading…
Reference in New Issue
Block a user