diff options
author | Paul Aurich <darkrain42@pidgin.im> | 2010-07-10 00:59:19 +0000 |
---|---|---|
committer | Paul Aurich <darkrain42@pidgin.im> | 2010-07-10 00:59:19 +0000 |
commit | 5a56062885edd01113efa7db702ce008647b649f (patch) | |
tree | ac7d87fd937422fd80e64df8318aabf678af3057 | |
parent | a13a67e9aca4568cfedc6c33f4effe79f67b759a (diff) | |
download | pidgin-5a56062885edd01113efa7db702ce008647b649f.tar.gz |
jabber: Move (and harden) a function to xdata.c
Oops, I guess the const change on xmlnode_get_attrib wasn't
necessary since I had to cast away the constness so I could use
xmlnode_get_next_twin. Oh well.
-rw-r--r-- | libpurple/protocols/jabber/caps.c | 15 | ||||
-rw-r--r-- | libpurple/protocols/jabber/xdata.c | 26 | ||||
-rw-r--r-- | libpurple/protocols/jabber/xdata.h | 15 |
3 files changed, 45 insertions, 11 deletions
diff --git a/libpurple/protocols/jabber/caps.c b/libpurple/protocols/jabber/caps.c index 89fdb1813e..12777a3fc0 100644 --- a/libpurple/protocols/jabber/caps.c +++ b/libpurple/protocols/jabber/caps.c @@ -29,6 +29,7 @@ #include "iq.h" #include "presence.h" #include "util.h" +#include "xdata.h" #define JABBER_CAPS_FILENAME "xmpp-caps.xml" @@ -732,14 +733,6 @@ jabber_identity_compare(gconstpointer a, gconstpointer b) } } -static gchar *jabber_caps_get_formtype(const xmlnode *x) { - xmlnode *formtypefield; - formtypefield = xmlnode_get_child(x, "field"); - while (formtypefield && strcmp(xmlnode_get_attrib(formtypefield, "var"), "FORM_TYPE")) formtypefield = xmlnode_get_next_twin(formtypefield); - formtypefield = xmlnode_get_child(formtypefield, "value"); - return xmlnode_get_data(formtypefield);; -} - static gint jabber_xdata_compare(gconstpointer a, gconstpointer b) { @@ -749,8 +742,8 @@ jabber_xdata_compare(gconstpointer a, gconstpointer b) char *bformtype; int result; - aformtype = jabber_caps_get_formtype(aformtypefield); - bformtype = jabber_caps_get_formtype(bformtypefield); + aformtype = jabber_x_data_get_formtype(aformtypefield); + bformtype = jabber_x_data_get_formtype(bformtypefield); result = strcmp(aformtype, bformtype); g_free(aformtype); @@ -902,7 +895,7 @@ gchar *jabber_caps_calculate_hash(JabberCapsClientInfo *info, const char *hash) /* concat x-data forms to the verification string */ for(node = info->forms; node; node = node->next) { xmlnode *data = (xmlnode *)node->data; - gchar *formtype = jabber_caps_get_formtype(data); + gchar *formtype = jabber_x_data_get_formtype(data); GList *fields = jabber_caps_xdata_get_fields(data); /* append FORM_TYPE's field value to the verification string */ diff --git a/libpurple/protocols/jabber/xdata.c b/libpurple/protocols/jabber/xdata.c index 64ca60586e..e681694396 100644 --- a/libpurple/protocols/jabber/xdata.c +++ b/libpurple/protocols/jabber/xdata.c @@ -411,4 +411,30 @@ void *jabber_x_data_request_with_actions(JabberStream *js, xmlnode *packet, GLis return handle; } +gchar * +jabber_x_data_get_formtype(const xmlnode *form) +{ + xmlnode *field; + + g_return_val_if_fail(form != NULL, NULL); + + for (field = xmlnode_get_child((xmlnode *)form, "field"); field; + field = xmlnode_get_next_twin(field)) { + const char *var = xmlnode_get_attrib(field, "var"); + if (purple_strequal(var, "FORM_TYPE")) { + xmlnode *value = xmlnode_get_child(field, "value"); + if (value) + return xmlnode_get_data(value); + else + /* An interesting corner case... Looking for a second + * FORM_TYPE would be more considerate, but I'm in favor + * of not helping broken clients. + */ + return NULL; + } + } + + /* Erm, none found :( */ + return NULL; +} diff --git a/libpurple/protocols/jabber/xdata.h b/libpurple/protocols/jabber/xdata.h index c737fdeda3..7ebc50e008 100644 --- a/libpurple/protocols/jabber/xdata.h +++ b/libpurple/protocols/jabber/xdata.h @@ -37,4 +37,19 @@ typedef void (*jabber_x_data_action_cb)(JabberStream *js, xmlnode *result, const void *jabber_x_data_request(JabberStream *js, xmlnode *packet, jabber_x_data_cb cb, gpointer user_data); void *jabber_x_data_request_with_actions(JabberStream *js, xmlnode *packet, GList *actions, int defaultaction, jabber_x_data_action_cb cb, gpointer user_data); +/* + * Return the form type (the CDATA of the value child of the FORM_TYPE + * field entry. + * E.g., for the following, "http://jabber.org/protocol/muc#roominfo". + * <x xmlns='jabber:x:data' type='result'> + * <field var='FORM_TYPE' type='hidden'> + * <value>http://jabber.org/protocol/muc#roominfo</value> + * </field> + * </x> + * + * @param form The xmlnode for the form (the 'x' element) + * @returns The FORM_TYPE. Must be freed by caller. + */ +gchar *jabber_x_data_get_formtype(const xmlnode *form); + #endif /* PURPLE_JABBER_XDATA_H_ */ |