# HG changeset patch # User Tobias Markmann # Date 1214161173 0 # Node ID 9867a406707e3197ac50fe49625f0cd3d32d398c # Parent f6272b1568736e19c8c6254704217a391ef89609 * defined JabberCapsIdentity as struct _JabberIdentity * added jabber_caps_jabber_xdata_compare() which compares two x-data forms as required by XEP-0115 diff -r f6272b156873 -r 9867a406707e libpurple/protocols/jabber/caps.c --- a/libpurple/protocols/jabber/caps.c Sun Jun 22 18:30:12 2008 +0000 +++ b/libpurple/protocols/jabber/caps.c Sun Jun 22 18:59:33 2008 +0000 @@ -595,6 +595,42 @@ return strcmp(ac->namespace, bc->namespace); } +static gint jabber_caps_string_compare(gconstpointer a, gconstpointer b) { + const gchar *ac; + const gchar *bc; + + ac = a; + bc = b; + + return strcmp(ac, bc); +} + +static gint jabber_caps_jabber_xdata_compare(gconstpointer a, gconstpointer b) { + const xmlnode *ac; + const xmlnode *bc; + xmlnode *aformtypefield; + xmlnode *bformtypefield; + char *aformtype; + char *bformtype; + int result; + + ac = a; + bc = b; + + aformtypefield = xmlnode_get_child(ac, "field"); + while (aformtypefield && strcmp(xmlnode_get_attrib(aformtypefield, "var"), "FORM_TYPE")) aformtypefield = xmlnode_get_next_twin(aformtypefield); + aformtype = xmlnode_get_data(aformtypefield); + + bformtypefield = xmlnode_get_child(bc, "field"); + while (bformtypefield && strcmp(xmlnode_get_attrib(bformtypefield, "var"), "FORM_TYPE")) bformtypefield = xmlnode_get_next_twin(bformtypefield); + bformtype = xmlnode_get_data(bformtypefield); + + result = strcmp(aformtype, bformtype); + g_free(aformtype); + g_free(bformtype); + return result; +} + JabberCapsClientInfo *jabber_caps_parse_client_info(xmlnode *query) { xmlnode *child; @@ -636,6 +672,10 @@ gchar *jabber_caps_calcualte_hash(JabberCapsClientInfo *info) { if (!info) return 0; + /* sort identities, features and x-data forms */ + info->identities = g_list_sort(info->identities, jabber_caps_jabber_identity_compare); + info->features = g_list_sort(info->features, jabber_caps_string_compare); + info->forms = g_list_sort(info->forms, jabber_caps_jabber_xdata_compare); } void jabber_caps_calculate_own_hash() { diff -r f6272b156873 -r 9867a406707e libpurple/protocols/jabber/caps.h --- a/libpurple/protocols/jabber/caps.h Sun Jun 22 18:30:12 2008 +0000 +++ b/libpurple/protocols/jabber/caps.h Sun Jun 22 18:59:33 2008 +0000 @@ -28,12 +28,7 @@ /* Implementation of XEP-0115 */ -typedef struct _JabberCapsIdentity { - char *category; - char *type; - char *name; - char *lang; -} JabberCapsIdentity; +typedef struct _JabberIdentity JabberCapsIdentity; struct _JabberCapsClientInfo { GList *identities; /* JabberCapsIdentity */ diff -r f6272b156873 -r 9867a406707e libpurple/protocols/jabber/jabber.h --- a/libpurple/protocols/jabber/jabber.h Sun Jun 22 18:30:12 2008 +0000 +++ b/libpurple/protocols/jabber/jabber.h Sun Jun 22 18:59:33 2008 +0000 @@ -216,6 +216,7 @@ gchar *category; gchar *type; gchar *name; + gchar *lang; } JabberIdentity; typedef struct _JabberBytestreamsStreamhost {