# HG changeset patch # User Nicolas Cornu # Date 1278504409 -7200 # Node ID 08715c230027642eaa1cbc30ed8db75a98db47fb # Parent 92e92ce901e735860434f651139d6b0fbe4ec0b1 Start session add diff -r 92e92ce901e7 -r 08715c230027 jingle/action-handlers.c --- a/jingle/action-handlers.c Tue Jul 06 16:57:11 2010 +0200 +++ b/jingle/action-handlers.c Wed Jul 07 14:06:49 2010 +0200 @@ -38,6 +38,56 @@ * return a error to the initiator. */ +void handle_content_add(LmMessage *m, JingleNode *jn) +{ + GError *err = NULL; + GSList *child = NULL; + JingleContent *cn; + JingleAppFuncs *appfuncs; + JingleTransportFuncs *transfuncs; + gconstpointer description, transport; + const gchar *xmlns; + + if (!check_contents(jn, &err)) { + scr_log_print(LPRINT_DEBUG, "jingle: One of the content element was invalid (%s)", + err->message); + jingle_send_iq_error(m, "cancel", "bad-request", NULL); + return; + } + + // it's better if there is at least one content elem */ + if (g_slist_length(jn->content) < 1) { + jingle_send_iq_error(m, "cancel", "bad-request", NULL); + return; + } + + // if a session with the same sid doesn't already exists + if (session_find(jn) == NULL) { + jingle_send_iq_error(m, "cancel", "unexpected-request", "out-of-order"); + return; + } + + jingle_ack_iq(m); + + 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; + + description = appfuncs->check(cn, &err); + if (description == NULL || err != NULL) continue; + transport = transfuncs->check(cn, &err); + if (transport == NULL || err != NULL) continue; + } +} + + void handle_session_initiate(LmMessage *m, JingleNode *jn) { GError *err = NULL; diff -r 92e92ce901e7 -r 08715c230027 jingle/action-handlers.h --- a/jingle/action-handlers.h Tue Jul 06 16:57:11 2010 +0200 +++ b/jingle/action-handlers.h Wed Jul 07 14:06:49 2010 +0200 @@ -4,7 +4,7 @@ #include #include - +void handle_content_add(LmMessage *m, JingleNode *jn); void handle_session_initiate(LmMessage *m, JingleNode *jn); void handle_session_terminate(LmMessage *m, JingleNode *jn); const gchar* get_xmlnsdesc(const GSList* list); diff -r 92e92ce901e7 -r 08715c230027 jingle/jingle.c --- a/jingle/jingle.c Tue Jul 06 16:57:11 2010 +0200 +++ b/jingle/jingle.c Wed Jul 07 14:06:49 2010 +0200 @@ -56,7 +56,7 @@ struct JingleActionList jingle_action_list[] = { { NULL, NULL }, // for JINGLE_UNKNOWN_ACTION { "content-accept", NULL }, - { "content-add", NULL }, + { "content-add", handle_content_add }, { "content-modify", NULL }, { "content-reject", NULL }, { "content-remove", NULL },