Debug
authorNicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Fri, 13 Aug 2010 18:06:17 +0200
changeset 107 a7f14a5e112c
parent 106 2942c71f434a
child 108 7df2fb9a2365
Debug
jingle-filetransfer/filetransfer.c
jingle-ibb/ibb.c
jingle/action-handlers.c
jingle/jingle.c
jingle/jingle.h
jingle/register.h
jingle/send.c
jingle/send.h
jingle/sessions.c
jingle/sessions.h
--- a/jingle-filetransfer/filetransfer.c	Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle-filetransfer/filetransfer.c	Fri Aug 13 18:06:17 2010 +0200
@@ -39,6 +39,7 @@
 #include <jingle/check.h>
 #include <jingle/register.h>
 #include <jingle/sessions.h>
+#include <jingle/send.h>
 
 #include "filetransfer.h"
 
@@ -46,8 +47,8 @@
 gconstpointer jingle_ft_check(JingleContent *cn, GError **err);
 void jingle_ft_tomessage(gconstpointer data, LmMessageNode *node);
 gboolean jingle_ft_handle_data(gconstpointer data, const gchar *data2, guint len);
-void jingle_ft_start(const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size);
-void jingle_ft_send(const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size);
+void jingle_ft_start(session_content *sc, gsize size);
+void jingle_ft_send(session_content *sc, gsize size);
 static gboolean is_md5_hash(const gchar *hash);
 static void jingle_ft_init(void);
 static void jingle_ft_uninit(void);
@@ -169,24 +170,25 @@
 
 gboolean jingle_ft_handle_data(gconstpointer jingleft, const gchar *data, guint len)
 {
-  JingleFT *ft = (JingleFT *) jingleft;
+  JingleFT *jft = (JingleFT *) jingleft;
   GError *err = NULL;
   GIOStatus status;
   gsize bytes_written = 0;
 
   // TODO: check if the file already exist or if it was created
   // during the call to jingle_ft_check and handle_data
-  if (ft->outfile == NULL) {
-    ft->outfile = g_io_channel_new_file(ft->name, "w", &err);
-    if (ft->outfile == NULL || err != NULL) {
+  if (jft->outfile == NULL) {
+    jft->outfile = g_io_channel_new_file(jft->name, "w", &err);
+    if (jft->outfile == NULL || err != NULL) {
       // propagate the GError ?
       return FALSE;
 	}
+	g_io_channel_set_encoding(jft->outfile, NULL, NULL);
   }
 
-  status = g_io_channel_write_chars(ft->outfile, data, (gssize) len,
+  status = g_io_channel_write_chars(jft->outfile, data, (gssize) len,
                                     &bytes_written, &err);
-  g_io_channel_flush (ft->outfile, NULL);
+  g_io_channel_flush(jft->outfile, NULL);
   if (status != G_IO_STATUS_NORMAL || err != NULL) {
     return FALSE;
   }
@@ -325,9 +327,9 @@
   lm_message_unref(r);
 }
 
-void jingle_ft_send(const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size)
+void jingle_ft_send(session_content *sc, gsize size)
 {
-  JingleFT *jft = (JingleFT*)(data);
+  JingleFT *jft;
   gchar *buf = g_new0(gchar, size);
   gsize read;
   GIOStatus status;
@@ -335,11 +337,11 @@
   JingleSession *sess = session_find_by_sid(sid, from);
   if (sess == NULL) {
     scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: error before transfer");
-    // TODO: send session-terminate / delete session
+    // TODO: send error
     return;
   }
   
-  SessionContent *sc = session_find_sessioncontent(sess, name);
+  SessionContent *sc2 = session_find_sessioncontent(sess, name);
   
   do {
     count++;
@@ -357,42 +359,46 @@
     return;
   }
   
-  g_checksum_update(jft->md5, (guchar*)buf, read);
-  
-  // Call a handle in jingle who will call the trans
-  handle_app_data(sid, from, name, buf, read);
-  
-  g_free(buf);
+  if (status == G_IO_STATUS_NORMAL) {
+    g_checksum_update(jft->md5, (guchar*)buf, read);
+    // Call a handle in jingle who will call the trans
+    handle_app_data(sid, from, name, buf, read);
+    g_free(buf);
+  }
   
   if (status == G_IO_STATUS_EOF) {
     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
-    session_changestate_sessioncontent(sess, sc->name, JINGLE_SESSION_STATE_ENDED);
+    session_changestate_sessioncontent(sess, sc2->name, JINGLE_SESSION_STATE_ENDED);
     // Send the hash
     jingle_ft_send_hash(sess->sid, sess->to, jft->hash);
     g_checksum_free(jft->md5);
     
-    // Send a session-terminate (success)
-    
+    if (!session_remove_sessioncontent(sess, sc2->name)) {
+      jingle_send_session_terminate(sess, "success");
+      session_delete(sess);
+    }
   }
 }
 
-void jingle_ft_start(const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size)
+void jingle_ft_start(session_content *sc, gsize size)
 {
-  JingleFT *jft = (JingleFT*)data;
+  JingleFT *jft;
   
-  JingleSession *sess = session_find_by_sid(sid, from);
+  JingleSession *sess = session_find_by_sid(sc->sid, sc->from);
   if (sess == NULL) {
     scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: error before transfer");
     return;
   }
   
-  SessionContent *sc = session_find_sessioncontent(sess, name);
+  SessionContent *sc2 = session_find_sessioncontent(sess, sc->name);
 
+  jft = (JingleFT*)sc2->description;
+  
   jft->md5 = g_checksum_new(G_CHECKSUM_MD5);
   
-  sc->appfuncs->send(sid, from, name, data, size);
+  sc->appfuncs->send(sc, data, size);
 }
 
 static void jingle_ft_init(void)
--- a/jingle-ibb/ibb.c	Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle-ibb/ibb.c	Fri Aug 13 18:06:17 2010 +0200
@@ -43,7 +43,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);
+void jingle_ibb_send(session_content *sc, const gchar *to, gconstpointer data, gchar *buf, gsize size);
 
 static void jingle_ibb_init(void);
 static void jingle_ibb_uninit(void);
@@ -206,13 +206,13 @@
   g_free(bsize);
 }
 
-static void jingle_ibb_handle_ack_iq_send(LmMessage *mess, gpointer *data)
+static void jingle_ibb_handle_ack_iq_send(LmMessage *mess, gpointer data)
 {
-  
-
+  // TODO: check the sub type (error ??)
+  handle_trans_next((session_content*)data);
 }
 
-void jingle_ibb_send(const gchar *to, gconstpointer data, gchar *buf, gsize size)
+void jingle_ibb_send(session_content *sc, const gchar *to, gconstpointer data, gchar *buf, gsize size)
 {
   JingleIBB *jibb = (JingleIBB*)data;
   JingleAckHandle *ackhandle;
@@ -223,13 +223,16 @@
   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", 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));
+  ackhandle->user_data = (gpointer)sc;
+ 
   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 15:17:52 2010 +0200
+++ b/jingle/action-handlers.c	Fri Aug 13 18:06:17 2010 +0200
@@ -211,7 +211,7 @@
   
   // If there is nothing more to do, close the session
   if (g_slist_length(sess->content) == 0) {
-    jingle_send_session_terminate(jn, "success");
+    jingle_send_session_terminate(sess, "success");
     session_delete(sess);
     return;
   }
@@ -268,7 +268,7 @@
   // Make sure the request come from an user in our roster
   disp = jidtodisp(lm_message_get_from(jn->message));
   if (!roster_find(disp, jidsearch, 0)) {
-    jingle_send_session_terminate(jn, "decline");
+    // jingle_send_session_terminate(jn, "decline");
     jingle_free_jinglenode(jn);
     g_free(disp);
     return;
@@ -341,6 +341,7 @@
   JingleSession *sess;
   JingleContent *jc;
   SessionContent *sc;
+  session_content *sc2;
   
   GSList *el;
   const gchar *from = lm_message_get_from(jn->message);
@@ -373,7 +374,7 @@
   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);
+    sc2sc->appfuncs->start(sess->sid, (sess->origin == JINGLE_SESSION_INCOMING) ? sess->from : sess->to, sc->name, sc->description, 2048);
   }
 
 }
--- a/jingle/jingle.c	Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle/jingle.c	Fri Aug 13 18:06:17 2010 +0200
@@ -209,7 +209,7 @@
   } else {
     scr_LogPrint(LPRINT_LOGNORM, "Jingle event from %s cancelled.",
                  jn->initiator);
-    jingle_send_session_terminate(jn, "decline");
+    // TODO: jingle_send_session_terminate(jn, "decline");
     jingle_free_jinglenode(jn);
   }
 
@@ -466,6 +466,20 @@
   sc->appfuncs->handle_data(sc->description, data2, len);
 }
 
+void handle_trans_next(session_content *sc2) {
+  JingleSession *sess = session_find_by_sid(sc2->sid, sc2->from);
+  if (sess == NULL) {
+    // TODO: err
+    return;
+  }
+  
+  SessionContent *sc = session_find_sessioncontent(sess, sc2->name);
+  
+  // TODO: size!
+  sc->appfuncs->send(sc2, 2048);
+  g_free(sc2);
+}
+
 gchar *jingle_generate_sid(void)
 {
   gchar *sid;
--- a/jingle/jingle.h	Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle/jingle.h	Fri Aug 13 18:06:17 2010 +0200
@@ -115,6 +115,11 @@
   gpointer *user_data;
 } JingleAckHandle;
 
+typedef struct {
+  const gchar *sid;
+  const gchar *from;
+  const gchar *name;
+} session_content;
 
 LmHandlerResult jingle_handle_ack_iq(LmMessageHandler *handler,
                                      LmConnection *connection, 
--- a/jingle/register.h	Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle/register.h	Fri Aug 13 18:06:17 2010 +0200
@@ -37,15 +37,15 @@
 typedef gconstpointer (*JingleAppCheck) (JingleContent *cn, GError **err);
 typedef void (*JingleAppToMessage) (gconstpointer data, LmMessageNode *node);
 typedef gboolean (*JingleAppHandleData) (gconstpointer data, const gchar *data2, guint len);
-typedef void (*JingleAppStart) (const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size);
-typedef void (*JingleAppSend) (const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size);
+typedef void (*JingleAppStart) (session_content *sc, gsize size);
+typedef void (*JingleAppSend) (session_content *sc, gsize size);
 
 typedef gconstpointer (*JingleTransportCheck) (JingleContent *cn, GError **err);
 typedef void (*JingleTransportToMessage) (gconstpointer data, LmMessageNode *node);
 typedef gboolean (*JingleTransportCmp) (gconstpointer data1, gconstpointer data2);
 typedef const gchar* (*JingleTransportxmlns) (void);
 typedef gconstpointer (*JingleTransportNew) (void);
-typedef void (*JingleTransportSend) (const gchar *to, gconstpointer data, gchar *buf, gsize size);
+typedef void (*JingleTransportSend) (session_content *sc, const gchar *to, gconstpointer data, gchar *buf, gsize size);
 
 typedef struct {
   /* check if the description of a JingleContent is correct */
--- a/jingle/send.c	Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle/send.c	Fri Aug 13 18:06:17 2010 +0200
@@ -32,24 +32,27 @@
 #include <jingle/send.h>
 
 
-void jingle_send_session_terminate(JingleNode *jn, const gchar *reason)
+void jingle_send_session_terminate(JingleSession *js, const gchar *reason)
 {
-  LmMessage *r;
-  LmMessageNode *err,*err2;
-  JingleNode *reply = g_new0(JingleNode, 1);
   JingleAckHandle *ackhandle;
 
-  reply->action = JINGLE_SESSION_TERMINATE;
-  reply->sid = jn->sid;
-
-  r = lm_message_from_jinglenode(reply, lm_message_get_from(jn->message));
+  LmMessage *r = lm_message_new_with_sub_type(js->to, LM_MESSAGE_TYPE_IQ,
+                                              LM_MESSAGE_SUB_TYPE_SET);
+  LmMessageNode *node = lm_message_get_node(r);
+  lm_message_node_add_child(node, "jingle", NULL);
+  node = lm_message_node_get_child(node, "jingle");
+  lm_message_node_set_attributes(node, "xmlns", NS_JINGLE,
+                                 "action", "session-terminate",
+                                 "sid", js->sid,
+                                 NULL);
+  lm_message_node_add_child(node, "reason", NULL);
+  node = lm_message_node_get_child(node, "reason");
+  
   if (r == NULL) return;
 
   if (reason != NULL) { 
-    err2 = lm_message_node_get_child(r->node, "jingle");
-    // TODO check reason 
-    err = lm_message_node_add_child(err2, "reason", NULL);
-    lm_message_node_add_child(err, reason, NULL);
+    node = lm_message_node_get_child(node, "reason");
+    lm_message_node_add_child(node, reason, NULL);
   }
 
   ackhandle = g_new0(JingleAckHandle, 1);
@@ -122,13 +125,13 @@
   }
 
   if(g_slist_length(sess->content) == 0) {
-    jingle_send_session_terminate(jn, "unsupported-applications");
+    jingle_send_session_terminate(sess, "unsupported-applications");
     session_delete(sess);
     return;
   }
 
   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;
@@ -167,7 +170,6 @@
   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);
--- a/jingle/send.h	Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle/send.h	Fri Aug 13 18:06:17 2010 +0200
@@ -7,7 +7,7 @@
 #include <jingle/jingle.h>
 #include <jingle/sessions.h>
 
-void jingle_send_session_terminate(JingleNode *jn, const gchar *reason);
+void jingle_send_session_terminate(JingleSession *js, const gchar *reason);
 void jingle_send_session_initiate(JingleSession *js);
 void jingle_send_session_accept(JingleNode *jn);
 
--- a/jingle/sessions.c	Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle/sessions.c	Fri Aug 13 18:06:17 2010 +0200
@@ -162,15 +162,17 @@
   return NULL;
 }
 
-void session_remove_sessioncontent(JingleSession *sess, const gchar *name)
+int session_remove_sessioncontent(JingleSession *sess, const gchar *name)
 {
   SessionContent *sc;
   sc = session_find_sessioncontent(sess, name);
   if(sc == NULL) return;
 
-  if (sc->state == JINGLE_SESSION_STATE_ACTIVE); // We should stop the transfert
+  if (sc->state == JINGLE_SESSION_STATE_ACTIVE); // We should stop the transfer
 
   sess->content = g_slist_remove(sess->content, sc);
+  
+  return g_slist_length(sess->content);
 }
 
 void session_changestate_sessioncontent(JingleSession *sess, const gchar *name,
@@ -276,10 +278,14 @@
 {
   // TODO: check that the module is always loaded
   JingleSession *sess = session_find_by_sid(sid, from);
+  session_content *sc2 = g_new0(session_content, 1);
   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);
+  sc2->sid = sess->sid;
+  sc2->from = (sess->origin == JINGLE_SESSION_INCOMING) ? sess->from : sess->to;
+  sc2->name = sc->name;
+  sc->transfuncs->send(sc2, sess->to, sc->transport, data, size);
 }
--- a/jingle/sessions.h	Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle/sessions.h	Fri Aug 13 18:06:17 2010 +0200
@@ -85,7 +85,7 @@
                          SessionState state);
 SessionContent *session_find_sessioncontent(JingleSession *sess, const gchar *name);
 SessionContent *session_find_transport(const gchar *xmlns_trans, gconstpointer data);
-void session_remove_sessioncontent(JingleSession *sess, const gchar *name);
+int session_remove_sessioncontent(JingleSession *sess, const gchar *name);
 void session_changestate_sessioncontent(JingleSession *sess, const gchar *name,
                                         SessionState state);
 void session_delete(JingleSession *sess);