[Spice-devel] [PATCH spice-gtk 03/14] channels: use spice_channel_set_handlers()

Christophe Fergeau cfergeau at redhat.com
Thu Sep 12 08:57:49 PDT 2013


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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20130912/7fb4aa52/attachment-0001.pgp>


More information about the Spice-devel mailing list