diff options
author | Jonny Lamb <jonny.lamb@collabora.co.uk> | 2012-04-03 21:07:18 -0400 |
---|---|---|
committer | Jonny Lamb <jonny.lamb@collabora.co.uk> | 2012-04-03 21:08:39 -0400 |
commit | 3a5c302994130f7ea3ad41b4d6abc9386000f627 (patch) | |
tree | 7275266292222d3c382a5d3a283b87a0418ec898 | |
parent | 85fbec36ec2a24872383bc52b91e34ab79d435d0 (diff) | |
download | telepathy-salut-3a5c302994130f7ea3ad41b4d6abc9386000f627.tar.gz |
ft-channel: don't call gibber_ft_send unless the remote is accepted already
This should fixe all the annoying TimeoutErrors in the outgoing file
transfer tests waiting for TransferredBytesChanged (salut was actually
asserting). \o/
Signed-off-by: Jonny Lamb <jonny.lamb@collabora.co.uk>
-rw-r--r-- | src/file-transfer-channel.c | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/src/file-transfer-channel.c b/src/file-transfer-channel.c index 2ec92664..837f7402 100644 --- a/src/file-transfer-channel.c +++ b/src/file-transfer-channel.c @@ -111,6 +111,7 @@ struct _SalutFileTransferChannelPrivate { guint progress_timer; GSocket *socket; gboolean remote_accepted; + GIOChannel *channel; /* properties */ TpFileTransferState state; @@ -750,6 +751,12 @@ salut_file_transfer_channel_dispose (GObject *object) self->priv->ft = NULL; } + if (self->priv->channel != NULL) + { + g_io_channel_unref (self->priv->channel); + self->priv->channel = NULL; + } + /* release any references held by the object here */ if (G_OBJECT_CLASS (salut_file_transfer_channel_parent_class)->dispose) @@ -858,6 +865,18 @@ remote_accepted_cb (GibberFileTransfer *ft, { self->priv->remote_accepted = TRUE; + /* if we've got the IO channel here then gibber_file_transfer_send + * hasn't been called so let's call it now before doing anything + * else. */ + if (self->priv->channel != NULL) + { + gibber_file_transfer_send (ft, self->priv->channel); + + /* we have no need for this anymore */ + g_io_channel_unref (self->priv->channel); + self->priv->channel = NULL; + } + if (self->priv->socket != NULL) { /* ProvideFile has already been called. Channel is Open */ @@ -1451,11 +1470,12 @@ accept_local_socket_connection (GIOChannel *source, GIOCondition condition, gpointer user_data) { + SalutFileTransferChannel *self = SALUT_FILE_TRANSFER_CHANNEL (user_data); GibberFileTransfer *ft; int new_fd; GIOChannel *channel; - ft = SALUT_FILE_TRANSFER_CHANNEL (user_data)->priv->ft; + ft = self->priv->ft; g_assert (ft != NULL); @@ -1478,10 +1498,25 @@ accept_local_socket_connection (GIOChannel *source, g_io_channel_set_close_on_unref (channel, TRUE); g_io_channel_set_encoding (channel, NULL, NULL); if (ft->direction == GIBBER_FILE_TRANSFER_DIRECTION_INCOMING) - gibber_file_transfer_receive (ft, channel); + { + gibber_file_transfer_receive (ft, channel); + g_io_channel_unref (channel); + } else - gibber_file_transfer_send (ft, channel); - g_io_channel_unref (channel); + { + /* gibber_file_transfer_send needs ::remote-accepted to have + * already been fired, so let's wait for that, keeping + * around the GIOChannel, if it hasn't already happened. */ + if (self->priv->remote_accepted) + { + gibber_file_transfer_send (ft, channel); + g_io_channel_unref (channel); + } + else + { + self->priv->channel = channel; + } + } } return FALSE; |