Fix jingle_ibb_handle_ack_iq_send, keep the JingleIBB in a hash table.
--- a/jingle-ibb/ibb.c Mon Aug 16 02:04:50 2010 +0200
+++ b/jingle-ibb/ibb.c Mon Aug 16 02:55:00 2010 +0200
@@ -54,6 +54,7 @@
static void jingle_ibb_init(void);
static void jingle_ibb_uninit(void);
+
static guint connect_hid = 0;
static guint disconn_hid = 0;
@@ -81,6 +82,10 @@
.next = NULL,
};
+/* Hash-Table of all emited JingleIBB struct */
+static GHashTable *JingleIBBs = NULL;
+
+
static gconstpointer check(JingleContent *cn, GError **err)
{
JingleIBB *ibb = NULL;
@@ -115,7 +120,8 @@
g_free(ibb);
return NULL;
}
-
+
+ g_hash_table_insert(JingleIBBs, ibb->sid, ibb);
return (gconstpointer) ibb;
}
@@ -214,7 +220,8 @@
g_free(bsize);
}
-static void jingle_ibb_handle_ack_iq_send(LmMessage *mess, gpointer data)
+static void jingle_ibb_handle_ack_iq_send(JingleAckType type, LmMessage *mess,
+ gpointer data)
{
// TODO: check the sub type (error ??)
session_content *sc = (session_content *)data;
@@ -248,7 +255,7 @@
LmMessage *r = lm_message_new_with_sub_type(to, LM_MESSAGE_TYPE_IQ,
LM_MESSAGE_SUB_TYPE_SET);
LmMessageNode *node = lm_message_get_node(r);
-
+
gchar *base64 = g_base64_encode((const guchar *)buf, size);
gchar *strseq = g_strdup_printf("%" G_GINT64_FORMAT, *seq);
@@ -258,18 +265,18 @@
"seq", strseq,
NULL);
lm_message_node_set_value(node, base64);
-
+
ackhandle = g_new0(JingleAckHandle, 1);
ackhandle->callback = jingle_ibb_handle_ack_iq_send;
ackhandle->user_data = (gpointer)sc;
-
+
lm_connection_send_with_reply(lconnection, r,
jingle_new_ack_handler(ackhandle), NULL);
lm_message_unref(r);
-
+
// The next packet will be seq++
++(*seq);
-
+
g_free(base64);
g_free(strseq);
}
@@ -374,6 +381,12 @@
return info;
}
+static void free_ibb(gpointer data)
+{
+ JingleIBB *jibb = (JingleIBB *)data;
+ g_free(jibb);
+}
+
static void jingle_ibb_init(void)
{
jingle_ibb_handler = lm_message_handler_new(jingle_ibb_handle_iq, NULL, NULL);
@@ -388,6 +401,7 @@
JINGLE_TRANSPORT_STREAMING,
JINGLE_TRANSPORT_LOW);
xmpp_add_feature(NS_JINGLE_TRANSPORT_IBB);
+ JingleIBBs = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, free_ibb);
}
static void jingle_ibb_uninit(void)