|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* glade-xml-utils.c - This functions are based on gnome-print/libgpa/gpa-xml.c
|
|
Packit |
1e8aac |
* which were in turn based on gnumeric/xml-io.c
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
1e8aac |
* it under the terms of the GNU General Public License as
|
|
Packit |
1e8aac |
* published by the Free Software Foundation; either version 2 of the
|
|
Packit |
1e8aac |
* License, or (at your option) any later version.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
1e8aac |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
1e8aac |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
1e8aac |
* GNU General Public License for more details.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* You should have received a copy of the GNU General Public License
|
|
Packit |
1e8aac |
* along with this program; if not, write to the Free Software
|
|
Packit |
1e8aac |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Authors:
|
|
Packit |
1e8aac |
* Daniel Veillard <Daniel.Veillard@w3.org>
|
|
Packit |
1e8aac |
* Miguel de Icaza <miguel@gnu.org>
|
|
Packit |
1e8aac |
* Chema Celorio <chema@gnome.org>
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* SECTION:glade-xml-utils
|
|
Packit |
1e8aac |
* @Title: Xml Utils
|
|
Packit |
1e8aac |
* @Short_Description: An api to read and write xml.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* You may need these tools if you are implementing #GladeReadWidgetFunc
|
|
Packit |
1e8aac |
* and/or #GladeWriteWidgetFunc on your #GladeWidgetAdaptor to read
|
|
Packit |
1e8aac |
* and write widgets in custom ways
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include "config.h"
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include <string.h>
|
|
Packit |
1e8aac |
#include <glib.h>
|
|
Packit |
1e8aac |
#include <errno.h>
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include "glade-xml-utils.h"
|
|
Packit |
1e8aac |
#include "glade-catalog.h"
|
|
Packit |
1e8aac |
#include "glade-utils.h"
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include <libxml/tree.h>
|
|
Packit |
1e8aac |
#include <libxml/parser.h>
|
|
Packit |
1e8aac |
#include <libxml/parserInternals.h>
|
|
Packit |
1e8aac |
#include <libxml/xmlmemory.h>
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
struct _GladeXmlNode
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node;
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
struct _GladeXmlDoc
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlDoc doc;
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
struct _GladeXmlContext
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeXmlDoc *doc;
|
|
Packit |
1e8aac |
gboolean freedoc;
|
|
Packit |
1e8aac |
xmlNsPtr ns;
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* This is used inside for loops so that we skip xml comments
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* also to skip whitespace between nodes
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
#define skip_text(node) if ((xmlStrcmp ( ((xmlNodePtr)node)->name, BAD_CAST("text")) == 0) ||\
|
|
Packit |
1e8aac |
(xmlStrcmp ( ((xmlNodePtr)node)->name, BAD_CAST("comment")) == 0)) { \
|
|
Packit |
1e8aac |
node = (GladeXmlNode *)((xmlNodePtr)node)->next; continue ; };
|
|
Packit |
1e8aac |
#define skip_text_libxml(node) if ((xmlStrcmp ( ((xmlNodePtr)node)->name, BAD_CAST("text")) == 0) ||\
|
|
Packit |
1e8aac |
(xmlStrcmp ( ((xmlNodePtr)node)->name, BAD_CAST("comment")) == 0)) { \
|
|
Packit |
1e8aac |
node = ((xmlNodePtr)node)->next; continue ; };
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gchar *
|
|
Packit |
1e8aac |
claim_string (xmlChar *string)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gchar *ret;
|
|
Packit |
1e8aac |
ret = g_strdup (CAST_BAD (string));
|
|
Packit |
1e8aac |
xmlFree (string);
|
|
Packit |
1e8aac |
return ret;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_xml_set_value:
|
|
Packit |
1e8aac |
* @node_in: a #GladeXmlNode
|
|
Packit |
1e8aac |
* @name: a string
|
|
Packit |
1e8aac |
* @val: a string
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Sets the property @name in @node_in to @val
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_xml_set_value (GladeXmlNode *node_in, const gchar *name, const gchar *val)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
xmlChar *ret;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
ret = xmlGetProp (node, BAD_CAST (name));
|
|
Packit |
1e8aac |
if (ret)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlFree (ret);
|
|
Packit |
1e8aac |
xmlSetProp (node, BAD_CAST (name), BAD_CAST (val));
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_xml_get_content:
|
|
Packit |
1e8aac |
* @node_in: a #GladeXmlNode
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Gets a string containing the content of @node_in.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: A newly allocated string
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
gchar *
|
|
Packit |
1e8aac |
glade_xml_get_content (GladeXmlNode *node_in)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
xmlChar *val = xmlNodeGetContent (node);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return claim_string (val);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_xml_set_content:
|
|
Packit |
1e8aac |
* @node_in: a #GladeXmlNode
|
|
Packit |
1e8aac |
* @content: a string
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Sets the content of @node to @content.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_xml_set_content (GladeXmlNode *node_in, const gchar *content)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
xmlChar *content_encoded;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (node != NULL);
|
|
Packit |
1e8aac |
g_return_if_fail (node->doc != NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
content_encoded = xmlEncodeSpecialChars (node->doc, BAD_CAST (content));
|
|
Packit |
1e8aac |
xmlNodeSetContent (node, BAD_CAST (content_encoded));
|
|
Packit |
1e8aac |
xmlFree (content_encoded);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* Get a value for a node either carried as an attibute or as
|
|
Packit |
1e8aac |
* the content of a child.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns a g_malloc'ed string. Caller must free.
|
|
Packit |
1e8aac |
* (taken from gnumeric )
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
static gchar *
|
|
Packit |
1e8aac |
glade_xml_get_value (xmlNodePtr node, const gchar *name)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr child;
|
|
Packit |
1e8aac |
gchar *ret = NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (child = node->children; child; child = child->next)
|
|
Packit |
1e8aac |
if (!xmlStrcmp (child->name, BAD_CAST (name)))
|
|
Packit |
1e8aac |
ret = claim_string (xmlNodeGetContent (child));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return ret;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_xml_node_verify_silent:
|
|
Packit |
1e8aac |
* @node_in: a #GladeXmlNode
|
|
Packit |
1e8aac |
* @name: a string
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: %TRUE if @node_in's name is equal to @name, %FALSE otherwise
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_xml_node_verify_silent (GladeXmlNode *node_in, const gchar *name)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (node != NULL, FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (xmlStrcmp (node->name, BAD_CAST (name)) != 0)
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_xml_node_verify:
|
|
Packit |
1e8aac |
* @node_in: a #GladeXmlNode
|
|
Packit |
1e8aac |
* @name: a string
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* This is a wrapper around glade_xml_node_verify_silent(), only it emits
|
|
Packit |
1e8aac |
* a g_warning() if @node_in has a name different than @name.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: %TRUE if @node_in's name is equal to @name, %FALSE otherwise
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_xml_node_verify (GladeXmlNode *node_in, const gchar *name)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!glade_xml_node_verify_silent (node_in, name))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_warning ("Expected node was \"%s\", encountered \"%s\"",
|
|
Packit |
1e8aac |
name, node->name);
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_xml_get_value_int:
|
|
Packit |
1e8aac |
* @node_in: a #GladeXmlNode
|
|
Packit |
1e8aac |
* @name: a string
|
|
Packit |
1e8aac |
* @val: a pointer to an #int
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Gets an integer value for a node either carried as an attribute or as
|
|
Packit |
1e8aac |
* the content of a child.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: %TRUE if the node is found, %FALSE otherwise
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_xml_get_value_int (GladeXmlNode *node_in, const gchar *name, gint *val)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
gchar *value, *endptr = NULL;
|
|
Packit |
1e8aac |
gint64 i;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
value = glade_xml_get_value (node, name);
|
|
Packit |
1e8aac |
if (value == NULL)
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
errno = 0;
|
|
Packit |
1e8aac |
i = g_ascii_strtoll (value, &endptr, 10);
|
|
Packit |
1e8aac |
if (errno != 0 || (i == 0 && endptr == value))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_free (value);
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (value);
|
|
Packit |
1e8aac |
*val = (gint) i;
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_xml_get_value_int_required:
|
|
Packit |
1e8aac |
* @node: a #GladeXmlNode
|
|
Packit |
1e8aac |
* @name: a string
|
|
Packit |
1e8aac |
* @val: a pointer to an #int
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* This is a wrapper around glade_xml_get_value_int(), only it emits
|
|
Packit |
1e8aac |
* a g_warning() if @node_in did not contain the requested tag
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns:
|
|
Packit |
1e8aac |
**/
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_xml_get_value_int_required (GladeXmlNode *node,
|
|
Packit |
1e8aac |
const gchar *name,
|
|
Packit |
1e8aac |
gint *val)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gboolean ret;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
ret = glade_xml_get_value_int (node, name, val);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (ret == FALSE)
|
|
Packit |
1e8aac |
g_warning ("The file did not contain the required value \"%s\"\n"
|
|
Packit |
1e8aac |
"Under the \"%s\" tag.", name, glade_xml_node_get_name (node));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return ret;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* Get a String value for a node either carried as an attibute or as
|
|
Packit |
1e8aac |
* the content of a child.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
gchar *
|
|
Packit |
1e8aac |
glade_xml_get_value_string (GladeXmlNode *node_in, const gchar *name)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
return glade_xml_get_value (node, name);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gchar *
|
|
Packit |
1e8aac |
glade_xml_get_property (xmlNodePtr node, const gchar *name)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlChar *val;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
val = xmlGetProp (node, BAD_CAST (name));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (val)
|
|
Packit |
1e8aac |
return claim_string (val);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return NULL;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_xml_set_property (xmlNodePtr node,
|
|
Packit |
1e8aac |
const gchar *name,
|
|
Packit |
1e8aac |
const gchar *value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (value)
|
|
Packit |
1e8aac |
xmlSetProp (node, BAD_CAST (name), BAD_CAST (value));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* Get a String value for a node either carried as an attibute or as
|
|
Packit |
1e8aac |
* the content of a child.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_xml_get_boolean (GladeXmlNode *node_in,
|
|
Packit |
1e8aac |
const gchar *name,
|
|
Packit |
1e8aac |
gboolean _default)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
gchar *value;
|
|
Packit |
1e8aac |
gboolean ret = FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
value = glade_xml_get_value (node, name);
|
|
Packit |
1e8aac |
if (value == NULL)
|
|
Packit |
1e8aac |
return _default;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_utils_boolean_from_string (value, &ret))
|
|
Packit |
1e8aac |
g_warning ("Boolean tag unrecognized *%s*\n", value);
|
|
Packit |
1e8aac |
g_free (value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return ret;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* Get a String value for a node either carried as an attibute or as
|
|
Packit |
1e8aac |
* the content of a child.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_xml_get_property_boolean (GladeXmlNode *node_in,
|
|
Packit |
1e8aac |
const gchar *name,
|
|
Packit |
1e8aac |
gboolean _default)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
gchar *value;
|
|
Packit |
1e8aac |
gboolean ret = FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
value = glade_xml_get_property (node, name);
|
|
Packit |
1e8aac |
if (value == NULL)
|
|
Packit |
1e8aac |
return _default;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_utils_boolean_from_string (value, &ret))
|
|
Packit |
1e8aac |
g_warning ("Boolean tag unrecognized *%s*\n", value);
|
|
Packit |
1e8aac |
g_free (value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return ret;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gdouble
|
|
Packit |
1e8aac |
glade_xml_get_property_double (GladeXmlNode *node_in,
|
|
Packit |
1e8aac |
const gchar *name,
|
|
Packit |
1e8aac |
gdouble _default)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
gdouble retval;
|
|
Packit |
1e8aac |
gchar *value;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((value = glade_xml_get_property (node, name)) == NULL)
|
|
Packit |
1e8aac |
return _default;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
errno = 0;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
retval = g_ascii_strtod (value, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (errno)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_free (value);
|
|
Packit |
1e8aac |
return _default;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_free (value);
|
|
Packit |
1e8aac |
return retval;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gint
|
|
Packit |
1e8aac |
glade_xml_get_property_int (GladeXmlNode *node_in,
|
|
Packit |
1e8aac |
const gchar *name,
|
|
Packit |
1e8aac |
gint _default)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
gint retval;
|
|
Packit |
1e8aac |
gchar *value;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((value = glade_xml_get_property (node, name)) == NULL)
|
|
Packit |
1e8aac |
return _default;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
retval = g_ascii_strtoll (value, NULL, 10);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return retval;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_xml_node_set_property_boolean (GladeXmlNode *node_in,
|
|
Packit |
1e8aac |
const gchar *name,
|
|
Packit |
1e8aac |
gboolean value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (value)
|
|
Packit |
1e8aac |
glade_xml_set_property (node, name, "True");
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
glade_xml_set_property (node, name, "False");
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gchar *
|
|
Packit |
1e8aac |
glade_xml_get_value_string_required (GladeXmlNode *node_in,
|
|
Packit |
1e8aac |
const gchar *name,
|
|
Packit |
1e8aac |
const gchar *xtra)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
gchar *value = glade_xml_get_value (node, name);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (value == NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (xtra == NULL)
|
|
Packit |
1e8aac |
g_warning ("The file did not contain the required value \"%s\"\n"
|
|
Packit |
1e8aac |
"Under the \"%s\" tag.", name, node->name);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
g_warning ("The file did not contain the required value \"%s\"\n"
|
|
Packit |
1e8aac |
"Under the \"%s\" tag (%s).", name, node->name, xtra);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return value;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gchar *
|
|
Packit |
1e8aac |
glade_xml_get_property_string (GladeXmlNode *node_in, const gchar *name)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return glade_xml_get_property (node, name);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_xml_node_set_property_string (GladeXmlNode *node_in,
|
|
Packit |
1e8aac |
const gchar *name,
|
|
Packit |
1e8aac |
const gchar *string)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_xml_set_property (node, name, string);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gchar *
|
|
Packit |
1e8aac |
glade_xml_get_property_string_required (GladeXmlNode *node_in,
|
|
Packit |
1e8aac |
const gchar *name,
|
|
Packit |
1e8aac |
const gchar *xtra)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
gchar *value = glade_xml_get_property_string (node_in, name);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (value == NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (xtra == NULL)
|
|
Packit |
1e8aac |
g_warning ("The file did not contain the required property \"%s\"\n"
|
|
Packit |
1e8aac |
"Under the \"%s\" tag.", name, node->name);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
g_warning ("The file did not contain the required property \"%s\"\n"
|
|
Packit |
1e8aac |
"Under the \"%s\" tag (%s).", name, node->name, xtra);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
return value;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_xml_get_property_version (GladeXmlNode *node_in,
|
|
Packit |
1e8aac |
const gchar *name,
|
|
Packit |
1e8aac |
guint16 *major,
|
|
Packit |
1e8aac |
guint16 * minor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
gchar *value = glade_xml_get_property_string (node_in, name);
|
|
Packit |
1e8aac |
gchar **split;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!value)
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((split = g_strsplit (value, ".", 2)))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (!split[0] || !split[1])
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_warning ("Malformed version property \"%s\"\n"
|
|
Packit |
1e8aac |
"Under the \"%s\" tag (%s)", name, node->name, value);
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
*major = g_ascii_strtoll (split[0], NULL, 10);
|
|
Packit |
1e8aac |
*minor = g_ascii_strtoll (split[1], NULL, 10);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_strfreev (split);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GList *
|
|
Packit |
1e8aac |
glade_xml_get_property_targetable_versions (GladeXmlNode *node_in,
|
|
Packit |
1e8aac |
const gchar *name)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeTargetableVersion *version;
|
|
Packit |
1e8aac |
GList *targetable = NULL;
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
gchar *value;
|
|
Packit |
1e8aac |
gchar **split, **maj_min;
|
|
Packit |
1e8aac |
gint i;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!(value = glade_xml_get_property_string (node_in, name)))
|
|
Packit |
1e8aac |
return NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((split = g_strsplit (value, ",", 0)) != NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
for (i = 0; split[i]; i++)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
maj_min = g_strsplit (split[i], ".", 2);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!maj_min[0] || !maj_min[1])
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_warning ("Malformed version property \"%s\"\n"
|
|
Packit |
1e8aac |
"Under the \"%s\" tag (%s)", name, node->name, value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
version = g_new (GladeTargetableVersion, 1);
|
|
Packit |
1e8aac |
version->major = g_ascii_strtoll (maj_min[0], NULL, 10);
|
|
Packit |
1e8aac |
version->minor = g_ascii_strtoll (maj_min[1], NULL, 10);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
targetable = g_list_append (targetable, version);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
g_strfreev (maj_min);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_strfreev (split);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return targetable;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* Search a child by name,
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
GladeXmlNode *
|
|
Packit |
1e8aac |
glade_xml_search_child (GladeXmlNode *node_in, const gchar *name)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node;
|
|
Packit |
1e8aac |
xmlNodePtr child;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (node_in != NULL, NULL);
|
|
Packit |
1e8aac |
g_return_val_if_fail (name != NULL, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (child = node->children; child; child = child->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (!xmlStrcmp (child->name, BAD_CAST (name)))
|
|
Packit |
1e8aac |
return (GladeXmlNode *) child;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return NULL;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_xml_search_child_required:
|
|
Packit |
1e8aac |
* @tree:
|
|
Packit |
1e8aac |
* @name:
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* just a small wrapper arround glade_xml_search_child that displays
|
|
Packit |
1e8aac |
* an error if the child was not found
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Return Value:
|
|
Packit |
1e8aac |
**/
|
|
Packit |
1e8aac |
GladeXmlNode *
|
|
Packit |
1e8aac |
glade_xml_search_child_required (GladeXmlNode *node, const gchar *name)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeXmlNode *child;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
child = glade_xml_search_child (node, name);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (child == NULL)
|
|
Packit |
1e8aac |
g_warning ("The file did not contain the required tag \"%s\"\n"
|
|
Packit |
1e8aac |
"Under the \"%s\" node.", name, glade_xml_node_get_name (node));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return child;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* --------------------------- Parse Context ----------------------------*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GladeXmlContext *
|
|
Packit |
1e8aac |
glade_xml_context_new_real (GladeXmlDoc *doc, gboolean freedoc, xmlNsPtr ns)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeXmlContext *context = g_new0 (GladeXmlContext, 1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
context->doc = doc;
|
|
Packit |
1e8aac |
context->freedoc = freedoc;
|
|
Packit |
1e8aac |
context->ns = ns;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return context;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeXmlContext *
|
|
Packit |
1e8aac |
glade_xml_context_new (GladeXmlDoc *doc, const gchar *name_space)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* We are not using the namespace now */
|
|
Packit |
1e8aac |
return glade_xml_context_new_real (doc, TRUE, NULL);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_xml_context_destroy (GladeXmlContext * context)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (context != NULL);
|
|
Packit |
1e8aac |
if (context->freedoc)
|
|
Packit |
1e8aac |
xmlFreeDoc ((xmlDoc *) context->doc);
|
|
Packit |
1e8aac |
g_free (context);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeXmlContext *
|
|
Packit |
1e8aac |
glade_xml_context_new_from_path (const gchar *full_path,
|
|
Packit |
1e8aac |
const gchar *nspace,
|
|
Packit |
1e8aac |
const gchar *root_name)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeXmlContext *context;
|
|
Packit |
1e8aac |
xmlDocPtr doc;
|
|
Packit |
1e8aac |
xmlNsPtr name_space;
|
|
Packit |
1e8aac |
xmlNodePtr root;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (full_path != NULL, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
doc = xmlParseFile (full_path);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* That's not an error condition. The file is not readable, and we can't know it
|
|
Packit |
1e8aac |
* before we try to read it (testing for readability is a call to race conditions).
|
|
Packit |
1e8aac |
* So we should not print a warning */
|
|
Packit |
1e8aac |
if (doc == NULL)
|
|
Packit |
1e8aac |
return NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (doc->children == NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_warning ("Invalid xml File, tree empty [%s]&", full_path);
|
|
Packit |
1e8aac |
xmlFreeDoc (doc);
|
|
Packit |
1e8aac |
return NULL;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
name_space = xmlSearchNsByHref (doc, doc->children, BAD_CAST (nspace));
|
|
Packit |
1e8aac |
if (name_space == NULL && nspace != NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_warning ("The file did not contain the expected name space\n"
|
|
Packit |
1e8aac |
"Expected \"%s\" [%s]", nspace, full_path);
|
|
Packit |
1e8aac |
xmlFreeDoc (doc);
|
|
Packit |
1e8aac |
return NULL;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
root = xmlDocGetRootElement (doc);
|
|
Packit |
1e8aac |
if (root_name != NULL &&
|
|
Packit |
1e8aac |
((root->name == NULL) ||
|
|
Packit |
1e8aac |
(xmlStrcmp (root->name, BAD_CAST (root_name)) != 0)))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_warning ("The file did not contain the expected root name\n"
|
|
Packit |
1e8aac |
"Expected \"%s\", actual : \"%s\" [%s]",
|
|
Packit |
1e8aac |
root_name, root->name, full_path);
|
|
Packit |
1e8aac |
xmlFreeDoc (doc);
|
|
Packit |
1e8aac |
return NULL;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
context = glade_xml_context_new_real ((GladeXmlDoc *) doc, TRUE, name_space);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return context;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_xml_context_free:
|
|
Packit |
1e8aac |
* @context:
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Similar to glade_xml_context_destroy but it also frees the document set in the context
|
|
Packit |
1e8aac |
**/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_xml_context_free (GladeXmlContext *context)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (context != NULL);
|
|
Packit |
1e8aac |
if (context->doc)
|
|
Packit |
1e8aac |
xmlFreeDoc ((xmlDocPtr) context->doc);
|
|
Packit |
1e8aac |
context->doc = NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (context);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_xml_node_append_child (GladeXmlNode *node_in,
|
|
Packit |
1e8aac |
GladeXmlNode *child_in)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
xmlNodePtr child = (xmlNodePtr) child_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (node != NULL);
|
|
Packit |
1e8aac |
g_return_if_fail (child != NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
xmlAddChild (node, child);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_xml_node_remove (GladeXmlNode * node_in)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (node != NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
xmlReplaceNode (node, NULL);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeXmlNode *
|
|
Packit |
1e8aac |
glade_xml_node_new (GladeXmlContext *context, const gchar *name)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (context != NULL, NULL);
|
|
Packit |
1e8aac |
g_return_val_if_fail (name != NULL, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return (GladeXmlNode *) xmlNewDocNode ((xmlDocPtr) context->doc, context->ns,
|
|
Packit |
1e8aac |
BAD_CAST (name), NULL);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeXmlNode *
|
|
Packit |
1e8aac |
glade_xml_node_new_comment (GladeXmlContext *context, const gchar *comment)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (context != NULL, NULL);
|
|
Packit |
1e8aac |
g_return_val_if_fail (comment != NULL, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return (GladeXmlNode *) xmlNewDocComment ((xmlDocPtr) context->doc,
|
|
Packit |
1e8aac |
BAD_CAST (comment));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeXmlNode *
|
|
Packit |
1e8aac |
glade_xml_node_copy (GladeXmlNode *node)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (node)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr xnode = (xmlNodePtr) node;
|
|
Packit |
1e8aac |
return (GladeXmlNode *) xmlDocCopyNode (xnode, NULL, 1);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
return NULL;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_xml_node_delete (GladeXmlNode *node)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlFreeNode ((xmlNodePtr) node);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeXmlDoc *
|
|
Packit |
1e8aac |
glade_xml_context_get_doc (GladeXmlContext *context)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return context->doc;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gchar *
|
|
Packit |
1e8aac |
glade_xml_dump_from_context (GladeXmlContext *context)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeXmlDoc *doc;
|
|
Packit |
1e8aac |
xmlChar *string = NULL;
|
|
Packit |
1e8aac |
gchar *text;
|
|
Packit |
1e8aac |
int size;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
doc = glade_xml_context_get_doc (context);
|
|
Packit |
1e8aac |
xmlDocDumpFormatMemory (&(doc->doc), &string, &size, 1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
text = claim_string (string);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return text;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_xml_node_is_comment (GladeXmlNode *node_in)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
return (node) ? node->type == XML_COMMENT_NODE : FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static inline gboolean
|
|
Packit |
1e8aac |
glade_xml_node_is_comment_or_text (GladeXmlNode *node_in)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
return (node) ? node->type == XML_COMMENT_NODE || node->type == XML_TEXT_NODE : FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeXmlNode *
|
|
Packit |
1e8aac |
glade_xml_node_get_children (GladeXmlNode * node_in)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
xmlNodePtr children;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
children = node->children;
|
|
Packit |
1e8aac |
while (glade_xml_node_is_comment_or_text ((GladeXmlNode *) children))
|
|
Packit |
1e8aac |
children = children->next;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return (GladeXmlNode *) children;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeXmlNode *
|
|
Packit |
1e8aac |
glade_xml_node_get_parent (GladeXmlNode *node_in)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return (GladeXmlNode *) node->parent;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeXmlNode *
|
|
Packit |
1e8aac |
glade_xml_node_get_children_with_comments (GladeXmlNode *node_in)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return (GladeXmlNode *) node->children;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeXmlNode *
|
|
Packit |
1e8aac |
glade_xml_node_next (GladeXmlNode *node_in)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
node = node->next;
|
|
Packit |
1e8aac |
while (glade_xml_node_is_comment_or_text ((GladeXmlNode *) node))
|
|
Packit |
1e8aac |
node = node->next;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return (GladeXmlNode *) node;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeXmlNode *
|
|
Packit |
1e8aac |
glade_xml_node_next_with_comments (GladeXmlNode *node_in)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return (GladeXmlNode *) node->next;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeXmlNode *
|
|
Packit |
1e8aac |
glade_xml_node_prev_with_comments (GladeXmlNode *node_in)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return (GladeXmlNode *) node->prev;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
const gchar *
|
|
Packit |
1e8aac |
glade_xml_node_get_name (GladeXmlNode *node_in)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return CAST_BAD (node->name);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeXmlDoc *
|
|
Packit |
1e8aac |
glade_xml_doc_new (void)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlDocPtr xml_doc = xmlNewDoc (BAD_CAST ("1.0"));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return (GladeXmlDoc *) xml_doc;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_xml_doc_set_root (GladeXmlDoc *doc_in, GladeXmlNode *node_in)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node = (xmlNodePtr) node_in;
|
|
Packit |
1e8aac |
xmlDocPtr doc = (xmlDocPtr) doc_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
xmlDocSetRootElement (doc, node);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gint
|
|
Packit |
1e8aac |
glade_xml_doc_save (GladeXmlDoc *doc_in, const gchar *full_path)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlDocPtr doc = (xmlDocPtr) doc_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
xmlKeepBlanksDefault (0);
|
|
Packit |
1e8aac |
return xmlSaveFormatFileEnc (full_path, doc, "UTF-8", 1);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_xml_doc_free (GladeXmlDoc *doc_in)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlDocPtr doc = (xmlDocPtr) doc_in;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
xmlFreeDoc (doc);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_xml_doc_get_root:
|
|
Packit |
1e8aac |
* @doc: a #GladeXmlDoc
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: the #GladeXmlNode that is the document root of @doc
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
GladeXmlNode *
|
|
Packit |
1e8aac |
glade_xml_doc_get_root (GladeXmlDoc *doc)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlNodePtr node;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
node = xmlDocGetRootElement ((xmlDocPtr) (doc));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return (GladeXmlNode *) node;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_xml_load_sym_from_node (GladeXmlNode *node_in,
|
|
Packit |
1e8aac |
GModule *module,
|
|
Packit |
1e8aac |
gchar *tagname,
|
|
Packit |
1e8aac |
gpointer *sym_location)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
static GModule *self = NULL;
|
|
Packit |
1e8aac |
gboolean retval = FALSE;
|
|
Packit |
1e8aac |
gchar *buff;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!self)
|
|
Packit |
1e8aac |
self = g_module_open (NULL, 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((buff = glade_xml_get_value_string (node_in, tagname)) != NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (!module)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_warning ("Catalog specified symbol '%s' for tag '%s', "
|
|
Packit |
1e8aac |
"no module available to load it from !", buff, tagname);
|
|
Packit |
1e8aac |
g_free (buff);
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* I use here a g_warning to signal these errors instead of a dialog
|
|
Packit |
1e8aac |
* box, as if there is one of this kind of errors, there will probably
|
|
Packit |
1e8aac |
* a lot of them, and we don't want to inflict the user the pain of
|
|
Packit |
1e8aac |
* plenty of dialog boxes. Ideally, we should collect these errors,
|
|
Packit |
1e8aac |
* and show all of them at the end of the load process.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* I dont know who wrote the above in glade-property-class.c, but
|
|
Packit |
1e8aac |
* its a good point... makeing a bugzilla entry.
|
|
Packit |
1e8aac |
* -Tristan
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* XXX http://bugzilla.gnome.org/show_bug.cgi?id=331797
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if (g_module_symbol (module, buff, sym_location) ||
|
|
Packit |
1e8aac |
g_module_symbol (self, buff, sym_location))
|
|
Packit |
1e8aac |
retval = TRUE;
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
g_warning ("Could not find %s in %s or in global namespace\n",
|
|
Packit |
1e8aac |
buff, g_module_name (module));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (buff);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
return retval;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeXmlNode *
|
|
Packit |
1e8aac |
glade_xml_doc_new_comment (GladeXmlDoc *doc, const gchar *comment)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return (GladeXmlNode *) xmlNewDocComment ((xmlDocPtr) (doc), BAD_CAST (comment));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeXmlNode *
|
|
Packit |
1e8aac |
glade_xml_node_add_prev_sibling (GladeXmlNode *node, GladeXmlNode *new_node)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return (GladeXmlNode *) xmlAddPrevSibling ((xmlNodePtr) node, (xmlNodePtr) new_node);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeXmlNode *
|
|
Packit |
1e8aac |
glade_xml_node_add_next_sibling (GladeXmlNode *node, GladeXmlNode *new_node)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return (GladeXmlNode *) xmlAddNextSibling ((xmlNodePtr) node, (xmlNodePtr) new_node);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Private API */
|
|
Packit |
1e8aac |
#include "glade-private.h"
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
_glade_xml_error_reset_last (void)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlResetLastError ();
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gchar *
|
|
Packit |
1e8aac |
_glade_xml_error_get_last_message ()
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
xmlErrorPtr error = xmlGetLastError ();
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (error)
|
|
Packit |
1e8aac |
return g_strdup_printf ("Error parsing file '%s' on line %d \n%s",
|
|
Packit |
1e8aac |
error->file, error->line, error->message);
|
|
Packit |
1e8aac |
return NULL;
|
|
Packit |
1e8aac |
}
|