add ack iq to the list
authorNicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Sun, 11 Jul 2010 20:37:04 +0200
changeset 48 3c08b78be871
parent 47 964b3ebeba8d
child 49 8dddfbe488b6
add ack iq to the list
jingle/action-handlers.c
jingle/general-handlers.c
jingle/general-handlers.h
jingle/jingle.c
jingle/send.c
--- a/jingle/action-handlers.c	Sun Jul 11 18:23:28 2010 +0200
+++ b/jingle/action-handlers.c	Sun Jul 11 20:37:04 2010 +0200
@@ -35,6 +35,8 @@
 #include <jingle/action-handlers.h>
 #include <jingle/general-handlers.h>
 
+extern LmMessageHandler* jingle_ack_iq_handler;
+
 void handle_content_accept(JingleNode *jn)
 {
   GError *err = NULL;
@@ -86,8 +88,8 @@
   JingleNode accept, reject;
   JingleContent tmp_cn;
   LmMessage *r;
-  
-  
+  ack_iq *elem;
+
   if (!check_contents(jn, &err)) {
     scr_log_print(LPRINT_DEBUG, "jingle: One of the content element was invalid (%s)",
                   err->message);
@@ -145,7 +147,12 @@
   if (g_slist_length(accept.content) != 0) {
     r = lm_message_from_jinglenode(&accept, lm_message_get_from(jn->message));
     if (r) {
-      lm_connection_send_with_reply(lconnection, r,NULL, NULL);
+      elem->id = g_strdup(lm_message_get_id(r));
+      elem->callback = NULL;
+      elem->udata = NULL;
+      add_ack_wait(elem);
+      // TODO: errors
+      lm_connection_send_with_reply(lconnection, r, jingle_ack_iq_handler, &err);
       lm_message_unref(r);
     }
   }
@@ -153,7 +160,12 @@
   if (g_slist_length(reject.content) != 0) {
     r = lm_message_from_jinglenode(&reject, lm_message_get_from(jn->message));
     if (r) {
-      lm_connection_send(lconnection, r, NULL);
+      elem->id = g_strdup(lm_message_get_id(r));
+      elem->callback = NULL;
+      elem->udata = NULL;
+      add_ack_wait(elem);
+      // TODO: errors
+      lm_connection_send_with_reply(lconnection, r, jingle_ack_iq_handler, &err);
       lm_message_unref(r);
     }
   }
--- a/jingle/general-handlers.c	Sun Jul 11 18:23:28 2010 +0200
+++ b/jingle/general-handlers.c	Sun Jul 11 20:37:04 2010 +0200
@@ -27,6 +27,8 @@
 #include <jingle/jingle.h>
 #include <jingle/general-handlers.h>
 
+GSList *ack_wait = NULL;
+
 extern LmMessageHandler* jingle_ack_iq_handler;
 gboolean evscallback_jingle(guint evcontext, const gchar *arg,
                             gpointer userdata)
@@ -72,7 +74,6 @@
                                       LmConnection *connection, 
                                       LmMessage *message, gpointer user_data)
 {
-  static GSList *ack_wait;
   GSList *child;
   LmMessageNode *node = lm_message_get_node(message);
   const gchar *id = lm_message_node_get_attribute(node, "id");
@@ -80,10 +81,17 @@
   for (child = ack_wait; child; child = child->next) {
     ai = (ack_iq*)child->data;
     if(!g_strcmp0(ai->id, id)) {
-      ai->callback(ai->udata);
+      g_free(ai->id);
+      if(ai->callback != NULL)
+        ai->callback(message, ai->udata);
       ack_wait = g_slist_remove(ack_wait, child);
       return LM_HANDLER_RESULT_REMOVE_MESSAGE;
     }
   }
   return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
 }
+
+void add_ack_wait(ack_iq *elem)
+{
+  ack_wait = g_slist_append(ack_wait, elem);
+}
--- a/jingle/general-handlers.h	Sun Jul 11 18:23:28 2010 +0200
+++ b/jingle/general-handlers.h	Sun Jul 11 20:37:04 2010 +0200
@@ -1,16 +1,18 @@
 #ifndef __JINGLE_GENERAL_HANDLERS_H__
 #define __JINGLE_GENERAL_HANDLERS_H__ 1
 
-typedef void (*jingle_func_ack_iq) (void*);
+typedef void (*jingle_func_ack_iq) (LmMessage*, void*);
+
 typedef struct {
-  const gchar *id;
+  gchar *id;
   jingle_func_ack_iq callback;
   void *udata;
 } ack_iq;
 
-gboolean evscallback_jingle(guint evcontext, const gchar *arg, gpointer userdata);
+gboolean evscallback_jingle(guint evcontext, const gchar *arg,
+                            gpointer userdata);
 LmHandlerResult jingle_handle_ack_iq (LmMessageHandler *handler,
                                       LmConnection *connection, 
                                       LmMessage *message, gpointer user_data);
-
+void add_ack_wait(ack_iq *elem);
 #endif
--- a/jingle/jingle.c	Sun Jul 11 18:23:28 2010 +0200
+++ b/jingle/jingle.c	Sun Jul 11 20:37:04 2010 +0200
@@ -183,9 +183,14 @@
 void jingle_send_iq_error(LmMessage *m, const gchar *errtype,
                           const gchar *cond, const gchar *jinglecond)
 {
+  ack_iq *elem;
   LmMessage *r = jingle_new_iq_error(m, errtype, cond, jinglecond);
   if (r) {
-	  lm_connection_send(lconnection, r, NULL);
+	  elem->id = g_strdup(lm_message_get_id(r));
+     elem->callback = NULL;
+     elem->udata = NULL;
+     add_ack_wait(elem);
+     lm_connection_send_with_reply(lconnection, r, jingle_ack_iq_handler, NULL);
 	  lm_message_unref(r);
   }
 }
--- a/jingle/send.c	Sun Jul 11 18:23:28 2010 +0200
+++ b/jingle/send.c	Sun Jul 11 20:37:04 2010 +0200
@@ -28,6 +28,7 @@
 #include <jingle/jingle.h>
 #include <jingle/sessions.h>
 #include <jingle/send.h>
+#include <jingle/general-handlers.h>
 
 extern LmMessageHandler* jingle_ack_iq_handler;
 
@@ -36,6 +37,7 @@
   LmMessage *r;
   LmMessageNode *err;
   JingleNode *reply = g_new0(JingleNode, 1);
+  ack_iq *elem;
 
   reply->action = JINGLE_SESSION_TERMINATE;
   reply->sid = jn->sid;
@@ -49,7 +51,12 @@
   }
 
   if (r) {
-    lm_connection_send(lconnection, r, NULL);
+    elem->id = g_strdup(lm_message_get_id(r));
+    elem->callback = NULL;
+    elem->udata = NULL;
+    add_ack_wait(elem);
+
+    lm_connection_send_with_reply(lconnection, r, jingle_ack_iq_handler, NULL);
     lm_message_unref(r);
   }
 }
@@ -65,7 +72,8 @@
   gconstpointer description, transport;
   const gchar *xmlns;
   GError *err = NULL;
-
+  ack_iq *elem;
+ 
   accept.action = JINGLE_SESSION_ACCEPT;
   accept.responder = g_strdup_printf("%s/%s",
                                      lm_connection_get_jid(lconnection),
@@ -84,7 +92,7 @@
 
     xmlns = lm_message_node_get_attribute(cn->transport, "xmlns");
     transfuncs = jingle_get_transportfuncs(xmlns);
-    if (appfuncs == NULL) continue; // negociate another transport ?
+    if (appfuncs == NULL) continue;
 
     description = appfuncs->check(cn, &err);
     if (description == NULL || err != NULL) continue;
@@ -105,6 +113,10 @@
 
   accept.message = lm_message_from_jinglenode(&accept, lm_message_get_from(jn->message));
   if (accept.message) {
+	 elem->id = g_strdup(lm_message_get_id(accept.message));
+    elem->callback = NULL;
+    elem->udata = NULL;
+    add_ack_wait(elem);
     lm_connection_send_with_reply(lconnection, accept.message,
                                   jingle_ack_iq_handler, &err);
     lm_message_unref(accept.message);