These helper functions will be useful later on. These functions are not made available to the library user since we don't want to expose too much our libxml internals. --- examples/Makefile.am | 1 + libvirt-gconfig/Makefile.am | 5 + libvirt-gconfig/libvirt-gconfig-helpers-private.h | 45 +++++ libvirt-gconfig/libvirt-gconfig-helpers.c | 180 +++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-helpers.h | 38 +++++ libvirt-gconfig/libvirt-gconfig-object.c | 53 +------ libvirt-gconfig/libvirt-gconfig.h | 2 + libvirt-gconfig/libvirt-gconfig.sym | 1 + libvirt-gobject/Makefile.am | 2 + 9 files changed, 275 insertions(+), 52 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-helpers-private.h create mode 100644 libvirt-gconfig/libvirt-gconfig-helpers.c create mode 100644 libvirt-gconfig/libvirt-gconfig-helpers.h diff --git a/examples/Makefile.am b/examples/Makefile.am index 0964597..d88c0e1 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -19,6 +19,7 @@ conn_test_CFLAGS = \ $(WARN_CFLAGS) \ $(GLIB2_CFLAGS) \ $(LIBVIRT_CFLAGS) \ + $(LIBXML2_CFLAGS) \ -I$(top_srcdir) conn_test_SOURCES = \ conn-test.c diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index 180d5ee..ae06935 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -9,6 +9,7 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-capabilities.h \ libvirt-gconfig-domain.h \ libvirt-gconfig-domain-snapshot.h \ + libvirt-gconfig-helpers.h \ libvirt-gconfig-interface.h \ libvirt-gconfig-network.h \ libvirt-gconfig-network-filter.h \ @@ -16,11 +17,14 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-secret.h \ libvirt-gconfig-storage-pool.h \ libvirt-gconfig-storage-vol.h +noinst_HEADERS = \ + libvirt-gconfig-helpers-private.h GCONFIG_SOURCE_FILES = \ libvirt-gconfig-object.c \ libvirt-gconfig-capabilities.c \ libvirt-gconfig-domain.c \ libvirt-gconfig-domain-snapshot.c \ + libvirt-gconfig-helpers.c \ libvirt-gconfig-interface.c \ libvirt-gconfig-network.c \ libvirt-gconfig-network-filter.c \ @@ -70,6 +74,7 @@ LibvirtGConfig-1.0.gir: libvirt-gconfig-1.0.la $(G_IR_SCANNER) Makefile.am --output $@ \ -I$(top_srcdir) \ -I$(top_builddir) \ + $(LIBXML2_CFLAGS) \ --verbose \ --pkg=gobject-2.0 \ --c-include="libvirt-gconfig/libvirt-gconfig.h" \ diff --git a/libvirt-gconfig/libvirt-gconfig-helpers-private.h b/libvirt-gconfig/libvirt-gconfig-helpers-private.h new file mode 100644 index 0000000..c7a5d6a --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-helpers-private.h @@ -0,0 +1,45 @@ +/* + * libvirt-gconfig-helpers.h: various GVirConfig helpers + * + * Copyright (C) 2010, 2011 Red Hat + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Authors: Daniel P. Berrange <berrange@xxxxxxxxxx> + * Christophe Fergeau <cfergeau@xxxxxxxxx> + */ + +#if !defined(__LIBVIRT_GCONFIG_H__) && !defined(LIBVIRT_GCONFIG_BUILD) +#error "Only <libvirt-gconfig/libvirt-gconfig.h> can be included directly." +#endif + +#ifndef __LIBVIRT_GCONFIG_HELPERS_PRIVATE_H__ +#define __LIBVIRT_GCONFIG_HELPERS_PRIVATE_H__ + +G_BEGIN_DECLS + +GError *gvir_xml_error_new(GQuark domain, gint code, + const gchar *format, ...); +xmlNodePtr gvir_config_xml_parse(const char *xml, + const char *root_node, + GError **err); +xmlNode * gvir_config_xml_get_element (xmlNode *node, ...); +xmlChar * gvir_config_xml_get_child_element_content (xmlNode *node, + const char *child_name); +char *gvir_config_xml_get_child_element_content_glib (xmlNode *node, + const char *child_name); +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_HELPERS_PRIVATE_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig-helpers.c b/libvirt-gconfig/libvirt-gconfig-helpers.c new file mode 100644 index 0000000..2e28429 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-helpers.c @@ -0,0 +1,180 @@ +/* + * libvirt-gconfig-helpers.c: various GVirConfig helpers + * + * Copyright (C) 2010, 2011 Red Hat + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Authors: Daniel P. Berrange <berrange@xxxxxxxxxx> + * Christophe Fergeau <cfergeau@xxxxxxxxx> + */ + +#include <config.h> + +#include <string.h> + +#include <libxml/xmlerror.h> + +#include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" + +GQuark +gvir_config_object_error_quark(void) +{ + return g_quark_from_static_string("gvir-config-object"); +} + +static GError *gvir_xml_error_new_literal(GQuark domain, + gint code, + const gchar *message) +{ + xmlErrorPtr xerr = xmlGetLastError(); + + if (!xerr) + return NULL; + + if (message) + return g_error_new(domain, + code, + "%s: %s", + message, + xerr->message); + else + return g_error_new(domain, + code, + "%s", + xerr->message); +} + + +GError *gvir_xml_error_new(GQuark domain, + gint code, + const gchar *format, + ...) +{ + GError *err; + va_list args; + gchar *message; + + va_start(args, format); + message = g_strdup_vprintf(format, args); + va_end(args); + + err = gvir_xml_error_new_literal(domain, code, message); + + g_free(message); + + return err; +} + +xmlNodePtr +gvir_config_xml_parse(const char *xml, const char *root_node, GError **err) +{ + xmlDocPtr doc; + + if (!xml) { + *err = g_error_new(GVIR_CONFIG_OBJECT_ERROR, + 0, + "%s", + "No XML document to parse"); + return NULL; + } + + doc = xmlParseMemory(xml, strlen(xml)); + if (!doc) { + *err = gvir_xml_error_new(GVIR_CONFIG_OBJECT_ERROR, + 0, + "%s", + "Unable to parse configuration"); + return NULL; + } + if ((!doc->children) || (strcmp((char *)doc->children->name, root_node) != 0)) { + *err = g_error_new(GVIR_CONFIG_OBJECT_ERROR, + 0, + "XML data has no '%s' node", + root_node); + xmlFreeDoc(doc); + return NULL; + } + + return doc->children; +} + + +/* + * gvir_config_xml_get_element, gvir_config_xml_get_child_element_content + * and gvir_config_xml_get_child_element_content_glib are: + * + * Copyright (C) 2006, 2007 OpenedHand Ltd. + * + * Author: Jorn Baayen <jorn@xxxxxxxxxxxxxx> + */ +xmlNode * +gvir_config_xml_get_element (xmlNode *node, ...) +{ + va_list var_args; + + va_start (var_args, node); + + while (TRUE) { + const char *arg; + + arg = va_arg (var_args, const char *); + if (!arg) + break; + + for (node = node->children; node; node = node->next) + if (!g_strcmp0 (arg, (char *) node->name)) + break; + + if (!node) + break; + } + + va_end (var_args); + + return node; +} + +xmlChar * +gvir_config_xml_get_child_element_content (xmlNode *node, + const char *child_name) +{ + xmlNode *child_node; + + child_node = gvir_config_xml_get_element (node, child_name, NULL); + if (!child_node) + return NULL; + + return xmlNodeGetContent (child_node); +} + +char * +gvir_config_xml_get_child_element_content_glib (xmlNode *node, + const char *child_name) +{ + xmlChar *content; + char *copy; + + content = gvir_config_xml_get_child_element_content (node, child_name); + if (!content) + return NULL; + + copy = g_strdup ((char *) content); + + xmlFree (content); + + return copy; +} diff --git a/libvirt-gconfig/libvirt-gconfig-helpers.h b/libvirt-gconfig/libvirt-gconfig-helpers.h new file mode 100644 index 0000000..d8026d3 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-helpers.h @@ -0,0 +1,38 @@ +/* + * libvirt-gconfig-helpers.h: various GVirConfig helpers + * + * Copyright (C) 2010, 2011 Red Hat + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Authors: Daniel P. Berrange <berrange@xxxxxxxxxx> + * Christophe Fergeau <cfergeau@xxxxxxxxx> + */ + +#if !defined(__LIBVIRT_GCONFIG_H__) && !defined(LIBVIRT_GCONFIG_BUILD) +#error "Only <libvirt-gconfig/libvirt-gconfig.h> can be included directly." +#endif + +#ifndef __LIBVIRT_GCONFIG_HELPERS_H__ +#define __LIBVIRT_GCONFIG_HELPERS_H__ + +G_BEGIN_DECLS + +GQuark gvir_config_object_error_quark(void); +#define GVIR_CONFIG_OBJECT_ERROR gvir_config_object_error_quark() + +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_HELPERS_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 95b147f..e050322 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -29,6 +29,7 @@ #include <libxml/xmlerror.h> #include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" //extern gboolean debugFlag; gboolean debugFlag; @@ -55,58 +56,6 @@ enum { }; -#define GVIR_CONFIG_OBJECT_ERROR gvir_config_object_error_quark() - - -static GQuark -gvir_config_object_error_quark(void) -{ - return g_quark_from_static_string("gvir-config-object"); -} - -static GError *gvir_xml_error_new_literal(GQuark domain, - gint code, - const gchar *message) -{ - xmlErrorPtr xerr = xmlGetLastError(); - - if (!xerr) - return NULL; - - if (message) - return g_error_new(domain, - code, - "%s: %s", - message, - xerr->message); - else - return g_error_new(domain, - code, - "%s", - xerr->message); -} - - -static GError *gvir_xml_error_new(GQuark domain, - gint code, - const gchar *format, - ...) -{ - GError *err; - va_list args; - gchar *message; - - va_start(args, format); - message = g_strdup_vprintf(format, args); - va_end(args); - - err = gvir_xml_error_new_literal(domain, code, message); - - g_free(message); - - return err; -} - static void gvir_xml_generic_error_nop(void *userData G_GNUC_UNUSED, const char *msg G_GNUC_UNUSED, ...) diff --git a/libvirt-gconfig/libvirt-gconfig.h b/libvirt-gconfig/libvirt-gconfig.h index c561804..fdc78a4 100644 --- a/libvirt-gconfig/libvirt-gconfig.h +++ b/libvirt-gconfig/libvirt-gconfig.h @@ -24,7 +24,9 @@ #define __LIBVIRT_GCONFIG_H__ #include <glib-object.h> +#include <libxml/tree.h> +#include <libvirt-gconfig/libvirt-gconfig-helpers.h> #include <libvirt-gconfig/libvirt-gconfig-object.h> #include <libvirt-gconfig/libvirt-gconfig-capabilities.h> #include <libvirt-gconfig/libvirt-gconfig-domain.h> diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 2d09c37..24407c3 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -22,6 +22,7 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_node_device_new; gvir_config_object_get_type; + gvir_config_object_error_quark; gvir_config_object_new; gvir_config_object_get_doc; gvir_config_object_get_schema; diff --git a/libvirt-gobject/Makefile.am b/libvirt-gobject/Makefile.am index 7013675..b482aa5 100644 --- a/libvirt-gobject/Makefile.am +++ b/libvirt-gobject/Makefile.am @@ -51,6 +51,7 @@ libvirt_gobject_1_0_la_CFLAGS = \ $(LIBVIRT_CFLAGS) \ $(GOBJECT2_CFLAGS) \ $(GIO2_CFLAGS) \ + $(LIBXML2_CFLAGS) \ $(WARN_CFLAGS) libvirt_gobject_1_0_la_LIBADD = \ $(LIBVIRT_LIBS) \ @@ -116,6 +117,7 @@ LibvirtGObject-1.0.gir: libvirt-gobject-1.0.la $(G_IR_SCANNER) Makefile.am --output $@ \ -I$(top_srcdir) \ -I$(top_builddir) \ + $(LIBXML2_CFLAGS) \ --verbose \ --pkg=gobject-2.0 \ --pkg=gthread-2.0 \ -- 1.7.7 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list