--- a/jingle-filetransfer/filetransfer.c Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle-filetransfer/filetransfer.c Sun Jul 18 21:51:41 2010 +0200
@@ -140,7 +140,7 @@
return FALSE;
}
-gboolean handle_data(gconstpointer *jingleft, const gchar *data, guint len)
+gboolean handle_data(gconstpointer jingleft, const gchar *data, guint len)
{
JingleFT *ft = (JingleFT *) jingleft;
GError *err = NULL;
--- a/jingle-ibb/ibb.c Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle-ibb/ibb.c Sun Jul 18 21:51:41 2010 +0200
@@ -64,6 +64,7 @@
blocksize = lm_message_node_get_attribute(node, "block-size");
ibb->sid = lm_message_node_get_attribute(node, "sid");
+ ibb->data = NULL;
if (!ibb->sid || !blocksize) {
g_set_error(err, JINGLE_CHECK_ERROR, JINGLE_CHECK_ERROR_MISSING,
@@ -89,8 +90,8 @@
LmConnection *connection, LmMessage *message,
gpointer user_data)
{
- const gchar *seq, *sid, *data64;
- guchar *data;
+ const gchar *data64;
+ JingleIBB *ibb = g_new0(JingleIBB, 1);
LmMessageSubType iqtype = lm_message_get_sub_type(message);
if (iqtype != LM_MESSAGE_SUB_TYPE_SET)
@@ -108,18 +109,39 @@
jingle_ack_iq(message);
- sid = lm_message_node_get_attribute(dnode, "sid");
- seq = lm_message_node_get_attribute(dnode, "seq");
+ ibb->sid = lm_message_node_get_attribute(dnode, "sid");
+ ibb->seq = lm_message_node_get_attribute(dnode, "seq");
data64 = lm_message_node_get_value(dnode);
- data = g_base64_decode(data64, NULL);
+ ibb->data = g_base64_decode(data64, NULL);
- g_free(data);
+
return LM_HANDLER_RESULT_REMOVE_MESSAGE;
}
+
+gboolean jingle_ibb_cmp(gconstpointer data1, gconstpointer data2)
+{
+ const JingleIBB *ibb1 = data1, *ibb2 = data2;
+ if(g_strcmp0(ibb1->sid, ibb2->sid))
+ return FALSE;
+ return TRUE;
+}
+
+
+int jingle_ibb_check_session(gconstpointer data, gconstpointer session)
+{
+ const JingleIBB *ibb1 = data, *ibb2 = session;
+ if(!g_strcmp0(ibb1->sid, ibb2->sid) && ibb1->seq > ibb2->seq) {
+ // TODO: change the seq in the session
+ return 0;
+ }
+ return 1;
+}
+
+
static void jingle_ibb_init(void)
{
jingle_ibb_handler = lm_message_handler_new(jingle_ibb_handle_iq, NULL, NULL);
--- a/jingle-ibb/ibb.h Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle-ibb/ibb.h Sun Jul 18 21:51:41 2010 +0200
@@ -10,7 +10,11 @@
/* The identifiant of the transfer */
const gchar *sid;
+
+ guchar *data;
+ const gchar *seq;
+
} JingleIBB;
#endif
--- a/jingle/check.h Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle/check.h Sun Jul 18 21:51:41 2010 +0200
@@ -19,6 +19,9 @@
gboolean check_jingle(LmMessage *message, LmMessageNode *node,
JingleNode *jn, GError **err);
gboolean check_contents(JingleNode *jn, GError **err);
+
+gboolean check_transport(const gchar *xmlns, gconstpointer *data);
+
GQuark jingle_check_error_quark(void);
#endif
--- a/jingle/jingle.c Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle/jingle.c Sun Jul 18 21:51:41 2010 +0200
@@ -36,7 +36,7 @@
#include <jingle/action-handlers.h>
#include <jingle/register.h>
#include <jingle/send.h>
-
+#include <jingle/sessions.h>
static void jingle_register_lm_handlers(void);
static void jingle_unregister_lm_handlers(void);
@@ -395,3 +395,11 @@
lm_message_node_set_attribute(node, "senders", "responder");
}
+void handle_trans_data(const gchar *xmlns, gconstpointer data, const gchar *data2, guint len)
+{
+ SessionContent *sc = session_find_transport(xmlns, data);
+ if (sc == NULL) {
+ return;
+ }
+ sc->appfuncs->handle_data(sc->description, data2, len);
+}
--- a/jingle/jingle.h Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle/jingle.h Sun Jul 18 21:51:41 2010 +0200
@@ -134,5 +134,7 @@
gboolean evscallback_jingle(guint evcontext, const gchar *arg,
gpointer userdata);
+
+void handle_trans_data(const gchar *xmlns, gconstpointer data, const gchar *data2, guint len);
#endif
--- a/jingle/register.h Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle/register.h Sun Jul 18 21:51:41 2010 +0200
@@ -20,10 +20,12 @@
typedef gconstpointer (*JingleAppCheck) (JingleContent *cn, GError **err);
typedef void (*JingleAppHandle) (JingleNode *jn, JingleContent *cn);
typedef LmMessageNode* (*JingleAppGetLM) (gconstpointer data);
+typedef gboolean (*JingleAppHandleData) (gconstpointer data, const gchar *data2, guint len);
typedef gconstpointer (*JingleTransportCheck) (JingleContent *cn, GError **err);
typedef void (*JingleTransportHandle) (JingleNode *jn, JingleContent *cn);
typedef LmMessageNode* (*JingleTransportGetLM) (gconstpointer data);
+typedef gboolean (*JingleTransportCmp) (gconstpointer data1, gconstpointer data2);
typedef struct {
/* check if the description of a JingleContent is correct */
@@ -34,6 +36,8 @@
/* If we got a LM with the good xmlns */
JingleAppHandle handle;
+
+ JingleAppHandleData handle_data;
} JingleAppFuncs;
@@ -46,6 +50,8 @@
/* */
JingleAppHandle handle;
+ JingleTransportCmp cmp;
+
} JingleTransportFuncs;
--- a/jingle/sessions.c Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle/sessions.c Sun Jul 18 21:51:41 2010 +0200
@@ -78,15 +78,13 @@
sc->name = cn->name;
sc->state = state;
- const gchar *tmpchar = lm_message_node_get_attribute(cn->description,
- "xmlns");
- sc->appfuncs = jingle_get_appfuncs(tmpchar);
- tmpchar = lm_message_node_get_attribute(cn->transport, "xmlns");
- sc->transfuncs = jingle_get_transportfuncs(tmpchar);
- // TODO errors
+ sc->xmlns_desc = lm_message_node_get_attribute(cn->description, "xmlns");
+ sc->appfuncs = jingle_get_appfuncs(sc->xmlns_desc);
+ sc->xmlns_trans = lm_message_node_get_attribute(cn->transport, "xmlns");
+ sc->transfuncs = jingle_get_transportfuncs(sc->xmlns_trans);
sc->description = sc->appfuncs->check(cn, NULL);
- sc->transport = sc->appfuncs->check(cn, NULL);
-
+ sc->transport = sc->transfuncs->check(cn, NULL);
+
sess->content = g_slist_append(sess->content, sc);
}
@@ -97,12 +95,28 @@
SessionContent *sc;
for (el = sess->content; el; el = el->next) {
sc = (SessionContent*) el->data;
- if (g_strcmp0(sc->name, name))
+ if (!g_strcmp0(sc->name, name))
return sc;
}
return NULL;
}
+SessionContent *session_find_transport(const gchar *xmlns_trans, gconstpointer data)
+{
+ GSList *el, *el1;
+ JingleSession *sess;
+ SessionContent *sc;
+ for (el1 = sessions; el1; el1 = el1->next) {
+ sess = (JingleSession*) el1->data;
+ for (el = sess->content; el; el = el->next) {
+ sc = (SessionContent*) el->data;
+ if (!g_strcmp0(sc->xmlns_trans, xmlns_trans) && sc->transfuncs->cmp(sc->transport, data))
+ return sc;
+ }
+ }
+ return NULL;
+}
+
void session_remove_sessioncontent(JingleSession *sess, const gchar *name)
{
SessionContent *sc;
@@ -123,6 +137,7 @@
sc->state = state;
}
+
/**
* Remove a session from the linked list and free it.
*/
--- a/jingle/sessions.h Sun Jul 18 18:55:22 2010 +0200
+++ b/jingle/sessions.h Sun Jul 18 21:51:41 2010 +0200
@@ -27,18 +27,20 @@
typedef struct {
const gchar *name;
SessionState state;
+ const gchar *xmlns_desc;
gconstpointer description;
JingleAppFuncs *appfuncs;
+ const gchar *xmlns_trans;
gconstpointer transport;
JingleTransportFuncs *transfuncs;
} SessionContent;
-
JingleSession *session_new(JingleNode *jn);
JingleSession *session_find_by_sid(const gchar *sid, const gchar *from);
JingleSession *session_find(const JingleNode *jn);
void session_add_content(JingleSession *sess, JingleContent *cn, SessionState state);
SessionContent *session_find_sessioncontent(JingleSession *sess, const gchar *name);
+SessionContent *session_find_transport(const gchar *xmlns_trans, gconstpointer data);
void session_remove_sessioncontent(JingleSession *sess, const gchar *name);
void session_changestate_sessioncontent(JingleSession *sess, const gchar *name,
SessionState state);