[libvirt] [libvirt-glib] Add gvir_xml_set_error

Christophe Fergeau cfergeau at redhat.com
Fri Dec 2 17:00:15 UTC 2011


This mirrors g_set_error, but uses gvir_xml_error_new. The main
benefit of using gvxr_xml_set_error over gvir_xml_error_new is that
it handles NULL GError **.
---
 libvirt-gconfig/libvirt-gconfig-helpers-private.h |    2 +
 libvirt-gconfig/libvirt-gconfig-helpers.c         |   40 ++++++++++++++++-----
 libvirt-gconfig/libvirt-gconfig-object.c          |   32 ++++++----------
 3 files changed, 45 insertions(+), 29 deletions(-)

diff --git a/libvirt-gconfig/libvirt-gconfig-helpers-private.h b/libvirt-gconfig/libvirt-gconfig-helpers-private.h
index 0a35595..b5b4878 100644
--- a/libvirt-gconfig/libvirt-gconfig-helpers-private.h
+++ b/libvirt-gconfig/libvirt-gconfig-helpers-private.h
@@ -32,6 +32,8 @@ G_BEGIN_DECLS
 
 GError *gvir_xml_error_new(GQuark domain, gint code,
                            const gchar *format, ...);
+void gvir_xml_set_error(GError **error, GQuark domain, gint code,
+                        const gchar *format, ...);
 xmlNodePtr gvir_config_xml_parse(const char *xml,
                                  const char *root_node,
                                  GError **err);
diff --git a/libvirt-gconfig/libvirt-gconfig-helpers.c b/libvirt-gconfig/libvirt-gconfig-helpers.c
index 722fe3d..bfdcfc3 100644
--- a/libvirt-gconfig/libvirt-gconfig-helpers.c
+++ b/libvirt-gconfig/libvirt-gconfig-helpers.c
@@ -59,6 +59,22 @@ static GError *gvir_xml_error_new_literal(GQuark domain,
 }
 
 
+static GError *gvir_xml_error_new_va(GQuark domain,
+                                     gint code,
+                                     const gchar *format,
+                                     va_list args)
+{
+    GError *err;
+    gchar *message;
+
+    message = g_strdup_vprintf(format, args);
+    err = gvir_xml_error_new_literal(domain, code, message);
+
+    g_free(message);
+
+    return err;
+}
+
 GError *gvir_xml_error_new(GQuark domain,
                            gint code,
                            const gchar *format,
@@ -66,17 +82,25 @@ GError *gvir_xml_error_new(GQuark domain,
 {
     GError *err;
     va_list args;
-    gchar *message;
 
     va_start(args, format);
-    message = g_strdup_vprintf(format, args);
+    err = gvir_xml_error_new_va(domain, code, format, args);
     va_end(args);
 
-    err = gvir_xml_error_new_literal(domain, code, message);
+    return err;
+}
 
-    g_free(message);
+void gvir_xml_set_error(GError **error, GQuark domain, gint code,
+                        const gchar *format, ...)
+{
+    va_list args;
 
-    return err;
+    if (error == NULL)
+        return;
+
+    va_start(args, format);
+    *error = gvir_xml_error_new_va(domain, code, format, args);
+    va_end(args);
 }
 
 xmlNodePtr
@@ -94,10 +118,8 @@ gvir_config_xml_parse(const char *xml, const char *root_node, GError **err)
 
     doc = xmlParseMemory(xml, strlen(xml));
     if (!doc) {
-        *err = gvir_xml_error_new(GVIR_CONFIG_OBJECT_ERROR,
-                                  0,
-                                  "%s",
-                                  "Unable to parse configuration");
+        gvir_xml_set_error(err, GVIR_CONFIG_OBJECT_ERROR,
+                           0, "%s", "Unable to parse configuration");
         return NULL;
     }
     if ((!doc->children) || (strcmp((char *)doc->children->name, root_node) != 0)) {
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c
index 03c7d5a..e2597f5 100644
--- a/libvirt-gconfig/libvirt-gconfig-object.c
+++ b/libvirt-gconfig/libvirt-gconfig-object.c
@@ -202,28 +202,23 @@ void gvir_config_object_validate(GVirConfigObject *config,
     xmlSetStructuredErrorFunc(NULL, gvir_xml_structured_error_nop);
 
     if (!priv->node) {
-        *err = gvir_xml_error_new(GVIR_CONFIG_OBJECT_ERROR,
-                                  0,
-                                  "%s",
-                                  "No XML document associated with this config object");
+        gvir_xml_set_error(err, GVIR_CONFIG_OBJECT_ERROR, 0, "%s",
+                           "No XML document associated with this config object");
         return;
     }
 
     rngParser = xmlRelaxNGNewParserCtxt(priv->schema);
     if (!rngParser) {
-        *err = gvir_xml_error_new(GVIR_CONFIG_OBJECT_ERROR,
-                                  0,
-                                  "Unable to create RNG parser for %s",
-                                  priv->schema);
+        gvir_xml_set_error(err, GVIR_CONFIG_OBJECT_ERROR, 0,
+                           "Unable to create RNG parser for %s",
+                           priv->schema);
         return;
     }
 
     rng = xmlRelaxNGParse(rngParser);
     if (!rng) {
-        *err = gvir_xml_error_new(GVIR_CONFIG_OBJECT_ERROR,
-                                  0,
-                                  "Unable to parse RNG %s",
-                                  priv->schema);
+        gvir_xml_set_error(err, GVIR_CONFIG_OBJECT_ERROR, 0,
+                           "Unable to parse RNG %s", priv->schema);
         xmlRelaxNGFreeParserCtxt(rngParser);
         return;
     }
@@ -231,19 +226,16 @@ void gvir_config_object_validate(GVirConfigObject *config,
 
     rngValid = xmlRelaxNGNewValidCtxt(rng);
     if (!rngValid) {
-        *err = gvir_xml_error_new(GVIR_CONFIG_OBJECT_ERROR,
-                                  0,
-                                  "Unable to create RNG validation context %s",
-                                  priv->schema);
+        gvir_xml_set_error(err, GVIR_CONFIG_OBJECT_ERROR, 0,
+                           "Unable to create RNG validation context %s",
+                           priv->schema);
         xmlRelaxNGFree(rng);
         return;
     }
 
     if (xmlRelaxNGValidateDoc(rngValid, priv->node->doc) != 0) {
-        *err = gvir_xml_error_new(GVIR_CONFIG_OBJECT_ERROR,
-                                  0,
-                                  "%s",
-                                  "Unable to validate doc");
+        gvir_xml_set_error(err, GVIR_CONFIG_OBJECT_ERROR, 0,
+                           "%s", "Unable to validate doc");
         xmlRelaxNGFreeValidCtxt(rngValid);
         xmlRelaxNGFree(rng);
         return;
-- 
1.7.7.3




More information about the libvir-list mailing list