[Spice-devel] [spice-gtk PATCH v4 2/6] webdav: write all buffer to client webdav
Victor Toso
victortoso at redhat.com
Tue Jun 2 09:00:47 PDT 2015
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);
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);
}
}
--
2.4.2
More information about the Spice-devel
mailing list