# HG changeset patch # User Paul Aurich # Date 1278727341 0 # Node ID 116ca888e77de13c6250540f32101dfacab190df # Parent 7fb775b4465b2936cd7f757650a580a3072dcd3f jabber: Move another function out of caps.c... Sadly, this one landed in jabber.c (which needs to be split up) diff -r 7fb775b4465b -r 116ca888e77d libpurple/protocols/jabber/caps.c --- a/libpurple/protocols/jabber/caps.c Sat Jul 10 00:59:19 2010 +0000 +++ b/libpurple/protocols/jabber/caps.c Sat Jul 10 02:02:21 2010 +0000 @@ -704,36 +704,6 @@ } static gint -jabber_identity_compare(gconstpointer a, gconstpointer b) -{ - const JabberIdentity *ac; - const JabberIdentity *bc; - gint cat_cmp; - gint typ_cmp; - - ac = a; - bc = b; - - if ((cat_cmp = strcmp(ac->category, bc->category)) == 0) { - if ((typ_cmp = strcmp(ac->type, bc->type)) == 0) { - if (!ac->lang && !bc->lang) { - return 0; - } else if (ac->lang && !bc->lang) { - return 1; - } else if (!ac->lang && bc->lang) { - return -1; - } else { - return strcmp(ac->lang, bc->lang); - } - } else { - return typ_cmp; - } - } else { - return cat_cmp; - } -} - -static gint jabber_xdata_compare(gconstpointer a, gconstpointer b) { const xmlnode *aformtypefield = a; @@ -956,6 +926,10 @@ } info.features = features; + /* TODO: This copy can go away, I think, since jabber_identities + * is pre-sorted, so the sort in calculate_hash should be idempotent. + * However, I want to test that. --darkrain + */ info.identities = g_list_copy(jabber_identities); info.forms = NULL; diff -r 7fb775b4465b -r 116ca888e77d libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c Sat Jul 10 00:59:19 2010 +0000 +++ b/libpurple/protocols/jabber/jabber.c Sat Jul 10 02:02:21 2010 +0000 @@ -1962,20 +1962,53 @@ } } -void jabber_add_identity(const gchar *category, const gchar *type, const gchar *lang, const gchar *name) { +gint +jabber_identity_compare(gconstpointer a, gconstpointer b) +{ + const JabberIdentity *ac; + const JabberIdentity *bc; + gint cat_cmp; + gint typ_cmp; + + ac = a; + bc = b; + + if ((cat_cmp = strcmp(ac->category, bc->category)) == 0) { + if ((typ_cmp = strcmp(ac->type, bc->type)) == 0) { + if (!ac->lang && !bc->lang) { + return 0; + } else if (ac->lang && !bc->lang) { + return 1; + } else if (!ac->lang && bc->lang) { + return -1; + } else { + return strcmp(ac->lang, bc->lang); + } + } else { + return typ_cmp; + } + } else { + return cat_cmp; + } +} + +void jabber_add_identity(const gchar *category, const gchar *type, + const gchar *lang, const gchar *name) +{ GList *identity; JabberIdentity *ident; + /* both required according to XEP-0030 */ g_return_if_fail(category != NULL); g_return_if_fail(type != NULL); - for(identity = jabber_identities; identity; identity = identity->next) { - JabberIdentity *ident = (JabberIdentity*)identity->data; - if (!strcmp(ident->category, category) && - !strcmp(ident->type, type) && - ((!ident->lang && !lang) || (ident->lang && lang && !strcmp(ident->lang, lang)))) { + /* Check if this identity is already there... */ + for (identity = jabber_identities; identity; identity = identity->next) { + JabberIdentity *id = identity->data; + if (g_str_equal(id->category, category) && + g_str_equal(id->type, type) && + purple_strequal(id->lang, lang)) return; - } } ident = g_new0(JabberIdentity, 1); @@ -1983,7 +2016,8 @@ ident->type = g_strdup(type); ident->lang = g_strdup(lang); ident->name = g_strdup(name); - jabber_identities = g_list_prepend(jabber_identities, ident); + jabber_identities = g_list_insert_sorted(jabber_identities, ident, + jabber_identity_compare); } static void jabber_identities_destroy(void) diff -r 7fb775b4465b -r 116ca888e77d libpurple/protocols/jabber/jabber.h --- a/libpurple/protocols/jabber/jabber.h Sat Jul 10 00:59:19 2010 +0000 +++ b/libpurple/protocols/jabber/jabber.h Sat Jul 10 02:02:21 2010 +0000 @@ -303,6 +303,9 @@ /* what kind of additional features as returned from disco#info are supported? */ extern GList *jabber_features; +/* A sorted list of identities advertised. Use jabber_add_identity to add + * so it remains sorted. + */ extern GList *jabber_identities; void jabber_stream_features_parse(JabberStream *js, xmlnode *packet); @@ -342,6 +345,11 @@ void jabber_add_identity(const gchar *category, const gchar *type, const gchar *lang, const gchar *name); /** + * GCompareFunc for JabberIdentity structs. + */ +gint jabber_identity_compare(gconstpointer a, gconstpointer b); + +/** * Returns true if this connection is over a secure (SSL) stream. Use this * instead of checking js->gsc because BOSH stores its PurpleSslConnection * members in its own data structure.