[Spice-devel] [spice-gtk PATCH v3 2/5] webdav: write all buffer to client webdav
Victor Toso
victortoso at redhat.com
Fri Jul 17 11:22:08 PDT 2015
Hey,
As discussed on IRC, this is fixed upstream by
http://cgit.freedesktop.org/spice/spice-gtk/commit/?id=ef2c79854cc4c7a50c3949bfeebf8870b40c197f
Sorry about that,
Cheers,
Victor Toso
On Fri, Jul 17, 2015 at 11:51:02AM -0500, Jeremy White wrote:
> 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);
> > }
> > }
> >
> >
>
More information about the Spice-devel
mailing list