[libvirt] [libvirt-glib 01/23] Add helpers in libvirt-gconfig-helpers.[ch]

Christophe Fergeau cfergeau at redhat.com
Tue Nov 8 10:23:18 UTC 2011


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 at redhat.com>
+ *          Christophe Fergeau <cfergeau at gmail.com>
+ */
+
+#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 at redhat.com>
+ *          Christophe Fergeau <cfergeau at gmail.com>
+ */
+
+#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 at openedhand.com>
+ */
+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 at redhat.com>
+ *          Christophe Fergeau <cfergeau at gmail.com>
+ */
+
+#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




More information about the libvir-list mailing list