[libvirt] [libvirt-glib 00/24] libvirt-gconfig patches

Hi, Here is a set of patches which start to implement functionality to libvirt-gconfig. The end result is that the "name", "memory" and "features" properties are implemented for the Domain class. Most of the work is about reworking the low-level plumbing to make the implementation as easy as possible. I chose to remove the xmlDocPtr and the xml string that were stored in GVirConfigObject objects and to replace this with a xmlNodePtr. This is useful when creating children objects (eg devices) when parsing a domain XML because the xmlNodePtr will point at the right position in the XML document. One caveat with that approach is that we need to refcount the xmlDocPtr associated with the xmlNodePtr to know when to free it, but this is not implemented yet (though gupnp seems to have code doing exactly this). Then most of the work is adding properties and helpers to make the code easier to write. And thinking about what API we want to expose to clients :) The two test programs should show how the API can be used as it is now. While writing this, I realized we had to do some "useless" work to return strings from libxml2 to glib, ie I g_strdup the string and xmlFree the source so that the caller can free it with g_free. While writing this code, there were at least 2 questions that arose, some input would be welcome :) * I don't know how to handle XMLs where the same node appears multiple times (eg "name"). If it's the latest name that wins, what do we do when changing the name on such an XML document? only modify the last name node? Drop all the redundant name nodes? * I'm also not sure how to make it possible to check whether a given property is set or not. For strings, this is easy, NULL means that the property was not set, but for integers, this is less obvious. Any thoughts on that? Next I'll have to start looking at more complicated properties :) More API questions on the way I guess... Christophe Christophe Fergeau (23): Add helpers in libvirt-gconfig-helpers.[ch] gvir_config_object_parse: don't parse empty documents Add getters for GVirConfig xmlNode and xmlDoc Add GVirConfigObject::node property Add GVir::Config::Domain::name property Rename gvir_config_domain_new Add gvir_config_domain_new to create an empty domain Implement gvir_config_domain_set_name Make the GVirConfigDomain::name property writable Add gvir_config_object_to_xml Use gvir_config_object_to_xml Add domain creation/parsing test Remove GVirConfigObject::docHandle Remove xml parsing from gvir_config_*_new functions Only do XML parsing when creating config objects Remove GError argument from GVirConfigObject::node getter Remove GVirConfigObject::doc Add gvir_config_object_get_node_content Add gvir_config_object_set_node_content Add test-domain-duplicate.xml which currently fails Validate document in parsing test Add GVirConfigDomain::memory Add GVirConfigDomain::features configure.ac | 1 + examples/Makefile.am | 1 + libvirt-gconfig/Makefile.am | 4 + libvirt-gconfig/libvirt-gconfig-capabilities.c | 10 +- libvirt-gconfig/libvirt-gconfig-capabilities.h | 2 +- libvirt-gconfig/libvirt-gconfig-domain-snapshot.c | 9 +- libvirt-gconfig/libvirt-gconfig-domain-snapshot.h | 2 +- libvirt-gconfig/libvirt-gconfig-domain.c | 186 ++++++++++++++++- libvirt-gconfig/libvirt-gconfig-domain.h | 12 +- libvirt-gconfig/libvirt-gconfig-helpers.c | 179 +++++++++++++++ libvirt-gconfig/libvirt-gconfig-helpers.h | 48 ++++ libvirt-gconfig/libvirt-gconfig-interface.c | 12 +- libvirt-gconfig/libvirt-gconfig-interface.h | 2 +- libvirt-gconfig/libvirt-gconfig-network-filter.c | 8 +- libvirt-gconfig/libvirt-gconfig-network-filter.h | 2 +- libvirt-gconfig/libvirt-gconfig-network.c | 8 +- libvirt-gconfig/libvirt-gconfig-network.h | 2 +- libvirt-gconfig/libvirt-gconfig-node-device.c | 9 +- libvirt-gconfig/libvirt-gconfig-node-device.h | 2 +- libvirt-gconfig/libvirt-gconfig-object.c | 244 ++++++++++++--------- libvirt-gconfig/libvirt-gconfig-object.h | 17 ++- libvirt-gconfig/libvirt-gconfig-secret.c | 8 +- libvirt-gconfig/libvirt-gconfig-secret.h | 2 +- libvirt-gconfig/libvirt-gconfig-storage-pool.c | 8 +- libvirt-gconfig/libvirt-gconfig-storage-pool.h | 2 +- libvirt-gconfig/libvirt-gconfig-storage-vol.c | 12 +- libvirt-gconfig/libvirt-gconfig-storage-vol.h | 2 +- libvirt-gconfig/libvirt-gconfig.h | 2 + libvirt-gconfig/libvirt-gconfig.sym | 11 +- libvirt-gconfig/tests/Makefile.am | 16 ++ libvirt-gconfig/tests/test-domain-create.c | 68 ++++++ libvirt-gconfig/tests/test-domain-duplicate.xml | 7 + libvirt-gconfig/tests/test-domain-invalid.xml | 6 + libvirt-gconfig/tests/test-domain-noname.xml | 4 + libvirt-gconfig/tests/test-domain-parse.c | 87 ++++++++ libvirt-gconfig/tests/test-domain.xml | 7 + libvirt-gobject/Makefile.am | 2 + libvirt-gobject/libvirt-gobject-connection.c | 2 +- libvirt-gobject/libvirt-gobject-domain-snapshot.c | 3 + libvirt-gobject/libvirt-gobject-domain.c | 6 +- libvirt-gobject/libvirt-gobject-interface.c | 3 + libvirt-gobject/libvirt-gobject-network-filter.c | 3 + libvirt-gobject/libvirt-gobject-network.c | 3 + libvirt-gobject/libvirt-gobject-node-device.c | 4 + libvirt-gobject/libvirt-gobject-secret.c | 4 + libvirt-gobject/libvirt-gobject-storage-pool.c | 5 +- libvirt-gobject/libvirt-gobject-storage-vol.c | 3 + 47 files changed, 895 insertions(+), 145 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-helpers.c create mode 100644 libvirt-gconfig/libvirt-gconfig-helpers.h create mode 100644 libvirt-gconfig/tests/Makefile.am create mode 100644 libvirt-gconfig/tests/test-domain-create.c create mode 100644 libvirt-gconfig/tests/test-domain-duplicate.xml create mode 100644 libvirt-gconfig/tests/test-domain-invalid.xml create mode 100644 libvirt-gconfig/tests/test-domain-noname.xml create mode 100644 libvirt-gconfig/tests/test-domain-parse.c create mode 100644 libvirt-gconfig/tests/test-domain.xml -- 1.7.6.4

These helper functions will be useful later on. --- examples/Makefile.am | 1 + libvirt-gconfig/Makefile.am | 3 + libvirt-gconfig/libvirt-gconfig-helpers.c | 179 +++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-helpers.h | 48 ++++++++ libvirt-gconfig/libvirt-gconfig-object.c | 52 --------- libvirt-gconfig/libvirt-gconfig.h | 2 + libvirt-gconfig/libvirt-gconfig.sym | 1 + libvirt-gobject/Makefile.am | 2 + 8 files changed, 236 insertions(+), 52 deletions(-) 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..634ad5a 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 \ @@ -21,6 +22,7 @@ GCONFIG_SOURCE_FILES = \ 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 +72,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.c b/libvirt-gconfig/libvirt-gconfig-helpers.c new file mode 100644 index 0000000..2fbfa9e --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-helpers.c @@ -0,0 +1,179 @@ +/* + * 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@redhat.com> + * Christophe Fergeau <cfergeau@gmail.com> + */ + +#include <config.h> + +#include <string.h> + +#include <libxml/xmlerror.h> + +#include "libvirt-gconfig/libvirt-gconfig.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@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..1bdf2d0 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-helpers.h @@ -0,0 +1,48 @@ +/* + * 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@redhat.com> + * Christophe Fergeau <cfergeau@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() + +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_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 95b147f..4a58323 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -55,58 +55,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.6.4

On Fri, Oct 07, 2011 at 11:40:46AM +0200, Christophe Fergeau wrote:
These helper functions will be useful later on. --- examples/Makefile.am | 1 + libvirt-gconfig/Makefile.am | 3 + libvirt-gconfig/libvirt-gconfig-helpers.c | 179 +++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-helpers.h | 48 ++++++++ libvirt-gconfig/libvirt-gconfig-object.c | 52 --------- libvirt-gconfig/libvirt-gconfig.h | 2 + libvirt-gconfig/libvirt-gconfig.sym | 1 + libvirt-gobject/Makefile.am | 2 + 8 files changed, 236 insertions(+), 52 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-helpers.c create mode 100644 libvirt-gconfig/libvirt-gconfig-helpers.h
diff --git a/libvirt-gconfig/libvirt-gconfig-helpers.h b/libvirt-gconfig/libvirt-gconfig-helpers.h new file mode 100644 index 0000000..1bdf2d0 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-helpers.h @@ -0,0 +1,48 @@
+ +GQuark gvir_config_object_error_quark(void); +#define GVIR_CONFIG_OBJECT_ERROR gvir_config_object_error_quark() + +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);
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;
Don't we want to also export the rest of those new APIs in gconfig-helpers.h ? ACK, if you tell me why they're not required, or if you add them before pushing the patch. 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 :|

Hi, On Tue, Oct 18, 2011 at 12:06:50PM +0100, Daniel P. Berrange wrote:
On Fri, Oct 07, 2011 at 11:40:46AM +0200, Christophe Fergeau wrote:
These helper functions will be useful later on. --- examples/Makefile.am | 1 + libvirt-gconfig/Makefile.am | 3 + libvirt-gconfig/libvirt-gconfig-helpers.c | 179 +++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-helpers.h | 48 ++++++++ libvirt-gconfig/libvirt-gconfig-object.c | 52 --------- libvirt-gconfig/libvirt-gconfig.h | 2 + libvirt-gconfig/libvirt-gconfig.sym | 1 + libvirt-gobject/Makefile.am | 2 + 8 files changed, 236 insertions(+), 52 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-helpers.c create mode 100644 libvirt-gconfig/libvirt-gconfig-helpers.h
diff --git a/libvirt-gconfig/libvirt-gconfig-helpers.h b/libvirt-gconfig/libvirt-gconfig-helpers.h new file mode 100644 index 0000000..1bdf2d0 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-helpers.h @@ -0,0 +1,48 @@
+ +GQuark gvir_config_object_error_quark(void); +#define GVIR_CONFIG_OBJECT_ERROR gvir_config_object_error_quark() + +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);
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;
Don't we want to also export the rest of those new APIs in gconfig-helpers.h ?
ACK, if you tell me why they're not required, or if you add them before pushing the patch.
At this point, I'm not sure what kind of low-level API we want to make available to the library user (by low-level, I mean letting people directly poke at the xmlNode wrapped in a GVirConfigObject instance). That's why I chose not to export them for now, and to make them public if/once they are needed. If you think they should be exported, I'll make the change. Christophe

On Mon, Nov 07, 2011 at 02:52:24PM +0100, Christophe Fergeau wrote:
Hi,
On Tue, Oct 18, 2011 at 12:06:50PM +0100, Daniel P. Berrange wrote:
On Fri, Oct 07, 2011 at 11:40:46AM +0200, Christophe Fergeau wrote:
These helper functions will be useful later on. --- examples/Makefile.am | 1 + libvirt-gconfig/Makefile.am | 3 + libvirt-gconfig/libvirt-gconfig-helpers.c | 179 +++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-helpers.h | 48 ++++++++ libvirt-gconfig/libvirt-gconfig-object.c | 52 --------- libvirt-gconfig/libvirt-gconfig.h | 2 + libvirt-gconfig/libvirt-gconfig.sym | 1 + libvirt-gobject/Makefile.am | 2 + 8 files changed, 236 insertions(+), 52 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-helpers.c create mode 100644 libvirt-gconfig/libvirt-gconfig-helpers.h
diff --git a/libvirt-gconfig/libvirt-gconfig-helpers.h b/libvirt-gconfig/libvirt-gconfig-helpers.h new file mode 100644 index 0000000..1bdf2d0 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-helpers.h @@ -0,0 +1,48 @@
+ +GQuark gvir_config_object_error_quark(void); +#define GVIR_CONFIG_OBJECT_ERROR gvir_config_object_error_quark() + +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);
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;
Don't we want to also export the rest of those new APIs in gconfig-helpers.h ?
ACK, if you tell me why they're not required, or if you add them before pushing the patch.
At this point, I'm not sure what kind of low-level API we want to make available to the library user (by low-level, I mean letting people directly poke at the xmlNode wrapped in a GVirConfigObject instance). That's why I chose not to export them for now, and to make them public if/once they are needed. If you think they should be exported, I'll make the change.
Personally I'd rather we didn't expose libxml2 data types in our public API, since it feels like an admission of defeat in our object model. I just mentioned the .syms file, because I saw the symbols included in the libvirt-gconfig/libvirt-gconfig-helpers.h header which presumably will end up in /usr/include. So if we want to avoid exposing libxml2 types in our API, we should ensure the header file in question doesn't get installed in /usr/include too. 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 :|

On Mon, Nov 07, 2011 at 01:56:42PM +0000, Daniel P. Berrange wrote:
On Mon, Nov 07, 2011 at 02:52:24PM +0100, Christophe Fergeau wrote:
At this point, I'm not sure what kind of low-level API we want to make available to the library user (by low-level, I mean letting people directly poke at the xmlNode wrapped in a GVirConfigObject instance). That's why I chose not to export them for now, and to make them public if/once they are needed. If you think they should be exported, I'll make the change.
Personally I'd rather we didn't expose libxml2 data types in our public API, since it feels like an admission of defeat in our object model.
Actually, while adding a refcounted wrapper around xmlDoc, I've made more changes/added more helpers which should make it possible to hide these xmlNodePtr from our public API. We would expose either GVirConfigObject or GVirConfigXmlNode as a wrapper around xmlNodePtr and provide helpers to manipulate the xml content they wrap (stuff like new_child, set_attributes, ...)
So if we want to avoid exposing libxml2 types in our API, we should ensure the header file in question doesn't get installed in /usr/include too.
Ah good point, didn't think about this. Time for some noinst_HEADERS in our Makefile.am. I also need to make sure libvirt-gconfig/libvirt-gconfig.h doesn't reference it. Christophe

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@redhat.com> + * Christophe Fergeau <cfergeau@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@redhat.com> + * Christophe Fergeau <cfergeau@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@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@redhat.com> + * Christophe Fergeau <cfergeau@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

Report an error when trying to parse the current XML document associated with the GVirConfig object when no document has been set. --- libvirt-gconfig/libvirt-gconfig-object.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 4a58323..6f80346 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -187,6 +187,14 @@ gvir_config_object_parse(GVirConfigObject *config, if (priv->docHandle) return; + if (!priv->doc) { + *err = g_error_new(GVIR_CONFIG_OBJECT_ERROR, + 0, + "%s", + "No XML document to parse"); + return; + } + priv->docHandle = xmlParseMemory(priv->doc, strlen(priv->doc)); if (!priv->docHandle) { *err = gvir_xml_error_new(GVIR_CONFIG_OBJECT_ERROR, -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:40:47AM +0200, Christophe Fergeau wrote:
Report an error when trying to parse the current XML document associated with the GVirConfig object when no document has been set. --- libvirt-gconfig/libvirt-gconfig-object.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 4a58323..6f80346 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -187,6 +187,14 @@ gvir_config_object_parse(GVirConfigObject *config, if (priv->docHandle) return;
+ if (!priv->doc) { + *err = g_error_new(GVIR_CONFIG_OBJECT_ERROR, + 0, + "%s", + "No XML document to parse"); + return; + } + priv->docHandle = xmlParseMemory(priv->doc, strlen(priv->doc)); if (!priv->docHandle) { *err = gvir_xml_error_new(GVIR_CONFIG_OBJECT_ERROR,
ACK Seeing this string message reminds me that we should add I18N gettext support to this library sometime soon. 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 :|

On Tue, Oct 18, 2011 at 12:07:43PM +0100, Daniel P. Berrange wrote:
Seeing this string message reminds me that we should add I18N gettext support to this library sometime soon.
Yep, I'm thinking about this from time to time too :) Christophe

They will be useful in subclasses to access the parsed document, and to external users needing to directly interact with the generated XML. --- libvirt-gconfig/libvirt-gconfig-object.c | 18 ++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-object.h | 2 ++ libvirt-gconfig/libvirt-gconfig.sym | 2 ++ 3 files changed, 22 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 6f80346..52e9be0 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -276,3 +276,21 @@ const gchar *gvir_config_object_get_schema(GVirConfigObject *config) return priv->schema; } +/* NB: the xmlDocPtr must not be freed by the caller */ +xmlDocPtr gvir_config_object_get_xml_doc(GVirConfigObject *config, GError **error) +{ + gvir_config_object_parse(config, error); + return config->priv->docHandle; +} + +/* FIXME: will we always have one xmlNode per GConfig object? */ +/* FIXME: need to return the right node from subclasses */ +/* NB: the xmlNodePtr must not be freed by the caller */ +xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config, + GError **error) +{ + gvir_config_object_parse(config, error); + if (error) + return NULL; + return config->priv->docHandle->children; +} diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index d08e97d..a0c0489 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -64,6 +64,8 @@ void gvir_config_object_validate(GVirConfigObject *config, const gchar *gvir_config_object_get_doc(GVirConfigObject *config); const gchar *gvir_config_object_get_schema(GVirConfigObject *config); +xmlDocPtr gvir_config_object_get_xml_doc(GVirConfigObject *config, GError **error); +xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config, GError **error); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 24407c3..d20e73b 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -26,6 +26,8 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_object_new; gvir_config_object_get_doc; gvir_config_object_get_schema; + gvir_config_object_get_xml_doc; + gvir_config_object_get_xml_node; gvir_config_object_validate; gvir_config_secret_get_type; -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:40:48AM +0200, Christophe Fergeau wrote:
They will be useful in subclasses to access the parsed document, and to external users needing to directly interact with the generated XML. --- libvirt-gconfig/libvirt-gconfig-object.c | 18 ++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-object.h | 2 ++ libvirt-gconfig/libvirt-gconfig.sym | 2 ++ 3 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 6f80346..52e9be0 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -276,3 +276,21 @@ const gchar *gvir_config_object_get_schema(GVirConfigObject *config) return priv->schema; }
+/* NB: the xmlDocPtr must not be freed by the caller */ +xmlDocPtr gvir_config_object_get_xml_doc(GVirConfigObject *config, GError **error) +{ + gvir_config_object_parse(config, error); + return config->priv->docHandle; +} + +/* FIXME: will we always have one xmlNode per GConfig object? */ +/* FIXME: need to return the right node from subclasses */ +/* NB: the xmlNodePtr must not be freed by the caller */ +xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config, + GError **error) +{ + gvir_config_object_parse(config, error); + if (error) + return NULL; + return config->priv->docHandle->children; +} diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index d08e97d..a0c0489 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -64,6 +64,8 @@ void gvir_config_object_validate(GVirConfigObject *config,
const gchar *gvir_config_object_get_doc(GVirConfigObject *config); const gchar *gvir_config_object_get_schema(GVirConfigObject *config); +xmlDocPtr gvir_config_object_get_xml_doc(GVirConfigObject *config, GError **error); +xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config, GError **error);
G_END_DECLS
diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 24407c3..d20e73b 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -26,6 +26,8 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_object_new; gvir_config_object_get_doc; gvir_config_object_get_schema; + gvir_config_object_get_xml_doc; + gvir_config_object_get_xml_node; gvir_config_object_validate;
gvir_config_secret_get_type;
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 :|

This property stores the XML node corresponding to the current configuration object in the XML tree. When creating configuration objects from a XML string, the XML file will be lazily loaded, and this property will be set. --- libvirt-gconfig/libvirt-gconfig-object.c | 35 +++++++++++++++++++++++++++-- 1 files changed, 32 insertions(+), 3 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 52e9be0..762baf9 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -43,7 +43,11 @@ struct _GVirConfigObjectPrivate gchar *doc; gchar *schema; + /* FIXME: docHandle is node->doc, can probably be removed to avoid the + * 2 getting out of sync + */ xmlDocPtr docHandle; + xmlNodePtr node; }; G_DEFINE_ABSTRACT_TYPE(GVirConfigObject, gvir_config_object, G_TYPE_OBJECT); @@ -52,6 +56,7 @@ enum { PROP_0, PROP_DOC, PROP_SCHEMA, + PROP_NODE }; @@ -83,6 +88,10 @@ static void gvir_config_object_get_property(GObject *object, g_value_set_string(value, priv->schema); break; + case PROP_NODE: + g_value_set_pointer(value, gvir_config_object_get_xml_node(conn, NULL)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); } @@ -108,6 +117,16 @@ static void gvir_config_object_set_property(GObject *object, priv->schema = g_value_dup_string(value); break; + case PROP_NODE: + priv->node = g_value_get_pointer(value); + if ((priv->docHandle != NULL) && (priv->docHandle != priv->node->doc)) + xmlFreeDoc(priv->docHandle); + if (priv->node) + priv->docHandle = priv->node->doc; + else + priv->docHandle = NULL; + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); } @@ -164,6 +183,15 @@ static void gvir_config_object_class_init(GVirConfigObjectClass *klass) G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); + g_object_class_install_property(object_class, + PROP_NODE, + g_param_spec_pointer("node", + "XML Node", + "The XML node this config object corresponds to", + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + g_type_class_add_private(klass, sizeof(GVirConfigObjectPrivate)); } @@ -202,6 +230,7 @@ gvir_config_object_parse(GVirConfigObject *config, "%s", "Unable to parse configuration"); } + priv->node = priv->docHandle->children; } @@ -277,6 +306,8 @@ const gchar *gvir_config_object_get_schema(GVirConfigObject *config) } /* NB: the xmlDocPtr must not be freed by the caller */ +/* gupnp has wrapped xmlDoc in a gobject */ +/* not really useful, can be obtained from xmlNode::doc */ xmlDocPtr gvir_config_object_get_xml_doc(GVirConfigObject *config, GError **error) { gvir_config_object_parse(config, error); @@ -290,7 +321,5 @@ xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config, GError **error) { gvir_config_object_parse(config, error); - if (error) - return NULL; - return config->priv->docHandle->children; + return config->priv->node; } -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:40:49AM +0200, Christophe Fergeau wrote:
This property stores the XML node corresponding to the current configuration object in the XML tree. When creating configuration objects from a XML string, the XML file will be lazily loaded, and this property will be set. --- libvirt-gconfig/libvirt-gconfig-object.c | 35 +++++++++++++++++++++++++++-- 1 files changed, 32 insertions(+), 3 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 52e9be0..762baf9 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -43,7 +43,11 @@ struct _GVirConfigObjectPrivate gchar *doc; gchar *schema;
+ /* FIXME: docHandle is node->doc, can probably be removed to avoid the + * 2 getting out of sync + */ xmlDocPtr docHandle; + xmlNodePtr node; };
G_DEFINE_ABSTRACT_TYPE(GVirConfigObject, gvir_config_object, G_TYPE_OBJECT); @@ -52,6 +56,7 @@ enum { PROP_0, PROP_DOC, PROP_SCHEMA, + PROP_NODE };
@@ -83,6 +88,10 @@ static void gvir_config_object_get_property(GObject *object, g_value_set_string(value, priv->schema); break;
+ case PROP_NODE: + g_value_set_pointer(value, gvir_config_object_get_xml_node(conn, NULL)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); } @@ -108,6 +117,16 @@ static void gvir_config_object_set_property(GObject *object, priv->schema = g_value_dup_string(value); break;
+ case PROP_NODE: + priv->node = g_value_get_pointer(value); + if ((priv->docHandle != NULL) && (priv->docHandle != priv->node->doc)) + xmlFreeDoc(priv->docHandle); + if (priv->node) + priv->docHandle = priv->node->doc; + else + priv->docHandle = NULL; + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); } @@ -164,6 +183,15 @@ static void gvir_config_object_class_init(GVirConfigObjectClass *klass) G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+ g_object_class_install_property(object_class, + PROP_NODE, + g_param_spec_pointer("node", + "XML Node", + "The XML node this config object corresponds to", + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + g_type_class_add_private(klass, sizeof(GVirConfigObjectPrivate)); }
@@ -202,6 +230,7 @@ gvir_config_object_parse(GVirConfigObject *config, "%s", "Unable to parse configuration"); } + priv->node = priv->docHandle->children; }
@@ -277,6 +306,8 @@ const gchar *gvir_config_object_get_schema(GVirConfigObject *config) }
/* NB: the xmlDocPtr must not be freed by the caller */ +/* gupnp has wrapped xmlDoc in a gobject */ +/* not really useful, can be obtained from xmlNode::doc */
I guess the reason for doing that would be to avoid any libxml2 data types in the public API. Might be worth considering in the future.
xmlDocPtr gvir_config_object_get_xml_doc(GVirConfigObject *config, GError **error) { gvir_config_object_parse(config, error); @@ -290,7 +321,5 @@ xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config, GError **error) { gvir_config_object_parse(config, error); - if (error) - return NULL; - return config->priv->docHandle->children; + return config->priv->node; }
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 :|

On Tue, Oct 18, 2011 at 12:32:33PM +0100, Daniel P. Berrange wrote:
On Fri, Oct 07, 2011 at 11:40:49AM +0200, Christophe Fergeau wrote:
@@ -277,6 +306,8 @@ const gchar *gvir_config_object_get_schema(GVirConfigObject *config) }
/* NB: the xmlDocPtr must not be freed by the caller */ +/* gupnp has wrapped xmlDoc in a gobject */ +/* not really useful, can be obtained from xmlNode::doc */
I guess the reason for doing that would be to avoid any libxml2 data types in the public API. Might be worth considering in the future.
Ah, I hadn't thought of this reason, but at the same time I was wondering if it's ok to leak libxml2 data types in the public API. The reason I'm considering it is to get refcounting on xmlDocPtr as you mentioned in a later patch in this series. Christophe

On Tue, Oct 18, 2011 at 02:43:10PM +0200, Christophe Fergeau wrote:
On Tue, Oct 18, 2011 at 12:32:33PM +0100, Daniel P. Berrange wrote:
On Fri, Oct 07, 2011 at 11:40:49AM +0200, Christophe Fergeau wrote:
@@ -277,6 +306,8 @@ const gchar *gvir_config_object_get_schema(GVirConfigObject *config) }
/* NB: the xmlDocPtr must not be freed by the caller */ +/* gupnp has wrapped xmlDoc in a gobject */ +/* not really useful, can be obtained from xmlNode::doc */
I guess the reason for doing that would be to avoid any libxml2 data types in the public API. Might be worth considering in the future.
Ah, I hadn't thought of this reason, but at the same time I was wondering if it's ok to leak libxml2 data types in the public API. The reason I'm considering it is to get refcounting on xmlDocPtr as you mentioned in a later patch in this series.
Generally my preference would be to avoid leaking non-GObject based types in the public API. I don't feel too strongly about libxml2 though, since it has a proven long term stable API that isn't going to break every 6 months like some libraries do. 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 :|

For now, it's read-only, but is exposed as a gobject property too. --- libvirt-gconfig/libvirt-gconfig-domain.c | 50 ++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 2 + libvirt-gconfig/libvirt-gconfig.sym | 1 + 3 files changed, 53 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 4a8911d..125c1ac 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -41,11 +41,45 @@ struct _GVirConfigDomainPrivate G_DEFINE_TYPE(GVirConfigDomain, gvir_config_domain, GVIR_TYPE_CONFIG_OBJECT); +enum { + PROP_0, + PROP_NAME, +}; + +static void gvir_config_domain_get_property(GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GVirConfigDomain *domain = GVIR_CONFIG_DOMAIN(object); + + switch (prop_id) { + case PROP_NAME: + g_value_take_string(value, gvir_config_domain_get_name(domain)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + } +} + static void gvir_config_domain_class_init(GVirConfigDomainClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass, sizeof(GVirConfigDomainPrivate)); + + object_class->get_property = gvir_config_domain_get_property; + + g_object_class_install_property(object_class, + PROP_NAME, + g_param_spec_string("name", + "Name", + "Domain Name", + NULL, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); } @@ -68,3 +102,19 @@ GVirConfigDomain *gvir_config_domain_new(const gchar *xml) "schema", DATADIR "/libvirt/schemas/domain.rng", 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; + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain), NULL); + if (node == NULL) + return NULL; + + return gvir_config_xml_get_child_element_content_glib(node, "name"); + +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index 11161c8..49c34dc 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -61,6 +61,8 @@ GType gvir_config_domain_get_type(void); GVirConfigDomain *gvir_config_domain_new(const gchar *xml); +char *gvir_config_domain_get_name(GVirConfigDomain *domain); + G_END_DECLS #endif /* __LIBVIRT_GCONFIG_DOMAIN_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index d20e73b..6127e22 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -5,6 +5,7 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_domain_get_type; gvir_config_domain_new; + gvir_config_domain_get_name; gvir_config_domain_snapshot_get_type; gvir_config_domain_snapshot_new; -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:40:50AM +0200, Christophe Fergeau wrote:
For now, it's read-only, but is exposed as a gobject property too. --- libvirt-gconfig/libvirt-gconfig-domain.c | 50 ++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 2 + libvirt-gconfig/libvirt-gconfig.sym | 1 + 3 files changed, 53 insertions(+), 0 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 4a8911d..125c1ac 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -41,11 +41,45 @@ struct _GVirConfigDomainPrivate
G_DEFINE_TYPE(GVirConfigDomain, gvir_config_domain, GVIR_TYPE_CONFIG_OBJECT);
+enum { + PROP_0, + PROP_NAME, +}; + +static void gvir_config_domain_get_property(GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GVirConfigDomain *domain = GVIR_CONFIG_DOMAIN(object); + + switch (prop_id) { + case PROP_NAME: + g_value_take_string(value, gvir_config_domain_get_name(domain)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + } +} +
static void gvir_config_domain_class_init(GVirConfigDomainClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS(klass);
g_type_class_add_private(klass, sizeof(GVirConfigDomainPrivate)); + + object_class->get_property = gvir_config_domain_get_property; + + g_object_class_install_property(object_class, + PROP_NAME, + g_param_spec_string("name", + "Name", + "Domain Name", + NULL, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); }
@@ -68,3 +102,19 @@ GVirConfigDomain *gvir_config_domain_new(const gchar *xml) "schema", DATADIR "/libvirt/schemas/domain.rng", 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? + */
I think it is reasonable to declare that the getters are not allowed to be accessed after a parsing failure. The app will be able to get back the parsing errors, at time of parse if they want them
+char *gvir_config_domain_get_name(GVirConfigDomain *domain) +{ + xmlNodePtr node; + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain), NULL); + if (node == NULL) + return NULL; + + return gvir_config_xml_get_child_element_content_glib(node, "name"); + +}
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 :|

Rename it to gvir_config_domain_new_from_xml since it takes an XML string as input. gvir_config_domain_new will be used to create a new empty domain. --- libvirt-gconfig/libvirt-gconfig-domain.c | 2 +- libvirt-gconfig/libvirt-gconfig-domain.h | 2 +- libvirt-gconfig/libvirt-gconfig.sym | 2 +- libvirt-gobject/libvirt-gobject-domain.c | 6 ++++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 125c1ac..2b9419e 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -95,7 +95,7 @@ static void gvir_config_domain_init(GVirConfigDomain *conn) } -GVirConfigDomain *gvir_config_domain_new(const gchar *xml) +GVirConfigDomain *gvir_config_domain_new_from_xml(const gchar *xml) { return GVIR_CONFIG_DOMAIN(g_object_new(GVIR_TYPE_CONFIG_DOMAIN, "doc", xml, diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index 49c34dc..343f076 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(const gchar *xml); +GVirConfigDomain *gvir_config_domain_new_from_xml(const gchar *xml); char *gvir_config_domain_get_name(GVirConfigDomain *domain); diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 6127e22..76e2ba2 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -4,7 +4,7 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_capabilities_new; gvir_config_domain_get_type; - gvir_config_domain_new; + gvir_config_domain_new_from_xml; gvir_config_domain_get_name; gvir_config_domain_snapshot_get_type; diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index 70d8d6d..fd5f709 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -432,9 +432,11 @@ GVirConfigDomain *gvir_domain_get_config(GVirDomain *dom, return NULL; } - GVirConfigDomain *conf = gvir_config_domain_new(xml); - + GVirConfigDomain *conf = gvir_config_domain_new_from_xml(xml); g_free(xml); + if ((err != NULL) && (*err != NULL)) + return NULL; + return conf; } -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:40:51AM +0200, Christophe Fergeau wrote:
Rename it to gvir_config_domain_new_from_xml since it takes an XML string as input. gvir_config_domain_new will be used to create a new empty domain. --- libvirt-gconfig/libvirt-gconfig-domain.c | 2 +- libvirt-gconfig/libvirt-gconfig-domain.h | 2 +- libvirt-gconfig/libvirt-gconfig.sym | 2 +- libvirt-gobject/libvirt-gobject-domain.c | 6 ++++-- 4 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 125c1ac..2b9419e 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -95,7 +95,7 @@ static void gvir_config_domain_init(GVirConfigDomain *conn) }
-GVirConfigDomain *gvir_config_domain_new(const gchar *xml) +GVirConfigDomain *gvir_config_domain_new_from_xml(const gchar *xml) { return GVIR_CONFIG_DOMAIN(g_object_new(GVIR_TYPE_CONFIG_DOMAIN, "doc", xml, diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index 49c34dc..343f076 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(const gchar *xml); +GVirConfigDomain *gvir_config_domain_new_from_xml(const gchar *xml);
char *gvir_config_domain_get_name(GVirConfigDomain *domain);
diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 6127e22..76e2ba2 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -4,7 +4,7 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_capabilities_new;
gvir_config_domain_get_type; - gvir_config_domain_new; + gvir_config_domain_new_from_xml; gvir_config_domain_get_name;
gvir_config_domain_snapshot_get_type; diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index 70d8d6d..fd5f709 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -432,9 +432,11 @@ GVirConfigDomain *gvir_domain_get_config(GVirDomain *dom, return NULL; }
- GVirConfigDomain *conf = gvir_config_domain_new(xml); - + GVirConfigDomain *conf = gvir_config_domain_new_from_xml(xml); g_free(xml); + if ((err != NULL) && (*err != NULL)) + return NULL; + return conf; }
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 :|

--- libvirt-gconfig/libvirt-gconfig-domain.c | 12 ++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 1 + 3 files changed, 14 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 2b9419e..7ae10b8 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -103,6 +103,18 @@ GVirConfigDomain *gvir_config_domain_new_from_xml(const gchar *xml) NULL)); } +GVirConfigDomain *gvir_config_domain_new(void) +{ + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"domain", NULL); + return GVIR_CONFIG_DOMAIN(g_object_new(GVIR_TYPE_CONFIG_DOMAIN, + "node", doc->children, + "schema", DATADIR "/libvirt/schemas/domain.rng", + 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? diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index 343f076..baa94c6 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -60,6 +60,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(void); char *gvir_config_domain_get_name(GVirConfigDomain *domain); diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 76e2ba2..8702a76 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -4,6 +4,7 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_capabilities_new; gvir_config_domain_get_type; + gvir_config_domain_new; gvir_config_domain_new_from_xml; gvir_config_domain_get_name; -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:40:52AM +0200, Christophe Fergeau wrote:
--- libvirt-gconfig/libvirt-gconfig-domain.c | 12 ++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 1 + 3 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 2b9419e..7ae10b8 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -103,6 +103,18 @@ GVirConfigDomain *gvir_config_domain_new_from_xml(const gchar *xml) NULL)); }
+GVirConfigDomain *gvir_config_domain_new(void) +{ + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"domain", NULL); + return GVIR_CONFIG_DOMAIN(g_object_new(GVIR_TYPE_CONFIG_DOMAIN, + "node", doc->children, + "schema", DATADIR "/libvirt/schemas/domain.rng", + 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? diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index 343f076..baa94c6 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -60,6 +60,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(void);
char *gvir_config_domain_get_name(GVirConfigDomain *domain);
diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 76e2ba2..8702a76 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -4,6 +4,7 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_capabilities_new;
gvir_config_domain_get_type; + gvir_config_domain_new; gvir_config_domain_new_from_xml; gvir_config_domain_get_name;
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 :|

--- libvirt-gconfig/libvirt-gconfig-domain.c | 27 +++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 1 + 3 files changed, 29 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 7ae10b8..06fc3fa 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -130,3 +130,30 @@ char *gvir_config_domain_get_name(GVirConfigDomain *domain) return gvir_config_xml_get_child_element_content_glib(node, "name"); } + +void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name) +{ + xmlNodePtr parent_node; + xmlNodePtr old_node; + xmlNodePtr new_node; + xmlChar *encoded_name; + + parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain), + NULL); + encoded_name = xmlEncodeEntitiesReentrant(parent_node->doc, + (xmlChar *)name); + new_node = xmlNewDocNode(parent_node->doc, NULL, + (xmlChar *)"name", encoded_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); + } else { + xmlAddChild(parent_node, new_node); + } + + g_object_notify(G_OBJECT(domain), "name"); +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index baa94c6..f6ceef1 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -63,6 +63,7 @@ GVirConfigDomain *gvir_config_domain_new_from_xml(const gchar *xml); GVirConfigDomain *gvir_config_domain_new(void); char *gvir_config_domain_get_name(GVirConfigDomain *domain); +void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 8702a76..2571c05 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -7,6 +7,7 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_domain_new; gvir_config_domain_new_from_xml; gvir_config_domain_get_name; + gvir_config_domain_set_name; gvir_config_domain_snapshot_get_type; gvir_config_domain_snapshot_new; -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:40:53AM +0200, Christophe Fergeau wrote:
--- libvirt-gconfig/libvirt-gconfig-domain.c | 27 +++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 1 + 3 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 7ae10b8..06fc3fa 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -130,3 +130,30 @@ char *gvir_config_domain_get_name(GVirConfigDomain *domain) return gvir_config_xml_get_child_element_content_glib(node, "name");
} + +void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name) +{ + xmlNodePtr parent_node; + xmlNodePtr old_node; + xmlNodePtr new_node; + xmlChar *encoded_name; + + parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain), + NULL); + encoded_name = xmlEncodeEntitiesReentrant(parent_node->doc, + (xmlChar *)name); + new_node = xmlNewDocNode(parent_node->doc, NULL, + (xmlChar *)"name", encoded_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); + } else { + xmlAddChild(parent_node, new_node); + } + + g_object_notify(G_OBJECT(domain), "name"); +}
Perhaps we want another helper method for setting XML elements too. In python-virtinst, they had a helper which allowed a very simple xpath like use.eg gvir_config_xml_set_element(parent_node, "/name", node); Or gvir_config_xml_set_element(parent_node, "/foo/bar/name", node); automagically creating foo & bar in the process. Perhaps even have wrappers to avoid needing to pass in a node for the value gvir_config_xml_set_data_element(parent_node, "/name", "foobar"); And setting NULL terminated list of attributes gvir_config_xml_set_element_attrs(parent_node, "/blah", "someattr", "somevalue", "otherattr", "othervalue", NULL); etc,m
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index baa94c6..f6ceef1 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -63,6 +63,7 @@ GVirConfigDomain *gvir_config_domain_new_from_xml(const gchar *xml); GVirConfigDomain *gvir_config_domain_new(void);
char *gvir_config_domain_get_name(GVirConfigDomain *domain); +void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name);
G_END_DECLS
diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 8702a76..2571c05 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -7,6 +7,7 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_domain_new; gvir_config_domain_new_from_xml; gvir_config_domain_get_name; + gvir_config_domain_set_name;
gvir_config_domain_snapshot_get_type; gvir_config_domain_snapshot_new;
ACK to this patch anyway, since convenience helpers can be added later as desired 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 :|

On Tue, Oct 18, 2011 at 12:39:34PM +0100, Daniel P. Berrange wrote:
On Fri, Oct 07, 2011 at 11:40:53AM +0200, Christophe Fergeau wrote:
--- libvirt-gconfig/libvirt-gconfig-domain.c | 27 +++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 1 + 3 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 7ae10b8..06fc3fa 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -130,3 +130,30 @@ char *gvir_config_domain_get_name(GVirConfigDomain *domain) return gvir_config_xml_get_child_element_content_glib(node, "name");
} + +void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name) +{ + xmlNodePtr parent_node; + xmlNodePtr old_node; + xmlNodePtr new_node; + xmlChar *encoded_name; + + parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain), + NULL); + encoded_name = xmlEncodeEntitiesReentrant(parent_node->doc, + (xmlChar *)name); + new_node = xmlNewDocNode(parent_node->doc, NULL, + (xmlChar *)"name", encoded_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); + } else { + xmlAddChild(parent_node, new_node); + } + + g_object_notify(G_OBJECT(domain), "name"); +}
Perhaps we want another helper method for setting XML elements too.
Yep this is planned, see https://gitorious.org/~teuf/libvirt/teuf-libvirt-glib/commit/264c6f952f02380... for example
In python-virtinst, they had a helper which allowed a very simple xpath like use.eg
gvir_config_xml_set_element(parent_node, "/name", node);
Or
gvir_config_xml_set_element(parent_node, "/foo/bar/name", node);
automagically creating foo & bar in the process.
Ah, interesting, my version is a bit more simplistic.
And setting NULL terminated list of attributes
gvir_config_xml_set_element_attrs(parent_node, "/blah", "someattr", "somevalue", "otherattr", "othervalue", NULL);
yep, thought about that one too when adding some of the helpers, I'll come to it when I feel I'm duplicating too much code :) Christophe

--- libvirt-gconfig/libvirt-gconfig-domain.c | 19 ++++++++++++++++++- 1 files changed, 18 insertions(+), 1 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 06fc3fa..00cab80 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -63,6 +63,22 @@ static void gvir_config_domain_get_property(GObject *object, } } +static void gvir_config_domain_set_property(GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GVirConfigDomain *domain = GVIR_CONFIG_DOMAIN(object); + + switch (prop_id) { + case PROP_NAME: + gvir_config_domain_set_name(domain, g_value_get_string(value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + } +} + static void gvir_config_domain_class_init(GVirConfigDomainClass *klass) { @@ -71,6 +87,7 @@ static void gvir_config_domain_class_init(GVirConfigDomainClass *klass) g_type_class_add_private(klass, sizeof(GVirConfigDomainPrivate)); object_class->get_property = gvir_config_domain_get_property; + object_class->set_property = gvir_config_domain_set_property; g_object_class_install_property(object_class, PROP_NAME, @@ -78,7 +95,7 @@ static void gvir_config_domain_class_init(GVirConfigDomainClass *klass) "Name", "Domain Name", NULL, - G_PARAM_READABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:40:54AM +0200, Christophe Fergeau wrote:
--- libvirt-gconfig/libvirt-gconfig-domain.c | 19 ++++++++++++++++++- 1 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 06fc3fa..00cab80 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -63,6 +63,22 @@ static void gvir_config_domain_get_property(GObject *object, } }
+static void gvir_config_domain_set_property(GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GVirConfigDomain *domain = GVIR_CONFIG_DOMAIN(object); + + switch (prop_id) { + case PROP_NAME: + gvir_config_domain_set_name(domain, g_value_get_string(value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + } +} +
static void gvir_config_domain_class_init(GVirConfigDomainClass *klass) { @@ -71,6 +87,7 @@ static void gvir_config_domain_class_init(GVirConfigDomainClass *klass) g_type_class_add_private(klass, sizeof(GVirConfigDomainPrivate));
object_class->get_property = gvir_config_domain_get_property; + object_class->set_property = gvir_config_domain_set_property;
g_object_class_install_property(object_class, PROP_NAME, @@ -78,7 +95,7 @@ static void gvir_config_domain_class_init(GVirConfigDomainClass *klass) "Name", "Domain Name", NULL, - G_PARAM_READABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); }
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 :|

--- libvirt-gconfig/libvirt-gconfig-object.c | 19 +++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-object.h | 2 ++ libvirt-gconfig/libvirt-gconfig.sym | 1 + 3 files changed, 22 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 762baf9..66102ec 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -293,6 +293,25 @@ void gvir_config_object_validate(GVirConfigObject *config, xmlRelaxNGFree(rng); } +gchar *gvir_config_object_to_xml(GVirConfigObject *config) +{ + xmlChar *doc; + int size; + xmlNodePtr node; + gchar *output_doc; + + node = gvir_config_object_get_xml_node(config, NULL); + if (node == NULL) + return NULL; + + xmlDocDumpMemory(node->doc, &doc, &size); + + output_doc = g_strdup((gchar *)doc); + xmlFree(doc); + + return output_doc; +} + const gchar *gvir_config_object_get_doc(GVirConfigObject *config) { GVirConfigObjectPrivate *priv = config->priv; diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index a0c0489..f6ac28b 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -62,6 +62,8 @@ GType gvir_config_object_get_type(void); void gvir_config_object_validate(GVirConfigObject *config, GError **err); +gchar *gvir_config_object_to_xml(GVirConfigObject *config); + const gchar *gvir_config_object_get_doc(GVirConfigObject *config); const gchar *gvir_config_object_get_schema(GVirConfigObject *config); xmlDocPtr gvir_config_object_get_xml_doc(GVirConfigObject *config, GError **error); diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 2571c05..5c4492e 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -31,6 +31,7 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_object_get_schema; gvir_config_object_get_xml_doc; gvir_config_object_get_xml_node; + gvir_config_object_to_xml; gvir_config_object_validate; gvir_config_secret_get_type; -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:40:55AM +0200, Christophe Fergeau wrote:
--- libvirt-gconfig/libvirt-gconfig-object.c | 19 +++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-object.h | 2 ++ libvirt-gconfig/libvirt-gconfig.sym | 1 + 3 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 762baf9..66102ec 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -293,6 +293,25 @@ void gvir_config_object_validate(GVirConfigObject *config, xmlRelaxNGFree(rng); }
+gchar *gvir_config_object_to_xml(GVirConfigObject *config) +{ + xmlChar *doc; + int size; + xmlNodePtr node; + gchar *output_doc; + + node = gvir_config_object_get_xml_node(config, NULL); + if (node == NULL) + return NULL; + + xmlDocDumpMemory(node->doc, &doc, &size); + + output_doc = g_strdup((gchar *)doc); + xmlFree(doc); + + return output_doc; +} + const gchar *gvir_config_object_get_doc(GVirConfigObject *config) { GVirConfigObjectPrivate *priv = config->priv; diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index a0c0489..f6ac28b 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -62,6 +62,8 @@ GType gvir_config_object_get_type(void); void gvir_config_object_validate(GVirConfigObject *config, GError **err);
+gchar *gvir_config_object_to_xml(GVirConfigObject *config); + const gchar *gvir_config_object_get_doc(GVirConfigObject *config); const gchar *gvir_config_object_get_schema(GVirConfigObject *config); xmlDocPtr gvir_config_object_get_xml_doc(GVirConfigObject *config, GError **error); diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 2571c05..5c4492e 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -31,6 +31,7 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_object_get_schema; gvir_config_object_get_xml_doc; gvir_config_object_get_xml_node; + gvir_config_object_to_xml; gvir_config_object_validate;
gvir_config_secret_get_type;
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 :|

s/gvir_config_object_get_doc/gvir_config_object_to_xml/ Prefer gvir_config_object_to_xml over gvir_config_object_get_doc since the latter will be removed soon. --- libvirt-gobject/libvirt-gobject-connection.c | 2 +- libvirt-gobject/libvirt-gobject-storage-pool.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c index 007d86e..71fa768 100644 --- a/libvirt-gobject/libvirt-gobject-connection.c +++ b/libvirt-gobject/libvirt-gobject-connection.c @@ -1170,7 +1170,7 @@ GVirDomain *gvir_connection_create_domain(GVirConnection *conn, virDomainPtr handle; GVirConnectionPrivate *priv = conn->priv; - xml = gvir_config_object_get_doc(GVIR_CONFIG_OBJECT(conf)); + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf)); g_return_val_if_fail(xml != NULL, NULL); diff --git a/libvirt-gobject/libvirt-gobject-storage-pool.c b/libvirt-gobject/libvirt-gobject-storage-pool.c index fc9cba9..8cc481e 100644 --- a/libvirt-gobject/libvirt-gobject-storage-pool.c +++ b/libvirt-gobject/libvirt-gobject-storage-pool.c @@ -491,7 +491,7 @@ GVirStorageVol *gvir_storage_pool_create_volume virStorageVolPtr handle; GVirStoragePoolPrivate *priv = pool->priv; - xml = gvir_config_object_get_doc(GVIR_CONFIG_OBJECT(conf)); + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf)); g_return_val_if_fail(xml != NULL, NULL); -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:40:56AM +0200, Christophe Fergeau wrote:
s/gvir_config_object_get_doc/gvir_config_object_to_xml/
Prefer gvir_config_object_to_xml over gvir_config_object_get_doc since the latter will be removed soon. --- libvirt-gobject/libvirt-gobject-connection.c | 2 +- libvirt-gobject/libvirt-gobject-storage-pool.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c index 007d86e..71fa768 100644 --- a/libvirt-gobject/libvirt-gobject-connection.c +++ b/libvirt-gobject/libvirt-gobject-connection.c @@ -1170,7 +1170,7 @@ GVirDomain *gvir_connection_create_domain(GVirConnection *conn, virDomainPtr handle; GVirConnectionPrivate *priv = conn->priv;
- xml = gvir_config_object_get_doc(GVIR_CONFIG_OBJECT(conf)); + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf));
g_return_val_if_fail(xml != NULL, NULL);
diff --git a/libvirt-gobject/libvirt-gobject-storage-pool.c b/libvirt-gobject/libvirt-gobject-storage-pool.c index fc9cba9..8cc481e 100644 --- a/libvirt-gobject/libvirt-gobject-storage-pool.c +++ b/libvirt-gobject/libvirt-gobject-storage-pool.c @@ -491,7 +491,7 @@ GVirStorageVol *gvir_storage_pool_create_volume virStorageVolPtr handle; GVirStoragePoolPrivate *priv = pool->priv;
- xml = gvir_config_object_get_doc(GVIR_CONFIG_OBJECT(conf)); + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf));
g_return_val_if_fail(xml != NULL, 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 :|

On Fri, Oct 07, 2011 at 11:40:56AM +0200, Christophe Fergeau wrote:
s/gvir_config_object_get_doc/gvir_config_object_to_xml/
Prefer gvir_config_object_to_xml over gvir_config_object_get_doc since the latter will be removed soon.
This one needs an additional diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c index e3fafed..99687b8 100644 --- a/libvirt-gobject/libvirt-gobject-connection.c +++ b/libvirt-gobject/libvirt-gobject-connection.c @@ -1220,7 +1220,7 @@ GVirStoragePool *gvir_connection_create_storage_pool virStoragePoolPtr handle; GVirConnectionPrivate *priv = conn->priv; - xml = gvir_config_object_get_doc(GVIR_CONFIG_OBJECT(conf)); + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf)); g_return_val_if_fail(xml != NULL, NULL); when applied on top of current master
--- libvirt-gobject/libvirt-gobject-connection.c | 2 +- libvirt-gobject/libvirt-gobject-storage-pool.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c index 007d86e..71fa768 100644 --- a/libvirt-gobject/libvirt-gobject-connection.c +++ b/libvirt-gobject/libvirt-gobject-connection.c @@ -1170,7 +1170,7 @@ GVirDomain *gvir_connection_create_domain(GVirConnection *conn, virDomainPtr handle; GVirConnectionPrivate *priv = conn->priv;
- xml = gvir_config_object_get_doc(GVIR_CONFIG_OBJECT(conf)); + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf));
g_return_val_if_fail(xml != NULL, NULL);
diff --git a/libvirt-gobject/libvirt-gobject-storage-pool.c b/libvirt-gobject/libvirt-gobject-storage-pool.c index fc9cba9..8cc481e 100644 --- a/libvirt-gobject/libvirt-gobject-storage-pool.c +++ b/libvirt-gobject/libvirt-gobject-storage-pool.c @@ -491,7 +491,7 @@ GVirStorageVol *gvir_storage_pool_create_volume virStorageVolPtr handle; GVirStoragePoolPrivate *priv = pool->priv;
- xml = gvir_config_object_get_doc(GVIR_CONFIG_OBJECT(conf)); + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf));
g_return_val_if_fail(xml != NULL, NULL);
-- 1.7.6.4
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list

--- configure.ac | 1 + libvirt-gconfig/Makefile.am | 1 + libvirt-gconfig/tests/Makefile.am | 16 ++++++ libvirt-gconfig/tests/test-domain-create.c | 53 +++++++++++++++++++ libvirt-gconfig/tests/test-domain-invalid.xml | 6 ++ libvirt-gconfig/tests/test-domain-noname.xml | 4 ++ libvirt-gconfig/tests/test-domain-parse.c | 67 +++++++++++++++++++++++++ libvirt-gconfig/tests/test-domain.xml | 5 ++ 8 files changed, 153 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/tests/Makefile.am create mode 100644 libvirt-gconfig/tests/test-domain-create.c create mode 100644 libvirt-gconfig/tests/test-domain-invalid.xml create mode 100644 libvirt-gconfig/tests/test-domain-noname.xml create mode 100644 libvirt-gconfig/tests/test-domain-parse.c create mode 100644 libvirt-gconfig/tests/test-domain.xml diff --git a/configure.ac b/configure.ac index 0581874..7903281 100644 --- a/configure.ac +++ b/configure.ac @@ -201,6 +201,7 @@ AM_CONDITIONAL([WITH_GOBJECT_INTROSPECTION], [test "x$enable_introspection" = "x AC_OUTPUT(Makefile libvirt-glib/Makefile libvirt-gconfig/Makefile + libvirt-gconfig/tests/Makefile libvirt-gobject/Makefile examples/Makefile python/Makefile diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index 634ad5a..8296dd1 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -1,3 +1,4 @@ +SUBDIRS = . tests EXTRA_DIST = libvirt-gconfig.sym diff --git a/libvirt-gconfig/tests/Makefile.am b/libvirt-gconfig/tests/Makefile.am new file mode 100644 index 0000000..1406b17 --- /dev/null +++ b/libvirt-gconfig/tests/Makefile.am @@ -0,0 +1,16 @@ +noinst_PROGRAMS = test-domain-create test-domain-parse + +AM_CFLAGS = \ + $(GOBJECT2_CFLAGS) \ + $(LIBXML2_CFLAGS) \ + $(WARN_CFLAGS) +INCLUDES = -I$(top_srcdir)/libvirt-gconfig +LDADD = \ + $(top_builddir)/libvirt-gconfig/libvirt-gconfig-1.0.la \ + $(GOBJECT2_LIBS) \ + $(LIBXML2_LIBS) \ + $(CYGWIN_EXTRA_LIBADD) + +test_domain_create_SOURCES = test-domain-create.c + +test_domain_parse_SOURCES = test-domain-parse.c diff --git a/libvirt-gconfig/tests/test-domain-create.c b/libvirt-gconfig/tests/test-domain-create.c new file mode 100644 index 0000000..a742dd7 --- /dev/null +++ b/libvirt-gconfig/tests/test-domain-create.c @@ -0,0 +1,53 @@ +/* + * test-domain-create.c: test libvirt-gconfig domain creation + * + * Copyright (C) 2011 Red Hat + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * The Software is provided "as is", without warranty of any kind, express + * or implied, including but not limited to the warranties of + * merchantability, fitness for a particular purpose and noninfringement. + * In no event shall the authors or copyright holders be liable for any + * claim, damages or other liability, whether in an action of contract, + * tort or otherwise, arising from, out of or in connection with the + * software or the use or other dealings in the Software. + * + * Author: Christophe Fergeau <cfergeau@redhat.com> + */ + +#include <string.h> +#include <libvirt-gconfig/libvirt-gconfig.h> + +int main(void) +{ + GVirConfigDomain *domain; + char *name; + char *xml; + + g_type_init(); + + domain = gvir_config_domain_new(); + g_assert(domain != NULL); + gvir_config_domain_set_name(domain, "foo"); + name = gvir_config_domain_get_name(domain); + g_assert(name != NULL); + g_assert(strcmp(name, "foo") == 0); + g_free(name); + + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain)); + g_print("%s\n", xml); + g_free(xml); + g_object_unref(G_OBJECT(domain)); + + return 0; +} diff --git a/libvirt-gconfig/tests/test-domain-invalid.xml b/libvirt-gconfig/tests/test-domain-invalid.xml new file mode 100644 index 0000000..73c6e6e --- /dev/null +++ b/libvirt-gconfig/tests/test-domain-invalid.xml @@ -0,0 +1,6 @@ +<invalidtag +<domain type='xen' id='3'> + <name>fv0</name> + <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid> + <description>Some human readable description</description> +</domain> diff --git a/libvirt-gconfig/tests/test-domain-noname.xml b/libvirt-gconfig/tests/test-domain-noname.xml new file mode 100644 index 0000000..7974f83 --- /dev/null +++ b/libvirt-gconfig/tests/test-domain-noname.xml @@ -0,0 +1,4 @@ +<domain type='xen' id='3'> + <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid> + <description>Some human readable description</description> +</domain> diff --git a/libvirt-gconfig/tests/test-domain-parse.c b/libvirt-gconfig/tests/test-domain-parse.c new file mode 100644 index 0000000..3a36144 --- /dev/null +++ b/libvirt-gconfig/tests/test-domain-parse.c @@ -0,0 +1,67 @@ +/* + * test-domain-create.c: test libvirt-gconfig domain parsing + * + * Copyright (C) 2011 Red Hat + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * The Software is provided "as is", without warranty of any kind, express + * or implied, including but not limited to the warranties of + * merchantability, fitness for a particular purpose and noninfringement. + * In no event shall the authors or copyright holders be liable for any + * claim, damages or other liability, whether in an action of contract, + * tort or otherwise, arising from, out of or in connection with the + * software or the use or other dealings in the Software. + * + * Author: Christophe Fergeau <cfergeau@redhat.com> + */ + +#include <string.h> +#include <libvirt-gconfig/libvirt-gconfig.h> + + +int main(int argc, char **argv) +{ + GVirConfigDomain *domain; + char *name; + char *xml; + GError *error = NULL; + + if (argc != 2) { + g_print("Usage: %s filename\n", argv[0]); + g_print("Attempt to parse the libvirt XML definition from filename\n"); + return 1; + } + + g_file_get_contents(argv[1], &xml, NULL, &error); + if (error != NULL) { + g_print("Couldn't read %s: %s\n", argv[1], error->message); + return 2; + } + + g_type_init(); + + domain = gvir_config_domain_new_from_xml(xml); + g_assert(domain != NULL); + name = gvir_config_domain_get_name(domain); + g_assert(name != NULL); + g_assert(strcmp(name, "foo") == 0); + g_free(name); + g_free(xml); + + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain)); + g_print("%s\n", xml); + g_free(xml); + g_object_unref(G_OBJECT(domain)); + + return 0; +} diff --git a/libvirt-gconfig/tests/test-domain.xml b/libvirt-gconfig/tests/test-domain.xml new file mode 100644 index 0000000..08a926e --- /dev/null +++ b/libvirt-gconfig/tests/test-domain.xml @@ -0,0 +1,5 @@ +<domain type='xen' id='3'> + <name>foo</name> + <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid> + <description>Some human readable description</description> +</domain> -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:40:57AM +0200, Christophe Fergeau wrote:
--- configure.ac | 1 + libvirt-gconfig/Makefile.am | 1 + libvirt-gconfig/tests/Makefile.am | 16 ++++++ libvirt-gconfig/tests/test-domain-create.c | 53 +++++++++++++++++++ libvirt-gconfig/tests/test-domain-invalid.xml | 6 ++ libvirt-gconfig/tests/test-domain-noname.xml | 4 ++ libvirt-gconfig/tests/test-domain-parse.c | 67 +++++++++++++++++++++++++ libvirt-gconfig/tests/test-domain.xml | 5 ++ 8 files changed, 153 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/tests/Makefile.am create mode 100644 libvirt-gconfig/tests/test-domain-create.c create mode 100644 libvirt-gconfig/tests/test-domain-invalid.xml create mode 100644 libvirt-gconfig/tests/test-domain-noname.xml create mode 100644 libvirt-gconfig/tests/test-domain-parse.c create mode 100644 libvirt-gconfig/tests/test-domain.xml
diff --git a/configure.ac b/configure.ac index 0581874..7903281 100644 --- a/configure.ac +++ b/configure.ac @@ -201,6 +201,7 @@ AM_CONDITIONAL([WITH_GOBJECT_INTROSPECTION], [test "x$enable_introspection" = "x AC_OUTPUT(Makefile libvirt-glib/Makefile libvirt-gconfig/Makefile + libvirt-gconfig/tests/Makefile libvirt-gobject/Makefile examples/Makefile python/Makefile diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index 634ad5a..8296dd1 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -1,3 +1,4 @@ +SUBDIRS = . tests
EXTRA_DIST = libvirt-gconfig.sym
diff --git a/libvirt-gconfig/tests/Makefile.am b/libvirt-gconfig/tests/Makefile.am new file mode 100644 index 0000000..1406b17 --- /dev/null +++ b/libvirt-gconfig/tests/Makefile.am @@ -0,0 +1,16 @@ +noinst_PROGRAMS = test-domain-create test-domain-parse + +AM_CFLAGS = \ + $(GOBJECT2_CFLAGS) \ + $(LIBXML2_CFLAGS) \ + $(WARN_CFLAGS) +INCLUDES = -I$(top_srcdir)/libvirt-gconfig +LDADD = \ + $(top_builddir)/libvirt-gconfig/libvirt-gconfig-1.0.la \ + $(GOBJECT2_LIBS) \ + $(LIBXML2_LIBS) \ + $(CYGWIN_EXTRA_LIBADD) + +test_domain_create_SOURCES = test-domain-create.c + +test_domain_parse_SOURCES = test-domain-parse.c diff --git a/libvirt-gconfig/tests/test-domain-create.c b/libvirt-gconfig/tests/test-domain-create.c new file mode 100644 index 0000000..a742dd7 --- /dev/null +++ b/libvirt-gconfig/tests/test-domain-create.c @@ -0,0 +1,53 @@ +/* + * test-domain-create.c: test libvirt-gconfig domain creation + * + * Copyright (C) 2011 Red Hat + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * The Software is provided "as is", without warranty of any kind, express + * or implied, including but not limited to the warranties of + * merchantability, fitness for a particular purpose and noninfringement. + * In no event shall the authors or copyright holders be liable for any + * claim, damages or other liability, whether in an action of contract, + * tort or otherwise, arising from, out of or in connection with the + * software or the use or other dealings in the Software. + * + * Author: Christophe Fergeau <cfergeau@redhat.com> + */ + +#include <string.h> +#include <libvirt-gconfig/libvirt-gconfig.h> + +int main(void) +{ + GVirConfigDomain *domain; + char *name; + char *xml; + + g_type_init(); + + domain = gvir_config_domain_new(); + g_assert(domain != NULL); + gvir_config_domain_set_name(domain, "foo"); + name = gvir_config_domain_get_name(domain); + g_assert(name != NULL); + g_assert(strcmp(name, "foo") == 0); + g_free(name); + + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain)); + g_print("%s\n", xml); + g_free(xml); + g_object_unref(G_OBJECT(domain)); + + return 0; +} diff --git a/libvirt-gconfig/tests/test-domain-invalid.xml b/libvirt-gconfig/tests/test-domain-invalid.xml new file mode 100644 index 0000000..73c6e6e --- /dev/null +++ b/libvirt-gconfig/tests/test-domain-invalid.xml @@ -0,0 +1,6 @@ +<invalidtag +<domain type='xen' id='3'> + <name>fv0</name> + <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid> + <description>Some human readable description</description> +</domain> diff --git a/libvirt-gconfig/tests/test-domain-noname.xml b/libvirt-gconfig/tests/test-domain-noname.xml new file mode 100644 index 0000000..7974f83 --- /dev/null +++ b/libvirt-gconfig/tests/test-domain-noname.xml @@ -0,0 +1,4 @@ +<domain type='xen' id='3'> + <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid> + <description>Some human readable description</description> +</domain> diff --git a/libvirt-gconfig/tests/test-domain-parse.c b/libvirt-gconfig/tests/test-domain-parse.c new file mode 100644 index 0000000..3a36144 --- /dev/null +++ b/libvirt-gconfig/tests/test-domain-parse.c @@ -0,0 +1,67 @@ +/* + * test-domain-create.c: test libvirt-gconfig domain parsing + * + * Copyright (C) 2011 Red Hat + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * The Software is provided "as is", without warranty of any kind, express + * or implied, including but not limited to the warranties of + * merchantability, fitness for a particular purpose and noninfringement. + * In no event shall the authors or copyright holders be liable for any + * claim, damages or other liability, whether in an action of contract, + * tort or otherwise, arising from, out of or in connection with the + * software or the use or other dealings in the Software. + * + * Author: Christophe Fergeau <cfergeau@redhat.com> + */ + +#include <string.h> +#include <libvirt-gconfig/libvirt-gconfig.h> + + +int main(int argc, char **argv) +{ + GVirConfigDomain *domain; + char *name; + char *xml; + GError *error = NULL; + + if (argc != 2) { + g_print("Usage: %s filename\n", argv[0]); + g_print("Attempt to parse the libvirt XML definition from filename\n"); + return 1; + } + + g_file_get_contents(argv[1], &xml, NULL, &error); + if (error != NULL) { + g_print("Couldn't read %s: %s\n", argv[1], error->message); + return 2; + } + + g_type_init(); + + domain = gvir_config_domain_new_from_xml(xml); + g_assert(domain != NULL); + name = gvir_config_domain_get_name(domain); + g_assert(name != NULL); + g_assert(strcmp(name, "foo") == 0); + g_free(name); + g_free(xml); + + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain)); + g_print("%s\n", xml); + g_free(xml); + g_object_unref(G_OBJECT(domain)); + + return 0; +} diff --git a/libvirt-gconfig/tests/test-domain.xml b/libvirt-gconfig/tests/test-domain.xml new file mode 100644 index 0000000..08a926e --- /dev/null +++ b/libvirt-gconfig/tests/test-domain.xml @@ -0,0 +1,5 @@ +<domain type='xen' id='3'> + <name>foo</name> + <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid> + <description>Some human readable description</description> +</domain>
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 :|

GVirConfigObject also contains an xmlNodePtr which is more useful since it indicates the position of the current config object in the source XML file. Since xmlNode has a 'doc' member, having both an xmlNodePtr and an xmlDocPtr in GVirConfigObject is redundant. --- libvirt-gconfig/libvirt-gconfig-object.c | 50 +++++++++++++---------------- libvirt-gconfig/libvirt-gconfig-object.h | 1 - libvirt-gconfig/libvirt-gconfig.sym | 1 - 3 files changed, 22 insertions(+), 30 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 66102ec..b7829c9 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -43,10 +43,6 @@ struct _GVirConfigObjectPrivate gchar *doc; gchar *schema; - /* FIXME: docHandle is node->doc, can probably be removed to avoid the - * 2 getting out of sync - */ - xmlDocPtr docHandle; xmlNodePtr node; }; @@ -117,15 +113,17 @@ static void gvir_config_object_set_property(GObject *object, priv->schema = g_value_dup_string(value); break; - case PROP_NODE: - priv->node = g_value_get_pointer(value); - if ((priv->docHandle != NULL) && (priv->docHandle != priv->node->doc)) - xmlFreeDoc(priv->docHandle); - if (priv->node) - priv->docHandle = priv->node->doc; - else - priv->docHandle = NULL; + case PROP_NODE: { + xmlNodePtr node; + node = g_value_get_pointer(value); + if ((priv->node != NULL) + && (priv->node->doc != NULL) + && (priv->node->doc != node->doc)) { + xmlFreeDoc(priv->node->doc); + } + priv->node = node; break; + } default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); @@ -143,8 +141,12 @@ static void gvir_config_object_finalize(GObject *object) g_free(priv->doc); g_free(priv->schema); - if (priv->docHandle) - xmlFreeDoc(priv->docHandle); + /* FIXME: all objects describing a given XML document will share the + * same document so we can't destroy it here like this, we need some + * refcounting to know when to destroy it. + */ + if (priv->node) + xmlFreeDoc(priv->node->doc); G_OBJECT_CLASS(gvir_config_object_parent_class)->finalize(object); } @@ -212,7 +214,8 @@ gvir_config_object_parse(GVirConfigObject *config, GError **err) { GVirConfigObjectPrivate *priv = config->priv; - if (priv->docHandle) + xmlDocPtr doc; + if (priv->node) return; if (!priv->doc) { @@ -223,14 +226,14 @@ gvir_config_object_parse(GVirConfigObject *config, return; } - priv->docHandle = xmlParseMemory(priv->doc, strlen(priv->doc)); - if (!priv->docHandle) { + 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 = priv->docHandle->children; + priv->node = doc->children; } @@ -279,7 +282,7 @@ void gvir_config_object_validate(GVirConfigObject *config, return; } - if (xmlRelaxNGValidateDoc(rngValid, priv->docHandle) != 0) { + if (xmlRelaxNGValidateDoc(rngValid, priv->node->doc) != 0) { *err = gvir_xml_error_new(GVIR_CONFIG_OBJECT_ERROR, 0, "%s", @@ -324,15 +327,6 @@ const gchar *gvir_config_object_get_schema(GVirConfigObject *config) return priv->schema; } -/* NB: the xmlDocPtr must not be freed by the caller */ -/* gupnp has wrapped xmlDoc in a gobject */ -/* not really useful, can be obtained from xmlNode::doc */ -xmlDocPtr gvir_config_object_get_xml_doc(GVirConfigObject *config, GError **error) -{ - gvir_config_object_parse(config, error); - return config->priv->docHandle; -} - /* FIXME: will we always have one xmlNode per GConfig object? */ /* FIXME: need to return the right node from subclasses */ /* NB: the xmlNodePtr must not be freed by the caller */ diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index f6ac28b..40480ba 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -66,7 +66,6 @@ gchar *gvir_config_object_to_xml(GVirConfigObject *config); const gchar *gvir_config_object_get_doc(GVirConfigObject *config); const gchar *gvir_config_object_get_schema(GVirConfigObject *config); -xmlDocPtr gvir_config_object_get_xml_doc(GVirConfigObject *config, GError **error); xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config, GError **error); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 5c4492e..94e596e 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -29,7 +29,6 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_object_new; gvir_config_object_get_doc; gvir_config_object_get_schema; - gvir_config_object_get_xml_doc; gvir_config_object_get_xml_node; gvir_config_object_to_xml; gvir_config_object_validate; -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:40:58AM +0200, Christophe Fergeau wrote:
GVirConfigObject also contains an xmlNodePtr which is more useful since it indicates the position of the current config object in the source XML file. Since xmlNode has a 'doc' member, having both an xmlNodePtr and an xmlDocPtr in GVirConfigObject is redundant. --- libvirt-gconfig/libvirt-gconfig-object.c | 50 +++++++++++++---------------- libvirt-gconfig/libvirt-gconfig-object.h | 1 - libvirt-gconfig/libvirt-gconfig.sym | 1 - 3 files changed, 22 insertions(+), 30 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 66102ec..b7829c9 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -43,10 +43,6 @@ struct _GVirConfigObjectPrivate gchar *doc; gchar *schema;
- /* FIXME: docHandle is node->doc, can probably be removed to avoid the - * 2 getting out of sync - */ - xmlDocPtr docHandle; xmlNodePtr node; };
@@ -117,15 +113,17 @@ static void gvir_config_object_set_property(GObject *object, priv->schema = g_value_dup_string(value); break;
- case PROP_NODE: - priv->node = g_value_get_pointer(value); - if ((priv->docHandle != NULL) && (priv->docHandle != priv->node->doc)) - xmlFreeDoc(priv->docHandle); - if (priv->node) - priv->docHandle = priv->node->doc; - else - priv->docHandle = NULL; + case PROP_NODE: { + xmlNodePtr node; + node = g_value_get_pointer(value); + if ((priv->node != NULL) + && (priv->node->doc != NULL) + && (priv->node->doc != node->doc)) { + xmlFreeDoc(priv->node->doc); + } + priv->node = node; break; + }
default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); @@ -143,8 +141,12 @@ static void gvir_config_object_finalize(GObject *object) g_free(priv->doc); g_free(priv->schema);
- if (priv->docHandle) - xmlFreeDoc(priv->docHandle); + /* FIXME: all objects describing a given XML document will share the + * same document so we can't destroy it here like this, we need some + * refcounting to know when to destroy it. + */ + if (priv->node) + xmlFreeDoc(priv->node->doc);
This could be reason for creating a trivial GObject to wrap the xmlDocPtr instance, gaining ref counting. 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 :|

On Tue, Oct 18, 2011 at 12:44:27PM +0100, Daniel P. Berrange wrote:
- if (priv->docHandle) - xmlFreeDoc(priv->docHandle); + /* FIXME: all objects describing a given XML document will share the + * same document so we can't destroy it here like this, we need some + * refcounting to know when to destroy it. + */ + if (priv->node) + xmlFreeDoc(priv->node->doc);
This could be reason for creating a trivial GObject to wrap the xmlDocPtr instance, gaining ref counting.
Yes, that's the plan, and that's also why I mentioned this gupnp object in one of the previous commits. Christophe

These functions now create empty config objects to be consistent with what gvir_config_domain_new does. --- libvirt-gconfig/libvirt-gconfig-capabilities.c | 10 ++++++++-- libvirt-gconfig/libvirt-gconfig-capabilities.h | 2 +- libvirt-gconfig/libvirt-gconfig-domain-snapshot.c | 9 +++++++-- libvirt-gconfig/libvirt-gconfig-domain-snapshot.h | 2 +- libvirt-gconfig/libvirt-gconfig-interface.c | 12 ++++++++---- libvirt-gconfig/libvirt-gconfig-interface.h | 2 +- libvirt-gconfig/libvirt-gconfig-network-filter.c | 8 ++++++-- libvirt-gconfig/libvirt-gconfig-network-filter.h | 2 +- libvirt-gconfig/libvirt-gconfig-network.c | 8 ++++++-- libvirt-gconfig/libvirt-gconfig-network.h | 2 +- libvirt-gconfig/libvirt-gconfig-node-device.c | 9 +++++++-- libvirt-gconfig/libvirt-gconfig-node-device.h | 2 +- libvirt-gconfig/libvirt-gconfig-secret.c | 8 ++++++-- libvirt-gconfig/libvirt-gconfig-secret.h | 2 +- libvirt-gconfig/libvirt-gconfig-storage-pool.c | 8 ++++++-- libvirt-gconfig/libvirt-gconfig-storage-pool.h | 2 +- libvirt-gconfig/libvirt-gconfig-storage-vol.c | 12 ++++++++---- libvirt-gconfig/libvirt-gconfig-storage-vol.h | 2 +- libvirt-gobject/libvirt-gobject-domain-snapshot.c | 3 +++ libvirt-gobject/libvirt-gobject-interface.c | 3 +++ libvirt-gobject/libvirt-gobject-network-filter.c | 3 +++ libvirt-gobject/libvirt-gobject-network.c | 3 +++ libvirt-gobject/libvirt-gobject-node-device.c | 4 ++++ libvirt-gobject/libvirt-gobject-secret.c | 4 ++++ libvirt-gobject/libvirt-gobject-storage-pool.c | 3 +++ libvirt-gobject/libvirt-gobject-storage-vol.c | 3 +++ 26 files changed, 97 insertions(+), 31 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-capabilities.c b/libvirt-gconfig/libvirt-gconfig-capabilities.c index b881a17..8ed0e2e 100644 --- a/libvirt-gconfig/libvirt-gconfig-capabilities.c +++ b/libvirt-gconfig/libvirt-gconfig-capabilities.c @@ -61,10 +61,16 @@ static void gvir_config_capabilities_init(GVirConfigCapabilities *conn) } -GVirConfigCapabilities *gvir_config_capabilities_new(const gchar *xml) +GVirConfigCapabilities *gvir_config_capabilities_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + /* FIXME: what is the XML root of the capability node? I suspect it is + * either 'guest' or 'host' */ + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"capabilities", NULL); return GVIR_CONFIG_CAPABILITIES(g_object_new(GVIR_TYPE_CONFIG_CAPABILITIES, - "doc", xml, + "node", doc->children, "schema", DATADIR "/libvirt/schemas/capability.rng", NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-capabilities.h b/libvirt-gconfig/libvirt-gconfig-capabilities.h index 5b79cab..b5660df 100644 --- a/libvirt-gconfig/libvirt-gconfig-capabilities.h +++ b/libvirt-gconfig/libvirt-gconfig-capabilities.h @@ -59,7 +59,7 @@ struct _GVirConfigCapabilitiesClass GType gvir_config_capabilities_get_type(void); -GVirConfigCapabilities *gvir_config_capabilities_new(const gchar *xml); +GVirConfigCapabilities *gvir_config_capabilities_new(void); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig-domain-snapshot.c b/libvirt-gconfig/libvirt-gconfig-domain-snapshot.c index 841f7af..35f63ec 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-snapshot.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-snapshot.c @@ -61,10 +61,15 @@ static void gvir_config_domain_snapshot_init(GVirConfigDomainSnapshot *conn) } -GVirConfigDomainSnapshot *gvir_config_domain_snapshot_new(const gchar *xml) +GVirConfigDomainSnapshot *gvir_config_domain_snapshot_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"domainsnapshot", NULL); + return GVIR_CONFIG_DOMAIN_SNAPSHOT(g_object_new(GVIR_TYPE_CONFIG_DOMAIN_SNAPSHOT, - "doc", xml, + "node", doc->children, "schema", DATADIR "/libvirt/schemas/domainsnapshot.rng", NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-domain-snapshot.h b/libvirt-gconfig/libvirt-gconfig-domain-snapshot.h index c6598c2..1924903 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-snapshot.h +++ b/libvirt-gconfig/libvirt-gconfig-domain-snapshot.h @@ -59,7 +59,7 @@ struct _GVirConfigDomainSnapshotClass GType gvir_config_domain_snapshot_get_type(void); -GVirConfigDomainSnapshot *gvir_config_domain_snapshot_new(const gchar *xml); +GVirConfigDomainSnapshot *gvir_config_domain_snapshot_new(void); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig-interface.c b/libvirt-gconfig/libvirt-gconfig-interface.c index 181ae52..48cbcfb 100644 --- a/libvirt-gconfig/libvirt-gconfig-interface.c +++ b/libvirt-gconfig/libvirt-gconfig-interface.c @@ -61,10 +61,14 @@ static void gvir_config_interface_init(GVirConfigInterface *conn) } -GVirConfigInterface *gvir_config_interface_new(const gchar *xml) +GVirConfigInterface *gvir_config_interface_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"interface", NULL); return GVIR_CONFIG_INTERFACE(g_object_new(GVIR_TYPE_CONFIG_INTERFACE, - "doc", xml, - "schema", DATADIR "/libvirt/schemas/interface.rng", - NULL)); + "node", doc->children, + "schema", DATADIR "/libvirt/schemas/interface.rng", + NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-interface.h b/libvirt-gconfig/libvirt-gconfig-interface.h index ca5e6cf..abfcc4e 100644 --- a/libvirt-gconfig/libvirt-gconfig-interface.h +++ b/libvirt-gconfig/libvirt-gconfig-interface.h @@ -59,7 +59,7 @@ struct _GVirConfigInterfaceClass GType gvir_config_interface_get_type(void); -GVirConfigInterface *gvir_config_interface_new(const gchar *xml); +GVirConfigInterface *gvir_config_interface_new(void); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig-network-filter.c b/libvirt-gconfig/libvirt-gconfig-network-filter.c index 783a5ed..1b4c22d 100644 --- a/libvirt-gconfig/libvirt-gconfig-network-filter.c +++ b/libvirt-gconfig/libvirt-gconfig-network-filter.c @@ -61,10 +61,14 @@ static void gvir_config_network_filter_init(GVirConfigNetworkFilter *conn) } -GVirConfigNetworkFilter *gvir_config_network_filter_new(const gchar *xml) +GVirConfigNetworkFilter *gvir_config_network_filter_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"filter", NULL); return GVIR_CONFIG_NETWORK_FILTER(g_object_new(GVIR_TYPE_CONFIG_NETWORK_FILTER, - "doc", xml, + "node", doc->children, "schema", DATADIR "/libvirt/schemas/nwfilter.rng", NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-network-filter.h b/libvirt-gconfig/libvirt-gconfig-network-filter.h index 0d50b2c..c3f87b7 100644 --- a/libvirt-gconfig/libvirt-gconfig-network-filter.h +++ b/libvirt-gconfig/libvirt-gconfig-network-filter.h @@ -59,7 +59,7 @@ struct _GVirConfigNetworkFilterClass GType gvir_config_network_filter_get_type(void); -GVirConfigNetworkFilter *gvir_config_network_filter_new(const gchar *xml); +GVirConfigNetworkFilter *gvir_config_network_filter_new(void); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig-network.c b/libvirt-gconfig/libvirt-gconfig-network.c index a6310e3..f2d19f7 100644 --- a/libvirt-gconfig/libvirt-gconfig-network.c +++ b/libvirt-gconfig/libvirt-gconfig-network.c @@ -61,10 +61,14 @@ static void gvir_config_network_init(GVirConfigNetwork *conn) } -GVirConfigNetwork *gvir_config_network_new(const gchar *xml) +GVirConfigNetwork *gvir_config_network_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"network", NULL); return GVIR_CONFIG_NETWORK(g_object_new(GVIR_TYPE_CONFIG_NETWORK, - "doc", xml, + "node", doc->children, "schema", DATADIR "/libvirt/schemas/network.rng", NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-network.h b/libvirt-gconfig/libvirt-gconfig-network.h index 79b80d0..f156971 100644 --- a/libvirt-gconfig/libvirt-gconfig-network.h +++ b/libvirt-gconfig/libvirt-gconfig-network.h @@ -59,7 +59,7 @@ struct _GVirConfigNetworkClass GType gvir_config_network_get_type(void); -GVirConfigNetwork *gvir_config_network_new(const gchar *xml); +GVirConfigNetwork *gvir_config_network_new(void); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig-node-device.c b/libvirt-gconfig/libvirt-gconfig-node-device.c index 8f028ee..a6e6d9e 100644 --- a/libvirt-gconfig/libvirt-gconfig-node-device.c +++ b/libvirt-gconfig/libvirt-gconfig-node-device.c @@ -61,10 +61,15 @@ static void gvir_config_node_device_init(GVirConfigNodeDevice *conn) } -GVirConfigNodeDevice *gvir_config_node_device_new(const gchar *xml) +GVirConfigNodeDevice *gvir_config_node_device_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + /* FIXME: correct node name ? */ + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"device", NULL); return GVIR_CONFIG_NODE_DEVICE(g_object_new(GVIR_TYPE_CONFIG_NODE_DEVICE, - "doc", xml, + "node", doc->children, "schema", DATADIR "/libvirt/schemas/nodedev.rng", NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-node-device.h b/libvirt-gconfig/libvirt-gconfig-node-device.h index d9ddacf..720b580 100644 --- a/libvirt-gconfig/libvirt-gconfig-node-device.h +++ b/libvirt-gconfig/libvirt-gconfig-node-device.h @@ -59,7 +59,7 @@ struct _GVirConfigNodeDeviceClass GType gvir_config_node_device_get_type(void); -GVirConfigNodeDevice *gvir_config_node_device_new(const gchar *xml); +GVirConfigNodeDevice *gvir_config_node_device_new(void); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig-secret.c b/libvirt-gconfig/libvirt-gconfig-secret.c index 5b639a9..505de4c 100644 --- a/libvirt-gconfig/libvirt-gconfig-secret.c +++ b/libvirt-gconfig/libvirt-gconfig-secret.c @@ -61,10 +61,14 @@ static void gvir_config_secret_init(GVirConfigSecret *conn) } -GVirConfigSecret *gvir_config_secret_new(const gchar *xml) +GVirConfigSecret *gvir_config_secret_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"secret", NULL); return GVIR_CONFIG_SECRET(g_object_new(GVIR_TYPE_CONFIG_SECRET, - "doc", xml, + "node", doc->children, "schema", DATADIR "/libvirt/schemas/secret.rng", NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-secret.h b/libvirt-gconfig/libvirt-gconfig-secret.h index 8163ef9..fbd4564 100644 --- a/libvirt-gconfig/libvirt-gconfig-secret.h +++ b/libvirt-gconfig/libvirt-gconfig-secret.h @@ -59,7 +59,7 @@ struct _GVirConfigSecretClass GType gvir_config_secret_get_type(void); -GVirConfigSecret *gvir_config_secret_new(const gchar *xml); +GVirConfigSecret *gvir_config_secret_new(void); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig-storage-pool.c b/libvirt-gconfig/libvirt-gconfig-storage-pool.c index 3d6ce5e..ef32aeb 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-pool.c +++ b/libvirt-gconfig/libvirt-gconfig-storage-pool.c @@ -61,10 +61,14 @@ static void gvir_config_storage_pool_init(GVirConfigStoragePool *conn) } -GVirConfigStoragePool *gvir_config_storage_pool_new(const gchar *xml) +GVirConfigStoragePool *gvir_config_storage_pool_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"pool", NULL); return GVIR_CONFIG_STORAGE_POOL(g_object_new(GVIR_TYPE_CONFIG_STORAGE_POOL, - "doc", xml, + "node", doc->children, "schema", DATADIR "/libvirt/schemas/storagepool.rng", NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-storage-pool.h b/libvirt-gconfig/libvirt-gconfig-storage-pool.h index fcf2fda..e5912f9 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-pool.h +++ b/libvirt-gconfig/libvirt-gconfig-storage-pool.h @@ -59,7 +59,7 @@ struct _GVirConfigStoragePoolClass GType gvir_config_storage_pool_get_type(void); -GVirConfigStoragePool *gvir_config_storage_pool_new(const gchar *xml); +GVirConfigStoragePool *gvir_config_storage_pool_new(void); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig-storage-vol.c b/libvirt-gconfig/libvirt-gconfig-storage-vol.c index d3ac8de..886b1e0 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-vol.c +++ b/libvirt-gconfig/libvirt-gconfig-storage-vol.c @@ -61,10 +61,14 @@ static void gvir_config_storage_vol_init(GVirConfigStorageVol *conn) } -GVirConfigStorageVol *gvir_config_storage_vol_new(const gchar *xml) +GVirConfigStorageVol *gvir_config_storage_vol_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"volume", NULL); return GVIR_CONFIG_STORAGE_VOL(g_object_new(GVIR_TYPE_CONFIG_STORAGE_VOL, - "doc", xml, - "schema", DATADIR "/libvirt/schemas/storage_vol.rng", - NULL)); + "node", doc->children, + "schema", DATADIR "/libvirt/schemas/storage_vol.rng", + NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-storage-vol.h b/libvirt-gconfig/libvirt-gconfig-storage-vol.h index 73032b6..08a2180 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-vol.h +++ b/libvirt-gconfig/libvirt-gconfig-storage-vol.h @@ -59,7 +59,7 @@ struct _GVirConfigStorageVolClass GType gvir_config_storage_vol_get_type(void); -GVirConfigStorageVol *gvir_config_storage_vol_new(const gchar *xml); +GVirConfigStorageVol *gvir_config_storage_vol_new(void); G_END_DECLS diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c b/libvirt-gobject/libvirt-gobject-domain-snapshot.c index cc17b60..530907d 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c @@ -213,8 +213,11 @@ GVirConfigDomainSnapshot *gvir_domain_snapshot_get_config return NULL; } +#if 0 GVirConfigDomainSnapshot *conf = gvir_config_domain_snapshot_new(xml); g_free(xml); return conf; +#endif + return NULL; } diff --git a/libvirt-gobject/libvirt-gobject-interface.c b/libvirt-gobject/libvirt-gobject-interface.c index b37a7fa..2c56492 100644 --- a/libvirt-gobject/libvirt-gobject-interface.c +++ b/libvirt-gobject/libvirt-gobject-interface.c @@ -203,8 +203,11 @@ GVirConfigInterface *gvir_interface_get_config(GVirInterface *iface, return NULL; } +#if 0 GVirConfigInterface *conf = gvir_config_interface_new(xml); g_free(xml); return conf; +#endif + return NULL; } diff --git a/libvirt-gobject/libvirt-gobject-network-filter.c b/libvirt-gobject/libvirt-gobject-network-filter.c index eb10ce9..b043e42 100644 --- a/libvirt-gobject/libvirt-gobject-network-filter.c +++ b/libvirt-gobject/libvirt-gobject-network-filter.c @@ -228,8 +228,11 @@ GVirConfigNetworkFilter *gvir_network_filter_get_config return NULL; } +#if 0 GVirConfigNetworkFilter *conf = gvir_config_network_filter_new(xml); g_free(xml); return conf; +#endif + return NULL; } diff --git a/libvirt-gobject/libvirt-gobject-network.c b/libvirt-gobject/libvirt-gobject-network.c index 158afa4..34692fd 100644 --- a/libvirt-gobject/libvirt-gobject-network.c +++ b/libvirt-gobject/libvirt-gobject-network.c @@ -224,8 +224,11 @@ GVirConfigNetwork *gvir_network_get_config(GVirNetwork *network, return NULL; } +#if 0 GVirConfigNetwork *conf = gvir_config_network_new(xml); g_free(xml); return conf; +#endif + return NULL; } diff --git a/libvirt-gobject/libvirt-gobject-node-device.c b/libvirt-gobject/libvirt-gobject-node-device.c index 2847fc6..b3ae6bf 100644 --- a/libvirt-gobject/libvirt-gobject-node-device.c +++ b/libvirt-gobject/libvirt-gobject-node-device.c @@ -203,8 +203,12 @@ GVirConfigNodeDevice *gvir_node_device_get_config(GVirNodeDevice *device, return NULL; } +#if 0 GVirConfigNodeDevice *conf = gvir_config_node_device_new(xml); g_free(xml); return conf; +#endif + + return NULL; } diff --git a/libvirt-gobject/libvirt-gobject-secret.c b/libvirt-gobject/libvirt-gobject-secret.c index ffff521..b39bac5 100644 --- a/libvirt-gobject/libvirt-gobject-secret.c +++ b/libvirt-gobject/libvirt-gobject-secret.c @@ -214,8 +214,12 @@ GVirConfigSecret *gvir_secret_get_config(GVirSecret *secret, return NULL; } +#if 0 GVirConfigSecret *conf = gvir_config_secret_new(xml); g_free(xml); return conf; +#endif + + return NULL; } diff --git a/libvirt-gobject/libvirt-gobject-storage-pool.c b/libvirt-gobject/libvirt-gobject-storage-pool.c index 8cc481e..d790a92 100644 --- a/libvirt-gobject/libvirt-gobject-storage-pool.c +++ b/libvirt-gobject/libvirt-gobject-storage-pool.c @@ -239,10 +239,13 @@ GVirConfigStoragePool *gvir_storage_pool_get_config(GVirStoragePool *pool, return NULL; } +#if 0 GVirConfigStoragePool *conf = gvir_config_storage_pool_new(xml); g_free(xml); return conf; +#endif + return NULL; } typedef gint (* CountFunction) (virStoragePoolPtr vpool); diff --git a/libvirt-gobject/libvirt-gobject-storage-vol.c b/libvirt-gobject/libvirt-gobject-storage-vol.c index 6cbae84..0d94cd5 100644 --- a/libvirt-gobject/libvirt-gobject-storage-vol.c +++ b/libvirt-gobject/libvirt-gobject-storage-vol.c @@ -214,8 +214,11 @@ GVirConfigStorageVol *gvir_storage_vol_get_config(GVirStorageVol *vol, return NULL; } +#if 0 GVirConfigStorageVol *conf = gvir_config_storage_vol_new(xml); g_free(xml); return conf; +#endif + return NULL; } -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:40:59AM +0200, Christophe Fergeau wrote:
These functions now create empty config objects to be consistent with what gvir_config_domain_new does. --- libvirt-gconfig/libvirt-gconfig-capabilities.c | 10 ++++++++-- libvirt-gconfig/libvirt-gconfig-capabilities.h | 2 +- libvirt-gconfig/libvirt-gconfig-domain-snapshot.c | 9 +++++++-- libvirt-gconfig/libvirt-gconfig-domain-snapshot.h | 2 +- libvirt-gconfig/libvirt-gconfig-interface.c | 12 ++++++++---- libvirt-gconfig/libvirt-gconfig-interface.h | 2 +- libvirt-gconfig/libvirt-gconfig-network-filter.c | 8 ++++++-- libvirt-gconfig/libvirt-gconfig-network-filter.h | 2 +- libvirt-gconfig/libvirt-gconfig-network.c | 8 ++++++-- libvirt-gconfig/libvirt-gconfig-network.h | 2 +- libvirt-gconfig/libvirt-gconfig-node-device.c | 9 +++++++-- libvirt-gconfig/libvirt-gconfig-node-device.h | 2 +- libvirt-gconfig/libvirt-gconfig-secret.c | 8 ++++++-- libvirt-gconfig/libvirt-gconfig-secret.h | 2 +- libvirt-gconfig/libvirt-gconfig-storage-pool.c | 8 ++++++-- libvirt-gconfig/libvirt-gconfig-storage-pool.h | 2 +- libvirt-gconfig/libvirt-gconfig-storage-vol.c | 12 ++++++++---- libvirt-gconfig/libvirt-gconfig-storage-vol.h | 2 +- libvirt-gobject/libvirt-gobject-domain-snapshot.c | 3 +++ libvirt-gobject/libvirt-gobject-interface.c | 3 +++ libvirt-gobject/libvirt-gobject-network-filter.c | 3 +++ libvirt-gobject/libvirt-gobject-network.c | 3 +++ libvirt-gobject/libvirt-gobject-node-device.c | 4 ++++ libvirt-gobject/libvirt-gobject-secret.c | 4 ++++ libvirt-gobject/libvirt-gobject-storage-pool.c | 3 +++ libvirt-gobject/libvirt-gobject-storage-vol.c | 3 +++ 26 files changed, 97 insertions(+), 31 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-capabilities.c b/libvirt-gconfig/libvirt-gconfig-capabilities.c index b881a17..8ed0e2e 100644 --- a/libvirt-gconfig/libvirt-gconfig-capabilities.c +++ b/libvirt-gconfig/libvirt-gconfig-capabilities.c @@ -61,10 +61,16 @@ static void gvir_config_capabilities_init(GVirConfigCapabilities *conn) }
-GVirConfigCapabilities *gvir_config_capabilities_new(const gchar *xml) +GVirConfigCapabilities *gvir_config_capabilities_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + /* FIXME: what is the XML root of the capability node? I suspect it is + * either 'guest' or 'host' */ + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"capabilities", NULL); return GVIR_CONFIG_CAPABILITIES(g_object_new(GVIR_TYPE_CONFIG_CAPABILITIES, - "doc", xml, + "node", doc->children, "schema", DATADIR "/libvirt/schemas/capability.rng", NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-capabilities.h b/libvirt-gconfig/libvirt-gconfig-capabilities.h index 5b79cab..b5660df 100644 --- a/libvirt-gconfig/libvirt-gconfig-capabilities.h +++ b/libvirt-gconfig/libvirt-gconfig-capabilities.h @@ -59,7 +59,7 @@ struct _GVirConfigCapabilitiesClass
GType gvir_config_capabilities_get_type(void);
-GVirConfigCapabilities *gvir_config_capabilities_new(const gchar *xml); +GVirConfigCapabilities *gvir_config_capabilities_new(void);
G_END_DECLS
diff --git a/libvirt-gconfig/libvirt-gconfig-domain-snapshot.c b/libvirt-gconfig/libvirt-gconfig-domain-snapshot.c index 841f7af..35f63ec 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-snapshot.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-snapshot.c @@ -61,10 +61,15 @@ static void gvir_config_domain_snapshot_init(GVirConfigDomainSnapshot *conn) }
-GVirConfigDomainSnapshot *gvir_config_domain_snapshot_new(const gchar *xml) +GVirConfigDomainSnapshot *gvir_config_domain_snapshot_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"domainsnapshot", NULL); + return GVIR_CONFIG_DOMAIN_SNAPSHOT(g_object_new(GVIR_TYPE_CONFIG_DOMAIN_SNAPSHOT, - "doc", xml, + "node", doc->children, "schema", DATADIR "/libvirt/schemas/domainsnapshot.rng", NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-domain-snapshot.h b/libvirt-gconfig/libvirt-gconfig-domain-snapshot.h index c6598c2..1924903 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-snapshot.h +++ b/libvirt-gconfig/libvirt-gconfig-domain-snapshot.h @@ -59,7 +59,7 @@ struct _GVirConfigDomainSnapshotClass
GType gvir_config_domain_snapshot_get_type(void);
-GVirConfigDomainSnapshot *gvir_config_domain_snapshot_new(const gchar *xml); +GVirConfigDomainSnapshot *gvir_config_domain_snapshot_new(void);
G_END_DECLS
diff --git a/libvirt-gconfig/libvirt-gconfig-interface.c b/libvirt-gconfig/libvirt-gconfig-interface.c index 181ae52..48cbcfb 100644 --- a/libvirt-gconfig/libvirt-gconfig-interface.c +++ b/libvirt-gconfig/libvirt-gconfig-interface.c @@ -61,10 +61,14 @@ static void gvir_config_interface_init(GVirConfigInterface *conn) }
-GVirConfigInterface *gvir_config_interface_new(const gchar *xml) +GVirConfigInterface *gvir_config_interface_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"interface", NULL); return GVIR_CONFIG_INTERFACE(g_object_new(GVIR_TYPE_CONFIG_INTERFACE, - "doc", xml, - "schema", DATADIR "/libvirt/schemas/interface.rng", - NULL)); + "node", doc->children, + "schema", DATADIR "/libvirt/schemas/interface.rng", + NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-interface.h b/libvirt-gconfig/libvirt-gconfig-interface.h index ca5e6cf..abfcc4e 100644 --- a/libvirt-gconfig/libvirt-gconfig-interface.h +++ b/libvirt-gconfig/libvirt-gconfig-interface.h @@ -59,7 +59,7 @@ struct _GVirConfigInterfaceClass
GType gvir_config_interface_get_type(void);
-GVirConfigInterface *gvir_config_interface_new(const gchar *xml); +GVirConfigInterface *gvir_config_interface_new(void);
G_END_DECLS
diff --git a/libvirt-gconfig/libvirt-gconfig-network-filter.c b/libvirt-gconfig/libvirt-gconfig-network-filter.c index 783a5ed..1b4c22d 100644 --- a/libvirt-gconfig/libvirt-gconfig-network-filter.c +++ b/libvirt-gconfig/libvirt-gconfig-network-filter.c @@ -61,10 +61,14 @@ static void gvir_config_network_filter_init(GVirConfigNetworkFilter *conn) }
-GVirConfigNetworkFilter *gvir_config_network_filter_new(const gchar *xml) +GVirConfigNetworkFilter *gvir_config_network_filter_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"filter", NULL); return GVIR_CONFIG_NETWORK_FILTER(g_object_new(GVIR_TYPE_CONFIG_NETWORK_FILTER, - "doc", xml, + "node", doc->children, "schema", DATADIR "/libvirt/schemas/nwfilter.rng", NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-network-filter.h b/libvirt-gconfig/libvirt-gconfig-network-filter.h index 0d50b2c..c3f87b7 100644 --- a/libvirt-gconfig/libvirt-gconfig-network-filter.h +++ b/libvirt-gconfig/libvirt-gconfig-network-filter.h @@ -59,7 +59,7 @@ struct _GVirConfigNetworkFilterClass
GType gvir_config_network_filter_get_type(void);
-GVirConfigNetworkFilter *gvir_config_network_filter_new(const gchar *xml); +GVirConfigNetworkFilter *gvir_config_network_filter_new(void);
G_END_DECLS
diff --git a/libvirt-gconfig/libvirt-gconfig-network.c b/libvirt-gconfig/libvirt-gconfig-network.c index a6310e3..f2d19f7 100644 --- a/libvirt-gconfig/libvirt-gconfig-network.c +++ b/libvirt-gconfig/libvirt-gconfig-network.c @@ -61,10 +61,14 @@ static void gvir_config_network_init(GVirConfigNetwork *conn) }
-GVirConfigNetwork *gvir_config_network_new(const gchar *xml) +GVirConfigNetwork *gvir_config_network_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"network", NULL); return GVIR_CONFIG_NETWORK(g_object_new(GVIR_TYPE_CONFIG_NETWORK, - "doc", xml, + "node", doc->children, "schema", DATADIR "/libvirt/schemas/network.rng", NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-network.h b/libvirt-gconfig/libvirt-gconfig-network.h index 79b80d0..f156971 100644 --- a/libvirt-gconfig/libvirt-gconfig-network.h +++ b/libvirt-gconfig/libvirt-gconfig-network.h @@ -59,7 +59,7 @@ struct _GVirConfigNetworkClass
GType gvir_config_network_get_type(void);
-GVirConfigNetwork *gvir_config_network_new(const gchar *xml); +GVirConfigNetwork *gvir_config_network_new(void);
G_END_DECLS
diff --git a/libvirt-gconfig/libvirt-gconfig-node-device.c b/libvirt-gconfig/libvirt-gconfig-node-device.c index 8f028ee..a6e6d9e 100644 --- a/libvirt-gconfig/libvirt-gconfig-node-device.c +++ b/libvirt-gconfig/libvirt-gconfig-node-device.c @@ -61,10 +61,15 @@ static void gvir_config_node_device_init(GVirConfigNodeDevice *conn) }
-GVirConfigNodeDevice *gvir_config_node_device_new(const gchar *xml) +GVirConfigNodeDevice *gvir_config_node_device_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + /* FIXME: correct node name ? */ + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"device", NULL); return GVIR_CONFIG_NODE_DEVICE(g_object_new(GVIR_TYPE_CONFIG_NODE_DEVICE, - "doc", xml, + "node", doc->children, "schema", DATADIR "/libvirt/schemas/nodedev.rng", NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-node-device.h b/libvirt-gconfig/libvirt-gconfig-node-device.h index d9ddacf..720b580 100644 --- a/libvirt-gconfig/libvirt-gconfig-node-device.h +++ b/libvirt-gconfig/libvirt-gconfig-node-device.h @@ -59,7 +59,7 @@ struct _GVirConfigNodeDeviceClass
GType gvir_config_node_device_get_type(void);
-GVirConfigNodeDevice *gvir_config_node_device_new(const gchar *xml); +GVirConfigNodeDevice *gvir_config_node_device_new(void);
G_END_DECLS
diff --git a/libvirt-gconfig/libvirt-gconfig-secret.c b/libvirt-gconfig/libvirt-gconfig-secret.c index 5b639a9..505de4c 100644 --- a/libvirt-gconfig/libvirt-gconfig-secret.c +++ b/libvirt-gconfig/libvirt-gconfig-secret.c @@ -61,10 +61,14 @@ static void gvir_config_secret_init(GVirConfigSecret *conn) }
-GVirConfigSecret *gvir_config_secret_new(const gchar *xml) +GVirConfigSecret *gvir_config_secret_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"secret", NULL); return GVIR_CONFIG_SECRET(g_object_new(GVIR_TYPE_CONFIG_SECRET, - "doc", xml, + "node", doc->children, "schema", DATADIR "/libvirt/schemas/secret.rng", NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-secret.h b/libvirt-gconfig/libvirt-gconfig-secret.h index 8163ef9..fbd4564 100644 --- a/libvirt-gconfig/libvirt-gconfig-secret.h +++ b/libvirt-gconfig/libvirt-gconfig-secret.h @@ -59,7 +59,7 @@ struct _GVirConfigSecretClass
GType gvir_config_secret_get_type(void);
-GVirConfigSecret *gvir_config_secret_new(const gchar *xml); +GVirConfigSecret *gvir_config_secret_new(void);
G_END_DECLS
diff --git a/libvirt-gconfig/libvirt-gconfig-storage-pool.c b/libvirt-gconfig/libvirt-gconfig-storage-pool.c index 3d6ce5e..ef32aeb 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-pool.c +++ b/libvirt-gconfig/libvirt-gconfig-storage-pool.c @@ -61,10 +61,14 @@ static void gvir_config_storage_pool_init(GVirConfigStoragePool *conn) }
-GVirConfigStoragePool *gvir_config_storage_pool_new(const gchar *xml) +GVirConfigStoragePool *gvir_config_storage_pool_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"pool", NULL); return GVIR_CONFIG_STORAGE_POOL(g_object_new(GVIR_TYPE_CONFIG_STORAGE_POOL, - "doc", xml, + "node", doc->children, "schema", DATADIR "/libvirt/schemas/storagepool.rng", NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-storage-pool.h b/libvirt-gconfig/libvirt-gconfig-storage-pool.h index fcf2fda..e5912f9 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-pool.h +++ b/libvirt-gconfig/libvirt-gconfig-storage-pool.h @@ -59,7 +59,7 @@ struct _GVirConfigStoragePoolClass
GType gvir_config_storage_pool_get_type(void);
-GVirConfigStoragePool *gvir_config_storage_pool_new(const gchar *xml); +GVirConfigStoragePool *gvir_config_storage_pool_new(void);
G_END_DECLS
diff --git a/libvirt-gconfig/libvirt-gconfig-storage-vol.c b/libvirt-gconfig/libvirt-gconfig-storage-vol.c index d3ac8de..886b1e0 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-vol.c +++ b/libvirt-gconfig/libvirt-gconfig-storage-vol.c @@ -61,10 +61,14 @@ static void gvir_config_storage_vol_init(GVirConfigStorageVol *conn) }
-GVirConfigStorageVol *gvir_config_storage_vol_new(const gchar *xml) +GVirConfigStorageVol *gvir_config_storage_vol_new(void) { + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"volume", NULL); return GVIR_CONFIG_STORAGE_VOL(g_object_new(GVIR_TYPE_CONFIG_STORAGE_VOL, - "doc", xml, - "schema", DATADIR "/libvirt/schemas/storage_vol.rng", - NULL)); + "node", doc->children, + "schema", DATADIR "/libvirt/schemas/storage_vol.rng", + NULL)); } diff --git a/libvirt-gconfig/libvirt-gconfig-storage-vol.h b/libvirt-gconfig/libvirt-gconfig-storage-vol.h index 73032b6..08a2180 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-vol.h +++ b/libvirt-gconfig/libvirt-gconfig-storage-vol.h @@ -59,7 +59,7 @@ struct _GVirConfigStorageVolClass
GType gvir_config_storage_vol_get_type(void);
-GVirConfigStorageVol *gvir_config_storage_vol_new(const gchar *xml); +GVirConfigStorageVol *gvir_config_storage_vol_new(void);
G_END_DECLS
diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c b/libvirt-gobject/libvirt-gobject-domain-snapshot.c index cc17b60..530907d 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c @@ -213,8 +213,11 @@ GVirConfigDomainSnapshot *gvir_domain_snapshot_get_config return NULL; }
+#if 0 GVirConfigDomainSnapshot *conf = gvir_config_domain_snapshot_new(xml);
g_free(xml); return conf; +#endif + return NULL; } diff --git a/libvirt-gobject/libvirt-gobject-interface.c b/libvirt-gobject/libvirt-gobject-interface.c index b37a7fa..2c56492 100644 --- a/libvirt-gobject/libvirt-gobject-interface.c +++ b/libvirt-gobject/libvirt-gobject-interface.c @@ -203,8 +203,11 @@ GVirConfigInterface *gvir_interface_get_config(GVirInterface *iface, return NULL; }
+#if 0 GVirConfigInterface *conf = gvir_config_interface_new(xml);
g_free(xml); return conf; +#endif + return NULL; } diff --git a/libvirt-gobject/libvirt-gobject-network-filter.c b/libvirt-gobject/libvirt-gobject-network-filter.c index eb10ce9..b043e42 100644 --- a/libvirt-gobject/libvirt-gobject-network-filter.c +++ b/libvirt-gobject/libvirt-gobject-network-filter.c @@ -228,8 +228,11 @@ GVirConfigNetworkFilter *gvir_network_filter_get_config return NULL; }
+#if 0 GVirConfigNetworkFilter *conf = gvir_config_network_filter_new(xml);
g_free(xml); return conf; +#endif + return NULL; } diff --git a/libvirt-gobject/libvirt-gobject-network.c b/libvirt-gobject/libvirt-gobject-network.c index 158afa4..34692fd 100644 --- a/libvirt-gobject/libvirt-gobject-network.c +++ b/libvirt-gobject/libvirt-gobject-network.c @@ -224,8 +224,11 @@ GVirConfigNetwork *gvir_network_get_config(GVirNetwork *network, return NULL; }
+#if 0 GVirConfigNetwork *conf = gvir_config_network_new(xml);
g_free(xml); return conf; +#endif + return NULL; } diff --git a/libvirt-gobject/libvirt-gobject-node-device.c b/libvirt-gobject/libvirt-gobject-node-device.c index 2847fc6..b3ae6bf 100644 --- a/libvirt-gobject/libvirt-gobject-node-device.c +++ b/libvirt-gobject/libvirt-gobject-node-device.c @@ -203,8 +203,12 @@ GVirConfigNodeDevice *gvir_node_device_get_config(GVirNodeDevice *device, return NULL; }
+#if 0 GVirConfigNodeDevice *conf = gvir_config_node_device_new(xml);
g_free(xml); return conf; +#endif + + return NULL; } diff --git a/libvirt-gobject/libvirt-gobject-secret.c b/libvirt-gobject/libvirt-gobject-secret.c index ffff521..b39bac5 100644 --- a/libvirt-gobject/libvirt-gobject-secret.c +++ b/libvirt-gobject/libvirt-gobject-secret.c @@ -214,8 +214,12 @@ GVirConfigSecret *gvir_secret_get_config(GVirSecret *secret, return NULL; }
+#if 0 GVirConfigSecret *conf = gvir_config_secret_new(xml);
g_free(xml); return conf; +#endif + + return NULL; } diff --git a/libvirt-gobject/libvirt-gobject-storage-pool.c b/libvirt-gobject/libvirt-gobject-storage-pool.c index 8cc481e..d790a92 100644 --- a/libvirt-gobject/libvirt-gobject-storage-pool.c +++ b/libvirt-gobject/libvirt-gobject-storage-pool.c @@ -239,10 +239,13 @@ GVirConfigStoragePool *gvir_storage_pool_get_config(GVirStoragePool *pool, return NULL; }
+#if 0 GVirConfigStoragePool *conf = gvir_config_storage_pool_new(xml);
g_free(xml); return conf; +#endif + return NULL; }
typedef gint (* CountFunction) (virStoragePoolPtr vpool); diff --git a/libvirt-gobject/libvirt-gobject-storage-vol.c b/libvirt-gobject/libvirt-gobject-storage-vol.c index 6cbae84..0d94cd5 100644 --- a/libvirt-gobject/libvirt-gobject-storage-vol.c +++ b/libvirt-gobject/libvirt-gobject-storage-vol.c @@ -214,8 +214,11 @@ GVirConfigStorageVol *gvir_storage_vol_get_config(GVirStorageVol *vol, return NULL; }
+#if 0 GVirConfigStorageVol *conf = gvir_config_storage_vol_new(xml);
g_free(xml); return conf; +#endif + 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 :|

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; -- 1.7.6.4

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 :|

Since this function no longer tries to do XML parsing, there is no error to report. --- libvirt-gconfig/libvirt-gconfig-domain.c | 5 ++--- libvirt-gconfig/libvirt-gconfig-object.c | 7 +++---- libvirt-gconfig/libvirt-gconfig-object.h | 2 +- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index ffd707d..210b3fa 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -142,7 +142,7 @@ char *gvir_config_domain_get_name(GVirConfigDomain *domain) { xmlNodePtr node; - node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain), NULL); + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain)); if (node == NULL) return NULL; @@ -156,8 +156,7 @@ void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name) xmlNodePtr new_node; xmlChar *encoded_name; - parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain), - NULL); + parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain)); encoded_name = xmlEncodeEntitiesReentrant(parent_node->doc, (xmlChar *)name); new_node = xmlNewDocNode(parent_node->doc, NULL, diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index bcb622a..97ac2e3 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -86,7 +86,7 @@ static void gvir_config_object_get_property(GObject *object, break; case PROP_NODE: - g_value_set_pointer(value, gvir_config_object_get_xml_node(conn, NULL)); + g_value_set_pointer(value, gvir_config_object_get_xml_node(conn)); break; default: @@ -279,7 +279,7 @@ gchar *gvir_config_object_to_xml(GVirConfigObject *config) xmlNodePtr node; gchar *output_doc; - node = gvir_config_object_get_xml_node(config, NULL); + node = gvir_config_object_get_xml_node(config); if (node == NULL) return NULL; @@ -306,8 +306,7 @@ const gchar *gvir_config_object_get_schema(GVirConfigObject *config) /* FIXME: will we always have one xmlNode per GConfig object? */ /* FIXME: need to return the right node from subclasses */ /* NB: the xmlNodePtr must not be freed by the caller */ -xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config, - GError **error) +xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config) { return config->priv->node; } diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index 98a05cb..5860102 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -66,7 +66,7 @@ gchar *gvir_config_object_to_xml(GVirConfigObject *config); 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); +xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config); /* FIXME: move to a libvirt-gconfig-helpers.h file? */ xmlNodePtr gvir_config_object_parse(const char *xml, const char *root_node, GError **err); -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:41:01AM +0200, Christophe Fergeau wrote:
Since this function no longer tries to do XML parsing, there is no error to report. --- libvirt-gconfig/libvirt-gconfig-domain.c | 5 ++--- libvirt-gconfig/libvirt-gconfig-object.c | 7 +++---- libvirt-gconfig/libvirt-gconfig-object.h | 2 +- 3 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index ffd707d..210b3fa 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -142,7 +142,7 @@ char *gvir_config_domain_get_name(GVirConfigDomain *domain) { xmlNodePtr node;
- node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain), NULL); + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain)); if (node == NULL) return NULL;
@@ -156,8 +156,7 @@ void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name) xmlNodePtr new_node; xmlChar *encoded_name;
- parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain), - NULL); + parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain)); encoded_name = xmlEncodeEntitiesReentrant(parent_node->doc, (xmlChar *)name); new_node = xmlNewDocNode(parent_node->doc, NULL, diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index bcb622a..97ac2e3 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -86,7 +86,7 @@ static void gvir_config_object_get_property(GObject *object, break;
case PROP_NODE: - g_value_set_pointer(value, gvir_config_object_get_xml_node(conn, NULL)); + g_value_set_pointer(value, gvir_config_object_get_xml_node(conn)); break;
default: @@ -279,7 +279,7 @@ gchar *gvir_config_object_to_xml(GVirConfigObject *config) xmlNodePtr node; gchar *output_doc;
- node = gvir_config_object_get_xml_node(config, NULL); + node = gvir_config_object_get_xml_node(config); if (node == NULL) return NULL;
@@ -306,8 +306,7 @@ const gchar *gvir_config_object_get_schema(GVirConfigObject *config) /* FIXME: will we always have one xmlNode per GConfig object? */ /* FIXME: need to return the right node from subclasses */ /* NB: the xmlNodePtr must not be freed by the caller */ -xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config, - GError **error) +xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config) { return config->priv->node; } diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index 98a05cb..5860102 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -66,7 +66,7 @@ gchar *gvir_config_object_to_xml(GVirConfigObject *config);
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); +xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config);
/* FIXME: move to a libvirt-gconfig-helpers.h file? */ xmlNodePtr gvir_config_object_parse(const char *xml, const char *root_node, GError **err);
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 :|

Now that the parsing is done before creating the object, this member is no longer useful. Moreover, it's redundant with the ::node member. Remove it and rely on always having an xmlNodePtr available to represent the config object. --- libvirt-gconfig/libvirt-gconfig-object.c | 30 ------------------------------ libvirt-gconfig/libvirt-gconfig-object.h | 1 - libvirt-gconfig/libvirt-gconfig.sym | 1 - 3 files changed, 0 insertions(+), 32 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 97ac2e3..6fd5473 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -40,7 +40,6 @@ gboolean debugFlag; struct _GVirConfigObjectPrivate { - gchar *doc; gchar *schema; xmlNodePtr node; @@ -50,7 +49,6 @@ G_DEFINE_ABSTRACT_TYPE(GVirConfigObject, gvir_config_object, G_TYPE_OBJECT); enum { PROP_0, - PROP_DOC, PROP_SCHEMA, PROP_NODE }; @@ -77,10 +75,6 @@ static void gvir_config_object_get_property(GObject *object, GVirConfigObjectPrivate *priv = conn->priv; switch (prop_id) { - case PROP_DOC: - g_value_set_string(value, priv->doc); - break; - case PROP_SCHEMA: g_value_set_string(value, priv->schema); break; @@ -103,11 +97,6 @@ static void gvir_config_object_set_property(GObject *object, GVirConfigObjectPrivate *priv = conn->priv; switch (prop_id) { - case PROP_DOC: - g_free(priv->doc); - priv->doc = g_value_dup_string(value); - break; - case PROP_SCHEMA: g_free(priv->schema); priv->schema = g_value_dup_string(value); @@ -138,7 +127,6 @@ static void gvir_config_object_finalize(GObject *object) DEBUG("Finalize GVirConfigObject=%p", conn); - g_free(priv->doc); g_free(priv->schema); /* FIXME: all objects describing a given XML document will share the @@ -161,18 +149,6 @@ static void gvir_config_object_class_init(GVirConfigObjectClass *klass) object_class->set_property = gvir_config_object_set_property; g_object_class_install_property(object_class, - PROP_DOC, - g_param_spec_string("doc", - "Doc", - "The XML document", - NULL, - G_PARAM_READABLE | - G_PARAM_WRITABLE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_NAME | - G_PARAM_STATIC_NICK | - G_PARAM_STATIC_BLURB)); - g_object_class_install_property(object_class, PROP_SCHEMA, g_param_spec_string("schema", "Schema", @@ -291,12 +267,6 @@ gchar *gvir_config_object_to_xml(GVirConfigObject *config) return output_doc; } -const gchar *gvir_config_object_get_doc(GVirConfigObject *config) -{ - GVirConfigObjectPrivate *priv = config->priv; - return priv->doc; -} - const gchar *gvir_config_object_get_schema(GVirConfigObject *config) { GVirConfigObjectPrivate *priv = config->priv; diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index 5860102..133ca9f 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -64,7 +64,6 @@ void gvir_config_object_validate(GVirConfigObject *config, gchar *gvir_config_object_to_xml(GVirConfigObject *config); -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); diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 94e596e..b67d152 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -27,7 +27,6 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_object_get_type; gvir_config_object_error_quark; gvir_config_object_new; - gvir_config_object_get_doc; gvir_config_object_get_schema; gvir_config_object_get_xml_node; gvir_config_object_to_xml; -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:41:02AM +0200, Christophe Fergeau wrote:
Now that the parsing is done before creating the object, this member is no longer useful. Moreover, it's redundant with the ::node member. Remove it and rely on always having an xmlNodePtr available to represent the config object. --- libvirt-gconfig/libvirt-gconfig-object.c | 30 ------------------------------ libvirt-gconfig/libvirt-gconfig-object.h | 1 - libvirt-gconfig/libvirt-gconfig.sym | 1 - 3 files changed, 0 insertions(+), 32 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 97ac2e3..6fd5473 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -40,7 +40,6 @@ gboolean debugFlag;
struct _GVirConfigObjectPrivate { - gchar *doc; gchar *schema;
xmlNodePtr node; @@ -50,7 +49,6 @@ G_DEFINE_ABSTRACT_TYPE(GVirConfigObject, gvir_config_object, G_TYPE_OBJECT);
enum { PROP_0, - PROP_DOC, PROP_SCHEMA, PROP_NODE }; @@ -77,10 +75,6 @@ static void gvir_config_object_get_property(GObject *object, GVirConfigObjectPrivate *priv = conn->priv;
switch (prop_id) { - case PROP_DOC: - g_value_set_string(value, priv->doc); - break; - case PROP_SCHEMA: g_value_set_string(value, priv->schema); break; @@ -103,11 +97,6 @@ static void gvir_config_object_set_property(GObject *object, GVirConfigObjectPrivate *priv = conn->priv;
switch (prop_id) { - case PROP_DOC: - g_free(priv->doc); - priv->doc = g_value_dup_string(value); - break; - case PROP_SCHEMA: g_free(priv->schema); priv->schema = g_value_dup_string(value); @@ -138,7 +127,6 @@ static void gvir_config_object_finalize(GObject *object)
DEBUG("Finalize GVirConfigObject=%p", conn);
- g_free(priv->doc); g_free(priv->schema);
/* FIXME: all objects describing a given XML document will share the @@ -161,18 +149,6 @@ static void gvir_config_object_class_init(GVirConfigObjectClass *klass) object_class->set_property = gvir_config_object_set_property;
g_object_class_install_property(object_class, - PROP_DOC, - g_param_spec_string("doc", - "Doc", - "The XML document", - NULL, - G_PARAM_READABLE | - G_PARAM_WRITABLE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_NAME | - G_PARAM_STATIC_NICK | - G_PARAM_STATIC_BLURB)); - g_object_class_install_property(object_class, PROP_SCHEMA, g_param_spec_string("schema", "Schema", @@ -291,12 +267,6 @@ gchar *gvir_config_object_to_xml(GVirConfigObject *config) return output_doc; }
-const gchar *gvir_config_object_get_doc(GVirConfigObject *config) -{ - GVirConfigObjectPrivate *priv = config->priv; - return priv->doc; -} - const gchar *gvir_config_object_get_schema(GVirConfigObject *config) { GVirConfigObjectPrivate *priv = config->priv; diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index 5860102..133ca9f 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -64,7 +64,6 @@ void gvir_config_object_validate(GVirConfigObject *config,
gchar *gvir_config_object_to_xml(GVirConfigObject *config);
-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);
diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 94e596e..b67d152 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -27,7 +27,6 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_object_get_type; gvir_config_object_error_quark; gvir_config_object_new; - gvir_config_object_get_doc; gvir_config_object_get_schema; gvir_config_object_get_xml_node; gvir_config_object_to_xml;
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 :|

There will be quite a few getter functions returning a string contained in one of the nodes of a GVirConfigObject, so better to make it a one-liner to achieve this. --- libvirt-gconfig/libvirt-gconfig-domain.c | 9 ++------- libvirt-gconfig/libvirt-gconfig-object.c | 12 ++++++++++++ libvirt-gconfig/libvirt-gconfig-object.h | 2 ++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 210b3fa..66ea7cb 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -140,13 +140,8 @@ GVirConfigDomain *gvir_config_domain_new(void) char *gvir_config_domain_get_name(GVirConfigDomain *domain) { - xmlNodePtr node; - - node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain)); - if (node == NULL) - return NULL; - - return gvir_config_xml_get_child_element_content_glib(node, "name"); + return gvir_config_object_get_node_content(GVIR_CONFIG_OBJECT(domain), + "name"); } void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name) diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 6fd5473..8855ff8 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -280,3 +280,15 @@ xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config) { return config->priv->node; } + +char *gvir_config_object_get_node_content(GVirConfigObject *object, + const char *node_name) +{ + xmlNodePtr node; + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(object)); + if (node == NULL) + return NULL; + + return gvir_config_xml_get_child_element_content_glib(node, node_name); +} diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index 133ca9f..1a82490 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -66,6 +66,8 @@ gchar *gvir_config_object_to_xml(GVirConfigObject *config); const gchar *gvir_config_object_get_schema(GVirConfigObject *config); xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config); +char *gvir_config_object_get_node_content(GVirConfigObject *object, + const char *node_name); /* FIXME: move to a libvirt-gconfig-helpers.h file? */ xmlNodePtr gvir_config_object_parse(const char *xml, const char *root_node, GError **err); -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:41:03AM +0200, Christophe Fergeau wrote:
There will be quite a few getter functions returning a string contained in one of the nodes of a GVirConfigObject, so better to make it a one-liner to achieve this. --- libvirt-gconfig/libvirt-gconfig-domain.c | 9 ++------- libvirt-gconfig/libvirt-gconfig-object.c | 12 ++++++++++++ libvirt-gconfig/libvirt-gconfig-object.h | 2 ++ 3 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 210b3fa..66ea7cb 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -140,13 +140,8 @@ GVirConfigDomain *gvir_config_domain_new(void)
char *gvir_config_domain_get_name(GVirConfigDomain *domain) { - xmlNodePtr node; - - node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain)); - if (node == NULL) - return NULL; - - return gvir_config_xml_get_child_element_content_glib(node, "name"); + return gvir_config_object_get_node_content(GVIR_CONFIG_OBJECT(domain), + "name"); }
void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name) diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 6fd5473..8855ff8 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -280,3 +280,15 @@ xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config) { return config->priv->node; } + +char *gvir_config_object_get_node_content(GVirConfigObject *object, + const char *node_name) +{ + xmlNodePtr node; + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(object)); + if (node == NULL) + return NULL; + + return gvir_config_xml_get_child_element_content_glib(node, node_name); +} diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index 133ca9f..1a82490 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -66,6 +66,8 @@ gchar *gvir_config_object_to_xml(GVirConfigObject *config);
const gchar *gvir_config_object_get_schema(GVirConfigObject *config); xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config); +char *gvir_config_object_get_node_content(GVirConfigObject *object, + const char *node_name);
/* FIXME: move to a libvirt-gconfig-helpers.h file? */ xmlNodePtr gvir_config_object_parse(const char *xml, const char *root_node, GError **err);
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 :|

It's used to set the content of a node in a GVirConfigObject to a given value, and will replace any existing node with the same value. --- libvirt-gconfig/libvirt-gconfig-domain.c | 22 ++-------------------- libvirt-gconfig/libvirt-gconfig-object.c | 30 ++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-object.h | 3 +++ 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 66ea7cb..039e551 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -146,25 +146,7 @@ char *gvir_config_domain_get_name(GVirConfigDomain *domain) void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name) { - xmlNodePtr parent_node; - xmlNodePtr old_node; - xmlNodePtr new_node; - xmlChar *encoded_name; - - parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain)); - encoded_name = xmlEncodeEntitiesReentrant(parent_node->doc, - (xmlChar *)name); - new_node = xmlNewDocNode(parent_node->doc, NULL, - (xmlChar *)"name", encoded_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); - } else { - xmlAddChild(parent_node, new_node); - } - + gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(domain), + "name", name); g_object_notify(G_OBJECT(domain), "name"); } diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 8855ff8..679c3f9 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -292,3 +292,33 @@ char *gvir_config_object_get_node_content(GVirConfigObject *object, return gvir_config_xml_get_child_element_content_glib(node, node_name); } + +/* FIXME: if there are multiple nodes with the same name, this function + * won't behave as expected. Should we get rid of the duplicated node names + * here? + */ +void gvir_config_object_set_node_content(GVirConfigObject *object, + const char *node_name, + const char *value) +{ + xmlNodePtr parent_node; + xmlNodePtr old_node; + xmlNodePtr new_node; + xmlChar *encoded_name; + + parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(object)); + encoded_name = xmlEncodeEntitiesReentrant(parent_node->doc, + (xmlChar *)value); + new_node = xmlNewDocNode(parent_node->doc, NULL, + (xmlChar *)node_name, encoded_name); + xmlFree(encoded_name); + + old_node = gvir_config_xml_get_element(parent_node, node_name, NULL); + if (old_node) { + old_node = xmlReplaceNode(old_node, new_node); + xmlFreeNode(old_node); + } else { + xmlAddChild(parent_node, new_node); + } +} + diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index 1a82490..ab99279 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_schema(GVirConfigObject *config); xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config); char *gvir_config_object_get_node_content(GVirConfigObject *object, const char *node_name); +void gvir_config_object_set_node_content(GVirConfigObject *object, + const char *node_name, + const char *value); /* FIXME: move to a libvirt-gconfig-helpers.h file? */ xmlNodePtr gvir_config_object_parse(const char *xml, const char *root_node, GError **err); -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:41:04AM +0200, Christophe Fergeau wrote:
It's used to set the content of a node in a GVirConfigObject to a given value, and will replace any existing node with the same value. --- libvirt-gconfig/libvirt-gconfig-domain.c | 22 ++-------------------- libvirt-gconfig/libvirt-gconfig-object.c | 30 ++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-object.h | 3 +++ 3 files changed, 35 insertions(+), 20 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 66ea7cb..039e551 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -146,25 +146,7 @@ char *gvir_config_domain_get_name(GVirConfigDomain *domain)
void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name) { - xmlNodePtr parent_node; - xmlNodePtr old_node; - xmlNodePtr new_node; - xmlChar *encoded_name; - - parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain)); - encoded_name = xmlEncodeEntitiesReentrant(parent_node->doc, - (xmlChar *)name); - new_node = xmlNewDocNode(parent_node->doc, NULL, - (xmlChar *)"name", encoded_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); - } else { - xmlAddChild(parent_node, new_node); - } - + gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(domain), + "name", name); g_object_notify(G_OBJECT(domain), "name"); } diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 8855ff8..679c3f9 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -292,3 +292,33 @@ char *gvir_config_object_get_node_content(GVirConfigObject *object,
return gvir_config_xml_get_child_element_content_glib(node, node_name); } + +/* FIXME: if there are multiple nodes with the same name, this function + * won't behave as expected. Should we get rid of the duplicated node names + * here? + */ +void gvir_config_object_set_node_content(GVirConfigObject *object, + const char *node_name, + const char *value) +{ + xmlNodePtr parent_node; + xmlNodePtr old_node; + xmlNodePtr new_node; + xmlChar *encoded_name; + + parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(object)); + encoded_name = xmlEncodeEntitiesReentrant(parent_node->doc, + (xmlChar *)value); + new_node = xmlNewDocNode(parent_node->doc, NULL, + (xmlChar *)node_name, encoded_name); + xmlFree(encoded_name); + + old_node = gvir_config_xml_get_element(parent_node, node_name, NULL); + if (old_node) { + old_node = xmlReplaceNode(old_node, new_node); + xmlFreeNode(old_node); + } else { + xmlAddChild(parent_node, new_node); + } +} + diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index 1a82490..ab99279 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_schema(GVirConfigObject *config); xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config); char *gvir_config_object_get_node_content(GVirConfigObject *object, const char *node_name); +void gvir_config_object_set_node_content(GVirConfigObject *object, + const char *node_name, + const char *value);
/* FIXME: move to a libvirt-gconfig-helpers.h file? */ xmlNodePtr gvir_config_object_parse(const char *xml, const char *root_node, GError **err);
ACK This addresses my comment from an earlier patch :-) 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 :|

This test has 3 duplicate "name" nodes in the domain XML, I don't know what the right behaviour is in this case :) --- libvirt-gconfig/tests/test-domain-duplicate.xml | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/tests/test-domain-duplicate.xml diff --git a/libvirt-gconfig/tests/test-domain-duplicate.xml b/libvirt-gconfig/tests/test-domain-duplicate.xml new file mode 100644 index 0000000..acff40a --- /dev/null +++ b/libvirt-gconfig/tests/test-domain-duplicate.xml @@ -0,0 +1,7 @@ +<domain type='xen' id='3'> + <name>bar</name> + <name>foo</name> + <name>foobar</name> + <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid> + <description>Some human readable description</description> +</domain> -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:41:05AM +0200, Christophe Fergeau wrote:
This test has 3 duplicate "name" nodes in the domain XML, I don't know what the right behaviour is in this case :)
Well first of all this is obviously a non-conforming XML document, so if the application is using the schema validation check they will get an error. If they're not validating against the schema, then IMHO any behaviour you care to implement is acceptable, but for sanity I'd pick either the first, or last node rather than a random node :-)
--- libvirt-gconfig/tests/test-domain-duplicate.xml | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/tests/test-domain-duplicate.xml
diff --git a/libvirt-gconfig/tests/test-domain-duplicate.xml b/libvirt-gconfig/tests/test-domain-duplicate.xml new file mode 100644 index 0000000..acff40a --- /dev/null +++ b/libvirt-gconfig/tests/test-domain-duplicate.xml @@ -0,0 +1,7 @@ +<domain type='xen' id='3'> + <name>bar</name> + <name>foo</name> + <name>foobar</name> + <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid> + <description>Some human readable description</description> +</domain>
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 :|

On Tue, Oct 18, 2011 at 12:50:44PM +0100, Daniel P. Berrange wrote:
On Fri, Oct 07, 2011 at 11:41:05AM +0200, Christophe Fergeau wrote:
This test has 3 duplicate "name" nodes in the domain XML, I don't know what the right behaviour is in this case :)
Well first of all this is obviously a non-conforming XML document, so if the application is using the schema validation check they will get an error.
Ah, I wasn't sure if such documents were conformant or not, hence my questions.
If they're not validating against the schema, then IMHO any behaviour you care to implement is acceptable, but for sanity I'd pick either the first, or last node rather than a random node :-)
Yep, it's likely to be the first node since this makes the implementation easier. Thanks for the clarification, Christophe

Add a call to gvir_config_object_validate in test-domain-parse.c However at the moment this call is purely informative since none of the tests is a valid domain XML description. --- libvirt-gconfig/tests/test-domain-parse.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/tests/test-domain-parse.c b/libvirt-gconfig/tests/test-domain-parse.c index 57b1875..545e733 100644 --- a/libvirt-gconfig/tests/test-domain-parse.c +++ b/libvirt-gconfig/tests/test-domain-parse.c @@ -56,6 +56,12 @@ int main(int argc, char **argv) return 3; } g_assert(domain != NULL); + gvir_config_object_validate(GVIR_CONFIG_OBJECT(domain), &error); + if (error != NULL) { + g_print("%s format is invalid: %s\n", argv[1], error->message); + g_clear_error(&error); + } + name = gvir_config_domain_get_name(domain); g_assert(name != NULL); g_assert(strcmp(name, "foo") == 0); -- 1.7.6.4

--- libvirt-gconfig/libvirt-gconfig-domain.c | 29 +++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 2 + libvirt-gconfig/libvirt-gconfig-object.c | 32 ++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-object.h | 5 ++++ libvirt-gconfig/libvirt-gconfig.sym | 2 + libvirt-gconfig/tests/test-domain-create.c | 3 ++ libvirt-gconfig/tests/test-domain-parse.c | 3 ++ libvirt-gconfig/tests/test-domain.xml | 1 + 8 files changed, 77 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 039e551..71bfb55 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -44,6 +44,7 @@ G_DEFINE_TYPE(GVirConfigDomain, gvir_config_domain, GVIR_TYPE_CONFIG_OBJECT); enum { PROP_0, PROP_NAME, + PROP_MEMORY, }; static void gvir_config_domain_get_property(GObject *object, @@ -57,6 +58,9 @@ static void gvir_config_domain_get_property(GObject *object, case PROP_NAME: g_value_take_string(value, gvir_config_domain_get_name(domain)); break; + case PROP_MEMORY: + g_value_set_uint64(value, gvir_config_domain_get_memory(domain)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); @@ -74,6 +78,9 @@ static void gvir_config_domain_set_property(GObject *object, case PROP_NAME: gvir_config_domain_set_name(domain, g_value_get_string(value)); break; + case PROP_MEMORY: + gvir_config_domain_set_memory(domain, g_value_get_uint64(value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); } @@ -97,6 +104,15 @@ static void gvir_config_domain_class_init(GVirConfigDomainClass *klass) NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property(object_class, + PROP_MEMORY, + g_param_spec_uint64("memory", + "Memory", + "Maximum Guest Memory (in kilobytes)", + 0, G_MAXUINT64, + 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); } @@ -150,3 +166,16 @@ void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name) "name", name); g_object_notify(G_OBJECT(domain), "name"); } + +guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain) +{ + return gvir_config_object_get_node_content_uint64(GVIR_CONFIG_OBJECT(domain), + "memory"); +} + +void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory) +{ + gvir_config_object_set_node_content_uint64(GVIR_CONFIG_OBJECT(domain), + "memory", memory); + g_object_notify(G_OBJECT(domain), "memory"); +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index b5ae050..03169b2 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -64,6 +64,8 @@ GVirConfigDomain *gvir_config_domain_new(void); char *gvir_config_domain_get_name(GVirConfigDomain *domain); void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name); +guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain); +void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 679c3f9..0de4abf 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -322,3 +322,35 @@ void gvir_config_object_set_node_content(GVirConfigObject *object, } } +/* FIXME: how to notify of errors/node not found? */ +guint64 gvir_config_object_get_node_content_uint64(GVirConfigObject *object, + const char *node_name) +{ + xmlNodePtr node; + xmlChar *str; + guint64 value; + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(object)); + if (node == NULL) + return 0; + + str = gvir_config_xml_get_child_element_content(node, node_name); + if (!str) + return 0; + + value = g_ascii_strtoull((char *)str, NULL, 0); + xmlFree(str); + + return value; +} + + +void gvir_config_object_set_node_content_uint64(GVirConfigObject *object, + const char *node_name, + guint64 value) +{ + char *str; + str = g_strdup_printf("%"G_GUINT64_FORMAT, value); + gvir_config_object_set_node_content(object, node_name, str); + g_free(str); +} diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index ab99279..c203798 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -68,9 +68,14 @@ const gchar *gvir_config_object_get_schema(GVirConfigObject *config); xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config); char *gvir_config_object_get_node_content(GVirConfigObject *object, const char *node_name); +guint64 gvir_config_object_get_node_content_uint64(GVirConfigObject *object, + const char *node_name); void gvir_config_object_set_node_content(GVirConfigObject *object, const char *node_name, const char *value); +void gvir_config_object_set_node_content_uint64(GVirConfigObject *object, + const char *node_name, + guint64 value); /* FIXME: move to a libvirt-gconfig-helpers.h file? */ xmlNodePtr gvir_config_object_parse(const char *xml, const char *root_node, GError **err); diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index b67d152..7acb95d 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -6,6 +6,8 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_domain_get_type; gvir_config_domain_new; gvir_config_domain_new_from_xml; + gvir_config_domain_get_memory; + gvir_config_domain_set_memory; gvir_config_domain_get_name; gvir_config_domain_set_name; diff --git a/libvirt-gconfig/tests/test-domain-create.c b/libvirt-gconfig/tests/test-domain-create.c index a742dd7..fe0063c 100644 --- a/libvirt-gconfig/tests/test-domain-create.c +++ b/libvirt-gconfig/tests/test-domain-create.c @@ -44,6 +44,9 @@ int main(void) g_assert(strcmp(name, "foo") == 0); g_free(name); + gvir_config_domain_set_memory(domain, 1234); + g_assert(gvir_config_domain_get_memory(domain) == 1234); + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain)); g_print("%s\n", xml); g_free(xml); diff --git a/libvirt-gconfig/tests/test-domain-parse.c b/libvirt-gconfig/tests/test-domain-parse.c index 545e733..7521d20 100644 --- a/libvirt-gconfig/tests/test-domain-parse.c +++ b/libvirt-gconfig/tests/test-domain-parse.c @@ -66,6 +66,9 @@ int main(int argc, char **argv) g_assert(name != NULL); g_assert(strcmp(name, "foo") == 0); g_free(name); + + g_assert(gvir_config_domain_get_memory(domain) == 987654321); + g_free(xml); xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain)); diff --git a/libvirt-gconfig/tests/test-domain.xml b/libvirt-gconfig/tests/test-domain.xml index 08a926e..d887e95 100644 --- a/libvirt-gconfig/tests/test-domain.xml +++ b/libvirt-gconfig/tests/test-domain.xml @@ -2,4 +2,5 @@ <name>foo</name> <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid> <description>Some human readable description</description> + <memory>987654321</memory> </domain> -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:41:07AM +0200, Christophe Fergeau wrote:
--- libvirt-gconfig/libvirt-gconfig-domain.c | 29 +++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 2 + libvirt-gconfig/libvirt-gconfig-object.c | 32 ++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-object.h | 5 ++++ libvirt-gconfig/libvirt-gconfig.sym | 2 + libvirt-gconfig/tests/test-domain-create.c | 3 ++ libvirt-gconfig/tests/test-domain-parse.c | 3 ++ libvirt-gconfig/tests/test-domain.xml | 1 + 8 files changed, 77 insertions(+), 0 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 039e551..71bfb55 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -44,6 +44,7 @@ G_DEFINE_TYPE(GVirConfigDomain, gvir_config_domain, GVIR_TYPE_CONFIG_OBJECT); enum { PROP_0, PROP_NAME, + PROP_MEMORY, };
static void gvir_config_domain_get_property(GObject *object, @@ -57,6 +58,9 @@ static void gvir_config_domain_get_property(GObject *object, case PROP_NAME: g_value_take_string(value, gvir_config_domain_get_name(domain)); break; + case PROP_MEMORY: + g_value_set_uint64(value, gvir_config_domain_get_memory(domain)); + break;
default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); @@ -74,6 +78,9 @@ static void gvir_config_domain_set_property(GObject *object, case PROP_NAME: gvir_config_domain_set_name(domain, g_value_get_string(value)); break; + case PROP_MEMORY: + gvir_config_domain_set_memory(domain, g_value_get_uint64(value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); } @@ -97,6 +104,15 @@ static void gvir_config_domain_class_init(GVirConfigDomainClass *klass) NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property(object_class, + PROP_MEMORY, + g_param_spec_uint64("memory", + "Memory", + "Maximum Guest Memory (in kilobytes)", + 0, G_MAXUINT64, + 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); }
@@ -150,3 +166,16 @@ void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name) "name", name); g_object_notify(G_OBJECT(domain), "name"); } + +guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain) +{ + return gvir_config_object_get_node_content_uint64(GVIR_CONFIG_OBJECT(domain), + "memory"); +} + +void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory) +{ + gvir_config_object_set_node_content_uint64(GVIR_CONFIG_OBJECT(domain), + "memory", memory); + g_object_notify(G_OBJECT(domain), "memory"); +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index b5ae050..03169b2 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -64,6 +64,8 @@ GVirConfigDomain *gvir_config_domain_new(void);
char *gvir_config_domain_get_name(GVirConfigDomain *domain); void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name); +guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain); +void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory);
G_END_DECLS
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 679c3f9..0de4abf 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -322,3 +322,35 @@ void gvir_config_object_set_node_content(GVirConfigObject *object, } }
+/* FIXME: how to notify of errors/node not found? */
Most of the properties will have some unused value. So I'd choose to set the value to '0' if node is not found. If '0' is a actually a valid value, then you'll almost certainly be able to use '-1' for missing value instead.
+guint64 gvir_config_object_get_node_content_uint64(GVirConfigObject *object, + const char *node_name) +{ + xmlNodePtr node; + xmlChar *str; + guint64 value; + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(object)); + if (node == NULL) + return 0; + + str = gvir_config_xml_get_child_element_content(node, node_name); + if (!str) + return 0; + + value = g_ascii_strtoull((char *)str, NULL, 0); + xmlFree(str); + + return value; +}
+ + +void gvir_config_object_set_node_content_uint64(GVirConfigObject *object, + const char *node_name, + guint64 value) +{ + char *str; + str = g_strdup_printf("%"G_GUINT64_FORMAT, value); + gvir_config_object_set_node_content(object, node_name, str); + g_free(str); +} diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index ab99279..c203798 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -68,9 +68,14 @@ const gchar *gvir_config_object_get_schema(GVirConfigObject *config); xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config); char *gvir_config_object_get_node_content(GVirConfigObject *object, const char *node_name); +guint64 gvir_config_object_get_node_content_uint64(GVirConfigObject *object, + const char *node_name); void gvir_config_object_set_node_content(GVirConfigObject *object, const char *node_name, const char *value); +void gvir_config_object_set_node_content_uint64(GVirConfigObject *object, + const char *node_name, + guint64 value);
/* FIXME: move to a libvirt-gconfig-helpers.h file? */ xmlNodePtr gvir_config_object_parse(const char *xml, const char *root_node, GError **err); diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index b67d152..7acb95d 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -6,6 +6,8 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_domain_get_type; gvir_config_domain_new; gvir_config_domain_new_from_xml; + gvir_config_domain_get_memory; + gvir_config_domain_set_memory; gvir_config_domain_get_name; gvir_config_domain_set_name;
diff --git a/libvirt-gconfig/tests/test-domain-create.c b/libvirt-gconfig/tests/test-domain-create.c index a742dd7..fe0063c 100644 --- a/libvirt-gconfig/tests/test-domain-create.c +++ b/libvirt-gconfig/tests/test-domain-create.c @@ -44,6 +44,9 @@ int main(void) g_assert(strcmp(name, "foo") == 0); g_free(name);
+ gvir_config_domain_set_memory(domain, 1234); + g_assert(gvir_config_domain_get_memory(domain) == 1234); + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain)); g_print("%s\n", xml); g_free(xml); diff --git a/libvirt-gconfig/tests/test-domain-parse.c b/libvirt-gconfig/tests/test-domain-parse.c index 545e733..7521d20 100644 --- a/libvirt-gconfig/tests/test-domain-parse.c +++ b/libvirt-gconfig/tests/test-domain-parse.c @@ -66,6 +66,9 @@ int main(int argc, char **argv) g_assert(name != NULL); g_assert(strcmp(name, "foo") == 0); g_free(name); + + g_assert(gvir_config_domain_get_memory(domain) == 987654321); + g_free(xml);
xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain)); diff --git a/libvirt-gconfig/tests/test-domain.xml b/libvirt-gconfig/tests/test-domain.xml index 08a926e..d887e95 100644 --- a/libvirt-gconfig/tests/test-domain.xml +++ b/libvirt-gconfig/tests/test-domain.xml @@ -2,4 +2,5 @@ <name>foo</name> <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid> <description>Some human readable description</description> + <memory>987654321</memory> </domain>
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 :|

--- libvirt-gconfig/libvirt-gconfig-domain.c | 71 ++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 4 ++ libvirt-gconfig/libvirt-gconfig.sym | 2 + libvirt-gconfig/tests/test-domain-create.c | 12 +++++ libvirt-gconfig/tests/test-domain-parse.c | 7 +++ libvirt-gconfig/tests/test-domain.xml | 1 + 6 files changed, 97 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 71bfb55..4a32595 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -45,6 +45,7 @@ enum { PROP_0, PROP_NAME, PROP_MEMORY, + PROP_FEATURES }; static void gvir_config_domain_get_property(GObject *object, @@ -61,6 +62,9 @@ static void gvir_config_domain_get_property(GObject *object, case PROP_MEMORY: g_value_set_uint64(value, gvir_config_domain_get_memory(domain)); break; + case PROP_FEATURES: + g_value_take_boxed(value, gvir_config_domain_get_features(domain)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); @@ -81,6 +85,9 @@ static void gvir_config_domain_set_property(GObject *object, case PROP_MEMORY: gvir_config_domain_set_memory(domain, g_value_get_uint64(value)); break; + case PROP_FEATURES: + gvir_config_domain_set_features(domain, g_value_get_boxed(value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); } @@ -113,6 +120,14 @@ static void gvir_config_domain_class_init(GVirConfigDomainClass *klass) 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property(object_class, + PROP_FEATURES, + g_param_spec_boxed("features", + "Features", + "Hypervisor Features", + G_TYPE_STRV, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); } @@ -179,3 +194,59 @@ void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory) "memory", memory); g_object_notify(G_OBJECT(domain), "memory"); } + +/** + * gvir_config_domain_get_features: + * Returns: (transfer full): + */ +GStrv gvir_config_domain_get_features(GVirConfigDomain *domain) +{ + GPtrArray *features; + xmlNodePtr parent_node; + xmlNodePtr node; + xmlNodePtr it; + + parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain)); + if (parent_node == NULL) + return NULL; + + node = gvir_config_xml_get_element(parent_node, "features", NULL); + if (node == NULL) + return NULL; + + features = g_ptr_array_new(); + for (it = node->children; it != NULL; it = it->next) { + g_ptr_array_add(features, g_strdup((char *)it->name)); + } + g_ptr_array_add(features, NULL); + + return (GStrv)g_ptr_array_free(features, FALSE); +} + +void gvir_config_domain_set_features(GVirConfigDomain *domain, + const GStrv features) +{ + xmlNodePtr parent_node; + xmlNodePtr features_node; + xmlNodePtr old_node; + GStrv it; + + parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain)); + features_node = xmlNewDocNode(parent_node->doc, NULL, + (xmlChar *)"features", NULL); + for (it = features; *it != NULL; it++) { + xmlNodePtr node; + + node = xmlNewDocNode(parent_node->doc, NULL, (xmlChar *)*it, NULL); + xmlAddChild(features_node, node); + } + + old_node = gvir_config_xml_get_element(parent_node, "features", NULL); + if (old_node) { + old_node = xmlReplaceNode(old_node, features_node); + xmlFreeNode(old_node); + } else { + xmlAddChild(parent_node, features_node); + } + g_object_notify(G_OBJECT(domain), "features"); +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index 03169b2..d9f0c09 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -66,6 +66,10 @@ char *gvir_config_domain_get_name(GVirConfigDomain *domain); void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name); guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain); void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory); +GStrv gvir_config_domain_get_features(GVirConfigDomain *domain); +void gvir_config_domain_set_features(GVirConfigDomain *domain, + const GStrv features); + G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 7acb95d..951aac6 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -6,6 +6,8 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_domain_get_type; gvir_config_domain_new; gvir_config_domain_new_from_xml; + gvir_config_domain_get_features; + gvir_config_domain_set_features; gvir_config_domain_get_memory; gvir_config_domain_set_memory; gvir_config_domain_get_name; diff --git a/libvirt-gconfig/tests/test-domain-create.c b/libvirt-gconfig/tests/test-domain-create.c index fe0063c..a719ed2 100644 --- a/libvirt-gconfig/tests/test-domain-create.c +++ b/libvirt-gconfig/tests/test-domain-create.c @@ -28,10 +28,14 @@ #include <string.h> #include <libvirt-gconfig/libvirt-gconfig.h> +const char *features[] = { "foo", "bar", "baz", NULL }; + int main(void) { GVirConfigDomain *domain; char *name; + GStrv feat; + unsigned int i; char *xml; g_type_init(); @@ -47,6 +51,14 @@ int main(void) gvir_config_domain_set_memory(domain, 1234); g_assert(gvir_config_domain_get_memory(domain) == 1234); + gvir_config_domain_set_features(domain, (const GStrv)features); + feat = gvir_config_domain_get_features(domain); + for (i = 0; features[i] != NULL; i++) { + g_assert(feat[i] != NULL); + g_assert(strcmp(feat[i], features[i]) == 0); + } + g_strfreev(feat); + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain)); g_print("%s\n", xml); g_free(xml); diff --git a/libvirt-gconfig/tests/test-domain-parse.c b/libvirt-gconfig/tests/test-domain-parse.c index 7521d20..9528816 100644 --- a/libvirt-gconfig/tests/test-domain-parse.c +++ b/libvirt-gconfig/tests/test-domain-parse.c @@ -33,6 +33,7 @@ int main(int argc, char **argv) { GVirConfigDomain *domain; char *name; + GStrv features; char *xml; GError *error = NULL; @@ -69,6 +70,12 @@ int main(int argc, char **argv) g_assert(gvir_config_domain_get_memory(domain) == 987654321); + features = gvir_config_domain_get_features(domain); + g_assert(g_strv_length(features) == 2); + g_assert(strcmp(features[0], "f1") == 0); + g_assert(strcmp(features[1], "f2") == 0); + g_strfreev(features); + g_free(xml); xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain)); diff --git a/libvirt-gconfig/tests/test-domain.xml b/libvirt-gconfig/tests/test-domain.xml index d887e95..a9610cc 100644 --- a/libvirt-gconfig/tests/test-domain.xml +++ b/libvirt-gconfig/tests/test-domain.xml @@ -2,5 +2,6 @@ <name>foo</name> <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid> <description>Some human readable description</description> + <features><f1/><f2/></features> <memory>987654321</memory> </domain> -- 1.7.6.4

On Fri, Oct 07, 2011 at 11:41:08AM +0200, Christophe Fergeau wrote:
--- libvirt-gconfig/libvirt-gconfig-domain.c | 71 ++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 4 ++ libvirt-gconfig/libvirt-gconfig.sym | 2 + libvirt-gconfig/tests/test-domain-create.c | 12 +++++ libvirt-gconfig/tests/test-domain-parse.c | 7 +++ libvirt-gconfig/tests/test-domain.xml | 1 + 6 files changed, 97 insertions(+), 0 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 71bfb55..4a32595 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -45,6 +45,7 @@ enum { PROP_0, PROP_NAME, PROP_MEMORY, + PROP_FEATURES };
static void gvir_config_domain_get_property(GObject *object, @@ -61,6 +62,9 @@ static void gvir_config_domain_get_property(GObject *object, case PROP_MEMORY: g_value_set_uint64(value, gvir_config_domain_get_memory(domain)); break; + case PROP_FEATURES: + g_value_take_boxed(value, gvir_config_domain_get_features(domain)); + break;
default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); @@ -81,6 +85,9 @@ static void gvir_config_domain_set_property(GObject *object, case PROP_MEMORY: gvir_config_domain_set_memory(domain, g_value_get_uint64(value)); break; + case PROP_FEATURES: + gvir_config_domain_set_features(domain, g_value_get_boxed(value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); } @@ -113,6 +120,14 @@ static void gvir_config_domain_class_init(GVirConfigDomainClass *klass) 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property(object_class, + PROP_FEATURES, + g_param_spec_boxed("features", + "Features", + "Hypervisor Features", + G_TYPE_STRV, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); }
@@ -179,3 +194,59 @@ void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory) "memory", memory); g_object_notify(G_OBJECT(domain), "memory"); } + +/** + * gvir_config_domain_get_features: + * Returns: (transfer full): + */ +GStrv gvir_config_domain_get_features(GVirConfigDomain *domain) +{ + GPtrArray *features; + xmlNodePtr parent_node; + xmlNodePtr node; + xmlNodePtr it; + + parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain)); + if (parent_node == NULL) + return NULL; + + node = gvir_config_xml_get_element(parent_node, "features", NULL); + if (node == NULL) + return NULL; + + features = g_ptr_array_new(); + for (it = node->children; it != NULL; it = it->next) { + g_ptr_array_add(features, g_strdup((char *)it->name)); + } + g_ptr_array_add(features, NULL); + + return (GStrv)g_ptr_array_free(features, FALSE); +} + +void gvir_config_domain_set_features(GVirConfigDomain *domain, + const GStrv features) +{ + xmlNodePtr parent_node; + xmlNodePtr features_node; + xmlNodePtr old_node; + GStrv it; + + parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain)); + features_node = xmlNewDocNode(parent_node->doc, NULL, + (xmlChar *)"features", NULL); + for (it = features; *it != NULL; it++) { + xmlNodePtr node; + + node = xmlNewDocNode(parent_node->doc, NULL, (xmlChar *)*it, NULL); + xmlAddChild(features_node, node); + } + + old_node = gvir_config_xml_get_element(parent_node, "features", NULL); + if (old_node) { + old_node = xmlReplaceNode(old_node, features_node); + xmlFreeNode(old_node); + } else { + xmlAddChild(parent_node, features_node); + } + g_object_notify(G_OBJECT(domain), "features"); +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index 03169b2..d9f0c09 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -66,6 +66,10 @@ char *gvir_config_domain_get_name(GVirConfigDomain *domain); void gvir_config_domain_set_name(GVirConfigDomain *domain, const char *name); guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain); void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory); +GStrv gvir_config_domain_get_features(GVirConfigDomain *domain); +void gvir_config_domain_set_features(GVirConfigDomain *domain, + const GStrv features); +
G_END_DECLS
diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 7acb95d..951aac6 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -6,6 +6,8 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_domain_get_type; gvir_config_domain_new; gvir_config_domain_new_from_xml; + gvir_config_domain_get_features; + gvir_config_domain_set_features; gvir_config_domain_get_memory; gvir_config_domain_set_memory; gvir_config_domain_get_name; diff --git a/libvirt-gconfig/tests/test-domain-create.c b/libvirt-gconfig/tests/test-domain-create.c index fe0063c..a719ed2 100644 --- a/libvirt-gconfig/tests/test-domain-create.c +++ b/libvirt-gconfig/tests/test-domain-create.c @@ -28,10 +28,14 @@ #include <string.h> #include <libvirt-gconfig/libvirt-gconfig.h>
+const char *features[] = { "foo", "bar", "baz", NULL }; + int main(void) { GVirConfigDomain *domain; char *name; + GStrv feat; + unsigned int i; char *xml;
g_type_init(); @@ -47,6 +51,14 @@ int main(void) gvir_config_domain_set_memory(domain, 1234); g_assert(gvir_config_domain_get_memory(domain) == 1234);
+ gvir_config_domain_set_features(domain, (const GStrv)features); + feat = gvir_config_domain_get_features(domain); + for (i = 0; features[i] != NULL; i++) { + g_assert(feat[i] != NULL); + g_assert(strcmp(feat[i], features[i]) == 0); + } + g_strfreev(feat); + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain)); g_print("%s\n", xml); g_free(xml); diff --git a/libvirt-gconfig/tests/test-domain-parse.c b/libvirt-gconfig/tests/test-domain-parse.c index 7521d20..9528816 100644 --- a/libvirt-gconfig/tests/test-domain-parse.c +++ b/libvirt-gconfig/tests/test-domain-parse.c @@ -33,6 +33,7 @@ int main(int argc, char **argv) { GVirConfigDomain *domain; char *name; + GStrv features; char *xml; GError *error = NULL;
@@ -69,6 +70,12 @@ int main(int argc, char **argv)
g_assert(gvir_config_domain_get_memory(domain) == 987654321);
+ features = gvir_config_domain_get_features(domain); + g_assert(g_strv_length(features) == 2); + g_assert(strcmp(features[0], "f1") == 0); + g_assert(strcmp(features[1], "f2") == 0); + g_strfreev(features); + g_free(xml);
xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain)); diff --git a/libvirt-gconfig/tests/test-domain.xml b/libvirt-gconfig/tests/test-domain.xml index d887e95..a9610cc 100644 --- a/libvirt-gconfig/tests/test-domain.xml +++ b/libvirt-gconfig/tests/test-domain.xml @@ -2,5 +2,6 @@ <name>foo</name> <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid> <description>Some human readable description</description> + <features><f1/><f2/></features> <memory>987654321</memory> </domain>
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 :|

On Fri, Oct 7, 2011 at 12:40 PM, Christophe Fergeau <cfergeau@redhat.com> wrote:
Hi,
Hello,
While writing this code, there were at least 2 questions that arose, some input would be welcome :)
* I don't know how to handle XMLs where the same node appears multiple times (eg "name"). If it's the latest name that wins, what do we do when changing the name on such an XML document? only modify the last name node? Drop all the redundant name nodes?
I would say take the first one only and set just that.
* I'm also not sure how to make it possible to check whether a given property is set or not. For strings, this is easy, NULL means that the property was not set, but for integers, this is less obvious. Any thoughts on that?
For many properties (e.g cpu freq, ram, storage size etc) I think a negative value (-1) would do, for others we can choose an insane number like -G_MAXINT for example. Not sure about booleans though. Do we really need to check if value is provided btw? AFAIK, every node/attribute has a default value.
Next I'll have to start looking at more complicated properties :) More API questions on the way I guess...
Awesome! Maybe its much more sooner that I starting really using the gconfig part then. :) -- Regards, Zeeshan Ali (Khattak) FSF member#5124

On Fri, Oct 07, 2011 at 02:59:28PM +0300, Zeeshan Ali (Khattak) wrote:
On Fri, Oct 7, 2011 at 12:40 PM, Christophe Fergeau <cfergeau@redhat.com> wrote:
* I don't know how to handle XMLs where the same node appears multiple times (eg "name"). If it's the latest name that wins, what do we do when changing the name on such an XML document? only modify the last name node? Drop all the redundant name nodes?
I would say take the first one only and set just that.
Is it consistent with what libvirt will do? Ie will it only use the first item in such an XML file?
* I'm also not sure how to make it possible to check whether a given property is set or not. For strings, this is easy, NULL means that the property was not set, but for integers, this is less obvious. Any thoughts on that?
For many properties (e.g cpu freq, ram, storage size etc) I think a negative value (-1) would do, for others we can choose an insane number like -G_MAXINT for example.
Yup, this could be surprising for library users though. We could also add a GError parameter to the various getters, but this wouldn't be available when using g_object_get.
Not sure about booleans though. Do we really need to check if value is provided btw? AFAIK, every node/attribute has a default value.
Ah if they all have a well defined default value, we could also use that instead. I don't see any immediate use for checking if a value is defined or not, but I can imagine people needing it. Christophe

On Tue, Oct 11, 2011 at 3:35 PM, Christophe Fergeau <cfergeau@redhat.com> wrote:
On Fri, Oct 07, 2011 at 02:59:28PM +0300, Zeeshan Ali (Khattak) wrote:
Not sure about booleans though. Do we really need to check if value is provided btw? AFAIK, every node/attribute has a default value.
Ah if they all have a well defined default value, we could also use that instead. I don't see any immediate use for checking if a value is defined or not, but I can imagine people needing it.
Can't we declare that as more advanced/special use-case and therefore have the app developer use libxml directly? We will still be helping out by providing a direct pointer to XMLNode. -- Regards, Zeeshan Ali (Khattak) FSF member#5124

On Tue, Oct 11, 2011 at 05:17:03PM +0300, Zeeshan Ali (Khattak) wrote:
Can't we declare that as more advanced/special use-case and therefore have the app developer use libxml directly? We will still be helping out by providing a direct pointer to XMLNode.
That's also an option, but that's the kind of issues I prefer to raise sooner rather than later :) Christophe

On Fri, Oct 07, 2011 at 11:40:45AM +0200, Christophe Fergeau wrote:
Hi,
Here is a set of patches which start to implement functionality to libvirt-gconfig. The end result is that the "name", "memory" and "features" properties are implemented for the Domain class. Most of the work is about reworking the low-level plumbing to make the implementation as easy as possible.
Can you tell me what GIT commitref this series is based on ? I tried to git am the series over current head, but it didn't pan out. 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 :|

On Mon, Oct 10, 2011 at 06:45:17PM +0100, Daniel P. Berrange wrote:
Can you tell me what GIT commitref this series is based on ? I tried to git am the series over current head, but it didn't pan out.
The tree can be found at https://gitorious.org/~teuf/libvirt/teuf-libvirt-glib/commits/gconfig , I think I know why git am doesn't work, the latest master commit in this branch is commit cff5f1c46f4b9661e112b85159fb58ae473a9a89 Author: Marc-André Lureau <marcandre.lureau@redhat.com> Date: Sun Oct 2 01:30:32 2011 +0200 event: remove timeout and handle from arrays However, this branch has the 3 error handling commits that you have already ack-ed on top of this one. One of these 3 commits changes code in libvirt-gconfig that is then moved to another file in this series. Since I don't have commit access to libvirt-glib, I'll annoy Marc-Andre or Zeeshan so that they commit these 3 patches for me :) Sorry for the inconvenience, Christophe
participants (3)
-
Christophe Fergeau
-
Daniel P. Berrange
-
Zeeshan Ali (Khattak)