--- 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);