[libvirt] [libvirt-glib 15/23] Only do XML parsing when creating config objects
Daniel P. Berrange
berrange at redhat.com
Tue Oct 18 11:46:15 UTC 2011
On Fri, Oct 07, 2011 at 11:41:00AM +0200, Christophe Fergeau wrote:
> This commit changes gvir_config_domain_new_from_xml not to operate
> on an existing object. This makes it possible to call it to create
> an appropriate xmlNodePtr object which can then be used to construct
> an object derived from GVirConfigObject. This will also makes it
> possible to remove GVirConfigObject::doc in a subsequent commit.
> ---
> libvirt-gconfig/libvirt-gconfig-domain.c | 16 +++++-----
> libvirt-gconfig/libvirt-gconfig-domain.h | 2 +-
> libvirt-gconfig/libvirt-gconfig-object.c | 41 +++++-----------------------
> libvirt-gconfig/libvirt-gconfig-object.h | 3 ++
> libvirt-gconfig/tests/test-domain-parse.c | 6 +++-
> libvirt-gobject/libvirt-gobject-domain.c | 2 +-
> 6 files changed, 26 insertions(+), 44 deletions(-)
>
> diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c
> index 00cab80..ffd707d 100644
> --- a/libvirt-gconfig/libvirt-gconfig-domain.c
> +++ b/libvirt-gconfig/libvirt-gconfig-domain.c
> @@ -112,10 +112,16 @@ static void gvir_config_domain_init(GVirConfigDomain *conn)
> }
>
>
> -GVirConfigDomain *gvir_config_domain_new_from_xml(const gchar *xml)
> +GVirConfigDomain *gvir_config_domain_new_from_xml(const gchar *xml,
> + GError **error)
> {
> + xmlNodePtr node;
> +
> + node = gvir_config_xml_parse(xml, "domain", error);
> + if ((error != NULL) && (*error != NULL))
> + return NULL;
> return GVIR_CONFIG_DOMAIN(g_object_new(GVIR_TYPE_CONFIG_DOMAIN,
> - "doc", xml,
> + "node", node,
> "schema", DATADIR "/libvirt/schemas/domain.rng",
> NULL));
> }
> @@ -132,10 +138,6 @@ GVirConfigDomain *gvir_config_domain_new(void)
> NULL));
> }
>
> -/* FIXME: do we add a GError ** to all getters in case there's an XML
> - * parsing error? Doesn't work with gobject properties
> - * => have a function to test if an error has occurred a la cairo?
> - */
> char *gvir_config_domain_get_name(GVirConfigDomain *domain)
> {
> xmlNodePtr node;
> @@ -145,7 +147,6 @@ char *gvir_config_domain_get_name(GVirConfigDomain *domain)
> return NULL;
>
> return gvir_config_xml_get_child_element_content_glib(node, "name");
> -
> }
>
> void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name)
> @@ -164,7 +165,6 @@ void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name)
> xmlFree(encoded_name);
>
> old_node = gvir_config_xml_get_element(parent_node, "name", NULL);
> -
> if (old_node) {
> old_node = xmlReplaceNode(old_node, new_node);
> xmlFreeNode(old_node);
> diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h
> index f6ceef1..b5ae050 100644
> --- a/libvirt-gconfig/libvirt-gconfig-domain.h
> +++ b/libvirt-gconfig/libvirt-gconfig-domain.h
> @@ -59,7 +59,7 @@ struct _GVirConfigDomainClass
>
> GType gvir_config_domain_get_type(void);
>
> -GVirConfigDomain *gvir_config_domain_new_from_xml(const gchar *xml);
> +GVirConfigDomain *gvir_config_domain_new_from_xml(const gchar *xml, GError **error);
> GVirConfigDomain *gvir_config_domain_new(void);
>
> char *gvir_config_domain_get_name(GVirConfigDomain *domain);
> diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c
> index b7829c9..bcb622a 100644
> --- a/libvirt-gconfig/libvirt-gconfig-object.c
> +++ b/libvirt-gconfig/libvirt-gconfig-object.c
> @@ -26,10 +26,10 @@
> #include <string.h>
>
> #include <libxml/relaxng.h>
> -#include <libxml/xmlerror.h>
>
> #include "libvirt-gconfig/libvirt-gconfig.h"
>
> +
> //extern gboolean debugFlag;
> gboolean debugFlag;
>
> @@ -67,6 +67,7 @@ static void gvir_xml_structured_error_nop(void *userData G_GNUC_UNUSED,
> {
> }
>
> +
> static void gvir_config_object_get_property(GObject *object,
> guint prop_id,
> GValue *value,
> @@ -93,7 +94,6 @@ static void gvir_config_object_get_property(GObject *object,
> }
> }
>
> -
> static void gvir_config_object_set_property(GObject *object,
> guint prop_id,
> const GValue *value,
> @@ -209,34 +209,6 @@ static void gvir_config_object_init(GVirConfigObject *conn)
> memset(priv, 0, sizeof(*priv));
> }
>
> -static void
> -gvir_config_object_parse(GVirConfigObject *config,
> - GError **err)
> -{
> - GVirConfigObjectPrivate *priv = config->priv;
> - xmlDocPtr doc;
> - if (priv->node)
> - return;
> -
> - if (!priv->doc) {
> - *err = g_error_new(GVIR_CONFIG_OBJECT_ERROR,
> - 0,
> - "%s",
> - "No XML document to parse");
> - return;
> - }
> -
> - doc = xmlParseMemory(priv->doc, strlen(priv->doc));
> - if (!doc) {
> - *err = gvir_xml_error_new(GVIR_CONFIG_OBJECT_ERROR,
> - 0,
> - "%s",
> - "Unable to parse configuration");
> - }
> - priv->node = doc->children;
> -}
> -
> -
> void gvir_config_object_validate(GVirConfigObject *config,
> GError **err)
> {
> @@ -248,9 +220,13 @@ void gvir_config_object_validate(GVirConfigObject *config,
> xmlSetGenericErrorFunc(NULL, gvir_xml_generic_error_nop);
> xmlSetStructuredErrorFunc(NULL, gvir_xml_structured_error_nop);
>
> - gvir_config_object_parse(config, err);
> - if (*err)
> + if (!priv->node) {
> + *err = gvir_xml_error_new(GVIR_CONFIG_OBJECT_ERROR,
> + 0,
> + "%s",
> + "No XML document associated with this config object");
> return;
> + }
>
> rngParser = xmlRelaxNGNewParserCtxt(priv->schema);
> if (!rngParser) {
> @@ -333,6 +309,5 @@ const gchar *gvir_config_object_get_schema(GVirConfigObject *config)
> xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config,
> GError **error)
> {
> - gvir_config_object_parse(config, error);
> return config->priv->node;
> }
> diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h
> index 40480ba..98a05cb 100644
> --- a/libvirt-gconfig/libvirt-gconfig-object.h
> +++ b/libvirt-gconfig/libvirt-gconfig-object.h
> @@ -68,6 +68,9 @@ const gchar *gvir_config_object_get_doc(GVirConfigObject *config);
> const gchar *gvir_config_object_get_schema(GVirConfigObject *config);
> xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config, GError **error);
>
> +/* FIXME: move to a libvirt-gconfig-helpers.h file? */
> +xmlNodePtr gvir_config_object_parse(const char *xml, const char *root_node, GError **err);
> +
> G_END_DECLS
>
> #endif /* __LIBVIRT_GCONFIG_OBJECT_H__ */
> diff --git a/libvirt-gconfig/tests/test-domain-parse.c b/libvirt-gconfig/tests/test-domain-parse.c
> index 3a36144..57b1875 100644
> --- a/libvirt-gconfig/tests/test-domain-parse.c
> +++ b/libvirt-gconfig/tests/test-domain-parse.c
> @@ -50,7 +50,11 @@ int main(int argc, char **argv)
>
> g_type_init();
>
> - domain = gvir_config_domain_new_from_xml(xml);
> + domain = gvir_config_domain_new_from_xml(xml, &error);
> + if (error != NULL) {
> + g_print("Couldn't parse %s: %s\n", argv[1], error->message);
> + return 3;
> + }
> g_assert(domain != NULL);
> name = gvir_config_domain_get_name(domain);
> g_assert(name != NULL);
> diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c
> index fd5f709..c5df290 100644
> --- a/libvirt-gobject/libvirt-gobject-domain.c
> +++ b/libvirt-gobject/libvirt-gobject-domain.c
> @@ -432,7 +432,7 @@ GVirConfigDomain *gvir_domain_get_config(GVirDomain *dom,
> return NULL;
> }
>
> - GVirConfigDomain *conf = gvir_config_domain_new_from_xml(xml);
> + GVirConfigDomain *conf = gvir_config_domain_new_from_xml(xml, err);
> g_free(xml);
> if ((err != NULL) && (*err != NULL))
> return NULL;
ACK
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list