[Spice-devel] [PATCH spice-gtk 02/14] channel: add spice_channel_set_handlers()
Christophe Fergeau
cfergeau at redhat.com
Thu Sep 12 08:57:14 PDT 2013
ACK
On Thu, Sep 12, 2013 at 02:09:10PM +0200, Marc-André Lureau wrote:
> This function will allow to set base handlers and specific channel
> handlers in a common way, instead of each channel having to override the
> base channel virtual handle_msg().
> ---
> gtk/channel-base.c | 39 +++++++++++++++++++++++++++++++++++++++
> gtk/spice-channel-priv.h | 2 ++
> gtk/spice-channel.h | 3 ++-
> 3 files changed, 43 insertions(+), 1 deletion(-)
>
> diff --git a/gtk/channel-base.c b/gtk/channel-base.c
> index dff3024..76d681a 100644
> --- a/gtk/channel-base.c
> +++ b/gtk/channel-base.c
> @@ -189,3 +189,42 @@ void spice_channel_handle_migrate(SpiceChannel *channel, SpiceMsgIn *in)
> spice_msg_out_send_internal(out);
> }
> }
> +
> +
> +static void set_handlers(SpiceChannelClass *klass,
> + const spice_msg_handler* handlers, const int n)
> +{
> + int i;
> +
> + g_array_set_size(klass->handlers, MAX(klass->handlers->len, n));
> + for (i = 0; i < n; i++) {
> + if (handlers[i])
> + g_array_index(klass->handlers, spice_msg_handler, i) = handlers[i];
> + }
> +}
> +
> +static void spice_channel_add_base_handlers(SpiceChannelClass *klass)
> +{
> + static const spice_msg_handler 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,
> + };
> +
> + set_handlers(klass, handlers, G_N_ELEMENTS(handlers));
> +}
> +
> +G_GNUC_INTERNAL
> +void spice_channel_set_handlers(SpiceChannelClass *klass,
> + const spice_msg_handler* handlers, const int n)
> +{
> + /* FIXME: use class private (requires glib 2.24) */
> + g_return_if_fail(klass->handlers == NULL);
> + klass->handlers = g_array_sized_new(FALSE, TRUE, sizeof(spice_msg_handler), n);
> +
> + spice_channel_add_base_handlers(klass);
> + set_handlers(klass, handlers, n);
> +}
> diff --git a/gtk/spice-channel-priv.h b/gtk/spice-channel-priv.h
> index be061c5..0070d71 100644
> --- a/gtk/spice-channel-priv.h
> +++ b/gtk/spice-channel-priv.h
> @@ -172,6 +172,8 @@ 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);
>
> diff --git a/gtk/spice-channel.h b/gtk/spice-channel.h
> index 0507b68..705dddf 100644
> --- a/gtk/spice-channel.h
> +++ b/gtk/spice-channel.h
> @@ -94,11 +94,12 @@ struct _SpiceChannelClass
> /* virtual methods, coroutine context */
> void (*channel_send_migration_handshake)(SpiceChannel *channel);
>
> + GArray *handlers;
> /*
> * If adding fields to this struct, remove corresponding
> * amount of padding to avoid changing overall struct size
> */
> - gchar _spice_reserved[SPICE_RESERVED_PADDING - sizeof(void *)];
> + gchar _spice_reserved[SPICE_RESERVED_PADDING - 2 * sizeof(void *)];
> };
>
> GType spice_channel_get_type(void);
> --
> 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/65770a88/attachment-0001.pgp>
More information about the Spice-devel
mailing list