Hi Victor, On 05/26/2015 08:35 AM, 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 | 25 ++++++++++++++----------- > 1 file changed, 14 insertions(+), 11 deletions(-) > > diff --git a/gtk/channel-webdav.c b/gtk/channel-webdav.c > index 1d3862e..bde728e 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); This function (and the write_all_async, below) became available in glib-0.43, afaict. The configure script still claims that 2.28 is good enough. Could you either change configure or work out a way to be 2.28 compatible? Cheers, Jeremy > > 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); > + CHANNEL_DEBUG(self, "pushing %"G_GSIZE_FORMAT" to client %p", size, client); > > 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); > } > } > > _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel