jingle/action-handlers.c
changeset 126 059a6737f6a4
parent 123 58bd57666ef9
child 128 cded9f40039e
--- a/jingle/action-handlers.c	Sun Aug 15 11:42:10 2010 +0200
+++ b/jingle/action-handlers.c	Sun Aug 15 16:37:32 2010 +0200
@@ -58,7 +58,6 @@
   if (!roster_find(disp, jidsearch, 0)) {
     // We say that we doesn't support jingle.
     jingle_send_iq_error(jn->message, "cancel", "service-unavailable", NULL);
-    jingle_free_jinglenode(jn);
     g_free(disp);
     return;
   }
@@ -67,7 +66,6 @@
     scr_log_print(LPRINT_DEBUG, "jingle: One of the content element was invalid (%s)",
                   err->message);
     jingle_send_iq_error(jn->message, "cancel", "bad-request", NULL);
-    jingle_free_jinglenode(jn);
     g_free(disp);
     return;
   }
@@ -75,7 +73,6 @@
   // a session-initiate message must contains at least one <content> element
   if (g_slist_length(jn->content) < 1) {
     jingle_send_iq_error(jn->message, "cancel", "bad-request", NULL);
-    jingle_free_jinglenode(jn);
     g_free(disp);
     return;
   }
@@ -92,7 +89,6 @@
   if (!valid_disposition) {
     jingle_send_iq_error(jn->message, "cancel", "bad-request", NULL);
     g_free(disp);
-    jingle_free_jinglenode(jn);
     return;  
   }
   
@@ -100,7 +96,6 @@
   if (session_find(jn) != NULL) {
     jingle_send_iq_error(jn->message, "cancel", "unexpected-request", "out-of-order");
     g_free(disp);
-    jingle_free_jinglenode(jn);
     return;
   }
 
@@ -158,7 +153,6 @@
     scr_LogPrint(LPRINT_LOGNORM, "%s", sbuf->str);
   }
   g_free(disp);
-  jingle_free_jinglenode(jn);
 }
 
 void handle_session_info(JingleNode *jn)
@@ -201,7 +195,6 @@
    * error condition of <unsupported-info/>." */
   jingle_send_iq_error(jn->message, "modify", "feature-not-implemented",
                        "unsupported-info");
-  jingle_free_jinglenode(jn);
 }
 
 void handle_session_accept(JingleNode *jn)
@@ -210,7 +203,7 @@
   JingleContent *jc;
   SessionContent *sc;
   session_content *sc2 = g_new0(session_content, 1);
-  
+  GError *err;
   GSList *el;
   const gchar *from = lm_message_get_from(jn->message);
   
@@ -220,33 +213,44 @@
     jingle_send_iq_error(jn->message, "cancel", "item-not-found", "unknown-session");
     return;
   }
+ 
+  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(jn->message, "cancel", "bad-request", NULL);
+    return;
+  }
   
   jingle_ack_iq(jn->message);
   
+  sc2->sid  = sess->sid;
+  sc2->from = (sess->origin == JINGLE_SESSION_INCOMING) ? sess->from : sess->to;
+
+  // TODO: it's really bad done!
   for (el = jn->content; el; el = el->next) {
     jc = (JingleContent*)el->data;
+    sc2->name = jc->name;
+    sc = session_find_sessioncontent(sess, jc->name);
     session_changestate_sessioncontent(sess, jc->name,
                                        JINGLE_SESSION_STATE_ACTIVE);
+    sc->transfuncs->init(sc2, sc->transfuncs->check(jc, NULL));
   }
   
-  // We delete content who have been refuse
-  /*for (el = sess->content; el; el = el->next) {
+  // We delete content who haven't been accepted
+  for (el = sess->content; el; el = el->next) {
     sc = (SessionContent*) el->data;
     if (sc->state == JINGLE_SESSION_STATE_PENDING) {
       scr_log_print(LPRINT_DEBUG, "Delete %s!", sc->name);
       session_remove_sessioncontent(sess, sc->name);
     }
-  }*/
+  }
   
   // Go go go! We start jobs!
   for (el = sess->content; el; el = el->next) {
     sc = (SessionContent*)el->data;
-    sc2->sid = sess->sid;
-    sc2->from = (sess->origin == JINGLE_SESSION_INCOMING) ? sess->from : sess->to;
     sc2->name = sc->name;
     sc->appfuncs->start(sc2);
   }
-  jingle_free_jinglenode(jn);
 }
 
 void handle_session_terminate(JingleNode *jn)
@@ -269,5 +273,4 @@
   }
   session_delete(sess);
   jingle_ack_iq(jn->message);
-  jingle_free_jinglenode(jn);
 }