libpurple/protocols/gg/xml.c

Thu, 12 Jul 2012 11:03:13 +0200

author
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
date
Thu, 12 Jul 2012 11:03:13 +0200
branch
soc.2012.gg
changeset 33315
42bbe5b85df8
parent 33314
57013b9e1a8e
child 33343
09f740724036
permissions
-rw-r--r--

Gadu-Gadu: roster - uploading/synchronization - part1

#include "xml.h"

#include "debug.h"

gboolean ggp_xml_get_string(const xmlnode *xml, gchar *childName, gchar **var)
{
	char *str;
	
	g_return_val_if_fail(xml != NULL, FALSE);
	g_return_val_if_fail(var != NULL, FALSE);
	
	if (childName != NULL)
	{
		xml = xmlnode_get_child(xml, childName);
		g_return_val_if_fail(xml != NULL, FALSE);
	}
	
	str = xmlnode_get_data(xml);
	g_return_val_if_fail(str != NULL, FALSE);
	
	*var = str;
	return TRUE;
}

gboolean ggp_xml_get_bool(const xmlnode *xml, gchar *childName, gboolean *var)
{
	char *str;
	gboolean succ;
	
	succ = ggp_xml_get_string(xml, childName, &str);
	g_return_val_if_fail(succ, FALSE);
	
	*var = (strcmp(str, "true") == 0 ||
		strcmp(str, "True") == 0 ||
		strcmp(str, "TRUE") == 0 ||
		strcmp(str, "1") == 0);
	g_free(str);
	
	return TRUE;
}

gboolean ggp_xml_get_uint(const xmlnode *xml, gchar *childName, unsigned int *var)
{
	char *str, *endptr;
	gboolean succ;
	unsigned int val;
	
	succ = ggp_xml_get_string(xml, childName, &str);
	g_return_val_if_fail(succ, FALSE);
	
	errno = 0;
	val = strtoul(str, &endptr, 10);
	
	succ = (errno != ERANGE && endptr[0] == '\0');
	g_free(str);
	
	if (succ)
		*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;
	}
}

mercurial