[Spice-devel] [PATCH spice-gtk 1/2] channel: add spice_vmc_write_async()
Christophe Fergeau
cfergeau at redhat.com
Tue Feb 11 04:36:00 PST 2014
On Tue, Feb 11, 2014 at 11:26:26AM +0100, Marc-André Lureau wrote:
> Refactor port code to create a private GIO async function that can send
> SPICE_MSGC_SPICEVMC_DATA message over any channel.
> ---
> gtk/channel-base.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
> gtk/channel-port.c | 33 +++------------------------------
> gtk/spice-channel-priv.h | 8 ++++++++
> 3 files changed, 59 insertions(+), 30 deletions(-)
>
> diff --git a/gtk/channel-base.c b/gtk/channel-base.c
> index 646042d..363dda5 100644
> --- a/gtk/channel-base.c
> +++ b/gtk/channel-base.c
> @@ -232,3 +232,51 @@ void spice_channel_set_handlers(SpiceChannelClass *klass,
> spice_channel_add_base_handlers(klass);
> set_handlers(klass, handlers, n);
> }
> +
> +static void
> +vmc_write_free_cb(uint8_t *data, void *user_data)
> +{
> + GSimpleAsyncResult *result = user_data;
maybe this deserves a check that user_data is a GSimpleAsyncResult
ACK.
Christophe
> +
> + g_simple_async_result_complete_in_idle(result);
> + g_object_unref(result);
> +}
> +
> +G_GNUC_INTERNAL
> +void spice_vmc_write_async(SpiceChannel *self,
> + const void *buffer, gsize count,
> + GCancellable *cancellable,
> + GAsyncReadyCallback callback,
> + gpointer user_data)
> +{
> + SpiceMsgOut *msg;
> + GSimpleAsyncResult *simple;
> +
> + simple = g_simple_async_result_new(G_OBJECT(self), callback, user_data,
> + spice_port_write_async);
> + g_simple_async_result_set_op_res_gssize(simple, count);
> +
> + msg = spice_msg_out_new(SPICE_CHANNEL(self), SPICE_MSGC_SPICEVMC_DATA);
> + spice_marshaller_add_ref_full(msg->marshaller, (uint8_t*)buffer, count,
> + vmc_write_free_cb, simple);
> + spice_msg_out_send(msg);
> +}
> +
> +G_GNUC_INTERNAL
> +gssize spice_vmc_write_finish(SpiceChannel *self,
> + GAsyncResult *result, GError **error)
> +{
> + GSimpleAsyncResult *simple;
> +
> + g_return_val_if_fail(result != NULL, -1);
> +
> + simple = (GSimpleAsyncResult *)result;
> +
> + if (g_simple_async_result_propagate_error(simple, error))
> + return -1;
> +
> + g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(self),
> + spice_port_write_async), -1);
> +
> + return g_simple_async_result_get_op_res_gssize(simple);
> +}
> diff --git a/gtk/channel-port.c b/gtk/channel-port.c
> index 0a8b37f..5512713 100644
> --- a/gtk/channel-port.c
> +++ b/gtk/channel-port.c
> @@ -289,14 +289,6 @@ static void port_handle_msg(SpiceChannel *channel, SpiceMsgIn *in)
> emit_main_context(channel, SPICE_PORT_DATA, buf, size);
> }
>
> -static void port_write_free_cb(uint8_t *data, void *user_data)
> -{
> - GSimpleAsyncResult *result = user_data;
> -
> - g_simple_async_result_complete(result);
> - g_object_unref(result);
> -}
> -
> /**
> * spice_port_write_async:
> * @port: A #SpicePortChannel
> @@ -320,9 +312,7 @@ void spice_port_write_async(SpicePortChannel *self,
> GAsyncReadyCallback callback,
> gpointer user_data)
> {
> - GSimpleAsyncResult *simple;
> SpicePortChannelPrivate *c;
> - SpiceMsgOut *msg;
>
> g_return_if_fail(SPICE_IS_PORT_CHANNEL(self));
> g_return_if_fail(buffer != NULL);
> @@ -335,14 +325,8 @@ void spice_port_write_async(SpicePortChannel *self,
> return;
> }
>
> - simple = g_simple_async_result_new(G_OBJECT(self), callback, user_data,
> - spice_port_write_async);
> - g_simple_async_result_set_op_res_gssize(simple, count);
> -
> - msg = spice_msg_out_new(SPICE_CHANNEL(self), SPICE_MSGC_SPICEVMC_DATA);
> - spice_marshaller_add_ref_full(msg->marshaller, (uint8_t*)buffer, count,
> - port_write_free_cb, simple);
> - spice_msg_out_send(msg);
> + spice_vmc_write_async(SPICE_CHANNEL(self), buffer, count,
> + cancellable, callback, user_data);
> }
>
> /**
> @@ -360,20 +344,9 @@ void spice_port_write_async(SpicePortChannel *self,
> gssize spice_port_write_finish(SpicePortChannel *self,
> GAsyncResult *result, GError **error)
> {
> - GSimpleAsyncResult *simple;
> -
> g_return_val_if_fail(SPICE_IS_PORT_CHANNEL(self), -1);
> - g_return_val_if_fail(result != NULL, -1);
> -
> - simple = (GSimpleAsyncResult *)result;
> -
> - if (g_simple_async_result_propagate_error(simple, error))
> - return -1;
> -
> - g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(self),
> - spice_port_write_async), -1);
>
> - return g_simple_async_result_get_op_res_gssize(simple);
> + return spice_vmc_write_finish(SPICE_CHANNEL(self), result, error);
> }
>
> /**
> diff --git a/gtk/spice-channel-priv.h b/gtk/spice-channel-priv.h
> index 0816061..35704ea 100644
> --- a/gtk/spice-channel-priv.h
> +++ b/gtk/spice-channel-priv.h
> @@ -196,6 +196,14 @@ void spice_caps_set(GArray *caps, guint32 cap, const gchar *desc);
>
> gchar *spice_channel_supported_string(void);
>
> +void spice_vmc_write_async(SpiceChannel *self,
> + const void *buffer, gsize count,
> + GCancellable *cancellable,
> + GAsyncReadyCallback callback,
> + gpointer user_data);
> +gssize spice_vmc_write_finish(SpiceChannel *self,
> + GAsyncResult *result, GError **error);
> +
> G_END_DECLS
>
> #endif /* __SPICE_CLIENT_CHANNEL_PRIV_H__ */
> --
> 1.8.4.2
>
> _______________________________________________
> 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: 181 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20140211/18f36d45/attachment.pgp>
More information about the Spice-devel
mailing list