# HG changeset patch # User Nicolas Cornu # Date 1280975591 -7200 # Node ID 8b6320ad470b09d327cd881b9d8f9eee00d15275 # Parent 1c2ef2c5debe6fc883e41bf2887e5aa1f4ee65f9 Add comments, change some function names... diff -r 1c2ef2c5debe -r 8b6320ad470b jingle-filetransfer/filetransfer.c --- a/jingle-filetransfer/filetransfer.c Wed Aug 04 23:46:47 2010 +0200 +++ b/jingle-filetransfer/filetransfer.c Thu Aug 05 04:33:11 2010 +0200 @@ -44,7 +44,7 @@ gconstpointer jingle_ft_check(JingleContent *cn, GError **err); -void jingle_ft_handle(JingleAction act, gconstpointer data, LmMessageNode *node); +void jingle_ft_tomessage(gconstpointer data, LmMessageNode *node); gboolean jingle_ft_handle_data(gconstpointer data, const gchar *data2, guint len); static gboolean is_md5_hash(const gchar *hash); static void jingle_ft_init(void); @@ -54,7 +54,7 @@ JingleAppFuncs funcs = { jingle_ft_check, - jingle_ft_handle, + jingle_ft_tomessage, jingle_ft_handle_data }; @@ -263,33 +263,30 @@ free_arg_lst(args); } -void jingle_ft_handle(JingleAction act, gconstpointer data, LmMessageNode *node) +void jingle_ft_tomessage(gconstpointer data, LmMessageNode *node) { - if (act == JINGLE_SESSION_INITIATE) { - JingleFT *jft = (JingleFT*) data; - if (lm_message_node_get_child(node, "description") != NULL) - return; - - LmMessageNode *node2 = lm_message_node_add_child(node, "description", NULL); - lm_message_node_set_attribute(node2, "xmlns", NS_JINGLE_APP_FT); - if (jft->type == JINGLE_FT_OFFER) - node2 = lm_message_node_add_child(node2, "offer", NULL); - else - node2 = lm_message_node_add_child(node2, "request", NULL); - - node2 = lm_message_node_add_child(node2, "file", NULL); - - lm_message_node_set_attributes(node2, "xmlns", NS_SI_FT, "name", jft->name, - "size", jft->size, NULL); - if (jft->hash != NULL) - lm_message_node_set_attribute(node2, "hash", jft->hash); - - if (jft->desc != NULL) - lm_message_node_add_child(node2, "desc", jft->desc); - - //if (jft->data != 0) - - } + JingleFT *jft = (JingleFT*) data; + if (lm_message_node_get_child(node, "description") != NULL) + return; + + LmMessageNode *node2 = lm_message_node_add_child(node, "description", NULL); + lm_message_node_set_attribute(node2, "xmlns", NS_JINGLE_APP_FT); + if (jft->type == JINGLE_FT_OFFER) + node2 = lm_message_node_add_child(node2, "offer", NULL); + else + node2 = lm_message_node_add_child(node2, "request", NULL); + + node2 = lm_message_node_add_child(node2, "file", NULL); + + lm_message_node_set_attributes(node2, "xmlns", NS_SI_FT, "name", jft->name, + "size", jft->size, NULL); + if (jft->hash != NULL) + lm_message_node_set_attribute(node2, "hash", jft->hash); + + if (jft->desc != NULL) + lm_message_node_add_child(node2, "desc", jft->desc); + + //if (jft->data != 0) } static void jingle_ft_init(void) diff -r 1c2ef2c5debe -r 8b6320ad470b jingle-ibb/ibb.c --- a/jingle-ibb/ibb.c Wed Aug 04 23:46:47 2010 +0200 +++ b/jingle-ibb/ibb.c Thu Aug 05 04:33:11 2010 +0200 @@ -37,7 +37,7 @@ gconstpointer jingle_ibb_check(JingleContent *cn, GError **err); gboolean jingle_ibb_cmp(gconstpointer data1, gconstpointer data2); -void jingle_ibb_handle(JingleAction act, gconstpointer data, LmMessageNode *node); +void jingle_ibb_tomessage(gconstpointer data, LmMessageNode *node); const gchar* jingle_ibb_xmlns(void); gconstpointer jingle_ibb_new(void); @@ -47,7 +47,13 @@ const gchar *deps[] = { "jingle", NULL }; -JingleTransportFuncs funcs = {jingle_ibb_xmlns, jingle_ibb_check, jingle_ibb_handle, jingle_ibb_cmp, jingle_ibb_new}; +JingleTransportFuncs funcs = { + jingle_ibb_xmlns, + jingle_ibb_check, + jingle_ibb_tomessage, + jingle_ibb_cmp, + jingle_ibb_new +}; module_info_t info_jingle_inbandbytestream = { .branch = MCABBER_BRANCH, @@ -175,20 +181,18 @@ return 1; } -void jingle_ibb_handle(JingleAction act, gconstpointer data, LmMessageNode *node) +void jingle_ibb_tomessage(gconstpointer data, LmMessageNode *node) { - if (act == JINGLE_SESSION_INITIATE) { - JingleIBB *jibb = (JingleIBB*) data; - gchar *bsize = g_strdup_printf("%i", jibb->blocksize); - if (lm_message_node_get_child(node, "transport") != NULL) - return; - - LmMessageNode *node2 = lm_message_node_add_child(node, "transport", NULL); - lm_message_node_set_attributes(node2, "xmlns", NS_JINGLE_TRANSPORT_IBB, - "sid", jibb->sid, - "block-size", bsize); - g_free(bsize); - } + JingleIBB *jibb = (JingleIBB*) data; + gchar *bsize = g_strdup_printf("%i", jibb->blocksize); + if (lm_message_node_get_child(node, "transport") != NULL) + return; + + LmMessageNode *node2 = lm_message_node_add_child(node, "transport", NULL); + lm_message_node_set_attributes(node2, "xmlns", NS_JINGLE_TRANSPORT_IBB, + "sid", jibb->sid, + "block-size", bsize); + g_free(bsize); } static void jingle_ibb_init(void) diff -r 1c2ef2c5debe -r 8b6320ad470b jingle/jingle.c --- a/jingle/jingle.c Wed Aug 04 23:46:47 2010 +0200 +++ b/jingle/jingle.c Thu Aug 05 04:33:11 2010 +0200 @@ -316,6 +316,14 @@ return JINGLE_UNKNOWN_ACTION; } +/** + * This function should not be called if jn->message was created + * using lm_message_from_jinglenode because loudmouth strdup + * strings we insert as attributes. the pointers in the LmMessage + * and the JingleNode would not refer to the same addresses and + * a call to lm_message_unref would not free the data from the + * JingleNode. + */ void jingle_free_jinglenode(JingleNode *jn) { g_slist_foreach(jn->content, (GFunc)g_free, NULL); @@ -412,32 +420,6 @@ return m; } -LmMessage *lm_message_from_jinglesession(const JingleSession *js, - const gchar *to, - JingleAction action) -{ - LmMessage* m; - LmMessageNode *jnode; - const gchar *actionstr; - - m = lm_message_new_with_sub_type(to, LM_MESSAGE_TYPE_IQ, - LM_MESSAGE_SUB_TYPE_SET); - jnode = lm_message_node_add_child(m->node, "jingle", NULL); - - if (actionstr = jingle_action_list[action].name) - lm_message_node_set_attribute(jnode, "action", actionstr); - else - return NULL; - - if (js->sid) - lm_message_node_set_attribute(jnode, "sid", js->sid); - else - return NULL; - - g_slist_foreach(js->content, lm_insert_sessioncontent, jnode); - return m; -} - static void lm_insert_sessioncontent(gpointer data, gpointer userdata) { const gchar *xmlns; @@ -466,32 +448,32 @@ LmMessageNode* dad = (LmMessageNode*) userdata; LmMessageNode* node = (LmMessageNode*) lm_message_node_add_child(dad, "content", NULL); - + if (content->creator == JINGLE_CREATOR_INITIATOR) lm_message_node_set_attribute(node, "creator", "initiator"); else lm_message_node_set_attribute(node, "creator", "responder"); - + if (content->disposition) lm_message_node_set_attribute(node, "disposition", content->disposition); - + if (content->name) lm_message_node_set_attribute(node, "name", content->name); - + if (content->senders == JINGLE_SENDERS_BOTH) lm_message_node_set_attribute(node, "senders", "both"); else if (content->senders == JINGLE_SENDERS_INITIATOR) lm_message_node_set_attribute(node, "senders", "initiator"); else if (content->senders == JINGLE_SENDERS_RESPONDER) lm_message_node_set_attribute(node, "senders", "responder"); - + xmlns = lm_message_node_get_attribute(content->transport, "xmlns"); tfunc = jingle_get_transportfuncs(xmlns); - //tfunc->handle(tfunc->check(content, NULL), node); + tfunc->tomessage(tfunc->check(content, NULL), node); xmlns = lm_message_node_get_attribute(content->description, "xmlns"); afunc = jingle_get_appfuncs(xmlns); - //afunc->handle(afunc->check(content, NULL), node); + afunc->tomessage(afunc->check(content, NULL), node); } void handle_trans_data(const gchar *xmlns, gconstpointer data, const gchar *data2, guint len) diff -r 1c2ef2c5debe -r 8b6320ad470b jingle/jingle.h --- a/jingle/jingle.h Wed Aug 04 23:46:47 2010 +0200 +++ b/jingle/jingle.h Thu Aug 05 04:33:11 2010 +0200 @@ -94,7 +94,7 @@ /* each content element (must) contain one description * child element that specifies a desired application. - * the content of this node is app specific. */ + * the connt of this node is app specific. */ LmMessageNode *description; /* each content element (must) contain one transport diff -r 1c2ef2c5debe -r 8b6320ad470b jingle/register.h --- a/jingle/register.h Wed Aug 04 23:46:47 2010 +0200 +++ b/jingle/register.h Thu Aug 05 04:33:11 2010 +0200 @@ -36,11 +36,11 @@ } JingleTransportPriority; typedef gconstpointer (*JingleAppCheck) (JingleContent *cn, GError **err); -typedef void (*JingleAppToMessage) (JingleAction action, gconstpointer data, LmMessageNode *node); +typedef void (*JingleAppToMessage) (gconstpointer data, LmMessageNode *node); typedef gboolean (*JingleAppHandleData) (gconstpointer data, const gchar *data2, guint len); typedef gconstpointer (*JingleTransportCheck) (JingleContent *cn, GError **err); -typedef void (*JingleTransportToMessage) (JingleAction action, gconstpointer data, LmMessageNode *node); +typedef void (*JingleTransportToMessage) (gconstpointer data, LmMessageNode *node); typedef gboolean (*JingleTransportCmp) (gconstpointer data1, gconstpointer data2); typedef const gchar* (*JingleTransportxmlns) (void); typedef gconstpointer (*JingleTransportNew) (void); diff -r 1c2ef2c5debe -r 8b6320ad470b jingle/send.c --- a/jingle/send.c Wed Aug 04 23:46:47 2010 +0200 +++ b/jingle/send.c Thu Aug 05 04:33:11 2010 +0200 @@ -127,11 +127,23 @@ { JingleNode initiate = {0}; JingleAckHandle *ackhandle; + GSList *listentry; + SessionContent *content; + JingleContent *jcontent; initiate.action = JINGLE_SESSION_INITIATE; initiate.sid = js->sid; initiate.initiator = js->from; - initiate.content = NULL; // TODO + for(listentry = js->content; listentry; listentry = g_slist_next(listentry)) { + /*content = (SessionContent *)listentry->data; + jcontent = g_new0(JingleContent, 1); + jcontent->node = lm_message_node_add_child() + jcontent->creator = JINGLE_CREATOR_INITIATOR; + jcontent->name = content->name + tfunc->tomessage(, node); + jcontent->transport = + initiate.content = g_slist_append(initiate.content, jcontent);*/ + } initiate.message = lm_message_from_jinglenode(&initiate, js->to); if (initiate.message) { diff -r 1c2ef2c5debe -r 8b6320ad470b jingle/sessions.c --- a/jingle/sessions.c Wed Aug 04 23:46:47 2010 +0200 +++ b/jingle/sessions.c Thu Aug 05 04:33:11 2010 +0200 @@ -21,8 +21,6 @@ #include -#include - #include #include #include @@ -75,7 +73,7 @@ JingleSession *session_find(const JingleNode *jn) { - const gchar *from = lm_message_get_from(jn->message); + const gchar *from = lm_message_node_get_attribute(jn->message->node, "from"); return session_find_by_sid(jn->sid, from); } diff -r 1c2ef2c5debe -r 8b6320ad470b jingle/sessions.h --- a/jingle/sessions.h Wed Aug 04 23:46:47 2010 +0200 +++ b/jingle/sessions.h Thu Aug 05 04:33:11 2010 +0200 @@ -44,13 +44,29 @@ } JingleSession; typedef struct { + /* "A unique name or identifier for the content type + * according to the creator" */ const gchar *name; + + /* */ SessionState state; + + /* The namespace of the app */ const gchar *xmlns_desc; + + /* The internal struct of the app module */ gconstpointer description; + + /* Struct of functions provided by the app module */ JingleAppFuncs *appfuncs; + + /* The namespace of the transport */ const gchar *xmlns_trans; + + /* The internal struct of the transport module */ gconstpointer transport; + + /* Struct of functions provided by the transport module */ JingleTransportFuncs *transfuncs; } SessionContent;