[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