[Telepathy-commits] [telepathy-salut/master] Added transferred-chunk signal to enable TransferredBytes to work.

Jonny Lamb jonny.lamb at collabora.co.uk
Fri Nov 21 03:46:17 PST 2008


20080804160458-8ed0e-ace6aeefc687528a03cecc1bbdae4dc1254209d3.gz
---
 lib/gibber/gibber-file-transfer.c     |    8 ++++++++
 lib/gibber/gibber-oob-file-transfer.c |    9 +++++++++
 src/salut-file-channel.c              |   18 ++++++++++++++++--
 3 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/lib/gibber/gibber-file-transfer.c b/lib/gibber/gibber-file-transfer.c
index ac469fb..b4f96fe 100644
--- a/lib/gibber/gibber-file-transfer.c
+++ b/lib/gibber/gibber-file-transfer.c
@@ -40,6 +40,7 @@ enum
   REMOTE_ACCEPTED,
   FINISHED,
   ERROR,
+  TRANSFERRED_CHUNK,
   LAST_SIGNAL
 };
 
@@ -248,6 +249,13 @@ gibber_file_transfer_class_init (GibberFileTransferClass *gibber_file_transfer_c
       0, NULL, NULL,
       _gibber_signals_marshal_VOID__UINT_INT_STRING,
       G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_INT, G_TYPE_STRING);
+
+  signals[TRANSFERRED_CHUNK] = g_signal_new ("transferred-chunk",
+      G_OBJECT_CLASS_TYPE (gibber_file_transfer_class),
+      G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+      0, NULL, NULL,
+      _gibber_signals_marshal_VOID__UINT64,
+      G_TYPE_NONE, 1, G_TYPE_UINT64);
 }
 
 static void
diff --git a/lib/gibber/gibber-oob-file-transfer.c b/lib/gibber/gibber-oob-file-transfer.c
index 6f2b2c5..64a2e11 100644
--- a/lib/gibber/gibber-oob-file-transfer.c
+++ b/lib/gibber/gibber-oob-file-transfer.c
@@ -210,6 +210,13 @@ gibber_oob_file_transfer_new_from_stanza (GibberXmppStanza *stanza,
   return GIBBER_FILE_TRANSFER (self);
 }
 
+static void
+transferred_chunk (GibberOobFileTransfer *self,
+                guint64 bytes_read)
+{
+  g_signal_emit_by_name (self, "transferred-chunk", bytes_read);
+}
+
 /*
  * Data received from the HTTP server.
  */
@@ -222,6 +229,7 @@ http_client_chunk_cb (SoupMessage *msg,
   /* FIXME make async */
   g_io_channel_write_chars (self->priv->channel, msg->response.body,
       msg->response.length, NULL, NULL);
+  transferred_chunk (self, (guint64) msg->response.length);
 }
 
 /*
@@ -405,6 +413,7 @@ input_channel_readable_cb (GIOChannel *source,
               buff, bytes_read);
           soup_message_io_unpause (self->priv->msg);
           DEBUG("Data available, writing a %d bytes chunk", bytes_read);
+          transferred_chunk (self, (guint64) bytes_read);
           return FALSE;
         case G_IO_STATUS_AGAIN:
           DEBUG("Data available, try again");
diff --git a/src/salut-file-channel.c b/src/salut-file-channel.c
index 8dddf34..3dc99d9 100644
--- a/src/salut-file-channel.c
+++ b/src/salut-file-channel.c
@@ -778,8 +778,8 @@ remote_accepted_cb (GibberFileTransfer *ft,
   g_signal_connect (ft, "finished", G_CALLBACK (ft_finished_cb), self);
 }
 
-static gboolean
-setup_local_socket (SalutFileChannel *self);
+static gboolean setup_local_socket (SalutFileChannel *self);
+static void ft_transferred_chunk_cb (GibberFileTransfer *ft, guint64 count, SalutFileChannel *self);
 
 static void
 send_file_offer (SalutFileChannel *self)
@@ -798,6 +798,8 @@ send_file_offer (SalutFileChannel *self)
 
   self->priv->ft = ft;
 
+  g_signal_connect (ft, "transferred-chunk", G_CALLBACK (ft_transferred_chunk_cb), self);
+
   setup_local_socket (self);
 
   if (self->priv->size != SALUT_UNDEFINED_FILE_SIZE)
@@ -908,6 +910,17 @@ salut_file_channel_set_state (SalutSvcChannelTypeFile *iface,
       state, reason);
 }
 
+static void
+ft_transferred_chunk_cb (GibberFileTransfer *ft, guint64 count, SalutFileChannel *self)
+{
+  SalutSvcChannelTypeFile *iface = SALUT_SVC_CHANNEL_TYPE_FILE (self);
+
+  self->priv->transferred_bytes += count;
+
+  salut_svc_channel_type_file_emit_transferred_bytes_changed (iface,
+      self->priv->transferred_bytes);
+}
+
 /**
  * salut_file_channel_accept_file
  *
@@ -950,6 +963,7 @@ salut_file_channel_accept_file (SalutSvcChannelTypeFile *iface,
     }
 
   g_signal_connect (ft, "finished", G_CALLBACK (ft_finished_cb), self);
+  g_signal_connect (ft, "transferred-chunk", G_CALLBACK (ft_transferred_chunk_cb), self);
 
   setup_local_socket (self);
 
-- 
1.5.6.5




More information about the Telepathy-commits mailing list