jingle/sessions.c
changeset 67 c12618793df0
parent 63 b56853071a09
child 75 bd48c89b0a3d
--- a/jingle/sessions.c	Wed Jul 21 17:43:46 2010 +0200
+++ b/jingle/sessions.c	Fri Jul 23 03:23:23 2010 +0200
@@ -34,21 +34,29 @@
 /**
  * Create a new session and insert it in the linked list.
  */
-JingleSession *session_new(JingleNode *jn)
+JingleSession *session_new(const gchar *sid, const gchar *initiator,
+                           const gchar *from)
 {
   JingleSession *js = g_new0(JingleSession, 1);
+  
+  js->sid = g_strdup(sid);
+  js->initiator = g_strdup(initiator);
+  js->from = g_strdup(from);
+  
+  sessions = g_slist_append(sessions, js);
+  return js;
+}
+
+JingleSession *session_new_from_jinglenode(JingleNode *jn)
+{
   const gchar *from;
   
-  js->sid = g_strdup(jn->sid);
-  js->initiator = g_strdup(jn->initiator);
   from = lm_message_get_from(jn->message);
   if (!from) {
     return NULL;
   }
-  js->from = g_strdup(from);
-
-  sessions = g_slist_append(sessions, js);
-  return js;
+ 
+  return session_new(jn->sid, jn->initiator, from);
 }
 
 JingleSession *session_find_by_sid(const gchar *sid, const gchar *from)
@@ -70,22 +78,48 @@
   return session_find_by_sid(jn->sid, from);
 }
 
-void session_add_content(JingleSession *sess, JingleContent *cn,
+void session_add_content(JingleSession *sess, const gchar *name,
                          SessionState state)
 {
   SessionContent *sc = g_new0(SessionContent, 1);
   
-  sc->name = cn->name;
+  sc->name = name;
   sc->state = state;
+
+  sess->content = g_slist_append(sess->content, sc);
+}
+
+void session_add_app(JingleSession *sess, const gchar *name,
+                           const gchar *xmlns, gconstpointer data)
+{
+  SessionContent *sc = session_find_sessioncontent(sess, name);
   
-  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->transfuncs->check(cn, NULL);
+  sc->xmlns_desc = xmlns;
+  sc->appfuncs = jingle_get_appfuncs(xmlns);
+  sc->description = data;
+}
+
+void session_add_trans(JingleSession *sess, const gchar *name,
+                           const gchar *xmlns, gconstpointer data)
+{
+  SessionContent *sc = session_find_sessioncontent(sess, name);
   
-  sess->content = g_slist_append(sess->content, sc);
+  sc->xmlns_trans = xmlns;
+  sc->transfuncs = jingle_get_transportfuncs(xmlns);
+  sc->transport = data;
+}
+
+void session_add_content_from_jinglecontent(JingleSession *sess, JingleContent *cn,
+                         SessionState state)
+{
+  SessionContent *sc = g_new0(SessionContent, 1);
+  session_add_content(sess, cn->name, state);
+  session_add_app(sess, cn->name,
+                  lm_message_node_get_attribute(cn->description, "xmlns"),
+                  sc->appfuncs->check(cn, NULL));
+  session_add_trans(sess, cn->name,
+                  lm_message_node_get_attribute(cn->transport, "xmlns"),
+                  sc->transfuncs->check(cn, NULL));
 }
 
 SessionContent *session_find_sessioncontent(JingleSession *sess,