a function to find a sessioncontent
authorNicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Tue, 06 Jul 2010 16:57:11 +0200
changeset 33 92e92ce901e7
parent 32 72bbe33f151a
child 34 08715c230027
a function to find a sessioncontent
jingle/jingle.h
jingle/register.h
jingle/sessions.c
jingle/sessions.h
--- a/jingle/jingle.h	Tue Jul 06 02:21:33 2010 +0200
+++ b/jingle/jingle.h	Tue Jul 06 16:57:11 2010 +0200
@@ -100,7 +100,6 @@
    * child element that specifies a potential transport
    * method */
   LmMessageNode *transport;
-
 } JingleContent;
 
 struct JingleActionList {
--- a/jingle/register.h	Tue Jul 06 02:21:33 2010 +0200
+++ b/jingle/register.h	Tue Jul 06 16:57:11 2010 +0200
@@ -11,10 +11,12 @@
 typedef gconstpointer (*JingleAppCheck) (JingleContent *cn, GError **err);
 typedef void (*JingleAppHandle) (JingleNode *jn, JingleContent *cn);
 typedef LmMessageNode* (*JingleAppGetLM) (gconstpointer data);
+typedef gboolean (*JingleAppCmp) (gconstpointer data, gconstpointer data2);
 
 typedef gconstpointer (*JingleTransportCheck) (JingleContent *cn, GError **err);
 typedef void (*JingleTransportHandle) (JingleNode *jn, JingleContent *cn);
 typedef LmMessageNode* (*JingleTransportGetLM) (gconstpointer data);
+typedef gboolean (*JingleTransportCmp) (gconstpointer data, gconstpointer data2);
 
 typedef struct {
   /* check if the description of a JingleContent is correct */
@@ -25,6 +27,8 @@
   
   /* If we got a LM with the good xmlns */
   JingleAppHandle handle;
+  
+  JingleAppCmp cmp;
 
 } JingleAppFuncs;
 
@@ -37,6 +41,8 @@
   /* */
   JingleAppHandle handle;
   
+  JingleTransportCmp cmp;
+  
 } JingleTransportFuncs;
 
 
--- a/jingle/sessions.c	Tue Jul 06 02:21:33 2010 +0200
+++ b/jingle/sessions.c	Tue Jul 06 16:57:11 2010 +0200
@@ -24,6 +24,7 @@
 
 #include <jingle/jingle.h>
 #include <jingle/sessions.h>
+#include <jingle/register.h>
 
 
 static GSList *sessions;
@@ -69,6 +70,35 @@
   return session_find_by_sid(jn->sid, from);
 }
 
+void session_add_content(JingleSession *sess, JingleContent *cn)
+{
+  SessionContent *sc = g_new0(SessionContent, 1);
+  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->description = sc->appfuncs->check(cn, NULL);
+  sc->transport = sc->appfuncs->check(cn, NULL);
+
+  sess->content = g_slist_append(sess->content, sc);
+}
+
+SessionContent *session_find_sessioncontent(JingleSession *sess,
+                                        gconstpointer desc, gconstpointer trans)
+{
+  GSList *el;
+  SessionContent *sc;
+  for (el = sess->content; el; el = el->next) {
+    sc = (SessionContent*) el->data;
+    if (sc->appfuncs->cmp(sc->description, desc) == TRUE &&
+        sc->transfuncs->cmp(sc->transport, trans) == TRUE)
+      return sc;
+  }
+  return NULL;
+}
+
 /**
  * Remove a session from the linked list and free it.
  */
--- a/jingle/sessions.h	Tue Jul 06 02:21:33 2010 +0200
+++ b/jingle/sessions.h	Tue Jul 06 16:57:11 2010 +0200
@@ -3,6 +3,8 @@
 
 #include <glib.h>
 
+#include <jingle/register.h>
+
 
 typedef enum {
   JINGLE_SESSION_
@@ -17,17 +19,18 @@
 } JingleSession;
 
 typedef struct {
-  gconstpointer *description;
+  gconstpointer description;
   JingleAppFuncs *appfuncs;
-  gconstpointer *transport;
+  gconstpointer transport;
   JingleTransportFuncs *transfuncs;
 } SessionContent;
 
 
-JingleSession *session_new(JingleNode *jn, LmMessageNode *app,
-                           LmMessageNode *transport);
+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);
+SessionContent *session_find_sessioncontent(JingleSession *sess, gconstpointer desc, gconstpointer trans);
 void session_delete(JingleSession *sess);
 void session_remove(JingleSession *sess);
 void session_free(JingleSession *sess);