summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Aurich <darkrain42@pidgin.im>2010-07-10 00:59:19 +0000
committerPaul Aurich <darkrain42@pidgin.im>2010-07-10 00:59:19 +0000
commit5a56062885edd01113efa7db702ce008647b649f (patch)
treeac7d87fd937422fd80e64df8318aabf678af3057
parenta13a67e9aca4568cfedc6c33f4effe79f67b759a (diff)
downloadpidgin-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.c15
-rw-r--r--libpurple/protocols/jabber/xdata.c26
-rw-r--r--libpurple/protocols/jabber/xdata.h15
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_ */