ACK, thanks fro the split. Is the spice-common change needed in this patch? I would have expected it to be part of the next one? Christophe On Thu, Sep 12, 2013 at 02:09:11PM +0200, Marc-André Lureau wrote: > This allows to simplify a little bit derived class (no need to override > handle_msg), and allows the base class more flexibility (for example for > filtering messages, as in the following patch) > --- > gtk/channel-cursor.c | 43 ++++++++------------- > gtk/channel-display.c | 97 +++++++++++++++++++++--------------------------- > gtk/channel-inputs.c | 31 +++++----------- > gtk/channel-main.c | 60 +++++++++++++++--------------- > gtk/channel-playback.c | 42 +++++++-------------- > gtk/channel-port.c | 32 +++++----------- > gtk/channel-record.c | 36 ++++++------------ > gtk/channel-smartcard.c | 34 +++++------------ > gtk/channel-usbredir.c | 32 +++++----------- > gtk/spice-channel-priv.h | 6 --- > gtk/spice-channel.c | 18 +++------ > spice-common | 2 +- > 12 files changed, 156 insertions(+), 277 deletions(-) > > diff --git a/gtk/channel-cursor.c b/gtk/channel-cursor.c > index e4a996b..5d2db84 100644 > --- a/gtk/channel-cursor.c > +++ b/gtk/channel-cursor.c > @@ -66,10 +66,10 @@ enum { > > static guint signals[SPICE_CURSOR_LAST_SIGNAL]; > > -static void spice_cursor_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg); > static void delete_cursor_all(SpiceChannel *channel); > static display_cursor * display_cursor_ref(display_cursor *cursor); > static void display_cursor_unref(display_cursor *cursor); > +static void channel_set_handlers(SpiceChannelClass *klass); > > G_DEFINE_TYPE(SpiceCursorChannel, spice_cursor_channel, SPICE_TYPE_CHANNEL) > > @@ -109,7 +109,6 @@ static void spice_cursor_channel_class_init(SpiceCursorChannelClass *klass) > SpiceChannelClass *channel_class = SPICE_CHANNEL_CLASS(klass); > > gobject_class->finalize = spice_cursor_channel_finalize; > - channel_class->handle_msg = spice_cursor_handle_msg; > channel_class->channel_reset = spice_cursor_channel_reset; > > /** > @@ -194,6 +193,7 @@ static void spice_cursor_channel_class_init(SpiceCursorChannelClass *klass) > 0); > > g_type_class_add_private(klass, sizeof(SpiceCursorChannelPrivate)); > + channel_set_handlers(SPICE_CHANNEL_CLASS(klass)); > } > > /* signal trampoline---------------------------------------------------------- */ > @@ -598,31 +598,18 @@ static void cursor_handle_inval_all(SpiceChannel *channel, SpiceMsgIn *in) > delete_cursor_all(channel); > } > > -static const spice_msg_handler cursor_handlers[] = { > - [ SPICE_MSG_CURSOR_INIT ] = cursor_handle_init, > - [ SPICE_MSG_CURSOR_RESET ] = cursor_handle_reset, > - [ SPICE_MSG_CURSOR_SET ] = cursor_handle_set, > - [ SPICE_MSG_CURSOR_MOVE ] = cursor_handle_move, > - [ SPICE_MSG_CURSOR_HIDE ] = cursor_handle_hide, > - [ SPICE_MSG_CURSOR_TRAIL ] = cursor_handle_trail, > - [ SPICE_MSG_CURSOR_INVAL_ONE ] = cursor_handle_inval_one, > - [ SPICE_MSG_CURSOR_INVAL_ALL ] = cursor_handle_inval_all, > -}; > - > -/* coroutine context */ > -static void spice_cursor_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg) > +static void channel_set_handlers(SpiceChannelClass *klass) > { > - int type = spice_msg_in_type(msg); > - SpiceChannelClass *parent_class; > - > - g_return_if_fail(type < SPICE_N_ELEMENTS(cursor_handlers)); > - > - parent_class = SPICE_CHANNEL_CLASS(spice_cursor_channel_parent_class); > - > - if (cursor_handlers[type] != NULL) > - cursor_handlers[type](channel, msg); > - else if (parent_class->handle_msg) > - parent_class->handle_msg(channel, msg); > - else > - g_return_if_reached(); > + static const spice_msg_handler handlers[] = { > + [ SPICE_MSG_CURSOR_INIT ] = cursor_handle_init, > + [ SPICE_MSG_CURSOR_RESET ] = cursor_handle_reset, > + [ SPICE_MSG_CURSOR_SET ] = cursor_handle_set, > + [ SPICE_MSG_CURSOR_MOVE ] = cursor_handle_move, > + [ SPICE_MSG_CURSOR_HIDE ] = cursor_handle_hide, > + [ SPICE_MSG_CURSOR_TRAIL ] = cursor_handle_trail, > + [ SPICE_MSG_CURSOR_INVAL_ONE ] = cursor_handle_inval_one, > + [ SPICE_MSG_CURSOR_INVAL_ALL ] = cursor_handle_inval_all, > + }; > + > + spice_channel_set_handlers(klass, handlers, G_N_ELEMENTS(handlers)); > } > diff --git a/gtk/channel-display.c b/gtk/channel-display.c > index 704d5a7..08d5dcb 100644 > --- a/gtk/channel-display.c > +++ b/gtk/channel-display.c > @@ -107,8 +107,8 @@ enum { > > static guint signals[SPICE_DISPLAY_LAST_SIGNAL]; > > -static void spice_display_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg); > static void spice_display_channel_up(SpiceChannel *channel); > +static void channel_set_handlers(SpiceChannelClass *klass); > > static void clear_surfaces(SpiceChannel *channel, gboolean keep_primary); > static void clear_streams(SpiceChannel *channel); > @@ -235,7 +235,6 @@ static void spice_display_channel_class_init(SpiceDisplayChannelClass *klass) > gobject_class->set_property = spice_display_set_property; > gobject_class->constructed = spice_display_channel_constructed; > > - channel_class->handle_msg = spice_display_handle_msg; > channel_class->channel_up = spice_display_channel_up; > channel_class->channel_reset = spice_display_channel_reset; > channel_class->channel_reset_capabilities = spice_display_channel_reset_capabilities; > @@ -387,6 +386,7 @@ static void spice_display_channel_class_init(SpiceDisplayChannelClass *klass) > sw_canvas_init(); > quic_init(); > rop3_init(); > + channel_set_handlers(SPICE_CHANNEL_CLASS(klass)); > } > > /** > @@ -1841,58 +1841,45 @@ static void display_handle_monitors_config(SpiceChannel *channel, SpiceMsgIn *in > g_object_notify_main_context(G_OBJECT(channel), "monitors"); > } > > -static const spice_msg_handler display_handlers[] = { > - [ SPICE_MSG_DISPLAY_MODE ] = display_handle_mode, > - [ SPICE_MSG_DISPLAY_MARK ] = display_handle_mark, > - [ SPICE_MSG_DISPLAY_RESET ] = display_handle_reset, > - [ SPICE_MSG_DISPLAY_COPY_BITS ] = display_handle_copy_bits, > - [ SPICE_MSG_DISPLAY_INVAL_LIST ] = display_handle_inv_list, > - [ SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS ] = display_handle_inv_pixmap_all, > - [ SPICE_MSG_DISPLAY_INVAL_PALETTE ] = display_handle_inv_palette, > - [ SPICE_MSG_DISPLAY_INVAL_ALL_PALETTES ] = display_handle_inv_palette_all, > - > - [ SPICE_MSG_DISPLAY_STREAM_CREATE ] = display_handle_stream_create, > - [ SPICE_MSG_DISPLAY_STREAM_DATA ] = display_handle_stream_data, > - [ SPICE_MSG_DISPLAY_STREAM_CLIP ] = display_handle_stream_clip, > - [ SPICE_MSG_DISPLAY_STREAM_DESTROY ] = display_handle_stream_destroy, > - [ SPICE_MSG_DISPLAY_STREAM_DESTROY_ALL ] = display_handle_stream_destroy_all, > - [ SPICE_MSG_DISPLAY_STREAM_DATA_SIZED ] = display_handle_stream_data, > - [ SPICE_MSG_DISPLAY_STREAM_ACTIVATE_REPORT ] = display_handle_stream_activate_report, > - > - [ SPICE_MSG_DISPLAY_DRAW_FILL ] = display_handle_draw_fill, > - [ SPICE_MSG_DISPLAY_DRAW_OPAQUE ] = display_handle_draw_opaque, > - [ SPICE_MSG_DISPLAY_DRAW_COPY ] = display_handle_draw_copy, > - [ SPICE_MSG_DISPLAY_DRAW_BLEND ] = display_handle_draw_blend, > - [ SPICE_MSG_DISPLAY_DRAW_BLACKNESS ] = display_handle_draw_blackness, > - [ SPICE_MSG_DISPLAY_DRAW_WHITENESS ] = display_handle_draw_whiteness, > - [ SPICE_MSG_DISPLAY_DRAW_INVERS ] = display_handle_draw_invers, > - [ SPICE_MSG_DISPLAY_DRAW_ROP3 ] = display_handle_draw_rop3, > - [ SPICE_MSG_DISPLAY_DRAW_STROKE ] = display_handle_draw_stroke, > - [ SPICE_MSG_DISPLAY_DRAW_TEXT ] = display_handle_draw_text, > - [ SPICE_MSG_DISPLAY_DRAW_TRANSPARENT ] = display_handle_draw_transparent, > - [ SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND ] = display_handle_draw_alpha_blend, > - [ SPICE_MSG_DISPLAY_DRAW_COMPOSITE ] = display_handle_draw_composite, > - > - [ SPICE_MSG_DISPLAY_SURFACE_CREATE ] = display_handle_surface_create, > - [ SPICE_MSG_DISPLAY_SURFACE_DESTROY ] = display_handle_surface_destroy, > - > - [ SPICE_MSG_DISPLAY_MONITORS_CONFIG ] = display_handle_monitors_config, > -}; > - > -/* coroutine context */ > -static void spice_display_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg) > -{ > - int type = spice_msg_in_type(msg); > - SpiceChannelClass *parent_class; > - > - g_return_if_fail(type < SPICE_N_ELEMENTS(display_handlers)); > - > - parent_class = SPICE_CHANNEL_CLASS(spice_display_channel_parent_class); > +static void channel_set_handlers(SpiceChannelClass *klass) > +{ > + static const spice_msg_handler handlers[] = { > + [ SPICE_MSG_DISPLAY_MODE ] = display_handle_mode, > + [ SPICE_MSG_DISPLAY_MARK ] = display_handle_mark, > + [ SPICE_MSG_DISPLAY_RESET ] = display_handle_reset, > + [ SPICE_MSG_DISPLAY_COPY_BITS ] = display_handle_copy_bits, > + [ SPICE_MSG_DISPLAY_INVAL_LIST ] = display_handle_inv_list, > + [ SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS ] = display_handle_inv_pixmap_all, > + [ SPICE_MSG_DISPLAY_INVAL_PALETTE ] = display_handle_inv_palette, > + [ SPICE_MSG_DISPLAY_INVAL_ALL_PALETTES ] = display_handle_inv_palette_all, > + > + [ SPICE_MSG_DISPLAY_STREAM_CREATE ] = display_handle_stream_create, > + [ SPICE_MSG_DISPLAY_STREAM_DATA ] = display_handle_stream_data, > + [ SPICE_MSG_DISPLAY_STREAM_CLIP ] = display_handle_stream_clip, > + [ SPICE_MSG_DISPLAY_STREAM_DESTROY ] = display_handle_stream_destroy, > + [ SPICE_MSG_DISPLAY_STREAM_DESTROY_ALL ] = display_handle_stream_destroy_all, > + [ SPICE_MSG_DISPLAY_STREAM_DATA_SIZED ] = display_handle_stream_data, > + [ SPICE_MSG_DISPLAY_STREAM_ACTIVATE_REPORT ] = display_handle_stream_activate_report, > + > + [ SPICE_MSG_DISPLAY_DRAW_FILL ] = display_handle_draw_fill, > + [ SPICE_MSG_DISPLAY_DRAW_OPAQUE ] = display_handle_draw_opaque, > + [ SPICE_MSG_DISPLAY_DRAW_COPY ] = display_handle_draw_copy, > + [ SPICE_MSG_DISPLAY_DRAW_BLEND ] = display_handle_draw_blend, > + [ SPICE_MSG_DISPLAY_DRAW_BLACKNESS ] = display_handle_draw_blackness, > + [ SPICE_MSG_DISPLAY_DRAW_WHITENESS ] = display_handle_draw_whiteness, > + [ SPICE_MSG_DISPLAY_DRAW_INVERS ] = display_handle_draw_invers, > + [ SPICE_MSG_DISPLAY_DRAW_ROP3 ] = display_handle_draw_rop3, > + [ SPICE_MSG_DISPLAY_DRAW_STROKE ] = display_handle_draw_stroke, > + [ SPICE_MSG_DISPLAY_DRAW_TEXT ] = display_handle_draw_text, > + [ SPICE_MSG_DISPLAY_DRAW_TRANSPARENT ] = display_handle_draw_transparent, > + [ SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND ] = display_handle_draw_alpha_blend, > + [ SPICE_MSG_DISPLAY_DRAW_COMPOSITE ] = display_handle_draw_composite, > + > + [ SPICE_MSG_DISPLAY_SURFACE_CREATE ] = display_handle_surface_create, > + [ SPICE_MSG_DISPLAY_SURFACE_DESTROY ] = display_handle_surface_destroy, > + > + [ SPICE_MSG_DISPLAY_MONITORS_CONFIG ] = display_handle_monitors_config, > + }; > > - if (display_handlers[type] != NULL) > - display_handlers[type](channel, msg); > - else if (parent_class->handle_msg) > - parent_class->handle_msg(channel, msg); > - else > - g_return_if_reached(); > + spice_channel_set_handlers(klass, handlers, G_N_ELEMENTS(handlers)); > } > diff --git a/gtk/channel-inputs.c b/gtk/channel-inputs.c > index ee86dc2..a69dbe6 100644 > --- a/gtk/channel-inputs.c > +++ b/gtk/channel-inputs.c > @@ -67,9 +67,9 @@ enum { > > static guint signals[SPICE_INPUTS_LAST_SIGNAL]; > > -static void spice_inputs_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg); > static void spice_inputs_channel_up(SpiceChannel *channel); > static void spice_inputs_channel_reset(SpiceChannel *channel, gboolean migrating); > +static void channel_set_handlers(SpiceChannelClass *klass); > > /* ------------------------------------------------------------------ */ > > @@ -108,7 +108,6 @@ static void spice_inputs_channel_class_init(SpiceInputsChannelClass *klass) > > gobject_class->finalize = spice_inputs_channel_finalize; > gobject_class->get_property = spice_inputs_get_property; > - channel_class->handle_msg = spice_inputs_handle_msg; > channel_class->channel_up = spice_inputs_channel_up; > channel_class->channel_reset = spice_inputs_channel_reset; > > @@ -143,6 +142,7 @@ static void spice_inputs_channel_class_init(SpiceInputsChannelClass *klass) > 0); > > g_type_class_add_private(klass, sizeof(SpiceInputsChannelPrivate)); > + channel_set_handlers(SPICE_CHANNEL_CLASS(klass)); > } > > /* signal trampoline---------------------------------------------------------- */ > @@ -281,28 +281,15 @@ static void inputs_handle_ack(SpiceChannel *channel, SpiceMsgIn *in) > } > } > > -static const spice_msg_handler inputs_handlers[] = { > - [ SPICE_MSG_INPUTS_INIT ] = inputs_handle_init, > - [ SPICE_MSG_INPUTS_KEY_MODIFIERS ] = inputs_handle_modifiers, > - [ SPICE_MSG_INPUTS_MOUSE_MOTION_ACK ] = inputs_handle_ack, > -}; > - > -/* coroutine context */ > -static void spice_inputs_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg) > +static void channel_set_handlers(SpiceChannelClass *klass) > { > - int type = spice_msg_in_type(msg); > - SpiceChannelClass *parent_class; > - > - g_return_if_fail(type < SPICE_N_ELEMENTS(inputs_handlers)); > - > - parent_class = SPICE_CHANNEL_CLASS(spice_inputs_channel_parent_class); > + static const spice_msg_handler handlers[] = { > + [ SPICE_MSG_INPUTS_INIT ] = inputs_handle_init, > + [ SPICE_MSG_INPUTS_KEY_MODIFIERS ] = inputs_handle_modifiers, > + [ SPICE_MSG_INPUTS_MOUSE_MOTION_ACK ] = inputs_handle_ack, > + }; > > - if (inputs_handlers[type] != NULL) > - inputs_handlers[type](channel, msg); > - else if (parent_class->handle_msg) > - parent_class->handle_msg(channel, msg); > - else > - g_return_if_reached(); > + spice_channel_set_handlers(klass, handlers, G_N_ELEMENTS(handlers)); > } > > /** > diff --git a/gtk/channel-main.c b/gtk/channel-main.c > index 93995f1..b342e97 100644 > --- a/gtk/channel-main.c > +++ b/gtk/channel-main.c > @@ -158,6 +158,7 @@ enum { > static guint signals[SPICE_MAIN_LAST_SIGNAL]; > > static void spice_main_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg); > +static void channel_set_handlers(SpiceChannelClass *klass); > static void agent_send_msg_queue(SpiceMainChannel *channel); > static void agent_free_msg_queue(SpiceMainChannel *channel); > static void migrate_channel_event_cb(SpiceChannel *channel, SpiceChannelEvent event, > @@ -728,6 +729,7 @@ static void spice_main_channel_class_init(SpiceMainChannelClass *klass) > G_TYPE_OBJECT); > > g_type_class_add_private(klass, sizeof(SpiceMainChannelPrivate)); > + channel_set_handlers(SPICE_CHANNEL_CLASS(klass)); > } > > /* signal trampoline---------------------------------------------------------- */ > @@ -2316,28 +2318,33 @@ static void main_handle_migrate_cancel(SpiceChannel *channel, > spice_session_abort_migration(session); > } > > -static const spice_msg_handler main_handlers[] = { > - [ SPICE_MSG_MAIN_INIT ] = main_handle_init, > - [ SPICE_MSG_MAIN_NAME ] = main_handle_name, > - [ SPICE_MSG_MAIN_UUID ] = main_handle_uuid, > - [ SPICE_MSG_MAIN_CHANNELS_LIST ] = main_handle_channels_list, > - [ SPICE_MSG_MAIN_MOUSE_MODE ] = main_handle_mouse_mode, > - [ SPICE_MSG_MAIN_MULTI_MEDIA_TIME ] = main_handle_mm_time, > - > - [ SPICE_MSG_MAIN_AGENT_CONNECTED ] = main_handle_agent_connected, > - [ SPICE_MSG_MAIN_AGENT_DISCONNECTED ] = main_handle_agent_disconnected, > - [ SPICE_MSG_MAIN_AGENT_DATA ] = main_handle_agent_data, > - [ SPICE_MSG_MAIN_AGENT_TOKEN ] = main_handle_agent_token, > - > - [ SPICE_MSG_MAIN_MIGRATE_BEGIN ] = main_handle_migrate_begin, > - [ SPICE_MSG_MAIN_MIGRATE_END ] = main_handle_migrate_end, > - [ SPICE_MSG_MAIN_MIGRATE_CANCEL ] = main_handle_migrate_cancel, > - [ SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST ] = main_handle_migrate_switch_host, > - [ SPICE_MSG_MAIN_AGENT_CONNECTED_TOKENS ] = main_handle_agent_connected_tokens, > - [ SPICE_MSG_MAIN_MIGRATE_BEGIN_SEAMLESS ] = main_handle_migrate_begin_seamless, > - [ SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_ACK] = main_handle_migrate_dst_seamless_ack, > - [ SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_NACK] = main_handle_migrate_dst_seamless_nack, > -}; > +static void channel_set_handlers(SpiceChannelClass *klass) > +{ > + static const spice_msg_handler handlers[] = { > + [ SPICE_MSG_MAIN_INIT ] = main_handle_init, > + [ SPICE_MSG_MAIN_NAME ] = main_handle_name, > + [ SPICE_MSG_MAIN_UUID ] = main_handle_uuid, > + [ SPICE_MSG_MAIN_CHANNELS_LIST ] = main_handle_channels_list, > + [ SPICE_MSG_MAIN_MOUSE_MODE ] = main_handle_mouse_mode, > + [ SPICE_MSG_MAIN_MULTI_MEDIA_TIME ] = main_handle_mm_time, > + > + [ SPICE_MSG_MAIN_AGENT_CONNECTED ] = main_handle_agent_connected, > + [ SPICE_MSG_MAIN_AGENT_DISCONNECTED ] = main_handle_agent_disconnected, > + [ SPICE_MSG_MAIN_AGENT_DATA ] = main_handle_agent_data, > + [ SPICE_MSG_MAIN_AGENT_TOKEN ] = main_handle_agent_token, > + > + [ SPICE_MSG_MAIN_MIGRATE_BEGIN ] = main_handle_migrate_begin, > + [ SPICE_MSG_MAIN_MIGRATE_END ] = main_handle_migrate_end, > + [ SPICE_MSG_MAIN_MIGRATE_CANCEL ] = main_handle_migrate_cancel, > + [ SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST ] = main_handle_migrate_switch_host, > + [ SPICE_MSG_MAIN_AGENT_CONNECTED_TOKENS ] = main_handle_agent_connected_tokens, > + [ SPICE_MSG_MAIN_MIGRATE_BEGIN_SEAMLESS ] = main_handle_migrate_begin_seamless, > + [ SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_ACK] = main_handle_migrate_dst_seamless_ack, > + [ SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_NACK] = main_handle_migrate_dst_seamless_nack, > + }; > + > + spice_channel_set_handlers(klass, handlers, G_N_ELEMENTS(handlers)); > +} > > /* coroutine context */ > static void spice_main_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg) > @@ -2346,8 +2353,6 @@ static void spice_main_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg) > SpiceChannelClass *parent_class; > SpiceChannelPrivate *c = SPICE_CHANNEL(channel)->priv; > > - g_return_if_fail(type < SPICE_N_ELEMENTS(main_handlers)); > - > parent_class = SPICE_CHANNEL_CLASS(spice_main_channel_parent_class); > > if (c->state == SPICE_CHANNEL_STATE_MIGRATION_HANDSHAKE) { > @@ -2359,12 +2364,7 @@ static void spice_main_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg) > } > } > > - if (main_handlers[type] != NULL) > - main_handlers[type](channel, msg); > - else if (parent_class->handle_msg) > - parent_class->handle_msg(channel, msg); > - else > - g_return_if_reached(); > + parent_class->handle_msg(channel, msg); > } > > /** > diff --git a/gtk/channel-playback.c b/gtk/channel-playback.c > index f246a80..60fc113 100644 > --- a/gtk/channel-playback.c > +++ b/gtk/channel-playback.c > @@ -82,8 +82,7 @@ enum { > }; > > static guint signals[SPICE_PLAYBACK_LAST_SIGNAL]; > - > -static void spice_playback_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg); > +static void channel_set_handlers(SpiceChannelClass *klass); > > /* ------------------------------------------------------------------ */ > > @@ -197,7 +196,6 @@ static void spice_playback_channel_class_init(SpicePlaybackChannelClass *klass) > gobject_class->get_property = spice_playback_channel_get_property; > gobject_class->set_property = spice_playback_channel_set_property; > > - channel_class->handle_msg = spice_playback_handle_msg; > channel_class->channel_reset = spice_playback_channel_reset; > channel_class->channel_reset_capabilities = spice_playback_channel_reset_capabilities; > > @@ -308,6 +306,7 @@ static void spice_playback_channel_class_init(SpicePlaybackChannelClass *klass) > 0); > > g_type_class_add_private(klass, sizeof(SpicePlaybackChannelPrivate)); > + channel_set_handlers(SPICE_CHANNEL_CLASS(klass)); > } > > /* signal trampoline---------------------------------------------------------- */ > @@ -517,32 +516,19 @@ static void playback_handle_set_latency(SpiceChannel *channel, SpiceMsgIn *in) > g_object_notify_main_context(G_OBJECT(channel), "min-latency"); > } > > -static const spice_msg_handler playback_handlers[] = { > - [ SPICE_MSG_PLAYBACK_DATA ] = playback_handle_data, > - [ SPICE_MSG_PLAYBACK_MODE ] = playback_handle_mode, > - [ SPICE_MSG_PLAYBACK_START ] = playback_handle_start, > - [ SPICE_MSG_PLAYBACK_STOP ] = playback_handle_stop, > - [ SPICE_MSG_PLAYBACK_VOLUME ] = playback_handle_set_volume, > - [ SPICE_MSG_PLAYBACK_MUTE ] = playback_handle_set_mute, > - [ SPICE_MSG_PLAYBACK_LATENCY ] = playback_handle_set_latency, > -}; > - > -/* coroutine context */ > -static void spice_playback_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg) > +static void channel_set_handlers(SpiceChannelClass *klass) > { > - int type = spice_msg_in_type(msg); > - SpiceChannelClass *parent_class; > - > - g_return_if_fail(type < SPICE_N_ELEMENTS(playback_handlers)); > - > - parent_class = SPICE_CHANNEL_CLASS(spice_playback_channel_parent_class); > - > - if (playback_handlers[type] != NULL) > - playback_handlers[type](channel, msg); > - else if (parent_class->handle_msg) > - parent_class->handle_msg(channel, msg); > - else > - g_return_if_reached(); > + static const spice_msg_handler handlers[] = { > + [ SPICE_MSG_PLAYBACK_DATA ] = playback_handle_data, > + [ SPICE_MSG_PLAYBACK_MODE ] = playback_handle_mode, > + [ SPICE_MSG_PLAYBACK_START ] = playback_handle_start, > + [ SPICE_MSG_PLAYBACK_STOP ] = playback_handle_stop, > + [ SPICE_MSG_PLAYBACK_VOLUME ] = playback_handle_set_volume, > + [ SPICE_MSG_PLAYBACK_MUTE ] = playback_handle_set_mute, > + [ SPICE_MSG_PLAYBACK_LATENCY ] = playback_handle_set_latency, > + }; > + > + spice_channel_set_handlers(klass, handlers, G_N_ELEMENTS(handlers)); > } > > void spice_playback_channel_set_delay(SpicePlaybackChannel *channel, guint32 delay_ms) > diff --git a/gtk/channel-port.c b/gtk/channel-port.c > index 1d6eef2..11948bb 100644 > --- a/gtk/channel-port.c > +++ b/gtk/channel-port.c > @@ -76,8 +76,7 @@ enum { > }; > > static guint signals[LAST_SIGNAL]; > - > -static void spice_port_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg); > +static void channel_set_handlers(SpiceChannelClass *klass); > > static void spice_port_channel_init(SpicePortChannel *channel) > { > @@ -131,7 +130,6 @@ static void spice_port_channel_class_init(SpicePortChannelClass *klass) > > gobject_class->finalize = spice_port_channel_finalize; > gobject_class->get_property = spice_port_get_property; > - channel_class->handle_msg = spice_port_handle_msg; > channel_class->channel_reset = spice_port_channel_reset; > > g_object_class_install_property > @@ -194,6 +192,7 @@ static void spice_port_channel_class_init(SpicePortChannelClass *klass) > G_TYPE_INT); > > g_type_class_add_private(klass, sizeof(SpicePortChannelPrivate)); > + channel_set_handlers(SPICE_CHANNEL_CLASS(klass)); > } > > /* signal trampoline---------------------------------------------------------- */ > @@ -401,26 +400,13 @@ void spice_port_event(SpicePortChannel *self, guint8 event) > spice_msg_out_send(msg); > } > > -static const spice_msg_handler port_handlers[] = { > - [ SPICE_MSG_PORT_INIT ] = port_handle_init, > - [ SPICE_MSG_PORT_EVENT ] = port_handle_event, > - [ SPICE_MSG_SPICEVMC_DATA ] = port_handle_msg, > -}; > - > -/* coroutine context */ > -static void spice_port_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg) > +static void channel_set_handlers(SpiceChannelClass *klass) > { > - int type = spice_msg_in_type(msg); > - SpiceChannelClass *parent_class; > - > - g_return_if_fail(type < SPICE_N_ELEMENTS(port_handlers)); > - > - parent_class = SPICE_CHANNEL_CLASS(spice_port_channel_parent_class); > + static const spice_msg_handler handlers[] = { > + [ SPICE_MSG_PORT_INIT ] = port_handle_init, > + [ SPICE_MSG_PORT_EVENT ] = port_handle_event, > + [ SPICE_MSG_SPICEVMC_DATA ] = port_handle_msg, > + }; > > - if (port_handlers[type] != NULL) > - port_handlers[type](channel, msg); > - else if (parent_class->handle_msg) > - parent_class->handle_msg(channel, msg); > - else > - g_return_if_reached(); > + spice_channel_set_handlers(klass, handlers, G_N_ELEMENTS(handlers)); > } > diff --git a/gtk/channel-record.c b/gtk/channel-record.c > index 6345569..e1f3ec7 100644 > --- a/gtk/channel-record.c > +++ b/gtk/channel-record.c > @@ -81,7 +81,7 @@ enum { > > static guint signals[SPICE_RECORD_LAST_SIGNAL]; > > -static void spice_record_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg); > +static void channel_set_handlers(SpiceChannelClass *klass); > static void channel_up(SpiceChannel *channel); > > #define FRAME_SIZE 256 > @@ -197,7 +197,6 @@ static void spice_record_channel_class_init(SpiceRecordChannelClass *klass) > gobject_class->finalize = spice_record_channel_finalize; > gobject_class->get_property = spice_record_channel_get_property; > gobject_class->set_property = spice_record_channel_set_property; > - channel_class->handle_msg = spice_record_handle_msg; > channel_class->channel_up = channel_up; > channel_class->channel_reset = channel_reset; > channel_class->channel_reset_capabilities = spice_record_channel_reset_capabilities; > @@ -265,6 +264,7 @@ static void spice_record_channel_class_init(SpiceRecordChannelClass *klass) > 0); > > g_type_class_add_private(klass, sizeof(SpiceRecordChannelPrivate)); > + channel_set_handlers(SPICE_CHANNEL_CLASS(klass)); > } > > /* signal trampoline---------------------------------------------------------- */ > @@ -521,28 +521,14 @@ static void record_handle_set_mute(SpiceChannel *channel, SpiceMsgIn *in) > g_object_notify_main_context(G_OBJECT(channel), "mute"); > } > > -static const spice_msg_handler record_handlers[] = { > - [ SPICE_MSG_RECORD_START ] = record_handle_start, > - [ SPICE_MSG_RECORD_STOP ] = record_handle_stop, > - [ SPICE_MSG_RECORD_VOLUME ] = record_handle_set_volume, > - [ SPICE_MSG_RECORD_MUTE ] = record_handle_set_mute, > -}; > - > -/* coroutine context */ > -static void spice_record_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg) > +static void channel_set_handlers(SpiceChannelClass *klass) > { > - int type = spice_msg_in_type(msg); > - > - SpiceChannelClass *parent_class; > - > - g_return_if_fail(type < SPICE_N_ELEMENTS(record_handlers)); > - > - parent_class = SPICE_CHANNEL_CLASS(spice_record_channel_parent_class); > - > - if (record_handlers[type] != NULL) > - record_handlers[type](channel, msg); > - else if (parent_class->handle_msg) > - parent_class->handle_msg(channel, msg); > - else > - g_return_if_reached(); > + static const spice_msg_handler handlers[] = { > + [ SPICE_MSG_RECORD_START ] = record_handle_start, > + [ SPICE_MSG_RECORD_STOP ] = record_handle_stop, > + [ SPICE_MSG_RECORD_VOLUME ] = record_handle_set_volume, > + [ SPICE_MSG_RECORD_MUTE ] = record_handle_set_mute, > + }; > + > + spice_channel_set_handlers(klass, handlers, G_N_ELEMENTS(handlers)); > } > diff --git a/gtk/channel-smartcard.c b/gtk/channel-smartcard.c > index 21b8343..88887a7 100644 > --- a/gtk/channel-smartcard.c > +++ b/gtk/channel-smartcard.c > @@ -95,7 +95,6 @@ enum { > SPICE_SMARTCARD_LAST_SIGNAL, > }; > > -static void spice_smartcard_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg); > static void spice_smartcard_channel_up(SpiceChannel *channel); > static void handle_smartcard_msg(SpiceChannel *channel, SpiceMsgIn *in); > static void smartcard_message_free(SpiceSmartcardChannelMessage *message); > @@ -209,6 +208,14 @@ static void spice_smartcard_channel_reset(SpiceChannel *channel, gboolean migrat > SPICE_CHANNEL_CLASS(spice_smartcard_channel_parent_class)->channel_reset(channel, migrating); > } > > +static void channel_set_handlers(SpiceChannelClass *klass) > +{ > + static const spice_msg_handler handlers[] = { > + [ SPICE_MSG_SMARTCARD_DATA ] = handle_smartcard_msg, > + }; > + spice_channel_set_handlers(klass, handlers, G_N_ELEMENTS(handlers)); > +} > + > static void spice_smartcard_channel_class_init(SpiceSmartcardChannelClass *klass) > { > GObjectClass *gobject_class = G_OBJECT_CLASS(klass); > @@ -217,17 +224,13 @@ static void spice_smartcard_channel_class_init(SpiceSmartcardChannelClass *klass > gobject_class->finalize = spice_smartcard_channel_finalize; > gobject_class->constructed = spice_smartcard_channel_constructed; > > - channel_class->handle_msg = spice_smartcard_handle_msg; > channel_class->channel_up = spice_smartcard_channel_up; > channel_class->channel_reset = spice_smartcard_channel_reset; > > g_type_class_add_private(klass, sizeof(SpiceSmartcardChannelPrivate)); > + channel_set_handlers(SPICE_CHANNEL_CLASS(klass)); > } > > -static const spice_msg_handler smartcard_handlers[] = { > - [ SPICE_MSG_SMARTCARD_DATA ] = handle_smartcard_msg, > -}; > - > /* ------------------------------------------------------------------ */ > /* private api */ > > @@ -442,24 +445,6 @@ static void card_removed_cb(SpiceSmartcardManager *manager, VReader *reader, > } > #endif /* USE_SMARTCARD */ > > -/* coroutine context */ > -static void spice_smartcard_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg) > -{ > - int type = spice_msg_in_type(msg); > - SpiceChannelClass *parent_class; > - > - g_return_if_fail(type < SPICE_N_ELEMENTS(smartcard_handlers)); > - > - parent_class = SPICE_CHANNEL_CLASS(spice_smartcard_channel_parent_class); > - > - if (smartcard_handlers[type] != NULL) > - smartcard_handlers[type](channel, msg); > - else if (parent_class->handle_msg) > - parent_class->handle_msg(channel, msg); > - else > - g_return_if_reached(); > -} > - > static void spice_smartcard_channel_up_cb(GObject *source_object, > GAsyncResult *res, > gpointer user_data) > @@ -570,4 +555,3 @@ static void handle_smartcard_msg(SpiceChannel *channel, SpiceMsgIn *in) > } > #endif > } > - > diff --git a/gtk/channel-usbredir.c b/gtk/channel-usbredir.c > index 11bf38c..239fe12 100644 > --- a/gtk/channel-usbredir.c > +++ b/gtk/channel-usbredir.c > @@ -81,7 +81,7 @@ struct _SpiceUsbredirChannelPrivate { > #endif > }; > > -static void spice_usbredir_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg); > +static void channel_set_handlers(SpiceChannelClass *klass); > static void spice_usbredir_channel_up(SpiceChannel *channel); > static void spice_usbredir_channel_dispose(GObject *obj); > static void spice_usbredir_channel_finalize(GObject *obj); > @@ -136,11 +136,11 @@ static void spice_usbredir_channel_class_init(SpiceUsbredirChannelClass *klass) > > gobject_class->dispose = spice_usbredir_channel_dispose; > gobject_class->finalize = spice_usbredir_channel_finalize; > - channel_class->handle_msg = spice_usbredir_handle_msg; > channel_class->channel_up = spice_usbredir_channel_up; > channel_class->channel_reset = spice_usbredir_channel_reset; > > g_type_class_add_private(klass, sizeof(SpiceUsbredirChannelPrivate)); > + channel_set_handlers(SPICE_CHANNEL_CLASS(klass)); > #endif > } > > @@ -188,9 +188,14 @@ static void spice_usbredir_channel_finalize(GObject *obj) > G_OBJECT_CLASS(spice_usbredir_channel_parent_class)->finalize(obj); > } > > -static const spice_msg_handler usbredir_handlers[] = { > - [ SPICE_MSG_SPICEVMC_DATA ] = usbredir_handle_msg, > -}; > +static void channel_set_handlers(SpiceChannelClass *klass) > +{ > + static const spice_msg_handler handlers[] = { > + [ SPICE_MSG_SPICEVMC_DATA ] = usbredir_handle_msg, > + }; > + > + spice_channel_set_handlers(klass, handlers, G_N_ELEMENTS(handlers)); > +} > > /* ------------------------------------------------------------------ */ > /* private api */ > @@ -608,23 +613,6 @@ static void do_emit_main_context(GObject *object, int event, gpointer params) > > /* --------------------------------------------------------------------- */ > /* coroutine context */ > -static void spice_usbredir_handle_msg(SpiceChannel *c, SpiceMsgIn *msg) > -{ > - int type = spice_msg_in_type(msg); > - SpiceChannelClass *parent_class; > - > - g_return_if_fail(type < SPICE_N_ELEMENTS(usbredir_handlers)); > - > - parent_class = SPICE_CHANNEL_CLASS(spice_usbredir_channel_parent_class); > - > - if (usbredir_handlers[type] != NULL) > - usbredir_handlers[type](c, msg); > - else if (parent_class->handle_msg) > - parent_class->handle_msg(c, msg); > - else > - g_return_if_reached(); > -} > - > static void spice_usbredir_channel_up(SpiceChannel *c) > { > SpiceUsbredirChannel *channel = SPICE_USBREDIR_CHANNEL(c); > diff --git a/gtk/spice-channel-priv.h b/gtk/spice-channel-priv.h > index 0070d71..92c9315 100644 > --- a/gtk/spice-channel-priv.h > +++ b/gtk/spice-channel-priv.h > @@ -167,15 +167,9 @@ typedef void (*handler_msg_in)(SpiceChannel *channel, SpiceMsgIn *msg, gpointer > void spice_channel_recv_msg(SpiceChannel *channel, handler_msg_in handler, gpointer data); > > /* channel-base.c */ > -/* coroutine context */ > -void spice_channel_handle_set_ack(SpiceChannel *channel, SpiceMsgIn *in); > -void spice_channel_handle_ping(SpiceChannel *channel, SpiceMsgIn *in); > -void spice_channel_handle_notify(SpiceChannel *channel, SpiceMsgIn *in); > -void spice_channel_handle_disconnect(SpiceChannel *channel, SpiceMsgIn *in); > void spice_channel_set_handlers(SpiceChannelClass *klass, > const spice_msg_handler* handlers, const int n); > void spice_channel_handle_wait_for_channels(SpiceChannel *channel, SpiceMsgIn *in); > -void spice_channel_handle_migrate(SpiceChannel *channel, SpiceMsgIn *in); > > gint spice_channel_get_channel_id(SpiceChannel *channel); > gint spice_channel_get_channel_type(SpiceChannel *channel); > diff --git a/gtk/spice-channel.c b/gtk/spice-channel.c > index 093b292..a0d9c15 100644 > --- a/gtk/spice-channel.c > +++ b/gtk/spice-channel.c > @@ -2763,24 +2763,18 @@ void spice_channel_swap(SpiceChannel *channel, SpiceChannel *swap, gboolean swap > #endif > } > > -static const spice_msg_handler base_handlers[] = { > - [ SPICE_MSG_SET_ACK ] = spice_channel_handle_set_ack, > - [ SPICE_MSG_PING ] = spice_channel_handle_ping, > - [ SPICE_MSG_NOTIFY ] = spice_channel_handle_notify, > - [ SPICE_MSG_DISCONNECTING ] = spice_channel_handle_disconnect, > - [ SPICE_MSG_WAIT_FOR_CHANNELS ] = spice_channel_handle_wait_for_channels, > - [ SPICE_MSG_MIGRATE ] = spice_channel_handle_migrate, > -}; > - > /* coroutine context */ > static void spice_channel_handle_msg(SpiceChannel *channel, SpiceMsgIn *msg) > { > + SpiceChannelClass *klass = SPICE_CHANNEL_GET_CLASS(channel); > int type = spice_msg_in_type(msg); > + spice_msg_handler handler; > > - g_return_if_fail(type < SPICE_N_ELEMENTS(base_handlers)); > - g_return_if_fail(base_handlers[type] != NULL); > + g_return_if_fail(type < klass->handlers->len); > > - base_handlers[type](channel, msg); > + handler = g_array_index(klass->handlers, spice_msg_handler, type); > + g_return_if_fail(handler != NULL); > + handler(channel, msg); > } > > static void spice_channel_reset_capabilities(SpiceChannel *channel) > diff --git a/spice-common b/spice-common > index fc27fb2..3363fe7 160000 > --- a/spice-common > +++ b/spice-common > @@ -1 +1 @@ > -Subproject commit fc27fb20b8ecd3e07809aec884f99f2121712bc9 > +Subproject commit 3363fe79f9d450774dd018a794c0b4381c1ef0a7 > -- > 1.8.3.1 > > _______________________________________________ > Spice-devel mailing list > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/spice-devel
Attachment:
pgpNkF4fG0RPu.pgp
Description: PGP signature
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel