Add a end function to transport
authorNicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Sun, 15 Aug 2010 01:09:48 +0200
changeset 123 58bd57666ef9
parent 122 8969dc3e2f14
child 124 7773e8147c29
Add a end function to transport
jingle-filetransfer/filetransfer.c
jingle-filetransfer/filetransfer.h
jingle-ibb/ibb.c
jingle/action-handlers.c
jingle/jingle.c
jingle/register.h
jingle/sessions.c
--- a/jingle-filetransfer/filetransfer.c	Sun Aug 15 00:51:24 2010 +0200
+++ b/jingle-filetransfer/filetransfer.c	Sun Aug 15 01:09:48 2010 +0200
@@ -48,8 +48,8 @@
 gboolean jingle_ft_handle(JingleAction action, gconstpointer data, LmMessageNode *node);
 void jingle_ft_tomessage(gconstpointer data, LmMessageNode *node);
 gboolean jingle_ft_handle_data(gconstpointer data, const gchar *data2, guint len);
-void jingle_ft_start(session_content *sc, gsize size);
-void jingle_ft_send(session_content *sc, gsize size);
+void jingle_ft_start(session_content *sc);
+void jingle_ft_send(session_content *sc);
 void jingle_ft_stop(gconstpointer data);
 
 static gboolean is_md5_hash(const gchar *hash);
@@ -358,10 +358,10 @@
   lm_message_unref(r);
 }
 
-void jingle_ft_send(session_content *sc, gsize size)
+void jingle_ft_send(session_content *sc)
 {
   JingleFT *jft;
-  gchar *buf = g_new0(gchar, size);
+  gchar buf[JINGLE_FT_SIZE_READ];
   gsize read;
   GIOStatus status;
   int count = 0;
@@ -378,7 +378,7 @@
   
   do {
     count++;
-    status = g_io_channel_read_chars(jft->outfile, (gchar*)buf, size, &read, NULL);
+    status = g_io_channel_read_chars(jft->outfile, (gchar*)buf, JINGLE_FT_SIZE_READ, &read, NULL);
   } while (status == G_IO_STATUS_AGAIN && count < 10);
   
   if (status == G_IO_STATUS_AGAIN) {
@@ -400,6 +400,7 @@
   }
   
   if (status == G_IO_STATUS_EOF) {
+    handle_app_data(sc->sid, sc->from, sc->name, NULL, 0);
     scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finish (%s)", jft->name);
     jft->hash = g_strdup(g_checksum_get_string(jft->md5));
     // Call a function to say state is ended
@@ -415,7 +416,7 @@
   }
 }
 
-void jingle_ft_start(session_content *sc, gsize size)
+void jingle_ft_start(session_content *sc)
 {
   JingleFT *jft;
   
@@ -434,7 +435,7 @@
   scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Transfer start (%s)",
                jft->name);
 
-  sc2->appfuncs->send(sc, size);
+  sc2->appfuncs->send(sc);
 }
 
 // When we got a session-terminate
--- a/jingle-filetransfer/filetransfer.h	Sun Aug 15 00:51:24 2010 +0200
+++ b/jingle-filetransfer/filetransfer.h	Sun Aug 15 01:09:48 2010 +0200
@@ -4,6 +4,7 @@
 #define NS_JINGLE_APP_FT      "urn:xmpp:jingle:apps:file-transfer:1"
 #define NS_JINGLE_APP_FT_INFO "urn:xmpp:jingle:apps:file-transfer:info:1"
 #define NS_SI_FT              "http://jabber.org/protocol/si/profile/file-transfer"
+#define JINGLE_FT_SIZE_READ 2048
 
 typedef enum {
   JINGLE_FT_OFFER,
--- a/jingle-ibb/ibb.c	Sun Aug 15 00:51:24 2010 +0200
+++ b/jingle-ibb/ibb.c	Sun Aug 15 01:09:48 2010 +0200
@@ -46,6 +46,7 @@
 const gchar* jingle_ibb_xmlns(void);
 gconstpointer jingle_ibb_new(void);
 void jingle_ibb_send(session_content *sc, gconstpointer data, gchar *buf, gsize size);
+void jingle_ibb_end(session_content *sc, gconstpointer data);
 static void _send_internal(session_content *sc, const gchar *to, gchar *buf,
                            gsize size, const gchar *sid, gint64 *seq);
 
@@ -63,7 +64,8 @@
   jingle_ibb_tomessage,
   jingle_ibb_cmp,
   jingle_ibb_new,
-  jingle_ibb_send
+  jingle_ibb_send,
+  jingle_ibb_end
 };
 
 module_info_t  info_jingle_inbandbytestream = {
@@ -295,12 +297,26 @@
   
     g_memmove(jibb->buf, jibb->buf+jibb->blocksize, jibb->dataleft);
   
-    _send_internal(sc, sess->to, buffer, jibb->blocksize, sess->sid, &jibb->seq);
+    _send_internal(sc, sess->to, buffer, jibb->blocksize, sess->sid,
+                   &jibb->seq);
   
     g_free(buf);
   }
 }
 
+void jingle_ibb_end(session_content *sc, gconstpointer data)
+{
+  JingleIBB *jibb = (JingleIBB*)data;
+  JingleSession *sess = session_find_by_sid(sc->sid, sc->from);
+  
+  if (jibb->dataleft > 0) {
+    _send_internal(sc, sess->to, jibb->buf, jibb->dataleft, sess->sid,
+                   &jibb->seq);
+  }
+  
+  g_free(jibb->buf);
+}
+
 static void jingle_ibb_unregister_lm_handlers(void)
 {
   if (lconnection) {
--- a/jingle/action-handlers.c	Sun Aug 15 00:51:24 2010 +0200
+++ b/jingle/action-handlers.c	Sun Aug 15 01:09:48 2010 +0200
@@ -241,11 +241,10 @@
   // Go go go! We start jobs!
   for (el = sess->content; el; el = el->next) {
     sc = (SessionContent*)el->data;
-    // TODO size!
     sc2->sid = sess->sid;
     sc2->from = (sess->origin == JINGLE_SESSION_INCOMING) ? sess->from : sess->to;
     sc2->name = sc->name;
-    sc->appfuncs->start(sc2, 2048);
+    sc->appfuncs->start(sc2);
   }
   jingle_free_jinglenode(jn);
 }
--- a/jingle/jingle.c	Sun Aug 15 00:51:24 2010 +0200
+++ b/jingle/jingle.c	Sun Aug 15 01:09:48 2010 +0200
@@ -401,7 +401,7 @@
   SessionContent *sc = session_find_sessioncontent(sess, sc2->name);
   
   // TODO: size!
-  sc->appfuncs->send(sc2, 2048);
+  sc->appfuncs->send(sc2);
   g_free(sc2);
 }
 
--- a/jingle/register.h	Sun Aug 15 00:51:24 2010 +0200
+++ b/jingle/register.h	Sun Aug 15 01:09:48 2010 +0200
@@ -38,8 +38,8 @@
 typedef gboolean (*JingleAppHandle) (JingleAction action, gconstpointer data, LmMessageNode *node);
 typedef void (*JingleAppToMessage) (gconstpointer data, LmMessageNode *node);
 typedef gboolean (*JingleAppHandleData) (gconstpointer data, const gchar *data2, guint len);
-typedef void (*JingleAppStart) (session_content *sc, gsize size);
-typedef void (*JingleAppSend) (session_content *sc, gsize size);
+typedef void (*JingleAppStart) (session_content *sc);
+typedef void (*JingleAppSend) (session_content *sc);
 typedef void (*JingleAppStop) (gconstpointer data);
 
 typedef gconstpointer (*JingleTransportCheck) (JingleContent *cn, GError **err);
@@ -48,6 +48,7 @@
 typedef const gchar* (*JingleTransportxmlns) (void);
 typedef gconstpointer (*JingleTransportNew) (void);
 typedef void (*JingleTransportSend) (session_content *sc, gconstpointer data, gchar *buf, gsize size);
+typedef void (*JingleTransportEnd) (session_content *sc, gconstpointer data);
 
 typedef struct {
   /* check if the description of a JingleContent is correct */
@@ -83,6 +84,8 @@
   JingleTransportNew new;
 
   JingleTransportSend send;
+  
+  JingleTransportEnd end;
 } JingleTransportFuncs;
 
 
--- a/jingle/sessions.c	Sun Aug 15 00:51:24 2010 +0200
+++ b/jingle/sessions.c	Sun Aug 15 01:09:48 2010 +0200
@@ -301,5 +301,8 @@
   sc2->sid = sess->sid;
   sc2->from = (sess->origin == JINGLE_SESSION_INCOMING) ? sess->from : sess->to;
   sc2->name = sc->name;
-  sc->transfuncs->send(sc2, sc->transport, data, size);
+  if (size != 0)
+    sc->transfuncs->send(sc2, sc->transport, data, size);
+  else
+    sc->transfuncs->end(sc2, sc->transport);
 }