Handle for jingle
authorNicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Sun, 18 Jul 2010 21:51:41 +0200
changeset 54 1c1153f9f945
parent 53 64a47491c068
child 55 bc0281fee13d
Handle for jingle
jingle-filetransfer/filetransfer.c
jingle-ibb/ibb.c
jingle-ibb/ibb.h
jingle/check.h
jingle/jingle.c
jingle/jingle.h
jingle/register.h
jingle/sessions.c
jingle/sessions.h
--- a/jingle-filetransfer/filetransfer.c	Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle-filetransfer/filetransfer.c	Sun Jul 18 21:51:41 2010 +0200
@@ -140,7 +140,7 @@
     return FALSE;
 }
 
-gboolean handle_data(gconstpointer *jingleft, const gchar *data, guint len)
+gboolean handle_data(gconstpointer jingleft, const gchar *data, guint len)
 {
   JingleFT *ft = (JingleFT *) jingleft;
   GError *err = NULL;
--- a/jingle-ibb/ibb.c	Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle-ibb/ibb.c	Sun Jul 18 21:51:41 2010 +0200
@@ -64,6 +64,7 @@
 
   blocksize  = lm_message_node_get_attribute(node, "block-size");
   ibb->sid = lm_message_node_get_attribute(node, "sid");
+  ibb->data = NULL;
   
   if (!ibb->sid || !blocksize) {
     g_set_error(err, JINGLE_CHECK_ERROR, JINGLE_CHECK_ERROR_MISSING,
@@ -89,8 +90,8 @@
                                  LmConnection *connection, LmMessage *message,
                                  gpointer user_data)
 {
-  const gchar *seq, *sid, *data64;
-  guchar *data;
+  const gchar *data64;
+  JingleIBB *ibb = g_new0(JingleIBB, 1);
   
   LmMessageSubType iqtype = lm_message_get_sub_type(message);
   if (iqtype != LM_MESSAGE_SUB_TYPE_SET)
@@ -108,18 +109,39 @@
 
   jingle_ack_iq(message);
   
-  sid = lm_message_node_get_attribute(dnode, "sid");
-  seq = lm_message_node_get_attribute(dnode, "seq");
+  ibb->sid = lm_message_node_get_attribute(dnode, "sid");
+  ibb->seq = lm_message_node_get_attribute(dnode, "seq");
   
   data64 = lm_message_node_get_value(dnode);
   
-  data = g_base64_decode(data64, NULL);
+  ibb->data = g_base64_decode(data64, NULL);
   
-  g_free(data);
+  
   
   return LM_HANDLER_RESULT_REMOVE_MESSAGE;
 }
 
+
+gboolean jingle_ibb_cmp(gconstpointer data1, gconstpointer data2)
+{
+  const JingleIBB *ibb1 = data1, *ibb2 = data2;
+  if(g_strcmp0(ibb1->sid, ibb2->sid))
+    return FALSE;
+  return TRUE;
+}
+
+
+int jingle_ibb_check_session(gconstpointer data, gconstpointer session)
+{
+  const JingleIBB *ibb1 = data, *ibb2 = session;
+  if(!g_strcmp0(ibb1->sid, ibb2->sid) && ibb1->seq > ibb2->seq) {
+    // TODO: change the seq in the session
+    return 0;
+  }
+  return 1;
+}
+
+
 static void jingle_ibb_init(void)
 {
   jingle_ibb_handler = lm_message_handler_new(jingle_ibb_handle_iq, NULL, NULL);
--- a/jingle-ibb/ibb.h	Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle-ibb/ibb.h	Sun Jul 18 21:51:41 2010 +0200
@@ -10,7 +10,11 @@
 
   /* The identifiant of the transfer */
   const gchar *sid;
+  
+  guchar *data;
 
+  const gchar *seq;
+  
 } JingleIBB;
 
 #endif
--- a/jingle/check.h	Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle/check.h	Sun Jul 18 21:51:41 2010 +0200
@@ -19,6 +19,9 @@
 gboolean check_jingle(LmMessage *message, LmMessageNode *node,
                       JingleNode *jn, GError **err);
 gboolean check_contents(JingleNode *jn, GError **err);
+
+gboolean check_transport(const gchar *xmlns, gconstpointer *data);
+
 GQuark jingle_check_error_quark(void);
 
 #endif
--- a/jingle/jingle.c	Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle/jingle.c	Sun Jul 18 21:51:41 2010 +0200
@@ -36,7 +36,7 @@
 #include <jingle/action-handlers.h>
 #include <jingle/register.h>
 #include <jingle/send.h>
-
+#include <jingle/sessions.h>
 
 static void  jingle_register_lm_handlers(void);
 static void  jingle_unregister_lm_handlers(void);
@@ -395,3 +395,11 @@
     lm_message_node_set_attribute(node, "senders", "responder");
 }
 
+void handle_trans_data(const gchar *xmlns, gconstpointer data, const gchar *data2, guint len)
+{
+  SessionContent *sc = session_find_transport(xmlns, data);
+  if (sc == NULL) {
+    return;  
+  }
+  sc->appfuncs->handle_data(sc->description, data2, len);
+}
--- a/jingle/jingle.h	Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle/jingle.h	Sun Jul 18 21:51:41 2010 +0200
@@ -134,5 +134,7 @@
 
 gboolean evscallback_jingle(guint evcontext, const gchar *arg,
                             gpointer userdata);
+                            
+void handle_trans_data(const gchar *xmlns, gconstpointer data, const gchar *data2, guint len);
 
 #endif
--- a/jingle/register.h	Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle/register.h	Sun Jul 18 21:51:41 2010 +0200
@@ -20,10 +20,12 @@
 typedef gconstpointer (*JingleAppCheck) (JingleContent *cn, GError **err);
 typedef void (*JingleAppHandle) (JingleNode *jn, JingleContent *cn);
 typedef LmMessageNode* (*JingleAppGetLM) (gconstpointer data);
+typedef gboolean (*JingleAppHandleData) (gconstpointer data, const gchar *data2, guint len);
 
 typedef gconstpointer (*JingleTransportCheck) (JingleContent *cn, GError **err);
 typedef void (*JingleTransportHandle) (JingleNode *jn, JingleContent *cn);
 typedef LmMessageNode* (*JingleTransportGetLM) (gconstpointer data);
+typedef gboolean (*JingleTransportCmp) (gconstpointer data1, gconstpointer data2);
 
 typedef struct {
   /* check if the description of a JingleContent is correct */
@@ -34,6 +36,8 @@
   
   /* If we got a LM with the good xmlns */
   JingleAppHandle handle;
+  
+  JingleAppHandleData handle_data;
 
 } JingleAppFuncs;
 
@@ -46,6 +50,8 @@
   /* */
   JingleAppHandle handle;
   
+  JingleTransportCmp cmp;
+  
 } JingleTransportFuncs;
 
 
--- a/jingle/sessions.c	Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle/sessions.c	Sun Jul 18 21:51:41 2010 +0200
@@ -78,15 +78,13 @@
   sc->name = cn->name;
   sc->state = state;
   
-  const gchar *tmpchar = lm_message_node_get_attribute(cn->description,
-                                                       "xmlns");
-  sc->appfuncs = jingle_get_appfuncs(tmpchar);
-  tmpchar = lm_message_node_get_attribute(cn->transport, "xmlns");
-  sc->transfuncs = jingle_get_transportfuncs(tmpchar);
-  // TODO errors
+  sc->xmlns_desc = lm_message_node_get_attribute(cn->description, "xmlns");
+  sc->appfuncs = jingle_get_appfuncs(sc->xmlns_desc);
+  sc->xmlns_trans = lm_message_node_get_attribute(cn->transport, "xmlns");
+  sc->transfuncs = jingle_get_transportfuncs(sc->xmlns_trans);
   sc->description = sc->appfuncs->check(cn, NULL);
-  sc->transport = sc->appfuncs->check(cn, NULL);
-
+  sc->transport = sc->transfuncs->check(cn, NULL);
+  
   sess->content = g_slist_append(sess->content, sc);
 }
 
@@ -97,12 +95,28 @@
   SessionContent *sc;
   for (el = sess->content; el; el = el->next) {
     sc = (SessionContent*) el->data;
-    if (g_strcmp0(sc->name, name))
+    if (!g_strcmp0(sc->name, name))
       return sc;
   }
   return NULL;
 }
 
+SessionContent *session_find_transport(const gchar *xmlns_trans, gconstpointer data)
+{
+  GSList *el, *el1;
+  JingleSession *sess;
+  SessionContent *sc;
+  for (el1 = sessions; el1; el1 = el1->next) {
+    sess = (JingleSession*) el1->data;
+    for (el = sess->content; el; el = el->next) {
+      sc = (SessionContent*) el->data;
+      if (!g_strcmp0(sc->xmlns_trans, xmlns_trans) && sc->transfuncs->cmp(sc->transport, data))
+        return sc;
+    }
+  }
+  return NULL;
+}
+
 void session_remove_sessioncontent(JingleSession *sess, const gchar *name)
 {
   SessionContent *sc;
@@ -123,6 +137,7 @@
     sc->state = state;
 }
 
+
 /**
  * Remove a session from the linked list and free it.
  */
--- a/jingle/sessions.h	Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle/sessions.h	Sun Jul 18 21:51:41 2010 +0200
@@ -27,18 +27,20 @@
 typedef struct {
   const gchar *name;
   SessionState state;
+  const gchar *xmlns_desc;
   gconstpointer description;
   JingleAppFuncs *appfuncs;
+  const gchar *xmlns_trans;
   gconstpointer transport;
   JingleTransportFuncs *transfuncs;
 } SessionContent;
 
-
 JingleSession *session_new(JingleNode *jn);
 JingleSession *session_find_by_sid(const gchar *sid, const gchar *from);
 JingleSession *session_find(const JingleNode *jn);
 void session_add_content(JingleSession *sess, JingleContent *cn, 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);
 void session_changestate_sessioncontent(JingleSession *sess, const gchar *name,
                                         SessionState state);