# HG changeset patch # User Paul Aurich # Date 1278723559 0 # Node ID 7fb775b4465b2936cd7f757650a580a3072dcd3f # Parent 77cd42f08ba111cb0df29a2a827bb7666c1f13eb 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. diff -r 77cd42f08ba1 -r 7fb775b4465b libpurple/protocols/jabber/caps.c --- a/libpurple/protocols/jabber/caps.c Sat Jul 10 00:56:11 2010 +0000 +++ b/libpurple/protocols/jabber/caps.c Sat Jul 10 00:59:19 2010 +0000 @@ -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 @@ } } -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 @@ 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 @@ /* 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 -r 77cd42f08ba1 -r 7fb775b4465b libpurple/protocols/jabber/xdata.c --- a/libpurple/protocols/jabber/xdata.c Sat Jul 10 00:56:11 2010 +0000 +++ b/libpurple/protocols/jabber/xdata.c Sat Jul 10 00:59:19 2010 +0000 @@ -411,4 +411,30 @@ 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 -r 77cd42f08ba1 -r 7fb775b4465b libpurple/protocols/jabber/xdata.h --- a/libpurple/protocols/jabber/xdata.h Sat Jul 10 00:56:11 2010 +0000 +++ b/libpurple/protocols/jabber/xdata.h Sat Jul 10 00:59:19 2010 +0000 @@ -37,4 +37,19 @@ 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". + * + * + * http://jabber.org/protocol/muc#roominfo + * + * + * + * @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_ */