pidgin/pidgin

1896a80ff8e3
Route GLib debug logging directly to the Finch debug window

Instead of flowing through purple debug, this merges some bits of the existing GLib log handler, and the purple debug printer.

Testing Done:
Open the Debug window an see some `GLib-*` outputs.

Reviewed at https://reviews.imfreedom.org/r/1057/
/* purple
*
* Purple is the legal property of its developers, whose names are too numerous
* to list here. Please refer to the COPYRIGHT file distributed with this
* source distribution.
*
* Rewritten from scratch during Google Summer of Code 2012
* by Tomek Wasilczyk (http://www.wasilczyk.pl).
*
* Previously implemented by:
* - Arkadiusz Miskiewicz <misiek@pld.org.pl> - first implementation (2001);
* - Bartosz Oler <bartosz@bzimage.us> - reimplemented during GSoC 2005;
* - Krzysztof Klinikowski <grommasher@gmail.com> - some parts (2009-2011).
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
#include <errno.h>
#include "xml.h"
gboolean
ggp_xml_get_string(const PurpleXmlNode *xml, const 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 = purple_xmlnode_get_child(xml, childName);
if (xml == NULL)
return FALSE;
}
str = purple_xmlnode_get_data(xml);
if (str == NULL)
return FALSE;
*var = str;
return TRUE;
}
gboolean
ggp_xml_get_bool(const PurpleXmlNode *xml, const gchar *childName, gboolean *var)
{
char *str;
gboolean succ;
succ = ggp_xml_get_string(xml, childName, &str);
if (!succ)
return 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 PurpleXmlNode *xml, const gchar *childName, unsigned int *var)
{
char *str, *endptr;
gboolean succ;
unsigned int val;
succ = ggp_xml_get_string(xml, childName, &str);
if (!succ)
return 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(PurpleXmlNode *xml, const gchar *childName, const gchar *val)
{
g_return_val_if_fail(xml != NULL, FALSE);
g_return_val_if_fail(val != NULL, FALSE);
if (childName != NULL) {
PurpleXmlNode *child = purple_xmlnode_get_child(xml, childName);
if (child == NULL)
child = purple_xmlnode_new_child(xml, childName);
xml = child;
}
ggp_xmlnode_remove_children(xml);
purple_xmlnode_insert_data(xml, val, -1);
return TRUE;
}
gboolean
ggp_xml_set_bool(PurpleXmlNode *xml, const gchar *childName, gboolean val)
{
return ggp_xml_set_string(xml, childName, val ? "true" : "false");
}
gboolean
ggp_xml_set_uint(PurpleXmlNode *xml, const 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(PurpleXmlNode *xml)
{
PurpleXmlNode *child = xml->child;
while (child) {
PurpleXmlNode *next = child->next;
if (child->type != PURPLE_XMLNODE_TYPE_ATTRIB)
purple_xmlnode_free(child);
child = next;
}
}
unsigned int ggp_xml_child_count(PurpleXmlNode *xml, const gchar *childName)
{
PurpleXmlNode *child;
unsigned int count = 0;
g_return_val_if_fail(xml != NULL, 0);
if (childName) {
child = purple_xmlnode_get_child(xml, childName);
while (child) {
child = purple_xmlnode_get_next_twin(child);
count++;
}
} else {
child = xml->child;
while (child) {
child = child->next;
count++;
}
}
return count;
}