Blame gladeui/glade-xml-utils.c

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
}