pidgin: 188465fa: jabber: Move another function out of cap...
darkrain42 at pidgin.im
darkrain42 at pidgin.im
Fri Jul 9 22:15:43 EDT 2010
----------------------------------------------------------------------
Revision: 188465fa1e8064c35ae348b4c71cee7fb4c7c755
Parent: 962c33d65e9071cb4e7327a9766e57bc444157d4
Author: darkrain42 at pidgin.im
Date: 07/09/10 22:02:21
Branch: im.pidgin.pidgin
URL: http://d.pidgin.im/viewmtn/revision/info/188465fa1e8064c35ae348b4c71cee7fb4c7c755
Changelog:
jabber: Move another function out of caps.c...
Sadly, this one landed in jabber.c (which needs to be split up)
Changes against parent 962c33d65e9071cb4e7327a9766e57bc444157d4
patched libpurple/protocols/jabber/caps.c
patched libpurple/protocols/jabber/jabber.c
patched libpurple/protocols/jabber/jabber.h
-------------- next part --------------
============================================================
--- libpurple/protocols/jabber/jabber.c 4de37479e28a724d6c23d4088d99d9194cf926d9
+++ libpurple/protocols/jabber/jabber.c c602a7a2808c1f0e3e519f22de419b7a79f71253
@@ -1962,20 +1962,53 @@ static void jabber_features_destroy(void
}
}
-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 @@ void jabber_add_identity(const gchar *ca
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)
============================================================
--- libpurple/protocols/jabber/jabber.h 86a671359b3665b429806ce52b5071fccc34f0f8
+++ libpurple/protocols/jabber/jabber.h 480e97195d8da8a1120c4f5cb1360b77c9a3d24b
@@ -303,6 +303,9 @@ extern GList *jabber_features;
/* 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 *ca
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.
============================================================
--- libpurple/protocols/jabber/caps.c 33afcb40b2ef4fdfb3c0a1948586d8ad99a9f18d
+++ libpurple/protocols/jabber/caps.c cc562b0d2df8fbd73a33ce5694ec1c8ada4de166
@@ -704,36 +704,6 @@ static gint
}
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 @@ void jabber_caps_calculate_own_hash(Jabb
}
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;
More information about the Commits
mailing list