diff -r 57013b9e1a8e -r 42bbe5b85df8 libpurple/protocols/gg/xml.c --- a/libpurple/protocols/gg/xml.c Mon Jul 09 21:21:21 2012 +0200 +++ b/libpurple/protocols/gg/xml.c Thu Jul 12 11:03:13 2012 +0200 @@ -1,5 +1,7 @@ #include "xml.h" +#include "debug.h" + gboolean ggp_xml_get_string(const xmlnode *xml, gchar *childName, gchar **var) { char *str; @@ -56,3 +58,46 @@ *var = val; return succ; } + +gboolean ggp_xml_set_string(xmlnode *xml, gchar *childName, const gchar *val) +{ + g_return_val_if_fail(xml != NULL, FALSE); + g_return_val_if_fail(val != NULL, FALSE); + + if (childName != NULL) + { + xmlnode *child = xmlnode_get_child(xml, childName); + if (child == NULL) + child = xmlnode_new_child(xml, childName); + xml = child; + } + + ggp_xmlnode_remove_children(xml); + xmlnode_insert_data(xml, val, -1); + + return TRUE; +} + +gboolean ggp_xml_set_bool(xmlnode *xml, gchar *childName, gboolean val) +{ + return ggp_xml_set_string(xml, childName, val ? "true" : "false"); +} + +gboolean ggp_xml_set_uint(xmlnode *xml, gchar *childName, unsigned int val) +{ + gchar buff[20]; + g_snprintf(buff, sizeof(buff), "%u", val); + return ggp_xml_set_string(xml, childName, buff); +} + +void ggp_xmlnode_remove_children(xmlnode *xml) +{ + xmlnode *child = xml->child; + while (child) + { + xmlnode *next = child->next; + if (child->type != XMLNODE_TYPE_ATTRIB) + xmlnode_free(child); + child = next; + } +}