diff options
author | Tobias Markmann <tfar@soc.pidgin.im> | 2008-06-22 18:59:33 +0000 |
---|---|---|
committer | Tobias Markmann <tfar@soc.pidgin.im> | 2008-06-22 18:59:33 +0000 |
commit | 2f36c1d50283bc2283ed574e8645dd58ba8afe93 (patch) | |
tree | cd2e981f01b6081b5102909a4cae854815efef4f | |
parent | b26f8b454c6110dc2a804262fb99ef5a72f1c1cc (diff) | |
download | pidgin-2f36c1d50283bc2283ed574e8645dd58ba8afe93.tar.gz |
* defined JabberCapsIdentity as struct _JabberIdentity
* added jabber_caps_jabber_xdata_compare() which compares two x-data forms as required by XEP-0115
-rw-r--r-- | libpurple/protocols/jabber/caps.c | 40 | ||||
-rw-r--r-- | libpurple/protocols/jabber/caps.h | 7 | ||||
-rw-r--r-- | libpurple/protocols/jabber/jabber.h | 1 |
3 files changed, 42 insertions, 6 deletions
diff --git a/libpurple/protocols/jabber/caps.c b/libpurple/protocols/jabber/caps.c index 45d729cc00..5ed5447a29 100644 --- a/libpurple/protocols/jabber/caps.c +++ b/libpurple/protocols/jabber/caps.c @@ -595,6 +595,42 @@ static gint jabber_caps_jabber_feature_compare(gconstpointer a, gconstpointer b) 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 @@ JabberCapsClientInfo *jabber_caps_parse_client_info(xmlnode *query) { 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 --git a/libpurple/protocols/jabber/caps.h b/libpurple/protocols/jabber/caps.h index 7ca042455b..1b62309d0b 100644 --- a/libpurple/protocols/jabber/caps.h +++ b/libpurple/protocols/jabber/caps.h @@ -28,12 +28,7 @@ typedef struct _JabberCapsClientInfo JabberCapsClientInfo; /* 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 --git a/libpurple/protocols/jabber/jabber.h b/libpurple/protocols/jabber/jabber.h index 56663cbbec..4455d2385f 100644 --- a/libpurple/protocols/jabber/jabber.h +++ b/libpurple/protocols/jabber/jabber.h @@ -216,6 +216,7 @@ typedef struct _JabberIdentity gchar *category; gchar *type; gchar *name; + gchar *lang; } JabberIdentity; typedef struct _JabberBytestreamsStreamhost { |