Start session add
authorNicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Wed, 07 Jul 2010 14:06:49 +0200
changeset 34 08715c230027
parent 33 92e92ce901e7
child 35 a0fd92a93af7
Start session add
jingle/action-handlers.c
jingle/action-handlers.h
jingle/jingle.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 <bad-request/> 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;
--- 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 <glib.h>
 #include <loudmouth/loudmouth.h>
 
-
+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);
--- 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 },