ibb handle new data
authorNicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Fri, 13 Aug 2010 13:53:12 +0200
changeset 105 c31988e107b3
parent 104 060e69633902
child 106 2942c71f434a
ibb handle new data
jingle-filetransfer/filetransfer.c
jingle-ibb/ibb.c
jingle/action-handlers.c
jingle/send.c
jingle/sessions.c
--- a/jingle-filetransfer/filetransfer.c	Fri Aug 13 01:23:59 2010 +0200
+++ b/jingle-filetransfer/filetransfer.c	Fri Aug 13 13:53:12 2010 +0200
@@ -262,10 +262,9 @@
     jingle_handle_app(sess, "file", NS_JINGLE_APP_FT, jft, recipientjid);
 
     g_free(ressource);
-    //g_checksum_free(md5);
     g_free(sid);
-    g_io_channel_unref(jft->outfile);
-    g_io_channel_shutdown(jft->outfile, TRUE, NULL);
+    //g_io_channel_unref(jft->outfile);
+    //g_io_channel_shutdown(jft->outfile, TRUE, NULL);
   }
 
   free_arg_lst(args);
@@ -333,7 +332,11 @@
   GIOStatus status;
   int count = 0;
   JingleSession *sess = session_find_by_sid(sid, from);
-  // TODO: sess == NULL
+  if (sess == NULL) {
+    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: error before transfer");
+    // TODO: send session-terminate / delete session
+    return;
+  }
   
   SessionContent *sc = session_find_sessioncontent(sess, name);
   
@@ -356,7 +359,7 @@
   g_checksum_update(jft->md5, (guchar*)buf, read);
   
   // Call a handle in jingle who will call the trans
-  handle_app_data(sid, name, from, buf, read);
+  handle_app_data(sid, from, name, buf, read);
   
   g_free(buf);
   
@@ -379,13 +382,16 @@
   JingleFT *jft = (JingleFT*)data;
   
   JingleSession *sess = session_find_by_sid(sid, from);
-  // TODO: sess == NULL
+  if (sess == NULL) {
+    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: error before transfer");
+    return;
+  }
   
   SessionContent *sc = session_find_sessioncontent(sess, name);
 
   jft->md5 = g_checksum_new(G_CHECKSUM_MD5);
   
-  sc->appfuncs->send(sid, name, from, data, size);
+  sc->appfuncs->send(sid, from, name, data, size);
 }
 
 static void jingle_ft_init(void)
--- a/jingle-ibb/ibb.c	Fri Aug 13 01:23:59 2010 +0200
+++ b/jingle-ibb/ibb.c	Fri Aug 13 13:53:12 2010 +0200
@@ -26,6 +26,7 @@
 #include <mcabber/modules.h>
 #include <mcabber/utils.h>
 #include <mcabber/xmpp_helper.h>
+#include <mcabber/logprint.h>
 
 #include <jingle/jingle.h>
 #include <jingle/check.h>
@@ -40,6 +41,7 @@
 void jingle_ibb_tomessage(gconstpointer data, LmMessageNode *node);
 const gchar* jingle_ibb_xmlns(void);
 gconstpointer jingle_ibb_new(void);
+void jingle_ibb_send(const gchar *to, gconstpointer data, gchar *buf, gsize size);
 
 static void jingle_ibb_init(void);
 static void jingle_ibb_uninit(void);
@@ -52,7 +54,8 @@
   jingle_ibb_check,
   jingle_ibb_tomessage,
   jingle_ibb_cmp,
-  jingle_ibb_new
+  jingle_ibb_new,
+  jingle_ibb_send
 };
 
 module_info_t  info_jingle_inbandbytestream = {
@@ -108,7 +111,7 @@
                                  gpointer user_data)
 {
   const gchar *data64;
-  JingleIBB *ibb = g_new0(JingleIBB, 1);
+  JingleIBB *jibb = g_new0(JingleIBB, 1);
   gsize len;
   guchar *data;
   
@@ -128,14 +131,14 @@
 
   jingle_ack_iq(message);
   
-  ibb->sid = lm_message_node_get_attribute(dnode, "sid");
-  ibb->seq = g_ascii_strtoll(lm_message_node_get_attribute(dnode, "seq"), NULL, 10);
+  jibb->sid = lm_message_node_get_attribute(dnode, "sid");
+  jibb->seq = g_ascii_strtoll(lm_message_node_get_attribute(dnode, "seq"), NULL, 10);
   
   data64 = lm_message_node_get_value(dnode);
   
   data = g_base64_decode(data64, &len);
   
-  handle_trans_data(NS_JINGLE_TRANSPORT_IBB, ibb, (const gchar *)data, (guint)len);
+  handle_trans_data(NS_JINGLE_TRANSPORT_IBB, jibb, (const gchar *)data, (guint)len);
   
   return LM_HANDLER_RESULT_REMOVE_MESSAGE;
 }
@@ -209,19 +212,20 @@
 {
   JingleIBB *jibb = (JingleIBB*)data;
   JingleAckHandle *ackhandle;
-  gchar* base64 = g_base64_encode((const guchar *)data, size);
+  gchar *base64 = g_base64_encode((const guchar *)data, size);
+  gchar *seq = g_strdup_printf("%" G_GINT64_FORMAT, jibb->seq);
   
   LmMessage *r = lm_message_new_with_sub_type(to, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET);
   LmMessageNode *node = lm_message_get_node(r);
   lm_message_node_add_child(node, "data", NULL);
   node = lm_message_node_get_child(node, "data");
-  lm_message_node_set_attributes(node, "xmlns", NS_TRANSPORT_IBB, "sid", jibb->sid, "seq", jibb->seq, NULL);
+  lm_message_node_set_attributes(node, "xmlns", NS_TRANSPORT_IBB, "sid", jibb->sid, "seq", seq, NULL);
   lm_message_node_set_value(node, base64);
   
   ackhandle = g_new0(JingleAckHandle, 1);
   ackhandle->callback = jingle_ibb_handle_ack_iq_send;
   ackhandle->user_data = NULL;
-  
+  scr_log_print(LPRINT_DEBUG, "%s", lm_message_node_to_string(r->node));
   lm_connection_send_with_reply(lconnection, r,
                                 jingle_new_ack_handler(ackhandle), NULL);
   lm_message_unref(r);
--- a/jingle/action-handlers.c	Fri Aug 13 01:23:59 2010 +0200
+++ b/jingle/action-handlers.c	Fri Aug 13 13:53:12 2010 +0200
@@ -361,12 +361,21 @@
   }
   
   // We delete content who have been refuse
-  for (el = sess->content; el; el = el->next) {
+  /*for (el = sess->content; el; el = el->next) {
     sc = (SessionContent*) el->data;
     if (sc->state == JINGLE_SESSION_STATE_PENDING) {
+      scr_log_print(LPRINT_DEBUG, "Delete %s!", sc->name);
       session_remove_sessioncontent(sess, sc->name);
     }
+  }*/
+  
+  // Go go go! We start jobs!
+  for (el = sess->content; el; el = el->next) {
+    sc = (SessionContent*)el->data;
+    // TODO size!
+    sc->appfuncs->start(sess->sid, (sess->origin == JINGLE_SESSION_INCOMING) ? sess->from : sess->to, sc->name, sc->description, 2048);
   }
+
 }
 
 void handle_session_terminate(JingleNode *jn)
--- a/jingle/send.c	Fri Aug 13 01:23:59 2010 +0200
+++ b/jingle/send.c	Fri Aug 13 13:53:12 2010 +0200
@@ -70,12 +70,6 @@
   SessionContent *sc;
   
   if(lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_RESULT) {
-    // Go go go! We start jobs!
-    for (child = sess->content; child; child = child->next) {
-      sc = (SessionContent*)child->data;
-      // TODO size!
-      sc->appfuncs->start(sess->sid, sess->from, sc->name, sc->description, 2048);
-    }
     return;
   }
   
@@ -134,6 +128,7 @@
   }
 
   mess = lm_message_from_jinglesession(sess, JINGLE_SESSION_ACCEPT);
+  scr_log_print(LPRINT_DEBUG, "%s", lm_message_node_to_string(mess->node));
   if (mess) {
     ackhandle = g_new0(JingleAckHandle, 1);
     ackhandle->callback = jingle_handle_ack_iq_sa;
@@ -172,7 +167,8 @@
   LmMessage *mess = lm_message_from_jinglesession(js, JINGLE_SESSION_INITIATE);
   lm_message_node_set_attribute(lm_message_node_get_child(mess->node, "jingle"),
                                 "initiator", js->from);
-
+scr_log_print(LPRINT_DEBUG, "%s", lm_message_node_to_string(mess->node));
+ 
   if (mess) {
     ackhandle = g_new0(JingleAckHandle, 1);
     ackhandle->callback = jingle_handle_ack_iq_si;
--- a/jingle/sessions.c	Fri Aug 13 01:23:59 2010 +0200
+++ b/jingle/sessions.c	Fri Aug 13 13:53:12 2010 +0200
@@ -276,6 +276,10 @@
 {
   // TODO: check that the module is always loaded
   JingleSession *sess = session_find_by_sid(sid, from);
+  if (sess == NULL) {
+    scr_LogPrint(LPRINT_LOGNORM, "Session not found (%s)", name);
+    return;
+  }
   SessionContent *sc = session_find_sessioncontent(sess, name);
   sc->transfuncs->send(sess->to, sc->transport, data, size);
 }