# HG changeset patch # User Nicolas Cornu # Date 1278713396 -7200 # Node ID 357e6910617184ab37a0aa125a0db10ca752b75e # Parent 526d61c145a7a9edc5017626b95ffef962c5c045 Split handle_session_initiate into two functions diff -r 526d61c145a7 -r 357e69106171 jingle/action-handlers.c --- a/jingle/action-handlers.c Fri Jul 09 16:22:11 2010 +0200 +++ b/jingle/action-handlers.c Sat Jul 10 00:09:56 2010 +0200 @@ -238,25 +238,12 @@ } } -/* The session-initiate action is used to request negotiation of a new Jingle - * session. When sending a session-initiate with one element, the - * value of the element's 'disposition' attribute MUST be "session" - * (if there are multiple elements then at least one MUST have a - * disposition of "session"); if this rule is violated, the responder MUST - * return a error to the initiator. - */ void handle_session_initiate(LmMessage *m, JingleNode *jn) { GError *err = NULL; GSList *child = NULL; gboolean valid_disposition = FALSE; JingleContent *cn; - JingleAppFuncs *appfuncs; - JingleTransportFuncs *transfuncs; - gconstpointer description, transport; - const gchar *xmlns; - JingleSession* sess; - JingleNode accept; LmMessage *r; if (!check_contents(jn, &err)) { @@ -294,51 +281,7 @@ jingle_ack_iq(m); - accept.action = JINGLE_SESSION_ACCEPT; - accept.responder = g_strdup_printf("%s/%s", - lm_connection_get_jid(lconnection), - settings_opt_get("resource")); - accept.sid = jn->sid; - accept.content = NULL; - - sess = session_new(jn); - - for (child = jn->content; child; child = child->next) { - cn = (JingleContent *)(child->data); - - xmlns = lm_message_node_get_attribute(cn->description, "xmlns"); - appfuncs = jingle_get_appfuncs(xmlns); - if (appfuncs == NULL) continue; - - xmlns = lm_message_node_get_attribute(cn->transport, "xmlns"); - transfuncs = jingle_get_transportfuncs(xmlns); - if (appfuncs == NULL) continue; // negociate another transport ? - - description = appfuncs->check(cn, &err); - if (description == NULL || err != NULL) continue; - transport = transfuncs->check(cn, &err); - if (transport == NULL || err != NULL) continue; - - session_add_content(sess, cn, ACTIVE); - accept.content = g_slist_append(accept.content, cn); - } - - if(g_slist_length(sess->content) == 0) { - jingle_send_session_terminate(jn, "unsupported-applications"); - session_delete(sess); - return; - } - - // Send a session-accept - if (g_slist_length(accept.content) != 0) { - r = lm_message_from_jinglenode(&accept, lm_message_get_from(m)); - if (r) { - lm_connection_send(lconnection, r, NULL); - lm_message_unref(r); - } - } - - // TODO: try transport + // TODO: generate an event and wait for the user's choice } void handle_session_terminate(LmMessage *m, JingleNode *jn) diff -r 526d61c145a7 -r 357e69106171 jingle/send.c --- a/jingle/send.c Fri Jul 09 16:22:11 2010 +0200 +++ b/jingle/send.c Sat Jul 10 00:09:56 2010 +0200 @@ -26,6 +26,7 @@ #include #include +#include #include @@ -52,3 +53,59 @@ } } +void jingle_send_session_accept(JingleNode *jn) +{ + JingleNode accept = {0}; + JingleSession* sess; + JingleContent *cn; + GSList *child = NULL; + JingleAppFuncs *appfuncs; + JingleTransportFuncs *transfuncs; + gconstpointer description, transport; + const gchar *xmlns; + GError *err = NULL; + + accept.action = JINGLE_SESSION_ACCEPT; + accept.responder = g_strdup_printf("%s/%s", + lm_connection_get_jid(lconnection), + settings_opt_get("resource")); + accept.sid = jn->sid; + accept.content = NULL; + + sess = session_new(jn); + + for (child = jn->content; child; child = child->next) { + cn = (JingleContent *)(child->data); + + xmlns = lm_message_node_get_attribute(cn->description, "xmlns"); + appfuncs = jingle_get_appfuncs(xmlns); + if (appfuncs == NULL) continue; + + xmlns = lm_message_node_get_attribute(cn->transport, "xmlns"); + transfuncs = jingle_get_transportfuncs(xmlns); + if (appfuncs == NULL) continue; // negociate another transport ? + + description = appfuncs->check(cn, &err); + if (description == NULL || err != NULL) continue; + transport = transfuncs->check(cn, &err); + if (transport == NULL || err != NULL) continue; + + session_add_content(sess, cn, ACTIVE); + accept.content = g_slist_append(accept.content, cn); + } + + if(g_slist_length(sess->content) == 0) { + jingle_send_session_terminate(jn, "unsupported-applications"); + session_delete(sess); + return; + } + + if (g_slist_length(accept.content) <= 0) return; + + accept.message = lm_message_from_jinglenode(&accept, lm_message_get_from(jn->message)); + if (accept.message) { + lm_connection_send_with_reply(lconnection, accept.message, + NULL, &err); + lm_message_unref(accept.message); + } +}