summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Markmann <tfar@soc.pidgin.im>2008-06-22 18:59:33 +0000
committerTobias Markmann <tfar@soc.pidgin.im>2008-06-22 18:59:33 +0000
commit2f36c1d50283bc2283ed574e8645dd58ba8afe93 (patch)
treecd2e981f01b6081b5102909a4cae854815efef4f
parentb26f8b454c6110dc2a804262fb99ef5a72f1c1cc (diff)
downloadpidgin-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.c40
-rw-r--r--libpurple/protocols/jabber/caps.h7
-rw-r--r--libpurple/protocols/jabber/jabber.h1
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 {