# HG changeset patch # User Nicolas Cornu # Date 1279482701 -7200 # Node ID 1c1153f9f9453ac49843a5ee7d5c3fc57af46c6c # Parent 64a47491c068db98f573c728964b41d9ec43eb11 Handle for jingle diff -r 64a47491c068 -r 1c1153f9f945 jingle-filetransfer/filetransfer.c --- 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; diff -r 64a47491c068 -r 1c1153f9f945 jingle-ibb/ibb.c --- 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); diff -r 64a47491c068 -r 1c1153f9f945 jingle-ibb/ibb.h --- 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 diff -r 64a47491c068 -r 1c1153f9f945 jingle/check.h --- 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 diff -r 64a47491c068 -r 1c1153f9f945 jingle/jingle.c --- 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 #include #include - +#include 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); +} diff -r 64a47491c068 -r 1c1153f9f945 jingle/jingle.h --- 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 diff -r 64a47491c068 -r 1c1153f9f945 jingle/register.h --- 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; diff -r 64a47491c068 -r 1c1153f9f945 jingle/sessions.c --- 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. */ diff -r 64a47491c068 -r 1c1153f9f945 jingle/sessions.h --- 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);