diff options
Diffstat (limited to 'gladeui/glade-xml-utils.c')
-rw-r--r-- | gladeui/glade-xml-utils.c | 826 |
1 files changed, 0 insertions, 826 deletions
diff --git a/gladeui/glade-xml-utils.c b/gladeui/glade-xml-utils.c deleted file mode 100644 index cc2f841f..00000000 --- a/gladeui/glade-xml-utils.c +++ /dev/null @@ -1,826 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* This functions are based on gnome-print/libgpa/gpa-xml.c which were in turn - * based on gnumeric/xml-io.c - */ -/* Authors: - * Daniel Veillard <Daniel.Veillard@w3.org> - * Miguel de Icaza <miguel@gnu.org> - * Chema Celorio <chema@gnome.org> - */ - -#include "config.h" - -#include <string.h> -#include <glib.h> -#include <errno.h> - -#include "glade-xml-utils.h" - -#include <libxml/tree.h> -#include <libxml/parser.h> -#include <libxml/parserInternals.h> -#include <libxml/xmlmemory.h> - -struct _GladeXmlNode -{ - xmlNodePtr node; -}; - -struct _GladeXmlDoc -{ - xmlDoc doc; -}; - -struct _GladeXmlContext { - GladeXmlDoc *doc; - gboolean freedoc; - xmlNsPtr ns; -}; - - -/* This is used inside for loops so that we skip xml comments - * <!-- i am a comment -> - * also to skip whitespace between nodes - */ -#define skip_text(node) if ((xmlStrcmp ( ((xmlNodePtr)node)->name, BAD_CAST("text")) == 0) ||\ - (xmlStrcmp ( ((xmlNodePtr)node)->name, BAD_CAST("comment")) == 0)) { \ - node = (GladeXmlNode *)((xmlNodePtr)node)->next; continue ; }; -#define skip_text_libxml(node) if ((xmlStrcmp ( ((xmlNodePtr)node)->name, BAD_CAST("text")) == 0) ||\ - (xmlStrcmp ( ((xmlNodePtr)node)->name, BAD_CAST("comment")) == 0)) { \ - node = ((xmlNodePtr)node)->next; continue ; }; - - -static gchar * -claim_string (xmlChar *string) -{ - gchar *ret; - ret = g_strdup (CAST_BAD(string)); - xmlFree (string); - return ret; -} - -/** - * glade_xml_set_value: - * @node_in: a #GladeXmlNode - * @name: a string - * @val: a string - * - * Sets the property @name in @node_in to @val - */ -void -glade_xml_set_value (GladeXmlNode *node_in, const gchar *name, const gchar *val) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - xmlChar *ret; - - ret = xmlGetProp (node, BAD_CAST(name)); - if (ret) - { - xmlFree (ret); - xmlSetProp (node, BAD_CAST(name), BAD_CAST(val)); - return; - } -} - -/** - * glade_xml_get_content: - * @node_in: a #GladeXmlNode - * - * Returns a string containing the content of @node_in. - * Note: It is the caller's responsibility to free the memory used by this - * string. - */ -gchar * -glade_xml_get_content (GladeXmlNode *node_in) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - xmlChar *val = xmlNodeGetContent(node); - - return claim_string (val); -} - -/** - * glade_xml_set_content: - * @node_in: a #GladeXmlNode - * @content: a string - * - * Sets the content of @node to @content. - */ -void -glade_xml_set_content (GladeXmlNode *node_in, const gchar *content) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - - xmlNodeSetContent(node, BAD_CAST(content)); -} - -/* - * Get a value for a node either carried as an attibute or as - * the content of a child. - * - * Returns a g_malloc'ed string. Caller must free. - * (taken from gnumeric ) - * - */ -static gchar * -glade_xml_get_value (xmlNodePtr node, const gchar *name) -{ - xmlNodePtr child; - gchar *ret = NULL; - - for (child = node->children; child; child = child->next) - if (!xmlStrcmp (child->name, BAD_CAST(name))) - ret = claim_string (xmlNodeGetContent(child)); - - return ret; -} - -/** - * glade_xml_node_verify_silent: - * @node_in: a #GladeXmlNode - * @name: a string - * - * Returns: %TRUE if @node_in's name is equal to @name, %FALSE otherwise - */ -gboolean -glade_xml_node_verify_silent (GladeXmlNode *node_in, const gchar *name) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - - g_return_val_if_fail (node != NULL, FALSE); - - if (xmlStrcmp (node->name, BAD_CAST(name)) != 0) - return FALSE; - return TRUE; -} - -/** - * glade_xml_node_verify: - * @node_in: a #GladeXmlNode - * @name: a string - * - * This is a wrapper around glade_xml_node_verify_silent(), only it emits - * a g_warning() if @node_in has a name different than @name. - * - * Returns: %TRUE if @node_in's name is equal to @name, %FALSE otherwise - */ -gboolean -glade_xml_node_verify (GladeXmlNode *node_in, const gchar *name) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - - if (!glade_xml_node_verify_silent (node_in, name)) - { - g_warning ("Expected node was \"%s\", encountered \"%s\"", - name, node->name); - return FALSE; - } - - return TRUE; -} - -/** - * glade_xml_get_value_int: - * @node_in: a #GladeXmlNode - * @name: a string - * @val: a pointer to an #int - * - * Gets an integer value for a node either carried as an attribute or as - * the content of a child. - * - * Returns: %TRUE if the node is found, %FALSE otherwise - */ -gboolean -glade_xml_get_value_int (GladeXmlNode *node_in, const gchar *name, gint *val) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - gchar *value, *endptr = NULL; - gint64 i; - - value = glade_xml_get_value (node, name); - if (value == NULL) - return FALSE; - - errno = 0; - i = g_ascii_strtoll (value, &endptr, 10); - if (errno != 0 || (i == 0 && endptr == value)) { - g_free (value); - return FALSE; - } - - g_free (value); - *val = (gint) i; - return TRUE; -} - -/** - * glade_xml_get_value_int_required: - * @node: a #GladeXmlNode - * @name: a string - * @val: a pointer to an #int - * - * This is a wrapper around glade_xml_get_value_int(), only it emits - * a g_warning() if @node_in did not contain the requested tag - * - * Returns: - **/ -gboolean -glade_xml_get_value_int_required (GladeXmlNode *node, const gchar *name, gint *val) -{ - gboolean ret; - - ret = glade_xml_get_value_int (node, name, val); - - if (ret == FALSE) - g_warning ("The file did not contained the required value \"%s\"\n" - "Under the \"%s\" tag.", name, glade_xml_node_get_name (node)); - - return ret; -} - -/* - * Get a String value for a node either carried as an attibute or as - * the content of a child. - */ -gchar * -glade_xml_get_value_string (GladeXmlNode *node_in, const gchar *name) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - return glade_xml_get_value (node, name); -} - -static gchar * -glade_xml_get_property (xmlNodePtr node, const gchar *name) -{ - xmlChar *val; - - val = xmlGetProp (node, BAD_CAST(name)); - - if (val) - return claim_string (val); - - return NULL; -} - -static void -glade_xml_set_property (xmlNodePtr node, const gchar *name, const gchar *value) -{ - if (value) - xmlSetProp (node, BAD_CAST(name), BAD_CAST(value)); -} - -#define GLADE_TAG_TRUE "True" -#define GLADE_TAG_FALSE "False" -#define GLADE_TAG_TRUE2 "TRUE" -#define GLADE_TAG_FALSE2 "FALSE" -#define GLADE_TAG_TRUE3 "yes" -#define GLADE_TAG_FALSE3 "no" -/* - * Get a String value for a node either carried as an attibute or as - * the content of a child. - */ -gboolean -glade_xml_get_boolean (GladeXmlNode *node_in, const gchar *name, gboolean _default) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - gchar * value; - gboolean ret = FALSE; - - value = glade_xml_get_value (node, name); - if (value == NULL) - return _default; - - if (strcmp (value, GLADE_TAG_FALSE) == 0) - ret = FALSE; - else if (strcmp (value, GLADE_TAG_FALSE2) == 0) - ret = FALSE; - else if (strcmp (value, GLADE_TAG_FALSE3) == 0) - ret = FALSE; - else if (strcmp (value, GLADE_TAG_TRUE) == 0) - ret = TRUE; - else if (strcmp (value, GLADE_TAG_TRUE2) == 0) - ret = TRUE; - else if (strcmp (value, GLADE_TAG_TRUE3) == 0) - ret = TRUE; - else - g_warning ("Boolean tag unrecognized *%s*\n", value); - - g_free (value); - - return ret; -} - -/* - * Get a String value for a node either carried as an attibute or as - * the content of a child. - */ -gboolean -glade_xml_get_property_boolean (GladeXmlNode *node_in, - const gchar *name, - gboolean _default) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - gchar * value; - gboolean ret = FALSE; - - value = glade_xml_get_property (node, name); - if (value == NULL) - return _default; - - if (strcmp (value, GLADE_TAG_FALSE) == 0) - ret = FALSE; - else if (strcmp (value, GLADE_TAG_FALSE2) == 0) - ret = FALSE; - else if (strcmp (value, GLADE_TAG_FALSE3) == 0) - ret = FALSE; - else if (strcmp (value, GLADE_TAG_TRUE) == 0) - ret = TRUE; - else if (strcmp (value, GLADE_TAG_TRUE2) == 0) - ret = TRUE; - else if (strcmp (value, GLADE_TAG_TRUE3) == 0) - ret = TRUE; - else - g_warning ("Boolean tag unrecognized *%s*\n", value); - - g_free (value); - - return ret; -} - -gdouble -glade_xml_get_property_double (GladeXmlNode *node_in, - const gchar *name, - gdouble _default) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - gdouble retval; - gchar *value; - - if ((value = glade_xml_get_property (node, name)) == NULL) - return _default; - - errno = 0; - - retval = g_ascii_strtod (value, NULL); - - if (errno) - { - g_free (value); - return _default; - } - else - { - g_free (value); - return retval; - } -} - -gint -glade_xml_get_property_int (GladeXmlNode *node_in, - const gchar *name, - gint _default) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - gint retval; - gchar *value; - - if ((value = glade_xml_get_property (node, name)) == NULL) - return _default; - - retval = g_ascii_strtoll (value, NULL, 10); - - g_free (value); - - return retval; -} - -void -glade_xml_node_set_property_boolean (GladeXmlNode *node_in, - const gchar *name, - gboolean value) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - - if (value) - glade_xml_set_property (node, name, GLADE_TAG_TRUE); - else - glade_xml_set_property (node, name, GLADE_TAG_FALSE); -} - -#undef GLADE_TAG_TRUE -#undef GLADE_TAG_FALSE -#undef GLADE_TAG_TRUE2 -#undef GLADE_TAG_FALSE2 -#undef GLADE_TAG_TRUE3 -#undef GLADE_TAG_FALSE3 - -gchar * -glade_xml_get_value_string_required (GladeXmlNode *node_in, - const gchar *name, - const gchar *xtra) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - gchar *value = glade_xml_get_value (node, name); - - if (value == NULL) - { - if (xtra == NULL) - g_warning ("The file did not contained the required value \"%s\"\n" - "Under the \"%s\" tag.", name, node->name); - else - g_warning ("The file did not contained the required value \"%s\"\n" - "Under the \"%s\" tag (%s).", name, node->name, xtra); - } - - return value; -} - -gchar * -glade_xml_get_property_string (GladeXmlNode *node_in, const gchar *name) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - - return glade_xml_get_property (node, name); -} - -void -glade_xml_node_set_property_string (GladeXmlNode *node_in, - const gchar *name, - const gchar *string) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - - glade_xml_set_property (node, name, string); -} - -gchar * -glade_xml_get_property_string_required (GladeXmlNode *node_in, - const gchar *name, - const gchar *xtra) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - gchar *value = glade_xml_get_property_string (node_in, name); - - if (value == NULL) - { - if (xtra == NULL) - g_warning ("The file did not contained the required property \"%s\"\n" - "Under the \"%s\" tag.", name, node->name); - else - g_warning ("The file did not contained the required property \"%s\"\n" - "Under the \"%s\" tag (%s).", name, node->name, xtra); - } - return value; -} - -/* - * Search a child by name, - */ -GladeXmlNode * -glade_xml_search_child (GladeXmlNode *node_in, const gchar *name) -{ - xmlNodePtr node; - xmlNodePtr child; - - g_return_val_if_fail (node_in != NULL, NULL); - g_return_val_if_fail (name != NULL, NULL); - - node = (xmlNodePtr) node_in; - - for (child = node->children; child; child = child->next) - { - if (!xmlStrcmp (child->name, BAD_CAST(name))) - return (GladeXmlNode *)child; - } - - return NULL; -} - -/** - * glade_xml_search_child_required: - * @tree: - * @name: - * - * just a small wrapper arround glade_xml_search_child that displays - * an error if the child was not found - * - * Return Value: - **/ -GladeXmlNode * -glade_xml_search_child_required (GladeXmlNode *node, const gchar* name) -{ - GladeXmlNode *child; - - child = glade_xml_search_child (node, name); - - if (child == NULL) - g_warning ("The file did not contained the required tag \"%s\"\n" - "Under the \"%s\" node.", name, glade_xml_node_get_name (node)); - - return child; -} - -/* --------------------------- Parse Context ----------------------------*/ - -static GladeXmlContext * -glade_xml_context_new_real (GladeXmlDoc *doc, gboolean freedoc, xmlNsPtr ns) -{ - GladeXmlContext *context = g_new0 (GladeXmlContext, 1); - - context->doc = doc; - context->freedoc = freedoc; - context->ns = ns; - - return context; -} - -GladeXmlContext * -glade_xml_context_new (GladeXmlDoc *doc, const gchar *name_space) -{ - /* We are not using the namespace now */ - return glade_xml_context_new_real (doc, FALSE, NULL); -} - -void -glade_xml_context_destroy (GladeXmlContext *context) -{ - g_return_if_fail (context != NULL); - if (context->freedoc) - xmlFreeDoc ((xmlDoc*)context->doc); - g_free (context); -} - -GladeXmlContext * -glade_xml_context_new_from_path (const gchar *full_path, - const gchar *nspace, - const gchar *root_name) -{ - GladeXmlContext *context; - xmlDocPtr doc; - xmlNsPtr name_space; - xmlNodePtr root; - - g_return_val_if_fail (full_path != NULL, NULL); - - doc = xmlParseFile (full_path); - - /* That's not an error condition. The file is not readable, and we can't know it - * before we try to read it (testing for readability is a call to race conditions). - * So we should not print a warning */ - if (doc == NULL) - return NULL; - - if (doc->children == NULL) { - g_warning ("Invalid xml File, tree empty [%s]&", full_path); - xmlFreeDoc (doc); - return NULL; - } - - name_space = xmlSearchNsByHref (doc, doc->children, BAD_CAST(nspace)); - if (name_space == NULL && nspace != NULL) - { - g_warning ("The file did not contained the expected name space\n" - "Expected \"%s\" [%s]", - nspace, full_path); - xmlFreeDoc (doc); - return NULL; - } - - root = xmlDocGetRootElement(doc); - if ((root->name == NULL) || (xmlStrcmp (root->name, BAD_CAST(root_name)) !=0 )) - { - g_warning ("The file did not contained the expected root name\n" - "Expected \"%s\", actual : \"%s\" [%s]", - root_name, root->name, full_path); - xmlFreeDoc (doc); - return NULL; - } - - context = glade_xml_context_new_real ((GladeXmlDoc *)doc, TRUE, name_space); - - return context; -} - -/** - * glade_xml_context_free: - * @context: - * - * Similar to glade_xml_context_destroy but it also frees the document set in the context - **/ -void -glade_xml_context_free (GladeXmlContext *context) -{ - g_return_if_fail (context != NULL); - if (context->doc) - xmlFreeDoc ((xmlDocPtr) context->doc); - context->doc = NULL; - - g_free (context); -} - -void -glade_xml_node_append_child (GladeXmlNode *node_in, GladeXmlNode *child_in) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - xmlNodePtr child = (xmlNodePtr) child_in; - - g_return_if_fail (node != NULL); - g_return_if_fail (child != NULL); - - xmlAddChild (node, child); -} - -GladeXmlNode * -glade_xml_node_new (GladeXmlContext *context, const gchar *name) -{ - g_return_val_if_fail (context != NULL, NULL); - g_return_val_if_fail (name != NULL, NULL); - - return (GladeXmlNode *) xmlNewDocNode ((xmlDocPtr) context->doc, context->ns, BAD_CAST(name), NULL); -} - -void -glade_xml_node_delete (GladeXmlNode *node) -{ - xmlFreeNode ((xmlNodePtr) node); -} - -GladeXmlDoc * -glade_xml_context_get_doc (GladeXmlContext *context) -{ - return context->doc; -} - -static gboolean -glade_libxml_node_is_comment (xmlNodePtr node) { - if (node == NULL) - return FALSE; - if ((xmlStrcmp ( node->name, BAD_CAST("text")) == 0) || - (xmlStrcmp ( node->name, BAD_CAST("comment")) == 0)) - return TRUE; - return FALSE; -} - -GladeXmlNode * -glade_xml_node_get_children (GladeXmlNode *node_in) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - xmlNodePtr children; - - children = node->children; - while (glade_libxml_node_is_comment (children)) - children = children->next; - - return (GladeXmlNode *)children; -} - -GladeXmlNode * -glade_xml_node_next (GladeXmlNode *node_in) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - - node = node->next; - while (glade_libxml_node_is_comment (node)) - node = node->next; - - return (GladeXmlNode *)node; -} - -const gchar * -glade_xml_node_get_name (GladeXmlNode *node_in) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - - return CAST_BAD(node->name); -} - -GladeXmlDoc * -glade_xml_doc_new (void) -{ - xmlDocPtr xml_doc = xmlNewDoc (BAD_CAST("1.0")); - - return (GladeXmlDoc *)xml_doc; -} - -void -glade_xml_doc_set_root (GladeXmlDoc *doc_in, GladeXmlNode *node_in) -{ - xmlNodePtr node = (xmlNodePtr) node_in; - xmlDocPtr doc = (xmlDocPtr) doc_in; - - xmlDocSetRootElement (doc, node); -} - -gint -glade_xml_doc_save (GladeXmlDoc *doc_in, const gchar *full_path) -{ - xmlDocPtr doc = (xmlDocPtr) doc_in; - - xmlKeepBlanksDefault (0); - return xmlSaveFormatFile (full_path, doc, 1); -} - -void -glade_xml_doc_free (GladeXmlDoc *doc_in) -{ - xmlDocPtr doc = (xmlDocPtr) doc_in; - - xmlFreeDoc (doc); -} - -/** - * glade_xml_doc_get_root: - * @doc: a #GladeXmlDoc - * - * Returns: the #GladeXmlNode that is the document root of @doc - */ -GladeXmlNode * -glade_xml_doc_get_root (GladeXmlDoc *doc) -{ - xmlNodePtr node; - - node = xmlDocGetRootElement((xmlDocPtr)(doc)); - - return (GladeXmlNode *)node; -} - -gchar * -glade_xml_alloc_string(GladeInterface *interface, const gchar *string) -{ - gchar *s; - - s = g_hash_table_lookup(interface->strings, string); - if (!s) { - s = g_strdup(string); - g_hash_table_insert(interface->strings, s, s); - } - - return s; -} - -gchar * -glade_xml_alloc_propname(GladeInterface *interface, const gchar *string) -{ - static GString *norm_str; - guint i; - - if (!norm_str) - norm_str = g_string_new_len(NULL, 64); - - /* assign the string to norm_str */ - g_string_assign(norm_str, string); - /* convert all dashes to underscores */ - for (i = 0; i < norm_str->len; i++) - if (norm_str->str[i] == '-') - norm_str->str[i] = '_'; - - return glade_xml_alloc_string(interface, norm_str->str); -} - -gboolean -glade_xml_load_sym_from_node (GladeXmlNode *node_in, - GModule *module, - gchar *tagname, - gpointer *sym_location) -{ - static GModule *self = NULL; - gboolean retval = FALSE; - gchar *buff; - - if (!self) - self = g_module_open (NULL, 0); - - if ((buff = glade_xml_get_value_string (node_in, tagname)) != NULL) - { - if (!module) - { - g_warning ("Catalog specified symbol '%s' for tag '%s', " - "no module available to load it from !", - buff, tagname); - g_free (buff); - return FALSE; - } - - /* I use here a g_warning to signal these errors instead of a dialog - * box, as if there is one of this kind of errors, there will probably - * a lot of them, and we don't want to inflict the user the pain of - * plenty of dialog boxes. Ideally, we should collect these errors, - * and show all of them at the end of the load process. - * - * I dont know who wrote the above in glade-property-class.c, but - * its a good point... makeing a bugzilla entry. - * -Tristan - * - * XXX http://bugzilla.gnome.org/show_bug.cgi?id=331797 - */ - if (g_module_symbol (module, buff, sym_location) || - g_module_symbol (self, buff, sym_location)) - retval = TRUE; - else - g_warning ("Could not find %s in %s or in global namespace\n", - buff, g_module_name (module)); - - g_free (buff); - } - return retval; -} |