--- 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);