Mercurial > ~mikael > mcabber > hg
diff mcabber/src/xmpp_iq.c @ 1600:c5ee395fbc8c
Updated Entity Capabilities support (XEP-0115)
author | franky |
---|---|
date | Tue, 23 Sep 2008 10:59:25 +0200 |
parents | dcd5d4c75199 |
children | 351427ef0b4b |
line wrap: on
line diff
--- a/mcabber/src/xmpp_iq.c Sun Oct 11 15:39:32 2009 +0200 +++ b/mcabber/src/xmpp_iq.c Tue Sep 23 10:59:25 2008 +0200 @@ -461,82 +461,47 @@ } -// disco_info_set_ext(ansquery, ext) -// Add features attributes to ansquery for extension ext. -static void disco_info_set_ext(LmMessageNode *ansquery, const char *ext) +void _disco_add_feature_helper(gpointer data, gpointer user_data) { - char *nodename = g_strdup_printf("%s#%s", MCABBER_CAPS_NODE, ext); - lm_message_node_set_attribute(ansquery, "node", nodename); - g_free(nodename); - if (!strcasecmp(ext, "csn")) { - // I guess it's ok to send this even if it's not compiled in. - lm_message_node_set_attribute(lm_message_node_add_child(ansquery, - "feature", NULL), - "var", NS_CHATSTATES); - } - if (!strcasecmp(ext, "iql")) { - // I guess it's ok to send this even if it's not compiled in. - lm_message_node_set_attribute(lm_message_node_add_child(ansquery, - "feature", NULL), - "var", NS_LAST); - } + LmMessageNode *node = user_data; + lm_message_node_set_attribute + (lm_message_node_add_child(node, "feature", NULL), "var", data); } -// disco_info_set_default(ansquery, entitycaps) -// Add features attributes to ansquery. If entitycaps is TRUE, assume -// that we're answering an Entity Caps request (if not, the request was -// a basic discovery query). +// disco_info_set_caps(ansquery, entitycaps) +// Add features attributes to ansquery. entitycaps should either be a +// valid capabilities hash or NULL. If it is NULL, the node attribute won't +// be added to the query child and Entity Capabilities will be announced +// as a feature. // Please change the entity version string if you modify mcabber disco // source code, so that it doesn't conflict with the upstream client. -static void disco_info_set_default(LmMessageNode *ansquery, guint entitycaps) +static void disco_info_set_caps(LmMessageNode *ansquery, + const char *entitycaps) { - LmMessageNode *y; - char *eversion; - - eversion = g_strdup_printf("%s#%s", MCABBER_CAPS_NODE, entity_version()); - lm_message_node_set_attribute(ansquery, "node", eversion); - g_free(eversion); - - y = lm_message_node_add_child(ansquery, "identity", NULL); + if (entitycaps) { + char *eversion; + eversion = g_strdup_printf("%s#%s", MCABBER_CAPS_NODE, entitycaps); + lm_message_node_set_attribute(ansquery, "node", eversion); + g_free(eversion); + } - lm_message_node_set_attributes(y, - "category", "client", - "type", "pc", - "name", PACKAGE_NAME, - NULL); + lm_message_node_set_attributes + (lm_message_node_add_child(ansquery, "identity", NULL), + "category", "client", + "name", PACKAGE_STRING, + "type", "pc", + NULL); - lm_message_node_set_attribute - (lm_message_node_add_child(ansquery, "feature", NULL), - "var", NS_DISCO_INFO); - lm_message_node_set_attribute - (lm_message_node_add_child(ansquery, "feature", NULL), - "var", NS_MUC); -#ifdef JEP0085 - // Advertise ChatStates only if we're not using Entity Capabilities - if (!entitycaps) + if (entitycaps) + caps_foreach_feature(entitycaps, _disco_add_feature_helper, ansquery); + else { + caps_foreach_feature(entity_version(xmpp_getstatus()), + _disco_add_feature_helper, + ansquery); lm_message_node_set_attribute (lm_message_node_add_child(ansquery, "feature", NULL), - "var", NS_CHATSTATES); -#endif - lm_message_node_set_attribute - (lm_message_node_add_child(ansquery, "feature", NULL), - "var", NS_TIME); - lm_message_node_set_attribute - (lm_message_node_add_child(ansquery, "feature", NULL), - "var", NS_XMPP_TIME); - lm_message_node_set_attribute - (lm_message_node_add_child(ansquery, "feature", NULL), - "var", NS_VERSION); - lm_message_node_set_attribute - (lm_message_node_add_child(ansquery, "feature", NULL), - "var", NS_PING); - lm_message_node_set_attribute - (lm_message_node_add_child(ansquery, "feature", NULL), - "var", NS_COMMANDS); - if (!entitycaps) - lm_message_node_set_attribute - (lm_message_node_add_child(ansquery, "feature", NULL), - "var", NS_LAST); + "var", NS_CAPS); + } } static LmHandlerResult handle_iq_disco_info(LmMessageHandler *h, @@ -546,23 +511,21 @@ LmMessage *r; LmMessageNode *query, *tmp; const char *node = NULL; + const char *param = NULL; r = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT); query = lm_message_node_add_child(r->node, "query", NULL); lm_message_node_set_attribute(query, "xmlns", NS_DISCO_INFO); tmp = lm_message_node_find_child(m->node, "query"); - if (tmp) + if (tmp) { node = lm_message_node_get_attribute(tmp, "node"); - if (node && startswith(node, MCABBER_CAPS_NODE "#", FALSE)) { - const char *param = node+strlen(MCABBER_CAPS_NODE)+1; - if (!strcmp(param, entity_version())) - disco_info_set_default(query, TRUE); // client#version - else - disco_info_set_ext(query, param); // client#extension - } else { + param = node+strlen(MCABBER_CAPS_NODE)+1; + } + if (node && startswith(node, MCABBER_CAPS_NODE "#", FALSE)) + disco_info_set_caps(query, param); // client#version + else // Basic discovery request - disco_info_set_default(query, FALSE); - } + disco_info_set_caps(query, NULL); lm_connection_send(c, r, NULL); lm_message_unref(r);