[Spice-devel] [spice-gtk PATCH v2 2/5] webdav: write all buffer to client webdav
Victor Toso
victortoso at redhat.com
Tue May 19 07:44:37 PDT 2015
On Tue, May 19, 2015 at 04:34:34PM +0200, Victor Toso wrote:
> Client's webdav can request less data (8192) then the amount sent by
> guest's webdav. Using g_output_stream_write_all_async in order to avoid
> losing data.
> ---
> gtk/channel-webdav.c | 23 +++++++++++++----------
> 1 file changed, 13 insertions(+), 10 deletions(-)
>
> diff --git a/gtk/channel-webdav.c b/gtk/channel-webdav.c
> index 1d3862e..9f1ee2b 100644
> --- a/gtk/channel-webdav.c
> +++ b/gtk/channel-webdav.c
> @@ -298,11 +298,11 @@ static void client_start_read(SpiceWebdavChannel *self, Client *client)
> static void start_demux(SpiceWebdavChannel *self);
>
> static void demux_to_client_finish(SpiceWebdavChannel *self,
> - Client *client, gssize size)
> + Client *client, gboolean fail)
> {
> SpiceWebdavChannelPrivate *c = self->priv;
>
> - if (size <= 0) {
> + if (fail) {
> remove_client(self, client);
> }
>
> @@ -315,34 +315,37 @@ static void demux_to_client_cb(GObject *source, GAsyncResult *result, gpointer u
> Client *client = user_data;
> SpiceWebdavChannelPrivate *c = client->self->priv;
> GError *error = NULL;
> - gssize size;
> + gboolean fail;
> + gsize size;
>
> - size = g_output_stream_write_finish(G_OUTPUT_STREAM(source), result, &error);
> + g_output_stream_write_all_finish(G_OUTPUT_STREAM(source), result, &size, &error);
>
> if (error) {
> CHANNEL_DEBUG(client->self, "write failed: %s", error->message);
> g_clear_error(&error);
> }
>
> + fail = (size != c->demux.size);
> g_warn_if_fail(size == c->demux.size);
> - demux_to_client_finish(client->self, client, size);
> + demux_to_client_finish(client->self, client, fail);
> }
>
> static void demux_to_client(SpiceWebdavChannel *self,
> Client *client)
> {
> SpiceWebdavChannelPrivate *c = self->priv;
> - gssize size = c->demux.size;
> + gsize size = c->demux.size;
>
> CHANNEL_DEBUG(self, "pushing %"G_GSSIZE_FORMAT" to client %p", size, client);
Not a big problem but I forgot to change G_GSSIZE_FORMAT to
G_GSIZE_FORMAT. Will do.
>
> if (size > 0) {
> - g_output_stream_write_async(g_io_stream_get_output_stream(client->pipe),
> - c->demux.buf, size, G_PRIORITY_DEFAULT,
> - c->cancellable, demux_to_client_cb, client);
> + g_output_stream_write_all_async(g_io_stream_get_output_stream(client->pipe),
> + c->demux.buf, size, G_PRIORITY_DEFAULT,
> + c->cancellable, demux_to_client_cb, client);
> return;
> } else {
> - demux_to_client_finish(self, client, size);
> + /* Nothing to write */
> + demux_to_client_finish(self, client, FALSE);
> }
> }
>
> --
> 2.4.1
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
More information about the Spice-devel
mailing list