diff -r cd16ab43a285 -r c12618793df0 jingle/sessions.c --- 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,