[libvirt] libvirt-gconfig patches

Hi, This is the 2nd version of my libvirt-gconfig patches. I think I have addressed all of the issues that were raised (or told why I didn't address them). If I missed anything, just let me know. Some of the patches have been split/merged after the review so the series look a bit different from the first one even if the content is the same. One notable change is that I dropped the chardev classes for now since I need to go back to the drawing board a bit for these Christophe

--- libvirt-gconfig/libvirt-gconfig-capabilities.c | 1 - libvirt-gconfig/libvirt-gconfig-domain-snapshot.c | 1 - libvirt-gconfig/libvirt-gconfig-interface.c | 1 - libvirt-gconfig/libvirt-gconfig-network-filter.c | 1 - libvirt-gconfig/libvirt-gconfig-network.c | 1 - libvirt-gconfig/libvirt-gconfig-node-device.c | 1 - libvirt-gconfig/libvirt-gconfig-secret.c | 1 - libvirt-gconfig/libvirt-gconfig-storage-pool.c | 1 - libvirt-gconfig/libvirt-gconfig-storage-vol.c | 1 - 9 files changed, 0 insertions(+), 9 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-capabilities.c b/libvirt-gconfig/libvirt-gconfig-capabilities.c index 2f79073..55b196b 100644 --- a/libvirt-gconfig/libvirt-gconfig-capabilities.c +++ b/libvirt-gconfig/libvirt-gconfig-capabilities.c @@ -44,7 +44,6 @@ G_DEFINE_TYPE(GVirConfigCapabilities, gvir_config_capabilities, GVIR_TYPE_CONFIG static void gvir_config_capabilities_class_init(GVirConfigCapabilitiesClass *klass) { - g_type_class_add_private(klass, sizeof(GVirConfigCapabilitiesPrivate)); } diff --git a/libvirt-gconfig/libvirt-gconfig-domain-snapshot.c b/libvirt-gconfig/libvirt-gconfig-domain-snapshot.c index e7dc36e..aa74254 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-snapshot.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-snapshot.c @@ -44,7 +44,6 @@ G_DEFINE_TYPE(GVirConfigDomainSnapshot, gvir_config_domain_snapshot, GVIR_TYPE_C static void gvir_config_domain_snapshot_class_init(GVirConfigDomainSnapshotClass *klass) { - g_type_class_add_private(klass, sizeof(GVirConfigDomainSnapshotPrivate)); } diff --git a/libvirt-gconfig/libvirt-gconfig-interface.c b/libvirt-gconfig/libvirt-gconfig-interface.c index 5e934f6..b58a4b4 100644 --- a/libvirt-gconfig/libvirt-gconfig-interface.c +++ b/libvirt-gconfig/libvirt-gconfig-interface.c @@ -44,7 +44,6 @@ G_DEFINE_TYPE(GVirConfigInterface, gvir_config_interface, GVIR_TYPE_CONFIG_OBJEC static void gvir_config_interface_class_init(GVirConfigInterfaceClass *klass) { - g_type_class_add_private(klass, sizeof(GVirConfigInterfacePrivate)); } diff --git a/libvirt-gconfig/libvirt-gconfig-network-filter.c b/libvirt-gconfig/libvirt-gconfig-network-filter.c index 8b615bf..bea21a3 100644 --- a/libvirt-gconfig/libvirt-gconfig-network-filter.c +++ b/libvirt-gconfig/libvirt-gconfig-network-filter.c @@ -44,7 +44,6 @@ G_DEFINE_TYPE(GVirConfigNetworkFilter, gvir_config_network_filter, GVIR_TYPE_CON static void gvir_config_network_filter_class_init(GVirConfigNetworkFilterClass *klass) { - g_type_class_add_private(klass, sizeof(GVirConfigNetworkFilterPrivate)); } diff --git a/libvirt-gconfig/libvirt-gconfig-network.c b/libvirt-gconfig/libvirt-gconfig-network.c index 2bd2512..26d5d61 100644 --- a/libvirt-gconfig/libvirt-gconfig-network.c +++ b/libvirt-gconfig/libvirt-gconfig-network.c @@ -44,7 +44,6 @@ G_DEFINE_TYPE(GVirConfigNetwork, gvir_config_network, GVIR_TYPE_CONFIG_OBJECT); static void gvir_config_network_class_init(GVirConfigNetworkClass *klass) { - g_type_class_add_private(klass, sizeof(GVirConfigNetworkPrivate)); } diff --git a/libvirt-gconfig/libvirt-gconfig-node-device.c b/libvirt-gconfig/libvirt-gconfig-node-device.c index 3be973f..71389ef 100644 --- a/libvirt-gconfig/libvirt-gconfig-node-device.c +++ b/libvirt-gconfig/libvirt-gconfig-node-device.c @@ -44,7 +44,6 @@ G_DEFINE_TYPE(GVirConfigNodeDevice, gvir_config_node_device, GVIR_TYPE_CONFIG_OB static void gvir_config_node_device_class_init(GVirConfigNodeDeviceClass *klass) { - g_type_class_add_private(klass, sizeof(GVirConfigNodeDevicePrivate)); } diff --git a/libvirt-gconfig/libvirt-gconfig-secret.c b/libvirt-gconfig/libvirt-gconfig-secret.c index bb55c44..6267cf5 100644 --- a/libvirt-gconfig/libvirt-gconfig-secret.c +++ b/libvirt-gconfig/libvirt-gconfig-secret.c @@ -44,7 +44,6 @@ G_DEFINE_TYPE(GVirConfigSecret, gvir_config_secret, GVIR_TYPE_CONFIG_OBJECT); static void gvir_config_secret_class_init(GVirConfigSecretClass *klass) { - g_type_class_add_private(klass, sizeof(GVirConfigSecretPrivate)); } diff --git a/libvirt-gconfig/libvirt-gconfig-storage-pool.c b/libvirt-gconfig/libvirt-gconfig-storage-pool.c index 4cbda27..8a70ac2 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-pool.c +++ b/libvirt-gconfig/libvirt-gconfig-storage-pool.c @@ -44,7 +44,6 @@ G_DEFINE_TYPE(GVirConfigStoragePool, gvir_config_storage_pool, GVIR_TYPE_CONFIG_ static void gvir_config_storage_pool_class_init(GVirConfigStoragePoolClass *klass) { - g_type_class_add_private(klass, sizeof(GVirConfigStoragePoolPrivate)); } diff --git a/libvirt-gconfig/libvirt-gconfig-storage-vol.c b/libvirt-gconfig/libvirt-gconfig-storage-vol.c index e9e90be..4a17c45 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-vol.c +++ b/libvirt-gconfig/libvirt-gconfig-storage-vol.c @@ -44,7 +44,6 @@ G_DEFINE_TYPE(GVirConfigStorageVol, gvir_config_storage_vol, GVIR_TYPE_CONFIG_OB static void gvir_config_storage_vol_class_init(GVirConfigStorageVolClass *klass) { - g_type_class_add_private(klass, sizeof(GVirConfigStorageVolPrivate)); } -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:03:58PM +0100, Christophe Fergeau wrote:
--- libvirt-gconfig/libvirt-gconfig-capabilities.c | 1 - libvirt-gconfig/libvirt-gconfig-domain-snapshot.c | 1 - libvirt-gconfig/libvirt-gconfig-interface.c | 1 - libvirt-gconfig/libvirt-gconfig-network-filter.c | 1 - libvirt-gconfig/libvirt-gconfig-network.c | 1 - libvirt-gconfig/libvirt-gconfig-node-device.c | 1 - libvirt-gconfig/libvirt-gconfig-secret.c | 1 - libvirt-gconfig/libvirt-gconfig-storage-pool.c | 1 - libvirt-gconfig/libvirt-gconfig-storage-vol.c | 1 - 9 files changed, 0 insertions(+), 9 deletions(-)
ACK, trivial 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 is no corresponding implementation so no need to keep this prototype. --- libvirt-gconfig/libvirt-gconfig-object.h | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index 52e4525..bac3403 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -85,9 +85,6 @@ 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); - G_END_DECLS #endif /* __LIBVIRT_GCONFIG_OBJECT_H__ */ -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:03:59PM +0100, Christophe Fergeau wrote:
There is no corresponding implementation so no need to keep this prototype. --- libvirt-gconfig/libvirt-gconfig-object.h | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index 52e4525..bac3403 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -85,9 +85,6 @@ 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); - G_END_DECLS
#endif /* __LIBVIRT_GCONFIG_OBJECT_H__ */
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 :|

At this point, I'm not sure how/if the library user should be able to directly manipulate the XML data wrapped by a GVirConfigObject. It's preferrable to hide this API from the user until we have a clearer idea how to expose it. --- libvirt-gconfig/Makefile.am | 3 +- libvirt-gconfig/libvirt-gconfig-domain.c | 1 + libvirt-gconfig/libvirt-gconfig-object-private.h | 41 ++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-object.c | 28 +++++++++------ libvirt-gconfig/libvirt-gconfig-object.h | 11 ------ libvirt-gconfig/libvirt-gconfig.sym | 1 - 6 files changed, 61 insertions(+), 24 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-object-private.h diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index 0d15e78..52eff79 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -19,7 +19,8 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-storage-pool.h \ libvirt-gconfig-storage-vol.h noinst_HEADERS = \ - libvirt-gconfig-helpers-private.h + libvirt-gconfig-helpers-private.h \ + libvirt-gconfig-object-private.h GCONFIG_SOURCE_FILES = \ libvirt-gconfig-object.c \ libvirt-gconfig-capabilities.c \ diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 3290389..d971a95 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -27,6 +27,7 @@ #include "libvirt-gconfig/libvirt-gconfig.h" #include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" +#include "libvirt-gconfig/libvirt-gconfig-object-private.h" extern gboolean debugFlag; diff --git a/libvirt-gconfig/libvirt-gconfig-object-private.h b/libvirt-gconfig/libvirt-gconfig-object-private.h new file mode 100644 index 0000000..aec88bf --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-object-private.h @@ -0,0 +1,41 @@ +/* + * libvirt-gconfig-config-object-private.h: base object for XML configuration + * + * Copyright (C) 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 + * + * Author: Christophe Fergeau <cfergeau@redhat.com> + */ +#ifndef __LIBVIRT_GCONFIG_OBJECT_PRIVATE_H__ +#define __LIBVIRT_GCONFIG_OBJECT_PRIVATE_H__ + +G_BEGIN_DECLS + +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); + +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_OBJECT_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index fbdbedd..276be8c 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -29,6 +29,7 @@ #include "libvirt-gconfig/libvirt-gconfig.h" #include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" +#include "libvirt-gconfig/libvirt-gconfig-object-private.h" //extern gboolean debugFlag; @@ -277,13 +278,15 @@ 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) +G_GNUC_INTERNAL 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) +G_GNUC_INTERNAL char * +gvir_config_object_get_node_content(GVirConfigObject *object, + const char *node_name) { xmlNodePtr node; @@ -298,9 +301,10 @@ char *gvir_config_object_get_node_content(GVirConfigObject *object, * 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) +G_GNUC_INTERNAL void +gvir_config_object_set_node_content(GVirConfigObject *object, + const char *node_name, + const char *value) { xmlNodePtr parent_node; xmlNodePtr old_node; @@ -324,8 +328,9 @@ 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) +G_GNUC_INTERNAL guint64 +gvir_config_object_get_node_content_uint64(GVirConfigObject *object, + const char *node_name) { xmlNodePtr node; xmlChar *str; @@ -346,9 +351,10 @@ guint64 gvir_config_object_get_node_content_uint64(GVirConfigObject *object, } -void gvir_config_object_set_node_content_uint64(GVirConfigObject *object, - const char *node_name, - guint64 value) +G_GNUC_INTERNAL 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); diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index bac3403..ef87668 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -73,17 +73,6 @@ void gvir_config_object_validate(GVirConfigObject *config, 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); -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); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index ed28449..4764fef 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -38,7 +38,6 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_object_error_quark; gvir_config_object_new; gvir_config_object_get_schema; - gvir_config_object_get_xml_node; gvir_config_object_to_xml; gvir_config_object_validate; -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:00PM +0100, Christophe Fergeau wrote:
At this point, I'm not sure how/if the library user should be able to directly manipulate the XML data wrapped by a GVirConfigObject. It's preferrable to hide this API from the user until we have a clearer idea how to expose it. --- libvirt-gconfig/Makefile.am | 3 +- libvirt-gconfig/libvirt-gconfig-domain.c | 1 + libvirt-gconfig/libvirt-gconfig-object-private.h | 41 ++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-object.c | 28 +++++++++------ libvirt-gconfig/libvirt-gconfig-object.h | 11 ------ libvirt-gconfig/libvirt-gconfig.sym | 1 - 6 files changed, 61 insertions(+), 24 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-object-private.h
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 allows us to factor the code to add an XML node to a config object. -- v2: use g_return_if_fail to test function args for sanity replace object --- libvirt-gconfig/libvirt-gconfig-object-private.h | 5 + libvirt-gconfig/libvirt-gconfig-object.c | 105 +++++++++++++++------- libvirt-gconfig/libvirt-gconfig.h | 2 +- 3 files changed, 80 insertions(+), 32 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-object-private.h b/libvirt-gconfig/libvirt-gconfig-object-private.h index aec88bf..a14a792 100644 --- a/libvirt-gconfig/libvirt-gconfig-object-private.h +++ b/libvirt-gconfig/libvirt-gconfig-object-private.h @@ -35,6 +35,11 @@ void gvir_config_object_set_node_content(GVirConfigObject *object, void gvir_config_object_set_node_content_uint64(GVirConfigObject *object, const char *node_name, guint64 value); +xmlNodePtr gvir_config_object_replace_child(GVirConfigObject *object, + const char *child_name); +void gvir_config_object_set_child(GVirConfigObject *object, + xmlNodePtr child); + G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 276be8c..ac10e88 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -297,34 +297,89 @@ 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? - */ -G_GNUC_INTERNAL void -gvir_config_object_set_node_content(GVirConfigObject *object, - const char *node_name, - const char *value) +static xmlNodePtr +gvir_config_object_set_child_internal(GVirConfigObject *object, + xmlNodePtr child, + gboolean overwrite) { 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); + g_return_val_if_fail (parent_node != NULL, NULL); - old_node = gvir_config_xml_get_element(parent_node, node_name, NULL); + old_node = gvir_config_xml_get_element(parent_node, child->name, NULL); + /* FIXME: should we make sure there are no multiple occurrences + * of this node? + */ if (old_node) { - old_node = xmlReplaceNode(old_node, new_node); - xmlFreeNode(old_node); + if (overwrite) { + old_node = xmlReplaceNode(old_node, child); + xmlFreeNode(old_node); + } else { + return old_node; + } } else { - xmlAddChild(parent_node, new_node); + xmlAddChild(parent_node, child); } + + return NULL; +} + +G_GNUC_INTERNAL void +gvir_config_object_set_child(GVirConfigObject *object, xmlNodePtr child) +{ + gvir_config_object_set_child_internal(object, child, TRUE); +} + +G_GNUC_INTERNAL xmlNodePtr +gvir_config_object_replace_child(GVirConfigObject *object, + const char *child_name) +{ + xmlNodePtr new_node; + + g_return_val_if_fail(GVIR_IS_CONFIG_OBJECT(object), NULL); + g_return_val_if_fail(child_name != NULL, NULL); + + new_node = xmlNewDocNode(NULL, NULL, (xmlChar *)child_name, NULL); + gvir_config_object_set_child_internal(object, new_node, TRUE); + + return new_node; +} + +G_GNUC_INTERNAL void +gvir_config_object_set_node_content(GVirConfigObject *object, + const char *node_name, + const char *value) +{ + xmlNodePtr node; + xmlChar *encoded_data; + + g_return_if_fail(GVIR_IS_CONFIG_OBJECT(object)); + g_return_if_fail(node_name != NULL); + g_return_if_fail(value != NULL); + + node = gvir_config_object_replace_child(object, node_name); + g_return_if_fail(node != NULL); + encoded_data = xmlEncodeEntitiesReentrant(node->doc, + (xmlChar *)value); + xmlNodeSetContent(node, encoded_data); + xmlFree(encoded_data); +} + +G_GNUC_INTERNAL void +gvir_config_object_set_node_content_uint64(GVirConfigObject *object, + const char *node_name, + guint64 value) +{ + char *str; + + g_return_if_fail(GVIR_IS_CONFIG_OBJECT(object)); + g_return_if_fail(node_name != NULL); + + str = g_strdup_printf("%"G_GUINT64_FORMAT, value); + gvir_config_object_set_node_content(object, node_name, str); + g_free(str); } /* FIXME: how to notify of errors/node not found? */ @@ -350,18 +405,6 @@ gvir_config_object_get_node_content_uint64(GVirConfigObject *object, return value; } - -G_GNUC_INTERNAL 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); -} - GVirConfigObject *gvir_config_object_new_from_xml(GType type, const char *root_name, const char *schema, diff --git a/libvirt-gconfig/libvirt-gconfig.h b/libvirt-gconfig/libvirt-gconfig.h index fdc78a4..4e23f0d 100644 --- a/libvirt-gconfig/libvirt-gconfig.h +++ b/libvirt-gconfig/libvirt-gconfig.h @@ -26,11 +26,11 @@ #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> #include <libvirt-gconfig/libvirt-gconfig-domain-snapshot.h> +#include <libvirt-gconfig/libvirt-gconfig-helpers.h> #include <libvirt-gconfig/libvirt-gconfig-interface.h> #include <libvirt-gconfig/libvirt-gconfig-network.h> #include <libvirt-gconfig/libvirt-gconfig-node-device.h> -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:01PM +0100, Christophe Fergeau wrote:
This allows us to factor the code to add an XML node to a config object.
-- v2: use g_return_if_fail to test function args for sanity
replace object --- libvirt-gconfig/libvirt-gconfig-object-private.h | 5 + libvirt-gconfig/libvirt-gconfig-object.c | 105 +++++++++++++++------- libvirt-gconfig/libvirt-gconfig.h | 2 +- 3 files changed, 80 insertions(+), 32 deletions(-)
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 | 17 +++-------------- libvirt-gconfig/libvirt-gconfig-domain.h | 1 - 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index d971a95..5db6bc4 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -224,27 +224,16 @@ GStrv gvir_config_domain_get_features(GVirConfigDomain *domain) 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); + features_node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(domain), + "features"); for (it = features; *it != NULL; it++) { xmlNodePtr node; - node = xmlNewDocNode(parent_node->doc, NULL, (xmlChar *)*it, NULL); + node = xmlNewDocNode(features_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 d9f0c09..6cc8f31 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -70,7 +70,6 @@ GStrv gvir_config_domain_get_features(GVirConfigDomain *domain); void gvir_config_domain_set_features(GVirConfigDomain *domain, const GStrv features); - G_END_DECLS #endif /* __LIBVIRT_GCONFIG_DOMAIN_H__ */ -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:02PM +0100, Christophe Fergeau wrote:
--- libvirt-gconfig/libvirt-gconfig-domain.c | 17 +++-------------- libvirt-gconfig/libvirt-gconfig-domain.h | 1 - 2 files changed, 3 insertions(+), 15 deletions(-)
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/Makefile.am | 4 ++ libvirt-gconfig/libvirt-gconfig-clock.c | 81 +++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-clock.h | 68 ++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-timer.c | 81 +++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-timer.h | 68 ++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 2 + libvirt-gconfig/libvirt-gconfig.sym | 8 +++ 7 files changed, 312 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-clock.c create mode 100644 libvirt-gconfig/libvirt-gconfig-clock.h create mode 100644 libvirt-gconfig/libvirt-gconfig-timer.c create mode 100644 libvirt-gconfig/libvirt-gconfig-timer.h diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index 52eff79..a2f01fd 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -8,6 +8,7 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig.h \ libvirt-gconfig-object.h \ libvirt-gconfig-capabilities.h \ + libvirt-gconfig-clock.h \ libvirt-gconfig-domain.h \ libvirt-gconfig-domain-snapshot.h \ libvirt-gconfig-helpers.h \ @@ -16,6 +17,7 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-network-filter.h \ libvirt-gconfig-node-device.h \ libvirt-gconfig-secret.h \ + libvirt-gconfig-timer.h \ libvirt-gconfig-storage-pool.h \ libvirt-gconfig-storage-vol.h noinst_HEADERS = \ @@ -24,6 +26,7 @@ noinst_HEADERS = \ GCONFIG_SOURCE_FILES = \ libvirt-gconfig-object.c \ libvirt-gconfig-capabilities.c \ + libvirt-gconfig-clock.c \ libvirt-gconfig-domain.c \ libvirt-gconfig-domain-snapshot.c \ libvirt-gconfig-helpers.c \ @@ -32,6 +35,7 @@ GCONFIG_SOURCE_FILES = \ libvirt-gconfig-network-filter.c \ libvirt-gconfig-node-device.c \ libvirt-gconfig-secret.c \ + libvirt-gconfig-timer.c \ libvirt-gconfig-storage-pool.c \ libvirt-gconfig-storage-vol.c diff --git a/libvirt-gconfig/libvirt-gconfig-clock.c b/libvirt-gconfig/libvirt-gconfig-clock.c new file mode 100644 index 0000000..1f28efb --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-clock.c @@ -0,0 +1,81 @@ +/* + * libvirt-gobject-config_clock.c: libvirt glib integration + * + * Copyright (C) 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 + * + * Author: Christophe Fergeau <cfergeau@redhat.com> + */ + +#include <config.h> + +#include <string.h> + +#include <libxml/tree.h> + +#include "libvirt-gconfig/libvirt-gconfig.h" + +extern gboolean debugFlag; + +#define DEBUG(fmt, ...) do { if (G_UNLIKELY(debugFlag)) g_debug(fmt, ## __VA_ARGS__); } while (0) + +#define GVIR_CONFIG_CLOCK_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_CLOCK, GVirConfigClockPrivate)) + +struct _GVirConfigClockPrivate +{ + gboolean unused; +}; + +G_DEFINE_TYPE(GVirConfigClock, gvir_config_clock, GVIR_TYPE_CONFIG_OBJECT); + + +static void gvir_config_clock_class_init(GVirConfigClockClass *klass) +{ + g_type_class_add_private(klass, sizeof(GVirConfigClockPrivate)); +} + + +static void gvir_config_clock_init(GVirConfigClock *klock) +{ + GVirConfigClockPrivate *priv; + + DEBUG("Init GVirConfigClock=%p", klock); + + priv = klock->priv = GVIR_CONFIG_CLOCK_GET_PRIVATE(klock); + + memset(priv, 0, sizeof(*priv)); +} + + +GVirConfigClock *gvir_config_clock_new(void) +{ + GVirConfigObject *object; + + object = gvir_config_object_new(GVIR_TYPE_CONFIG_CLOCK, + "clock", NULL); + return GVIR_CONFIG_CLOCK(object); +} + +GVirConfigClock *gvir_config_clock_new_from_xml(const gchar *xml, + GError **error) +{ + GVirConfigObject *object; + + object = gvir_config_object_new_from_xml(GVIR_TYPE_CONFIG_CLOCK, + "clock", NULL, xml, error); + return GVIR_CONFIG_CLOCK(object); +} diff --git a/libvirt-gconfig/libvirt-gconfig-clock.h b/libvirt-gconfig/libvirt-gconfig-clock.h new file mode 100644 index 0000000..fc8850a --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-clock.h @@ -0,0 +1,68 @@ +/* + * libvirt-gobject-clock.h: libvirt gobject integration + * + * Copyright (C) 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 + * + * Author: Christophe Fergeau <cfergeau@redhat.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_CLOCK_H__ +#define __LIBVIRT_GCONFIG_CLOCK_H__ + +G_BEGIN_DECLS + +#define GVIR_TYPE_CONFIG_CLOCK (gvir_config_clock_get_type ()) +#define GVIR_CONFIG_CLOCK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GVIR_TYPE_CONFIG_CLOCK, GVirConfigClock)) +#define GVIR_CONFIG_CLOCK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GVIR_TYPE_CONFIG_CLOCK, GVirConfigClockClass)) +#define GVIR_IS_CONFIG_CLOCK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GVIR_TYPE_CONFIG_CLOCK)) +#define GVIR_IS_CONFIG_CLOCK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GVIR_TYPE_CONFIG_CLOCK)) +#define GVIR_CONFIG_CLOCK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GVIR_TYPE_CONFIG_CLOCK, GVirConfigClockClass)) + +typedef struct _GVirConfigClock GVirConfigClock; +typedef struct _GVirConfigClockPrivate GVirConfigClockPrivate; +typedef struct _GVirConfigClockClass GVirConfigClockClass; + +struct _GVirConfigClock +{ + GVirConfigObject parent; + + GVirConfigClockPrivate *priv; + + /* Do not add fields to this struct */ +}; + +struct _GVirConfigClockClass +{ + GVirConfigObjectClass parent_class; + + gpointer padding[20]; +}; + + +GType gvir_config_clock_get_type(void); + +GVirConfigClock *gvir_config_clock_new(void); +GVirConfigClock *gvir_config_clock_new_from_xml(const gchar *xml, + GError **error); + +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_CLOCK_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig-timer.c b/libvirt-gconfig/libvirt-gconfig-timer.c new file mode 100644 index 0000000..fd134fb --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-timer.c @@ -0,0 +1,81 @@ +/* + * libvirt-gobject-config_timer.c: libvirt glib integration + * + * Copyright (C) 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 + * + * Author: Christophe Fergeau <cfergeau@gmail.com> + */ + +#include <config.h> + +#include <string.h> + +#include <libxml/tree.h> + +#include "libvirt-gconfig/libvirt-gconfig.h" + +extern gboolean debugFlag; + +#define DEBUG(fmt, ...) do { if (G_UNLIKELY(debugFlag)) g_debug(fmt, ## __VA_ARGS__); } while (0) + +#define GVIR_CONFIG_TIMER_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_TIMER, GVirConfigTimerPrivate)) + +struct _GVirConfigTimerPrivate +{ + gboolean unused; +}; + +G_DEFINE_TYPE(GVirConfigTimer, gvir_config_timer, GVIR_TYPE_CONFIG_OBJECT); + + +static void gvir_config_timer_class_init(GVirConfigTimerClass *klass) +{ + g_type_class_add_private(klass, sizeof(GVirConfigTimerPrivate)); +} + + +static void gvir_config_timer_init(GVirConfigTimer *timer) +{ + GVirConfigTimerPrivate *priv; + + DEBUG("Init GVirConfigTimer=%p", timer); + + priv = timer->priv = GVIR_CONFIG_TIMER_GET_PRIVATE(timer); + + memset(priv, 0, sizeof(*priv)); +} + + +GVirConfigTimer *gvir_config_timer_new(void) +{ + GVirConfigObject *object; + + object = gvir_config_object_new(GVIR_TYPE_CONFIG_TIMER, "timer", NULL); + return GVIR_CONFIG_TIMER(object); +} + + +GVirConfigTimer *gvir_config_timer_new_from_xml(const gchar *xml, + GError **error) +{ + GVirConfigObject *object; + + object = gvir_config_object_new_from_xml(GVIR_TYPE_CONFIG_TIMER, + "timer", NULL, xml, error); + return GVIR_CONFIG_TIMER(object); +} diff --git a/libvirt-gconfig/libvirt-gconfig-timer.h b/libvirt-gconfig/libvirt-gconfig-timer.h new file mode 100644 index 0000000..d0c0f4d --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-timer.h @@ -0,0 +1,68 @@ +/* + * libvirt-gobject-timer.c: libvirt gobject integration + * + * Copyright (C) 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 + * + * Author: 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_TIMER_H__ +#define __LIBVIRT_GCONFIG_TIMER_H__ + +G_BEGIN_DECLS + +#define GVIR_TYPE_CONFIG_TIMER (gvir_config_timer_get_type ()) +#define GVIR_CONFIG_TIMER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GVIR_TYPE_CONFIG_TIMER, GVirConfigTimer)) +#define GVIR_CONFIG_TIMER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GVIR_TYPE_CONFIG_TIMER, GVirConfigTimerClass)) +#define GVIR_IS_CONFIG_TIMER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GVIR_TYPE_CONFIG_TIMER)) +#define GVIR_IS_CONFIG_TIMER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GVIR_TYPE_CONFIG_TIMER)) +#define GVIR_CONFIG_TIMER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GVIR_TYPE_CONFIG_TIMER, GVirConfigTimerClass)) + +typedef struct _GVirConfigTimer GVirConfigTimer; +typedef struct _GVirConfigTimerPrivate GVirConfigTimerPrivate; +typedef struct _GVirConfigTimerClass GVirConfigTimerClass; + +struct _GVirConfigTimer +{ + GVirConfigObject parent; + + GVirConfigTimerPrivate *priv; + + /* Do not add fields to this struct */ +}; + +struct _GVirConfigTimerClass +{ + GVirConfigObjectClass parent_class; + + gpointer padding[20]; +}; + + +GType gvir_config_timer_get_type(void); + +GVirConfigTimer *gvir_config_timer_new(void); +GVirConfigTimer *gvir_config_timer_new_from_xml(const gchar *xml, + GError **error); + +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_TIMER_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.h b/libvirt-gconfig/libvirt-gconfig.h index 4e23f0d..7cb34b0 100644 --- a/libvirt-gconfig/libvirt-gconfig.h +++ b/libvirt-gconfig/libvirt-gconfig.h @@ -28,6 +28,7 @@ #include <libvirt-gconfig/libvirt-gconfig-object.h> #include <libvirt-gconfig/libvirt-gconfig-capabilities.h> +#include <libvirt-gconfig/libvirt-gconfig-clock.h> #include <libvirt-gconfig/libvirt-gconfig-domain.h> #include <libvirt-gconfig/libvirt-gconfig-domain-snapshot.h> #include <libvirt-gconfig/libvirt-gconfig-helpers.h> @@ -36,6 +37,7 @@ #include <libvirt-gconfig/libvirt-gconfig-node-device.h> #include <libvirt-gconfig/libvirt-gconfig-network-filter.h> #include <libvirt-gconfig/libvirt-gconfig-secret.h> +#include <libvirt-gconfig/libvirt-gconfig-timer.h> #include <libvirt-gconfig/libvirt-gconfig-storage-pool.h> #include <libvirt-gconfig/libvirt-gconfig-storage-vol.h> diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 4764fef..a01c22d 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -4,6 +4,10 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_capabilities_new; gvir_config_capabilities_new_from_xml; + gvir_config_clock_get_type; + gvir_config_clock_new; + gvir_config_clock_new_from_xml; + gvir_config_domain_get_type; gvir_config_domain_new; gvir_config_domain_new_from_xml; @@ -53,6 +57,10 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_storage_vol_new; gvir_config_storage_vol_new_from_xml; + gvir_config_timer_get_type; + gvir_config_timer_new; + gvir_config_timer_new_from_xml; + local: *; }; -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:03PM +0100, Christophe Fergeau wrote:
--- libvirt-gconfig/Makefile.am | 4 ++ libvirt-gconfig/libvirt-gconfig-clock.c | 81 +++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-clock.h | 68 ++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-timer.c | 81 +++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-timer.h | 68 ++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 2 + libvirt-gconfig/libvirt-gconfig.sym | 8 +++ 7 files changed, 312 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-clock.c create mode 100644 libvirt-gconfig/libvirt-gconfig-clock.h create mode 100644 libvirt-gconfig/libvirt-gconfig-timer.c create mode 100644 libvirt-gconfig/libvirt-gconfig-timer.h
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, Nov 22, 2011 at 12:48:54PM +0000, Daniel P. Berrange wrote:
On Mon, Nov 21, 2011 at 07:04:03PM +0100, Christophe Fergeau wrote:
--- libvirt-gconfig/Makefile.am | 4 ++ libvirt-gconfig/libvirt-gconfig-clock.c | 81 +++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-clock.h | 68 ++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-timer.c | 81 +++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-timer.h | 68 ++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 2 + libvirt-gconfig/libvirt-gconfig.sym | 8 +++ 7 files changed, 312 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-clock.c create mode 100644 libvirt-gconfig/libvirt-gconfig-clock.h create mode 100644 libvirt-gconfig/libvirt-gconfig-timer.c create mode 100644 libvirt-gconfig/libvirt-gconfig-timer.h
ACK
Actually, I'm afraid these classes need renaming to GVirConfigDomainClock and GVirConfigDomainTimer. 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 :|

-- v2: use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-clock.c | 38 +++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-clock.h | 5 ++++ libvirt-gconfig/libvirt-gconfig.sym | 2 + 3 files changed, 45 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-clock.c b/libvirt-gconfig/libvirt-gconfig-clock.c index 1f28efb..25f6159 100644 --- a/libvirt-gconfig/libvirt-gconfig-clock.c +++ b/libvirt-gconfig/libvirt-gconfig-clock.c @@ -27,6 +27,7 @@ #include <libxml/tree.h> #include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-object-private.h" extern gboolean debugFlag; @@ -79,3 +80,40 @@ GVirConfigClock *gvir_config_clock_new_from_xml(const gchar *xml, "clock", NULL, xml, error); return GVIR_CONFIG_CLOCK(object); } + +void gvir_config_clock_set_timezone(GVirConfigClock *klock, + const char *tz) +{ + xmlNodePtr node; + xmlChar *encoded_tz; + + g_return_if_fail(GVIR_IS_CONFIG_CLOCK(klock)); + g_return_if_fail(tz != NULL); + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(klock)); + if (node == NULL) + return; + + xmlNewProp(node, (xmlChar*)"offset", (xmlChar*)"timezone"); + encoded_tz = xmlEncodeEntitiesReentrant(node->doc, (xmlChar*)tz); + xmlNewProp(node, (xmlChar*)"timezone", encoded_tz); + xmlFree(encoded_tz); +} + +void gvir_config_clock_set_variable_offset(GVirConfigClock *klock, + gint seconds) +{ + xmlNodePtr node; + char *offset_str; + + g_return_if_fail(GVIR_IS_CONFIG_CLOCK(klock)); + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(klock), "clock"); + if (node == NULL) + return; + + xmlNewProp(node, (xmlChar*)"offset", (xmlChar*)"variable"); + offset_str = g_strdup_printf("%d", seconds); + xmlNewProp(node, (xmlChar*)"timezone", (xmlChar*)offset_str); + g_free(offset_str); +} diff --git a/libvirt-gconfig/libvirt-gconfig-clock.h b/libvirt-gconfig/libvirt-gconfig-clock.h index fc8850a..26f4b53 100644 --- a/libvirt-gconfig/libvirt-gconfig-clock.h +++ b/libvirt-gconfig/libvirt-gconfig-clock.h @@ -63,6 +63,11 @@ GVirConfigClock *gvir_config_clock_new(void); GVirConfigClock *gvir_config_clock_new_from_xml(const gchar *xml, GError **error); +void gvir_config_clock_set_timezone(GVirConfigClock *klock, + const char *tz); +void gvir_config_clock_set_variable_offset(GVirConfigClock *klock, + gint seconds); + G_END_DECLS #endif /* __LIBVIRT_GCONFIG_CLOCK_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index a01c22d..c3d46d5 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -7,6 +7,8 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_clock_get_type; gvir_config_clock_new; gvir_config_clock_new_from_xml; + gvir_config_clock_set_timezone; + gvir_config_clock_set_variable_offset; gvir_config_domain_get_type; gvir_config_domain_new; -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:04PM +0100, Christophe Fergeau wrote:
-- v2: use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-clock.c | 38 +++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-clock.h | 5 ++++ libvirt-gconfig/libvirt-gconfig.sym | 2 + 3 files changed, 45 insertions(+), 0 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-clock.c b/libvirt-gconfig/libvirt-gconfig-clock.c index 1f28efb..25f6159 100644 --- a/libvirt-gconfig/libvirt-gconfig-clock.c +++ b/libvirt-gconfig/libvirt-gconfig-clock.c @@ -27,6 +27,7 @@ #include <libxml/tree.h>
#include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-object-private.h"
extern gboolean debugFlag;
@@ -79,3 +80,40 @@ GVirConfigClock *gvir_config_clock_new_from_xml(const gchar *xml, "clock", NULL, xml, error); return GVIR_CONFIG_CLOCK(object); } + +void gvir_config_clock_set_timezone(GVirConfigClock *klock, + const char *tz) +{ + xmlNodePtr node; + xmlChar *encoded_tz; + + g_return_if_fail(GVIR_IS_CONFIG_CLOCK(klock)); + g_return_if_fail(tz != NULL); + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(klock)); + if (node == NULL) + return; + + xmlNewProp(node, (xmlChar*)"offset", (xmlChar*)"timezone"); + encoded_tz = xmlEncodeEntitiesReentrant(node->doc, (xmlChar*)tz); + xmlNewProp(node, (xmlChar*)"timezone", encoded_tz); + xmlFree(encoded_tz); +} + +void gvir_config_clock_set_variable_offset(GVirConfigClock *klock, + gint seconds) +{ + xmlNodePtr node; + char *offset_str; + + g_return_if_fail(GVIR_IS_CONFIG_CLOCK(klock)); + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(klock), "clock"); + if (node == NULL) + return; + + xmlNewProp(node, (xmlChar*)"offset", (xmlChar*)"variable"); + offset_str = g_strdup_printf("%d", seconds); + xmlNewProp(node, (xmlChar*)"timezone", (xmlChar*)offset_str); + g_free(offset_str);
Copy+paste buglet - s/timezone/adjustment/ ACK with that fix commit. 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 :|

The implementation is likely to need to be completed later. We might want to store pointers from GVirConfigDomain to the associated GVirConfigClock, from GVirConfigClock to the GVirConfigDomain that contains it. Since I'm not sure yet if they will be needed, I chose to keep the implementation simple. -- v2: use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-domain.c | 12 ++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 2 ++ libvirt-gconfig/libvirt-gconfig.sym | 1 + 3 files changed, 15 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 5db6bc4..4c4ca53 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -237,3 +237,15 @@ void gvir_config_domain_set_features(GVirConfigDomain *domain, } g_object_notify(G_OBJECT(domain), "features"); } + +void gvir_config_domain_set_clock(GVirConfigDomain *domain, + GVirConfigClock *klock) +{ + xmlNodePtr clock_node; + + g_return_if_fail(GVIR_IS_CONFIG_DOMAIN(domain)); + g_return_if_fail(GVIR_IS_CONFIG_CLOCK(klock)); + + clock_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(klock)); + gvir_config_object_set_child(GVIR_CONFIG_OBJECT(domain), clock_node); +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index 6cc8f31..6f822cf 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -69,6 +69,8 @@ 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); +void gvir_config_domain_set_clock(GVirConfigDomain *domain, + GVirConfigClock *klock); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index c3d46d5..7b346a1 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -13,6 +13,7 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_domain_get_type; gvir_config_domain_new; gvir_config_domain_new_from_xml; + gvir_config_domain_set_clock; gvir_config_domain_get_features; gvir_config_domain_set_features; gvir_config_domain_get_memory; -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:05PM +0100, Christophe Fergeau wrote:
The implementation is likely to need to be completed later. We might want to store pointers from GVirConfigDomain to the associated GVirConfigClock, from GVirConfigClock to the GVirConfigDomain that contains it. Since I'm not sure yet if they will be needed, I chose to keep the implementation simple.
-- v2: use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-domain.c | 12 ++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 2 ++ libvirt-gconfig/libvirt-gconfig.sym | 1 + 3 files changed, 15 insertions(+), 0 deletions(-)
ACK
diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index c3d46d5..7b346a1 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -13,6 +13,7 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_domain_get_type; gvir_config_domain_new; gvir_config_domain_new_from_xml; + gvir_config_domain_set_clock; gvir_config_domain_get_features; gvir_config_domain_set_features; gvir_config_domain_get_memory;
We should start a LIBVIRT_GOBJECT_0.0.2 block for symbols now 0.0.1 is released. Regards, 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, Nov 22, 2011 at 12:56:02PM +0000, Daniel P. Berrange wrote:
On Mon, Nov 21, 2011 at 07:04:05PM +0100, Christophe Fergeau wrote:
The implementation is likely to need to be completed later. We might want to store pointers from GVirConfigDomain to the associated GVirConfigClock, from GVirConfigClock to the GVirConfigDomain that contains it. Since I'm not sure yet if they will be needed, I chose to keep the implementation simple.
-- v2: use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-domain.c | 12 ++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 2 ++ libvirt-gconfig/libvirt-gconfig.sym | 1 + 3 files changed, 15 insertions(+), 0 deletions(-)
ACK
diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index c3d46d5..7b346a1 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -13,6 +13,7 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_domain_get_type; gvir_config_domain_new; gvir_config_domain_new_from_xml; + gvir_config_domain_set_clock; gvir_config_domain_get_features; gvir_config_domain_set_features; gvir_config_domain_get_memory;
We should start a LIBVIRT_GOBJECT_0.0.2 block for symbols now 0.0.1 is released.
On second thought, we could just rename the existing symbol version block. Since we are explicitly not ABI stable, renaming the block will force an application rebuild which is desirable for now 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, Nov 22, 2011 at 01:03:37PM +0000, Daniel P. Berrange wrote:
On Tue, Nov 22, 2011 at 12:56:02PM +0000, Daniel P. Berrange wrote:
We should start a LIBVIRT_GOBJECT_0.0.2 block for symbols now 0.0.1 is released.
On second thought, we could just rename the existing symbol version block. Since we are explicitly not ABI stable, renaming the block will force an application rebuild which is desirable for now
I haven't changed anything for that, we can do that before the release I guess. Christophe

We don't currently have any enum in our API, but we will need some. This commit adds the generation of libvirt-gconfig-enum-types.[ch] using glib-mkenums. These files will register the various enums that will get added to libvirt-gconfig header files with glib. -- v2: move libvirt-gconfig-enum-types.h to HEADERS in Makefile.am so that it's installed --- configure.ac | 4 ++ libvirt-gconfig/Makefile.am | 23 +++++++++++- .../libvirt-gconfig-enum-types.c.template | 36 ++++++++++++++++++++ .../libvirt-gconfig-enum-types.h.template | 24 +++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 1 + 5 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-enum-types.c.template create mode 100644 libvirt-gconfig/libvirt-gconfig-enum-types.h.template diff --git a/configure.ac b/configure.ac index 464160c..3281baa 100644 --- a/configure.ac +++ b/configure.ac @@ -52,6 +52,10 @@ PKG_CHECK_MODULES(LIBXML2, libxml-2.0 >= $LIBXML2_REQUIRED) GTK_DOC_CHECK([1.10],[--flavour no-tmpl]) +# Setup GLIB_MKENUMS to use glib-mkenums even if GLib is uninstalled. +GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0` +AC_SUBST(GLIB_MKENUMS) + dnl Extra link-time flags for Cygwin. dnl Copied from libxml2 configure.in, but I removed mingw changes dnl for now since I'm not supporting mingw at present. - RWMJ diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index a2f01fd..13655f9 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -1,6 +1,9 @@ SUBDIRS = . tests -EXTRA_DIST = libvirt-gconfig.sym +EXTRA_DIST = \ + libvirt-gconfig.sym \ + libvirt-gconfig-enum-types.h.template \ + libvirt-gconfig-enum-types.c.template lib_LTLIBRARIES = libvirt-gconfig-1.0.la @@ -29,6 +32,7 @@ GCONFIG_SOURCE_FILES = \ libvirt-gconfig-clock.c \ libvirt-gconfig-domain.c \ libvirt-gconfig-domain-snapshot.c \ + libvirt-gconfig-enum-types.c \ libvirt-gconfig-helpers.c \ libvirt-gconfig-interface.c \ libvirt-gconfig-network.c \ @@ -41,7 +45,8 @@ GCONFIG_SOURCE_FILES = \ libvirt_gconfig_1_0_ladir = $(includedir)/libvirt-gconfig-1.0/libvirt-gconfig libvirt_gconfig_1_0_la_HEADERS = \ - $(GCONFIG_HEADER_FILES) + $(GCONFIG_HEADER_FILES) \ + libvirt-gconfig-enum-types.h libvirt_gconfig_1_0_la_SOURCES = \ $(libvirt_gconfig_1_0_la_HEADERS) \ $(GCONFIG_SOURCE_FILES) @@ -65,6 +70,20 @@ libvirt_gconfig_1_0_la_LDFLAGS = \ -Wl,--version-script=$(srcdir)/libvirt-gconfig.sym \ -version-info $(LIBVIRT_GLIB_VERSION_INFO) +BUILT_SOURCES = \ + libvirt-gconfig-enum-types.c \ + libvirt-gconfig-enum-types.h + +libvirt-gconfig-enum-types.h: $(GCONFIG_HEADER_FILES) libvirt-gconfig-enum-types.h.template + $(AM_V_GEN) ( cd $(srcdir) \ + && $(GLIB_MKENUMS) --template libvirt-gconfig-enum-types.h.template $(GCONFIG_HEADER_FILES) ) >libvirt-gconfig-enum-types.h.tmp \ + && sed -e "s/G_TYPE_VIR/GVIR_TYPE/" -e "s/g_vir/gvir/" libvirt-gconfig-enum-types.h.tmp >libvirt-gconfig-enum-types.h + +libvirt-gconfig-enum-types.c: $(GCONFIG_HEADER_FILES) libvirt-gconfig-enum-types.c.template + $(AM_V_GEN) ( cd $(srcdir) \ + && $(GLIB_MKENUMS) --template libvirt-gconfig-enum-types.c.template $(GCONFIG_HEADER_FILES) ) >libvirt-gconfig-enum-types.c.tmp \ + && sed -e "s/G_TYPE_VIR/GVIR_TYPE/" -e "s/g_vir/gvir/" libvirt-gconfig-enum-types.c.tmp >libvirt-gconfig-enum-types.c + if WITH_GOBJECT_INTROSPECTION LibvirtGConfig-1.0.gir: libvirt-gconfig-1.0.la $(G_IR_SCANNER) Makefile.am diff --git a/libvirt-gconfig/libvirt-gconfig-enum-types.c.template b/libvirt-gconfig/libvirt-gconfig-enum-types.c.template new file mode 100644 index 0000000..cccea77 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-enum-types.c.template @@ -0,0 +1,36 @@ +/*** BEGIN file-header ***/ +#include <libvirt-gconfig/libvirt-gconfig.h> + +/*** END file-header ***/ + +/*** BEGIN file-production ***/ +/* enumerations from "@filename@" */ +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +GType +@enum_name@_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const G@Type@Value values[] = { +/*** END value-header ***/ + +/*** BEGIN value-production ***/ + { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, +/*** END value-production ***/ + +/*** BEGIN value-tail ***/ + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +/*** END value-tail ***/ diff --git a/libvirt-gconfig/libvirt-gconfig-enum-types.h.template b/libvirt-gconfig/libvirt-gconfig-enum-types.h.template new file mode 100644 index 0000000..2cab1c5 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-enum-types.h.template @@ -0,0 +1,24 @@ +/*** BEGIN file-header ***/ +#ifndef __LIBVIRT_GCONFIG_ENUM_TYPES_H__ +#define __LIBVIRT_GCONFIG_ENUM_TYPES_H__ + +#include <libvirt-gconfig/libvirt-gconfig.h> + +G_BEGIN_DECLS +/*** END file-header ***/ + +/*** BEGIN file-production ***/ + +/* enumerations from "@filename@" */ +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +GType @enum_name@_get_type (void) G_GNUC_CONST; +#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ()) +/*** END value-header ***/ + +/*** BEGIN file-tail ***/ +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_ENUM_TYPES_H__ */ +/*** END file-tail ***/ diff --git a/libvirt-gconfig/libvirt-gconfig.h b/libvirt-gconfig/libvirt-gconfig.h index 7cb34b0..26ad20e 100644 --- a/libvirt-gconfig/libvirt-gconfig.h +++ b/libvirt-gconfig/libvirt-gconfig.h @@ -31,6 +31,7 @@ #include <libvirt-gconfig/libvirt-gconfig-clock.h> #include <libvirt-gconfig/libvirt-gconfig-domain.h> #include <libvirt-gconfig/libvirt-gconfig-domain-snapshot.h> +#include <libvirt-gconfig/libvirt-gconfig-enum-types.h> #include <libvirt-gconfig/libvirt-gconfig-helpers.h> #include <libvirt-gconfig/libvirt-gconfig-interface.h> #include <libvirt-gconfig/libvirt-gconfig-network.h> -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:06PM +0100, Christophe Fergeau wrote:
We don't currently have any enum in our API, but we will need some. This commit adds the generation of libvirt-gconfig-enum-types.[ch] using glib-mkenums. These files will register the various enums that will get added to libvirt-gconfig header files with glib.
-- v2: move libvirt-gconfig-enum-types.h to HEADERS in Makefile.am so that it's installed --- configure.ac | 4 ++ libvirt-gconfig/Makefile.am | 23 +++++++++++- .../libvirt-gconfig-enum-types.c.template | 36 ++++++++++++++++++++ .../libvirt-gconfig-enum-types.h.template | 24 +++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 1 + 5 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-enum-types.c.template create mode 100644 libvirt-gconfig/libvirt-gconfig-enum-types.h.template
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 :|

We will often need to convert from an enum to its string representation, add an helper for that to avoid duplicating that code. -- v2: moved before gvir_config_clock_set_offset implementation since it needs it --- libvirt-gconfig/libvirt-gconfig-helpers-private.h | 1 + libvirt-gconfig/libvirt-gconfig-helpers.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-helpers-private.h b/libvirt-gconfig/libvirt-gconfig-helpers-private.h index c7a5d6a..59efd24 100644 --- a/libvirt-gconfig/libvirt-gconfig-helpers-private.h +++ b/libvirt-gconfig/libvirt-gconfig-helpers-private.h @@ -40,6 +40,7 @@ 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); +const char *gvir_config_genum_get_nick (GType enum_type, gint value); 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 index 2e28429..d7e1140 100644 --- a/libvirt-gconfig/libvirt-gconfig-helpers.c +++ b/libvirt-gconfig/libvirt-gconfig-helpers.c @@ -178,3 +178,20 @@ gvir_config_xml_get_child_element_content_glib (xmlNode *node, return copy; } + +const char *gvir_config_genum_get_nick (GType enum_type, gint value) +{ + GEnumClass *enum_class; + GEnumValue *enum_value; + + g_return_val_if_fail (G_TYPE_IS_ENUM (enum_type), NULL); + + enum_class = g_type_class_ref(enum_type); + enum_value = g_enum_get_value(enum_class, value); + g_type_class_unref(enum_class); + + if (enum_value != NULL) + return enum_value->value_nick; + + g_return_val_if_reached(NULL); +} -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:07PM +0100, Christophe Fergeau wrote:
We will often need to convert from an enum to its string representation, add an helper for that to avoid duplicating that code.
-- v2: moved before gvir_config_clock_set_offset implementation since it needs it --- libvirt-gconfig/libvirt-gconfig-helpers-private.h | 1 + libvirt-gconfig/libvirt-gconfig-helpers.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 0 deletions(-)
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 :|

-- v2: use gvir_config_genum_get_nick helper since it's now added before this commit use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-clock.c | 17 +++++++++++++++++ libvirt-gconfig/libvirt-gconfig-clock.h | 8 ++++++++ libvirt-gconfig/libvirt-gconfig.sym | 2 ++ 3 files changed, 27 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-clock.c b/libvirt-gconfig/libvirt-gconfig-clock.c index 25f6159..0768e58 100644 --- a/libvirt-gconfig/libvirt-gconfig-clock.c +++ b/libvirt-gconfig/libvirt-gconfig-clock.c @@ -27,6 +27,7 @@ #include <libxml/tree.h> #include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" #include "libvirt-gconfig/libvirt-gconfig-object-private.h" extern gboolean debugFlag; @@ -81,6 +82,22 @@ GVirConfigClock *gvir_config_clock_new_from_xml(const gchar *xml, return GVIR_CONFIG_CLOCK(object); } +void gvir_config_clock_set_offset(GVirConfigClock *klock, + GVirConfigClockOffset offset) +{ + xmlNodePtr node; + const char *offset_str; + + g_return_if_fail(GVIR_IS_CONFIG_CLOCK(klock)); + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(klock)); + g_return_if_fail(node != NULL); + offset_str = gvir_config_genum_get_nick(GVIR_TYPE_CONFIG_CLOCK_OFFSET, + offset); + g_return_if_fail(offset_str != NULL); + xmlNewProp(node, (xmlChar*)"offset", (xmlChar*)offset_str); +} + void gvir_config_clock_set_timezone(GVirConfigClock *klock, const char *tz) { diff --git a/libvirt-gconfig/libvirt-gconfig-clock.h b/libvirt-gconfig/libvirt-gconfig-clock.h index 26f4b53..49cacef 100644 --- a/libvirt-gconfig/libvirt-gconfig-clock.h +++ b/libvirt-gconfig/libvirt-gconfig-clock.h @@ -56,6 +56,12 @@ struct _GVirConfigClockClass gpointer padding[20]; }; +typedef enum { + GVIR_CONFIG_CLOCK_UTC, + GVIR_CONFIG_CLOCK_LOCALTIME, + GVIR_CONFIG_CLOCK_TIMEZONE, + GVIR_CONFIG_CLOCK_VARIABLE +} GVirConfigClockOffset; GType gvir_config_clock_get_type(void); @@ -63,6 +69,8 @@ GVirConfigClock *gvir_config_clock_new(void); GVirConfigClock *gvir_config_clock_new_from_xml(const gchar *xml, GError **error); +void gvir_config_clock_set_offset(GVirConfigClock *klock, + GVirConfigClockOffset offset); void gvir_config_clock_set_timezone(GVirConfigClock *klock, const char *tz); void gvir_config_clock_set_variable_offset(GVirConfigClock *klock, diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 7b346a1..0b60c7c 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -5,8 +5,10 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_capabilities_new_from_xml; gvir_config_clock_get_type; + gvir_config_clock_offset_get_type; gvir_config_clock_new; gvir_config_clock_new_from_xml; + gvir_config_clock_set_offset; gvir_config_clock_set_timezone; gvir_config_clock_set_variable_offset; -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:08PM +0100, Christophe Fergeau wrote:
-- v2: use gvir_config_genum_get_nick helper since it's now added before this commit use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-clock.c | 17 +++++++++++++++++ libvirt-gconfig/libvirt-gconfig-clock.h | 8 ++++++++ libvirt-gconfig/libvirt-gconfig.sym | 2 ++ 3 files changed, 27 insertions(+), 0 deletions(-)
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/tests/test-domain-create.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/tests/test-domain-create.c b/libvirt-gconfig/tests/test-domain-create.c index a719ed2..a5c5b99 100644 --- a/libvirt-gconfig/tests/test-domain-create.c +++ b/libvirt-gconfig/tests/test-domain-create.c @@ -33,6 +33,7 @@ const char *features[] = { "foo", "bar", "baz", NULL }; int main(void) { GVirConfigDomain *domain; + GVirConfigClock *klock; char *name; GStrv feat; unsigned int i; @@ -59,6 +60,10 @@ int main(void) } g_strfreev(feat); + klock = gvir_config_clock_new(); + gvir_config_clock_set_offset(klock, GVIR_CONFIG_CLOCK_UTC); + gvir_config_domain_set_clock(domain, klock); + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain)); g_print("%s\n", xml); g_free(xml); -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:09PM +0100, Christophe Fergeau wrote:
--- libvirt-gconfig/tests/test-domain-create.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)
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/Makefile.am | 2 + libvirt-gconfig/libvirt-gconfig-os.c | 79 ++++++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-os.h | 67 ++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 3 +- libvirt-gconfig/libvirt-gconfig.sym | 4 ++ 5 files changed, 154 insertions(+), 1 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-os.c create mode 100644 libvirt-gconfig/libvirt-gconfig-os.h diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index 13655f9..648ded0 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -19,6 +19,7 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-network.h \ libvirt-gconfig-network-filter.h \ libvirt-gconfig-node-device.h \ + libvirt-gconfig-os.h \ libvirt-gconfig-secret.h \ libvirt-gconfig-timer.h \ libvirt-gconfig-storage-pool.h \ @@ -38,6 +39,7 @@ GCONFIG_SOURCE_FILES = \ libvirt-gconfig-network.c \ libvirt-gconfig-network-filter.c \ libvirt-gconfig-node-device.c \ + libvirt-gconfig-os.c \ libvirt-gconfig-secret.c \ libvirt-gconfig-timer.c \ libvirt-gconfig-storage-pool.c \ diff --git a/libvirt-gconfig/libvirt-gconfig-os.c b/libvirt-gconfig/libvirt-gconfig-os.c new file mode 100644 index 0000000..c09e32a --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-os.c @@ -0,0 +1,79 @@ +/* + * libvirt-gobject-config_os.c: libvirt glib integration + * + * Copyright (C) 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 + * + * Author: Christophe Fergeau <cfergeau@gmail.com> + */ + +#include <config.h> + +#include <string.h> + +#include <libxml/tree.h> + +#include "libvirt-gconfig/libvirt-gconfig.h" + +extern gboolean debugFlag; + +#define DEBUG(fmt, ...) do { if (G_UNLIKELY(debugFlag)) g_debug(fmt, ## __VA_ARGS__); } while (0) + +#define GVIR_CONFIG_OS_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_OS, GVirConfigOsPrivate)) + +struct _GVirConfigOsPrivate +{ + gboolean unused; +}; + +G_DEFINE_TYPE(GVirConfigOs, gvir_config_os, GVIR_TYPE_CONFIG_OBJECT); + + +static void gvir_config_os_class_init(GVirConfigOsClass *klass) +{ + g_type_class_add_private(klass, sizeof(GVirConfigOsPrivate)); +} + + +static void gvir_config_os_init(GVirConfigOs *os) +{ + GVirConfigOsPrivate *priv; + + DEBUG("Init GVirConfigOs=%p", os); + + priv = os->priv = GVIR_CONFIG_OS_GET_PRIVATE(os); + + memset(priv, 0, sizeof(*priv)); +} + + +GVirConfigOs *gvir_config_os_new(void) +{ + GVirConfigObject *object; + + object = gvir_config_object_new(GVIR_TYPE_CONFIG_OS, "os", NULL); + return GVIR_CONFIG_OS(object); +} + +GVirConfigOs *gvir_config_os_new_from_xml(const gchar *xml, GError **error) +{ + GVirConfigObject *object; + + object = gvir_config_object_new_from_xml(GVIR_TYPE_CONFIG_OS, "os", + NULL, xml, error); + return GVIR_CONFIG_OS(object); +} diff --git a/libvirt-gconfig/libvirt-gconfig-os.h b/libvirt-gconfig/libvirt-gconfig-os.h new file mode 100644 index 0000000..716f588 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-os.h @@ -0,0 +1,67 @@ +/* + * libvirt-gobject-os.c: libvirt gobject integration + * + * Copyright (C) 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 + * + * Author: 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_OS_H__ +#define __LIBVIRT_GCONFIG_OS_H__ + +G_BEGIN_DECLS + +#define GVIR_TYPE_CONFIG_OS (gvir_config_os_get_type ()) +#define GVIR_CONFIG_OS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GVIR_TYPE_CONFIG_OS, GVirConfigOs)) +#define GVIR_CONFIG_OS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GVIR_TYPE_CONFIG_OS, GVirConfigOsClass)) +#define GVIR_IS_CONFIG_OS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GVIR_TYPE_CONFIG_OS)) +#define GVIR_IS_CONFIG_OS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GVIR_TYPE_CONFIG_OS)) +#define GVIR_CONFIG_OS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GVIR_TYPE_CONFIG_OS, GVirConfigOsClass)) + +typedef struct _GVirConfigOs GVirConfigOs; +typedef struct _GVirConfigOsPrivate GVirConfigOsPrivate; +typedef struct _GVirConfigOsClass GVirConfigOsClass; + +struct _GVirConfigOs +{ + GVirConfigObject parent; + + GVirConfigOsPrivate *priv; + + /* Do not add fields to this struct */ +}; + +struct _GVirConfigOsClass +{ + GVirConfigObjectClass parent_class; + + gpointer padding[20]; +}; + + +GType gvir_config_os_get_type(void); + +GVirConfigOs *gvir_config_os_new(void); +GVirConfigOs *gvir_config_os_new_from_xml(const gchar *xml, GError **error); + +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_OS_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.h b/libvirt-gconfig/libvirt-gconfig.h index 26ad20e..482c088 100644 --- a/libvirt-gconfig/libvirt-gconfig.h +++ b/libvirt-gconfig/libvirt-gconfig.h @@ -35,8 +35,9 @@ #include <libvirt-gconfig/libvirt-gconfig-helpers.h> #include <libvirt-gconfig/libvirt-gconfig-interface.h> #include <libvirt-gconfig/libvirt-gconfig-network.h> -#include <libvirt-gconfig/libvirt-gconfig-node-device.h> #include <libvirt-gconfig/libvirt-gconfig-network-filter.h> +#include <libvirt-gconfig/libvirt-gconfig-node-device.h> +#include <libvirt-gconfig/libvirt-gconfig-os.h> #include <libvirt-gconfig/libvirt-gconfig-secret.h> #include <libvirt-gconfig/libvirt-gconfig-timer.h> #include <libvirt-gconfig/libvirt-gconfig-storage-pool.h> diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 0b60c7c..138b80f 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -50,6 +50,10 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_object_to_xml; gvir_config_object_validate; + gvir_config_os_get_type; + gvir_config_os_new; + gvir_config_os_new_from_xml; + gvir_config_secret_get_type; gvir_config_secret_new; gvir_config_secret_new_from_xml; -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:10PM +0100, Christophe Fergeau wrote:
--- libvirt-gconfig/Makefile.am | 2 + libvirt-gconfig/libvirt-gconfig-os.c | 79 ++++++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-os.h | 67 ++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 3 +- libvirt-gconfig/libvirt-gconfig.sym | 4 ++ 5 files changed, 154 insertions(+), 1 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-os.c create mode 100644 libvirt-gconfig/libvirt-gconfig-os.h
ACK
+static void gvir_config_os_init(GVirConfigOs *os) +{ + GVirConfigOsPrivate *priv; + + DEBUG("Init GVirConfigOs=%p", os); + + priv = os->priv = GVIR_CONFIG_OS_GET_PRIVATE(os); + + memset(priv, 0, sizeof(*priv)); +}
Can drop the memset() since we previously figured out we don't need that. 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, Nov 22, 2011 at 01:01:17PM +0000, Daniel P. Berrange wrote:
On Mon, Nov 21, 2011 at 07:04:10PM +0100, Christophe Fergeau wrote:
--- libvirt-gconfig/Makefile.am | 2 + libvirt-gconfig/libvirt-gconfig-os.c | 79 ++++++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-os.h | 67 ++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 3 +- libvirt-gconfig/libvirt-gconfig.sym | 4 ++ 5 files changed, 154 insertions(+), 1 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-os.c create mode 100644 libvirt-gconfig/libvirt-gconfig-os.h
ACK
Sorry, needs renaming to GVirConfigDomainOs. 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, Nov 22, 2011 at 01:01:17PM +0000, Daniel P. Berrange wrote:
On Mon, Nov 21, 2011 at 07:04:10PM +0100, Christophe Fergeau wrote:
+static void gvir_config_os_init(GVirConfigOs *os) +{ + GVirConfigOsPrivate *priv; + + DEBUG("Init GVirConfigOs=%p", os); + + priv = os->priv = GVIR_CONFIG_OS_GET_PRIVATE(os); + + memset(priv, 0, sizeof(*priv)); +}
Can drop the memset() since we previously figured out we don't need that.
Dropped everywhere in an additional patch in v3 Christophe

-- v2: merged several related commits use safer g_strcmp0 for string comparison use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-os.c | 138 ++++++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-os.h | 27 +++++++ libvirt-gconfig/libvirt-gconfig.sym | 11 +++ 3 files changed, 176 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-os.c b/libvirt-gconfig/libvirt-gconfig-os.c index c09e32a..b430eb6 100644 --- a/libvirt-gconfig/libvirt-gconfig-os.c +++ b/libvirt-gconfig/libvirt-gconfig-os.c @@ -27,6 +27,8 @@ #include <libxml/tree.h> #include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" +#include "libvirt-gconfig/libvirt-gconfig-object-private.h" extern gboolean debugFlag; @@ -77,3 +79,139 @@ GVirConfigOs *gvir_config_os_new_from_xml(const gchar *xml, GError **error) NULL, xml, error); return GVIR_CONFIG_OS(object); } + +void gvir_config_os_set_os_type(GVirConfigOs *os, GVirConfigOsType type) +{ + xmlNodePtr node; + const char *type_str; + + g_return_if_fail(GVIR_IS_CONFIG_OS(os)); + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(os), "type"); + g_return_if_fail(node != NULL); + type_str = gvir_config_genum_get_nick(GVIR_TYPE_CONFIG_OS_TYPE, type); + g_return_if_fail(type_str != NULL); + xmlNodeSetContent(node, (xmlChar*)type_str); +} + +void gvir_config_os_set_loader(GVirConfigOs *os, const char * loader) +{ + gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(os), + "loader", loader); +} + +void gvir_config_os_enable_boot_menu(GVirConfigOs *os, gboolean enable) +{ + xmlNodePtr node; + + g_return_if_fail(GVIR_IS_CONFIG_OS(os)); + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(os), "bootmenu"); + g_return_if_fail(node != NULL); + if (enable) + xmlNewProp(node, (xmlChar*)"enable", (xmlChar*)"yes"); + else + xmlNewProp(node, (xmlChar*)"enable", (xmlChar*)"no"); +} + +void gvir_config_os_bios_enable_serial(GVirConfigOs *os, gboolean enable) +{ + xmlNodePtr node; + + g_return_if_fail(GVIR_IS_CONFIG_OS(os)); + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(os), "bios"); + g_return_if_fail(node != NULL); + if (enable) + xmlNewProp(node, (xmlChar*)"useserial", (xmlChar*)"yes"); + else + xmlNewProp(node, (xmlChar*)"useserial", (xmlChar*)"no"); +} + +void gvir_config_os_set_smbios_mode(GVirConfigOs *os, + GVirConfigOsSmBiosMode mode) +{ + xmlNodePtr node; + const char *mode_str; + + g_return_if_fail(GVIR_IS_CONFIG_OS(os)); + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(os), "smbios"); + g_return_if_fail(node != NULL); + mode_str = gvir_config_genum_get_nick(GVIR_TYPE_CONFIG_OS_SM_BIOS_MODE, + mode); + if (mode_str != NULL) + xmlNewProp(node, (xmlChar*)"mode", (xmlChar*)mode_str); +} + +/** + * gvir_config_os_set_boot_devices: + * @boot_devices: (in) (element-type LibvirtGConfig.OsBootDevice): + */ +void gvir_config_os_set_boot_devices(GVirConfigOs *os, GList *boot_devices) +{ + GList *it; + xmlNodePtr os_node; + xmlNodePtr node; + + g_return_if_fail(GVIR_IS_CONFIG_OS(os)); + + os_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os)); + g_return_if_fail(os_node != NULL); + + node = os_node->children; + while (node != NULL) { + xmlNodePtr next_node; + next_node = node->next; + if (g_strcmp0("boot", (char *)node->name) == 0) { + xmlUnlinkNode(node); + xmlFreeNode(node); + } + node = next_node; + } + + for (it = boot_devices; it != NULL; it = it->next) { + const char *dev; + + dev = gvir_config_genum_get_nick(GVIR_TYPE_CONFIG_OS_BOOT_DEVICE, + GPOINTER_TO_INT(it->data)); + g_warn_if_fail(dev != NULL); + if (dev != NULL) { + node = xmlNewDocNode(NULL, NULL, (xmlChar*)"boot", NULL); + xmlNewProp(node, (xmlChar*)"dev", (xmlChar*)dev); + xmlAddChild(os_node, node); + } + } +} + +void gvir_config_os_set_arch(GVirConfigOs *os, const char *arch) +{ + xmlNodePtr os_node; + xmlNodePtr os_type_node; + + g_return_if_fail(GVIR_IS_CONFIG_OS(os)); + + os_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os)); + g_return_if_fail(os_node != NULL); + + os_type_node = gvir_config_xml_get_element(os_node, "type", NULL); + g_return_if_fail(os_type_node != NULL); + + xmlNewProp(os_type_node, (xmlChar*)"arch", (xmlChar*)arch); +} + +void gvir_config_os_set_machine(GVirConfigOs *os, const char *machine) +{ + xmlNodePtr os_node; + xmlNodePtr os_type_node; + + g_return_if_fail(GVIR_IS_CONFIG_OS(os)); + + os_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os)); + g_return_if_fail(os_node != NULL); + + os_type_node = gvir_config_xml_get_element(os_node, "type", NULL); + g_return_if_fail(os_type_node != NULL); + + xmlNewProp(os_type_node, (xmlChar*)"machine", (xmlChar*)machine); +} diff --git a/libvirt-gconfig/libvirt-gconfig-os.h b/libvirt-gconfig/libvirt-gconfig-os.h index 716f588..b789eb3 100644 --- a/libvirt-gconfig/libvirt-gconfig-os.h +++ b/libvirt-gconfig/libvirt-gconfig-os.h @@ -56,12 +56,39 @@ struct _GVirConfigOsClass gpointer padding[20]; }; +typedef enum { + GVIR_CONFIG_OS_TYPE_HVM, + GVIR_CONFIG_OS_TYPE_LINUX +} GVirConfigOsType; + +typedef enum { + GVIR_CONFIG_OS_SMBIOS_MODE_EMULATE, + GVIR_CONFIG_OS_SMBIOS_MODE_HOST, + GVIR_CONFIG_OS_SMBIOS_MODE_SYSINFO +} GVirConfigOsSmBiosMode; + +typedef enum { + GVIR_CONFIG_OS_BOOT_DEVICE_FD, + GVIR_CONFIG_OS_BOOT_DEVICE_HD, + GVIR_CONFIG_OS_BOOT_DEVICE_CDROM, + GVIR_CONFIG_OS_BOOT_DEVICE_NETWORK +} GVirConfigOsBootDevice; GType gvir_config_os_get_type(void); GVirConfigOs *gvir_config_os_new(void); GVirConfigOs *gvir_config_os_new_from_xml(const gchar *xml, GError **error); +void gvir_config_os_set_os_type(GVirConfigOs *os, GVirConfigOsType type); +void gvir_config_os_set_arch(GVirConfigOs *os, const char *arch); +void gvir_config_os_set_boot_devices(GVirConfigOs *os, GList *boot_devices); +void gvir_config_os_set_loader(GVirConfigOs *os, const char * loader); +void gvir_config_os_set_machine(GVirConfigOs *os, const char *machine); +void gvir_config_os_set_smbios_mode(GVirConfigOs *os, + GVirConfigOsSmBiosMode mode); +void gvir_config_os_enable_boot_menu(GVirConfigOs *os, gboolean enable); +void gvir_config_os_bios_enable_serial(GVirConfigOs *os, gboolean enable); + G_END_DECLS #endif /* __LIBVIRT_GCONFIG_OS_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 138b80f..1a924c1 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -51,8 +51,19 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_object_validate; gvir_config_os_get_type; + gvir_config_os_boot_device_get_type; + gvir_config_os_sm_bios_mode_get_type; + gvir_config_os_type_get_type; gvir_config_os_new; gvir_config_os_new_from_xml; + gvir_config_os_set_os_type; + gvir_config_os_set_boot_devices; + gvir_config_os_set_loader; + gvir_config_os_set_smbios_mode; + gvir_config_os_enable_boot_menu; + gvir_config_os_bios_enable_serial; + gvir_config_os_set_machine; + gvir_config_os_set_arch; gvir_config_secret_get_type; gvir_config_secret_new; -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:11PM +0100, Christophe Fergeau wrote:
-- v2: merged several related commits use safer g_strcmp0 for string comparison use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-os.c | 138 ++++++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-os.h | 27 +++++++ libvirt-gconfig/libvirt-gconfig.sym | 11 +++ 3 files changed, 176 insertions(+), 0 deletions(-)
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 :|

-- v2: use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-domain.c | 12 ++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 2 ++ libvirt-gconfig/libvirt-gconfig.h | 4 +++- libvirt-gconfig/libvirt-gconfig.sym | 1 + 4 files changed, 18 insertions(+), 1 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 4c4ca53..bc2a1f3 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -249,3 +249,15 @@ void gvir_config_domain_set_clock(GVirConfigDomain *domain, clock_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(klock)); gvir_config_object_set_child(GVIR_CONFIG_OBJECT(domain), clock_node); } + +void gvir_config_domain_set_os(GVirConfigDomain *domain, + GVirConfigOs *os) +{ + xmlNodePtr os_node; + + g_return_if_fail(GVIR_IS_CONFIG_DOMAIN(domain)); + g_return_if_fail(GVIR_IS_CONFIG_OS(os)); + + os_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os)); + gvir_config_object_set_child(GVIR_CONFIG_OBJECT(domain), os_node); +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index 6f822cf..37effe4 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -71,6 +71,8 @@ void gvir_config_domain_set_features(GVirConfigDomain *domain, const GStrv features); void gvir_config_domain_set_clock(GVirConfigDomain *domain, GVirConfigClock *klock); +void gvir_config_domain_set_os(GVirConfigDomain *domain, + GVirConfigOs *os); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig.h b/libvirt-gconfig/libvirt-gconfig.h index 482c088..0f09d4f 100644 --- a/libvirt-gconfig/libvirt-gconfig.h +++ b/libvirt-gconfig/libvirt-gconfig.h @@ -29,7 +29,6 @@ #include <libvirt-gconfig/libvirt-gconfig-object.h> #include <libvirt-gconfig/libvirt-gconfig-capabilities.h> #include <libvirt-gconfig/libvirt-gconfig-clock.h> -#include <libvirt-gconfig/libvirt-gconfig-domain.h> #include <libvirt-gconfig/libvirt-gconfig-domain-snapshot.h> #include <libvirt-gconfig/libvirt-gconfig-enum-types.h> #include <libvirt-gconfig/libvirt-gconfig-helpers.h> @@ -43,4 +42,7 @@ #include <libvirt-gconfig/libvirt-gconfig-storage-pool.h> #include <libvirt-gconfig/libvirt-gconfig-storage-vol.h> +/* Must come last since it uses types defined in the other headers */ +#include <libvirt-gconfig/libvirt-gconfig-domain.h> + #endif /* __LIBVIRT_GCONFIG_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 1a924c1..0d68f92 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -16,6 +16,7 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_domain_new; gvir_config_domain_new_from_xml; gvir_config_domain_set_clock; + gvir_config_domain_set_os; gvir_config_domain_get_features; gvir_config_domain_set_features; gvir_config_domain_get_memory; -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:12PM +0100, Christophe Fergeau wrote:
-- v2: use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-domain.c | 12 ++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 2 ++ libvirt-gconfig/libvirt-gconfig.h | 4 +++- libvirt-gconfig/libvirt-gconfig.sym | 1 + 4 files changed, 18 insertions(+), 1 deletions(-)
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/tests/test-domain-create.c | 19 ++++++++++++++++++- 1 files changed, 18 insertions(+), 1 deletions(-) diff --git a/libvirt-gconfig/tests/test-domain-create.c b/libvirt-gconfig/tests/test-domain-create.c index a5c5b99..8abca00 100644 --- a/libvirt-gconfig/tests/test-domain-create.c +++ b/libvirt-gconfig/tests/test-domain-create.c @@ -33,7 +33,6 @@ const char *features[] = { "foo", "bar", "baz", NULL }; int main(void) { GVirConfigDomain *domain; - GVirConfigClock *klock; char *name; GStrv feat; unsigned int i; @@ -60,10 +59,28 @@ int main(void) } g_strfreev(feat); + /* clock node */ + GVirConfigClock *klock; + klock = gvir_config_clock_new(); gvir_config_clock_set_offset(klock, GVIR_CONFIG_CLOCK_UTC); gvir_config_domain_set_clock(domain, klock); + /* os node */ + GVirConfigOs *os; + GList *devices = NULL; + + os = gvir_config_os_new(); + gvir_config_os_set_os_type(os, GVIR_CONFIG_OS_TYPE_HVM); + gvir_config_os_set_arch(os, "x86_64"); + devices = g_list_append(devices, + GINT_TO_POINTER(GVIR_CONFIG_OS_BOOT_DEVICE_CDROM)); + devices = g_list_append(devices, + GINT_TO_POINTER(GVIR_CONFIG_OS_BOOT_DEVICE_NETWORK)); + gvir_config_os_set_boot_devices(os, devices); + g_list_free(devices); + gvir_config_domain_set_os(domain, os); + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain)); g_print("%s\n", xml); g_free(xml); -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:13PM +0100, Christophe Fergeau wrote:
--- libvirt-gconfig/tests/test-domain-create.c | 19 ++++++++++++++++++- 1 files changed, 18 insertions(+), 1 deletions(-)
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 | 29 ++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 3 ++ libvirt-gconfig/libvirt-gconfig.sym | 2 + libvirt-gconfig/tests/test-domain-create.c | 1 + 4 files changed, 35 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index bc2a1f3..64fdf50 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -47,6 +47,7 @@ enum { PROP_0, PROP_NAME, PROP_MEMORY, + PROP_VCPU, PROP_FEATURES }; @@ -64,6 +65,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_VCPU: + g_value_set_uint64(value, gvir_config_domain_get_vcpus(domain)); + break; case PROP_FEATURES: g_value_take_boxed(value, gvir_config_domain_get_features(domain)); break; @@ -87,6 +91,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_VCPU: + gvir_config_domain_set_vcpus(domain, g_value_get_uint64(value)); + break; case PROP_FEATURES: gvir_config_domain_set_features(domain, g_value_get_boxed(value)); break; @@ -123,6 +130,15 @@ static void gvir_config_domain_class_init(GVirConfigDomainClass *klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property(object_class, + PROP_VCPU, + g_param_spec_uint64("vcpu", + "Virtual CPUs", + "Maximum Number of Guest Virtual CPUs", + 0, G_MAXUINT64, + 1, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property(object_class, PROP_FEATURES, g_param_spec_boxed("features", "Features", @@ -193,6 +209,19 @@ void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory) g_object_notify(G_OBJECT(domain), "memory"); } +guint64 gvir_config_domain_get_vcpus(GVirConfigDomain *domain) +{ + return gvir_config_object_get_node_content_uint64(GVIR_CONFIG_OBJECT(domain), + "vcpu"); +} + +void gvir_config_domain_set_vcpus(GVirConfigDomain *domain, guint64 vcpu_count) +{ + gvir_config_object_set_node_content_uint64(GVIR_CONFIG_OBJECT(domain), + "vcpu", vcpu_count); + g_object_notify(G_OBJECT(domain), "vcpu"); +} + /** * gvir_config_domain_get_features: * Returns: (transfer full): diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index 37effe4..3ca6228 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -66,6 +66,9 @@ 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); +guint64 gvir_config_domain_get_vcpus(GVirConfigDomain *domain); +void gvir_config_domain_set_vcpus(GVirConfigDomain *domain, + guint64 vcpu_count); GStrv gvir_config_domain_get_features(GVirConfigDomain *domain); void gvir_config_domain_set_features(GVirConfigDomain *domain, const GStrv features); diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 0d68f92..23bb7f5 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -23,6 +23,8 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_domain_set_memory; gvir_config_domain_get_name; gvir_config_domain_set_name; + gvir_config_domain_get_vcpus; + gvir_config_domain_set_vcpus; gvir_config_domain_snapshot_get_type; gvir_config_domain_snapshot_new; diff --git a/libvirt-gconfig/tests/test-domain-create.c b/libvirt-gconfig/tests/test-domain-create.c index 8abca00..af960a9 100644 --- a/libvirt-gconfig/tests/test-domain-create.c +++ b/libvirt-gconfig/tests/test-domain-create.c @@ -49,6 +49,7 @@ int main(void) g_free(name); gvir_config_domain_set_memory(domain, 1234); + gvir_config_domain_set_vcpus(domain, 3); g_assert(gvir_config_domain_get_memory(domain) == 1234); gvir_config_domain_set_features(domain, (const GStrv)features); -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:14PM +0100, Christophe Fergeau wrote:
--- libvirt-gconfig/libvirt-gconfig-domain.c | 29 ++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 3 ++ libvirt-gconfig/libvirt-gconfig.sym | 2 + libvirt-gconfig/tests/test-domain-create.c | 1 + 4 files changed, 35 insertions(+), 0 deletions(-)
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 is an abstract type which will be used as a base class for all objects stored in the <devices> section of a domain. --- libvirt-gconfig/Makefile.am | 2 + libvirt-gconfig/libvirt-gconfig-device.c | 61 ++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-device.h | 64 ++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 2 + 5 files changed, 130 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-device.c create mode 100644 libvirt-gconfig/libvirt-gconfig-device.h diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index 648ded0..dda41e8 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -12,6 +12,7 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-object.h \ libvirt-gconfig-capabilities.h \ libvirt-gconfig-clock.h \ + libvirt-gconfig-device.h \ libvirt-gconfig-domain.h \ libvirt-gconfig-domain-snapshot.h \ libvirt-gconfig-helpers.h \ @@ -31,6 +32,7 @@ GCONFIG_SOURCE_FILES = \ libvirt-gconfig-object.c \ libvirt-gconfig-capabilities.c \ libvirt-gconfig-clock.c \ + libvirt-gconfig-device.c \ libvirt-gconfig-domain.c \ libvirt-gconfig-domain-snapshot.c \ libvirt-gconfig-enum-types.c \ diff --git a/libvirt-gconfig/libvirt-gconfig-device.c b/libvirt-gconfig/libvirt-gconfig-device.c new file mode 100644 index 0000000..ad08222 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-device.c @@ -0,0 +1,61 @@ +/* + * libvirt-gobject-config-device.c: libvirt glib integration + * + * Copyright (C) 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 + * + * Author: Christophe Fergeau <cfergeau@gmail.com> + */ + +#include <config.h> + +#include <string.h> + +#include <libxml/tree.h> + +#include "libvirt-gconfig/libvirt-gconfig.h" + +extern gboolean debugFlag; + +#define DEBUG(fmt, ...) do { if (G_UNLIKELY(debugFlag)) g_debug(fmt, ## __VA_ARGS__); } while (0) + +#define GVIR_CONFIG_DEVICE_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DEVICE, GVirConfigDevicePrivate)) + +struct _GVirConfigDevicePrivate +{ + gboolean unused; +}; + +G_DEFINE_ABSTRACT_TYPE(GVirConfigDevice, gvir_config_device, GVIR_TYPE_CONFIG_OBJECT); + + +static void gvir_config_device_class_init(GVirConfigDeviceClass *klass) +{ + g_type_class_add_private(klass, sizeof(GVirConfigDevicePrivate)); +} + + +static void gvir_config_device_init(GVirConfigDevice *device) +{ + GVirConfigDevicePrivate *priv; + + DEBUG("Init GVirConfigDevice=%p", device); + + priv = device->priv = GVIR_CONFIG_DEVICE_GET_PRIVATE(device); + + memset(priv, 0, sizeof(*priv)); +} diff --git a/libvirt-gconfig/libvirt-gconfig-device.h b/libvirt-gconfig/libvirt-gconfig-device.h new file mode 100644 index 0000000..abd10c2 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-device.h @@ -0,0 +1,64 @@ +/* + * libvirt-gobject-device.c: libvirt gobject integration + * + * Copyright (C) 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 + * + * Author: 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_DEVICE_H__ +#define __LIBVIRT_GCONFIG_DEVICE_H__ + +G_BEGIN_DECLS + +#define GVIR_TYPE_CONFIG_DEVICE (gvir_config_device_get_type ()) +#define GVIR_CONFIG_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GVIR_TYPE_CONFIG_DEVICE, GVirConfigDevice)) +#define GVIR_CONFIG_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GVIR_TYPE_CONFIG_DEVICE, GVirConfigDeviceClass)) +#define GVIR_IS_CONFIG_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GVIR_TYPE_CONFIG_DEVICE)) +#define GVIR_IS_CONFIG_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GVIR_TYPE_CONFIG_DEVICE)) +#define GVIR_CONFIG_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GVIR_TYPE_CONFIG_DEVICE, GVirConfigDeviceClass)) + +typedef struct _GVirConfigDevice GVirConfigDevice; +typedef struct _GVirConfigDevicePrivate GVirConfigDevicePrivate; +typedef struct _GVirConfigDeviceClass GVirConfigDeviceClass; + +struct _GVirConfigDevice +{ + GVirConfigObject parent; + + GVirConfigDevicePrivate *priv; + + /* Do not add fields to this struct */ +}; + +struct _GVirConfigDeviceClass +{ + GVirConfigObjectClass parent_class; + + gpointer padding[20]; +}; + + +GType gvir_config_device_get_type(void); + +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_DEVICE_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.h b/libvirt-gconfig/libvirt-gconfig.h index 0f09d4f..e13dbdc 100644 --- a/libvirt-gconfig/libvirt-gconfig.h +++ b/libvirt-gconfig/libvirt-gconfig.h @@ -29,6 +29,7 @@ #include <libvirt-gconfig/libvirt-gconfig-object.h> #include <libvirt-gconfig/libvirt-gconfig-capabilities.h> #include <libvirt-gconfig/libvirt-gconfig-clock.h> +#include <libvirt-gconfig/libvirt-gconfig-device.h> #include <libvirt-gconfig/libvirt-gconfig-domain-snapshot.h> #include <libvirt-gconfig/libvirt-gconfig-enum-types.h> #include <libvirt-gconfig/libvirt-gconfig-helpers.h> diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 23bb7f5..7b77319 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -12,6 +12,8 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_clock_set_timezone; gvir_config_clock_set_variable_offset; + gvir_config_device_get_type; + gvir_config_domain_get_type; gvir_config_domain_new; gvir_config_domain_new_from_xml; -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:15PM +0100, Christophe Fergeau wrote:
This is an abstract type which will be used as a base class for all objects stored in the <devices> section of a domain. --- libvirt-gconfig/Makefile.am | 2 + libvirt-gconfig/libvirt-gconfig-device.c | 61 ++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-device.h | 64 ++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 2 + 5 files changed, 130 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-device.c create mode 100644 libvirt-gconfig/libvirt-gconfig-device.h
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, Nov 22, 2011 at 01:06:11PM +0000, Daniel P. Berrange wrote:
On Mon, Nov 21, 2011 at 07:04:15PM +0100, Christophe Fergeau wrote:
This is an abstract type which will be used as a base class for all objects stored in the <devices> section of a domain. --- libvirt-gconfig/Makefile.am | 2 + libvirt-gconfig/libvirt-gconfig-device.c | 61 ++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-device.h | 64 ++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 2 + 5 files changed, 130 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-device.c create mode 100644 libvirt-gconfig/libvirt-gconfig-device.h
ACK
Sorry, needs renaming to GVirConfigDomainDevice 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/Makefile.am | 2 + libvirt-gconfig/libvirt-gconfig-device-disk.c | 81 +++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-device-disk.h | 68 +++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 4 + 5 files changed, 156 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-device-disk.c create mode 100644 libvirt-gconfig/libvirt-gconfig-device-disk.h diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index dda41e8..4bc7a21 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -13,6 +13,7 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-capabilities.h \ libvirt-gconfig-clock.h \ libvirt-gconfig-device.h \ + libvirt-gconfig-device-disk.h \ libvirt-gconfig-domain.h \ libvirt-gconfig-domain-snapshot.h \ libvirt-gconfig-helpers.h \ @@ -33,6 +34,7 @@ GCONFIG_SOURCE_FILES = \ libvirt-gconfig-capabilities.c \ libvirt-gconfig-clock.c \ libvirt-gconfig-device.c \ + libvirt-gconfig-device-disk.c \ libvirt-gconfig-domain.c \ libvirt-gconfig-domain-snapshot.c \ libvirt-gconfig-enum-types.c \ diff --git a/libvirt-gconfig/libvirt-gconfig-device-disk.c b/libvirt-gconfig/libvirt-gconfig-device-disk.c new file mode 100644 index 0000000..44c1f8e --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-device-disk.c @@ -0,0 +1,81 @@ +/* + * libvirt-gobject-config-device-disk.c: libvirt glib integration + * + * Copyright (C) 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 + * + * Author: Christophe Fergeau <cfergeau@gmail.com> + */ + +#include <config.h> + +#include <string.h> + +#include <libxml/tree.h> + +#include "libvirt-gconfig/libvirt-gconfig.h" + +extern gboolean debugFlag; + +#define DEBUG(fmt, ...) do { if (G_UNLIKELY(debugFlag)) g_debug(fmt, ## __VA_ARGS__); } while (0) + +#define GVIR_CONFIG_DEVICE_DISK_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DEVICE_DISK, GVirConfigDeviceDiskPrivate)) + +struct _GVirConfigDeviceDiskPrivate +{ + gboolean unused; +}; + +G_DEFINE_TYPE(GVirConfigDeviceDisk, gvir_config_device_disk, GVIR_TYPE_CONFIG_DEVICE); + + +static void gvir_config_device_disk_class_init(GVirConfigDeviceDiskClass *klass) +{ + g_type_class_add_private(klass, sizeof(GVirConfigDeviceDiskPrivate)); +} + + +static void gvir_config_device_disk_init(GVirConfigDeviceDisk *disk) +{ + GVirConfigDeviceDiskPrivate *priv; + + DEBUG("Init GVirConfigDeviceDisk=%p", disk); + + priv = disk->priv = GVIR_CONFIG_DEVICE_DISK_GET_PRIVATE(disk); + + memset(priv, 0, sizeof(*priv)); +} + + +GVirConfigDeviceDisk *gvir_config_device_disk_new(void) +{ + GVirConfigObject *object; + + object = gvir_config_object_new(GVIR_TYPE_CONFIG_DEVICE_DISK, + "disk", NULL); + return GVIR_CONFIG_DEVICE_DISK(object); +} + +GVirConfigDeviceDisk *gvir_config_device_disk_new_from_xml(const gchar *xml, + GError **error) +{ + GVirConfigObject *object; + + object = gvir_config_object_new_from_xml(GVIR_TYPE_CONFIG_DEVICE_DISK, + "disk", NULL, xml, error); + return GVIR_CONFIG_DEVICE_DISK(object); +} diff --git a/libvirt-gconfig/libvirt-gconfig-device-disk.h b/libvirt-gconfig/libvirt-gconfig-device-disk.h new file mode 100644 index 0000000..ef771d5 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-device-disk.h @@ -0,0 +1,68 @@ +/* + * libvirt-gobject-device-disk.c: libvirt gobject integration + * + * Copyright (C) 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 + * + * Author: 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_DEVICE_DISK_H__ +#define __LIBVIRT_GCONFIG_DEVICE_DISK_H__ + +G_BEGIN_DECLS + +#define GVIR_TYPE_CONFIG_DEVICE_DISK (gvir_config_device_disk_get_type ()) +#define GVIR_CONFIG_DEVICE_DISK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GVIR_TYPE_CONFIG_DEVICE_DISK, GVirConfigDeviceDisk)) +#define GVIR_CONFIG_DEVICE_DISK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GVIR_TYPE_CONFIG_DEVICE_DISK, GVirConfigDeviceDiskClass)) +#define GVIR_IS_CONFIG_DEVICE_DISK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GVIR_TYPE_CONFIG_DEVICE_DISK)) +#define GVIR_IS_CONFIG_DEVICE_DISK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GVIR_TYPE_CONFIG_DEVICE_DISK)) +#define GVIR_CONFIG_DEVICE_DISK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GVIR_TYPE_CONFIG_DEVICE_DISK, GVirConfigDeviceDiskClass)) + +typedef struct _GVirConfigDeviceDisk GVirConfigDeviceDisk; +typedef struct _GVirConfigDeviceDiskPrivate GVirConfigDeviceDiskPrivate; +typedef struct _GVirConfigDeviceDiskClass GVirConfigDeviceDiskClass; + +struct _GVirConfigDeviceDisk +{ + GVirConfigDevice parent; + + GVirConfigDeviceDiskPrivate *priv; + + /* Do not add fields to this struct */ +}; + +struct _GVirConfigDeviceDiskClass +{ + GVirConfigDeviceClass parent_class; + + gpointer padding[20]; +}; + + +GType gvir_config_device_disk_get_type(void); + +GVirConfigDeviceDisk *gvir_config_device_disk_new(void); +GVirConfigDeviceDisk *gvir_config_device_disk_new_from_xml(const gchar *xml, + GError **error); + +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_DEVICE_DISK_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.h b/libvirt-gconfig/libvirt-gconfig.h index e13dbdc..01a1af3 100644 --- a/libvirt-gconfig/libvirt-gconfig.h +++ b/libvirt-gconfig/libvirt-gconfig.h @@ -30,6 +30,7 @@ #include <libvirt-gconfig/libvirt-gconfig-capabilities.h> #include <libvirt-gconfig/libvirt-gconfig-clock.h> #include <libvirt-gconfig/libvirt-gconfig-device.h> +#include <libvirt-gconfig/libvirt-gconfig-device-disk.h> #include <libvirt-gconfig/libvirt-gconfig-domain-snapshot.h> #include <libvirt-gconfig/libvirt-gconfig-enum-types.h> #include <libvirt-gconfig/libvirt-gconfig-helpers.h> diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 7b77319..b0e752a 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -14,6 +14,10 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_device_get_type; + gvir_config_device_disk_get_type; + gvir_config_device_disk_new; + gvir_config_device_disk_new_from_xml; + gvir_config_domain_get_type; gvir_config_domain_new; gvir_config_domain_new_from_xml; -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:16PM +0100, Christophe Fergeau wrote:
--- libvirt-gconfig/Makefile.am | 2 + libvirt-gconfig/libvirt-gconfig-device-disk.c | 81 +++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-device-disk.h | 68 +++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 4 + 5 files changed, 156 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-device-disk.c create mode 100644 libvirt-gconfig/libvirt-gconfig-device-disk.h
ACK
+ +static void gvir_config_device_disk_init(GVirConfigDeviceDisk *disk) +{ + GVirConfigDeviceDiskPrivate *priv; + + DEBUG("Init GVirConfigDeviceDisk=%p", disk); + + priv = disk->priv = GVIR_CONFIG_DEVICE_DISK_GET_PRIVATE(disk); + + memset(priv, 0, sizeof(*priv)); +}
Can kill off memset() when pushing 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, Nov 22, 2011 at 01:06:52PM +0000, Daniel P. Berrange wrote:
On Mon, Nov 21, 2011 at 07:04:16PM +0100, Christophe Fergeau wrote:
--- libvirt-gconfig/Makefile.am | 2 + libvirt-gconfig/libvirt-gconfig-device-disk.c | 81 +++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-device-disk.h | 68 +++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 4 + 5 files changed, 156 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-device-disk.c create mode 100644 libvirt-gconfig/libvirt-gconfig-device-disk.h
ACK
Sorry, need to rename GVirConfigDeviceDisk to GVirConfigDomainDisk. (I think also having Device in the name would be overkill, given that we're adding Domain into the name, and 'Disk' is unique enough within the scope of the Domain XML document) 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 :|

-- v2: use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-device-disk.c | 50 +++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-device-disk.h | 25 ++++++++++++ libvirt-gconfig/libvirt-gconfig.sym | 6 +++ 3 files changed, 81 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-device-disk.c b/libvirt-gconfig/libvirt-gconfig-device-disk.c index 44c1f8e..e34e9a0 100644 --- a/libvirt-gconfig/libvirt-gconfig-device-disk.c +++ b/libvirt-gconfig/libvirt-gconfig-device-disk.c @@ -27,6 +27,8 @@ #include <libxml/tree.h> #include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" +#include "libvirt-gconfig/libvirt-gconfig-object-private.h" extern gboolean debugFlag; @@ -79,3 +81,51 @@ GVirConfigDeviceDisk *gvir_config_device_disk_new_from_xml(const gchar *xml, "disk", NULL, xml, error); return GVIR_CONFIG_DEVICE_DISK(object); } + +void gvir_config_device_disk_set_type(GVirConfigDeviceDisk *disk, + GVirConfigDeviceDiskType type) +{ + xmlNodePtr node; + const char *type_str; + + g_return_if_fail(GVIR_IS_CONFIG_DEVICE_DISK(disk)); + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(disk)); + g_return_if_fail(node != NULL); + type_str = gvir_config_genum_get_nick(GVIR_TYPE_CONFIG_DEVICE_DISK_TYPE, + type); + g_return_if_fail(type_str != NULL); + xmlNewProp(node, (xmlChar*)"type", (xmlChar*)type_str); +} + +void gvir_config_device_disk_set_guest_device_type(GVirConfigDeviceDisk *disk, + GVirConfigDeviceDiskGuestDeviceType type) +{ + xmlNodePtr node; + const char *type_str; + + g_return_if_fail(GVIR_IS_CONFIG_DEVICE_DISK(disk)); + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(disk)); + g_return_if_fail(node != NULL); + type_str = gvir_config_genum_get_nick(GVIR_TYPE_CONFIG_DEVICE_DISK_GUEST_DEVICE_TYPE, + type); + g_return_if_fail(type_str != NULL); + xmlNewProp(node, (xmlChar*)"device", (xmlChar*)type_str); +} + +void gvir_config_device_disk_set_snapshot_type(GVirConfigDeviceDisk *disk, + GVirConfigDeviceDiskSnapshotType type) +{ + xmlNodePtr node; + const char *type_str; + + g_return_if_fail(GVIR_IS_CONFIG_DEVICE_DISK(disk)); + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(disk)); + g_return_if_fail(node != NULL); + type_str = gvir_config_genum_get_nick(GVIR_TYPE_CONFIG_DEVICE_DISK_SNAPSHOT_TYPE, + type); + g_return_if_fail(type_str != NULL); + xmlNewProp(node, (xmlChar*)"snapshot", (xmlChar*)type_str); +} diff --git a/libvirt-gconfig/libvirt-gconfig-device-disk.h b/libvirt-gconfig/libvirt-gconfig-device-disk.h index ef771d5..e597815 100644 --- a/libvirt-gconfig/libvirt-gconfig-device-disk.h +++ b/libvirt-gconfig/libvirt-gconfig-device-disk.h @@ -56,6 +56,24 @@ struct _GVirConfigDeviceDiskClass gpointer padding[20]; }; +typedef enum { + GVIR_CONFIG_DEVICE_DISK_FILE, + GVIR_CONFIG_DEVICE_DISK_BLOCK, + GVIR_CONFIG_DEVICE_DISK_DIR, + GVIR_CONFIG_DEVICE_DISK_NETWORK +} GVirConfigDeviceDiskType; + +typedef enum { + GVIR_CONFIG_DEVICE_DISK_GUEST_DEVICE_DISK, + GVIR_CONFIG_DEVICE_DISK_GUEST_DEVICE_FLOPPY, + GVIR_CONFIG_DEVICE_DISK_GUEST_DEVICE_CDROM +} GVirConfigDeviceDiskGuestDeviceType; + +typedef enum { + GVIR_CONFIG_DEVICE_DISK_SNAPSHOT_NO, + GVIR_CONFIG_DEVICE_DISK_SNAPSHOT_INTERNAL, + GVIR_CONFIG_DEVICE_DISK_SNAPSHOT_EXTERNAL +} GVirConfigDeviceDiskSnapshotType; GType gvir_config_device_disk_get_type(void); @@ -63,6 +81,13 @@ GVirConfigDeviceDisk *gvir_config_device_disk_new(void); GVirConfigDeviceDisk *gvir_config_device_disk_new_from_xml(const gchar *xml, GError **error); +void gvir_config_device_disk_set_type(GVirConfigDeviceDisk *disk, + GVirConfigDeviceDiskType type); +void gvir_config_device_disk_set_guest_device_type(GVirConfigDeviceDisk *disk, + GVirConfigDeviceDiskGuestDeviceType type); +void gvir_config_device_disk_set_snapshot_type(GVirConfigDeviceDisk *disk, + GVirConfigDeviceDiskSnapshotType type); + G_END_DECLS #endif /* __LIBVIRT_GCONFIG_DEVICE_DISK_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index b0e752a..f059f9d 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -15,8 +15,14 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_device_get_type; gvir_config_device_disk_get_type; + gvir_config_device_disk_guest_device_type_get_type; + gvir_config_device_disk_snapshot_type_get_type; + gvir_config_device_disk_type_get_type; gvir_config_device_disk_new; gvir_config_device_disk_new_from_xml; + gvir_config_device_disk_set_snapshot_type; + gvir_config_device_disk_set_guest_device_type; + gvir_config_device_disk_set_type; gvir_config_domain_get_type; gvir_config_domain_new; -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:17PM +0100, Christophe Fergeau wrote:
-- v2: use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-device-disk.c | 50 +++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-device-disk.h | 25 ++++++++++++ libvirt-gconfig/libvirt-gconfig.sym | 6 +++ 3 files changed, 81 insertions(+), 0 deletions(-)
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 :|

-- v2: use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-domain.c | 23 +++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 2 ++ libvirt-gconfig/libvirt-gconfig.sym | 3 ++- 3 files changed, 27 insertions(+), 1 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 64fdf50..b6d705b 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -290,3 +290,26 @@ void gvir_config_domain_set_os(GVirConfigDomain *domain, os_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os)); gvir_config_object_set_child(GVIR_CONFIG_OBJECT(domain), os_node); } + +/** + * gvir_config_domain_set_devices: + * @devices: (in) (element-type LibvirtGConfig.Device): + */ +void gvir_config_domain_set_devices(GVirConfigDomain *domain, + GList *devices) +{ + xmlNodePtr devices_node; + GList *it; + + g_return_if_fail(GVIR_IS_CONFIG_DOMAIN(domain)); + + devices_node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(domain), + "devices"); + for (it = devices; it != NULL; it = it->next) { + GVirConfigDevice *device = GVIR_CONFIG_DEVICE(it->data); + xmlNodePtr node; + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(device)); + xmlAddChild(devices_node, node); + } +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index 3ca6228..da798e8 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -76,6 +76,8 @@ void gvir_config_domain_set_clock(GVirConfigDomain *domain, GVirConfigClock *klock); void gvir_config_domain_set_os(GVirConfigDomain *domain, GVirConfigOs *os); +void gvir_config_domain_set_devices(GVirConfigDomain *domain, + GList *devices); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index f059f9d..35dc3c7 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -28,13 +28,14 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_domain_new; gvir_config_domain_new_from_xml; gvir_config_domain_set_clock; - gvir_config_domain_set_os; + gvir_config_domain_set_devices; 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; gvir_config_domain_set_name; + gvir_config_domain_set_os; gvir_config_domain_get_vcpus; gvir_config_domain_set_vcpus; -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:18PM +0100, Christophe Fergeau wrote:
-- v2: use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-domain.c | 23 +++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 2 ++ libvirt-gconfig/libvirt-gconfig.sym | 3 ++- 3 files changed, 27 insertions(+), 1 deletions(-)
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 similar to gvir_config_object_replace_child except that if the current node already has a child with the correct name, it returns the existing child instead of replacing it. -- v2: instead of adding an argument to gvir_config_object_new_child, split the function in 2 separate ones, gvir_config_object_add_child and gvir_config_object_replace_child. use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-object-private.h | 2 ++ libvirt-gconfig/libvirt-gconfig-object.c | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-object-private.h b/libvirt-gconfig/libvirt-gconfig-object-private.h index a14a792..0cedaef 100644 --- a/libvirt-gconfig/libvirt-gconfig-object-private.h +++ b/libvirt-gconfig/libvirt-gconfig-object-private.h @@ -35,6 +35,8 @@ void gvir_config_object_set_node_content(GVirConfigObject *object, void gvir_config_object_set_node_content_uint64(GVirConfigObject *object, const char *node_name, guint64 value); +xmlNodePtr gvir_config_object_add_child(GVirConfigObject *object, + const char *child_name); xmlNodePtr gvir_config_object_replace_child(GVirConfigObject *object, const char *child_name); void gvir_config_object_set_child(GVirConfigObject *object, diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index ac10e88..142d714 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -333,6 +333,26 @@ gvir_config_object_set_child(GVirConfigObject *object, xmlNodePtr child) } G_GNUC_INTERNAL xmlNodePtr +gvir_config_object_add_child(GVirConfigObject *object, + const char *child_name) +{ + xmlNodePtr new_node; + xmlNodePtr old_node; + + g_return_val_if_fail(GVIR_IS_CONFIG_OBJECT(object), NULL); + + new_node = xmlNewDocNode(NULL, NULL, (xmlChar *)child_name, NULL); + old_node = gvir_config_object_set_child_internal(object, new_node, + FALSE); + if (old_node != NULL) { + xmlFreeNode(new_node); + return old_node; + } + + return new_node; +} + +G_GNUC_INTERNAL xmlNodePtr gvir_config_object_replace_child(GVirConfigObject *object, const char *child_name) { -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:19PM +0100, Christophe Fergeau wrote:
It's similar to gvir_config_object_replace_child except that if the current node already has a child with the correct name, it returns the existing child instead of replacing it.
-- v2: instead of adding an argument to gvir_config_object_new_child, split the function in 2 separate ones, gvir_config_object_add_child and gvir_config_object_replace_child. use g_return_if_fail to test function args for sanity
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 :|

-- v2: fix gvir_config_device_disk_set_source use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-device-disk.c | 78 ++++++++++++++++++++++++- libvirt-gconfig/libvirt-gconfig-device-disk.h | 10 +++ libvirt-gconfig/libvirt-gconfig.sym | 7 ++- 3 files changed, 93 insertions(+), 2 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-device-disk.c b/libvirt-gconfig/libvirt-gconfig-device-disk.c index e34e9a0..acfd1ab 100644 --- a/libvirt-gconfig/libvirt-gconfig-device-disk.c +++ b/libvirt-gconfig/libvirt-gconfig-device-disk.c @@ -39,7 +39,7 @@ extern gboolean debugFlag; struct _GVirConfigDeviceDiskPrivate { - gboolean unused; + GVirConfigDeviceDiskType type; }; G_DEFINE_TYPE(GVirConfigDeviceDisk, gvir_config_device_disk, GVIR_TYPE_CONFIG_DEVICE); @@ -96,6 +96,7 @@ void gvir_config_device_disk_set_type(GVirConfigDeviceDisk *disk, type); g_return_if_fail(type_str != NULL); xmlNewProp(node, (xmlChar*)"type", (xmlChar*)type_str); + disk->priv->type = type; } void gvir_config_device_disk_set_guest_device_type(GVirConfigDeviceDisk *disk, @@ -129,3 +130,78 @@ void gvir_config_device_disk_set_snapshot_type(GVirConfigDeviceDisk *disk, g_return_if_fail(type_str != NULL); xmlNewProp(node, (xmlChar*)"snapshot", (xmlChar*)type_str); } + +void gvir_config_device_disk_set_source(GVirConfigDeviceDisk *disk, + const char *source) +{ + xmlNodePtr source_node; + const char *attribute_name; + + g_return_if_fail(GVIR_IS_CONFIG_DEVICE_DISK(disk)); + source_node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(disk), + "source"); + g_return_if_fail(source_node != NULL); + + switch (disk->priv->type) { + case GVIR_CONFIG_DEVICE_DISK_FILE: + attribute_name = "file"; + break; + case GVIR_CONFIG_DEVICE_DISK_BLOCK: + attribute_name = "dev"; + break; + case GVIR_CONFIG_DEVICE_DISK_DIR: + attribute_name = "dir"; + break; + case GVIR_CONFIG_DEVICE_DISK_NETWORK: + attribute_name = "protocol"; + break; + default: + g_return_if_reached(); + } + xmlNewProp(source_node, (xmlChar*)attribute_name, (xmlChar*)source); +} + +void gvir_config_device_disk_set_driver_name(GVirConfigDeviceDisk *disk, + const char *driver_name) +{ + xmlNodePtr node; + + g_return_if_fail(GVIR_IS_CONFIG_DEVICE_DISK(disk)); + node = gvir_config_object_add_child(GVIR_CONFIG_OBJECT(disk), "driver"); + g_return_if_fail(node != NULL); + xmlNewProp(node, (xmlChar*)"name", (xmlChar*)driver_name); + +} + +void gvir_config_device_disk_set_driver_type(GVirConfigDeviceDisk *disk, + const char *driver_type) +{ + xmlNodePtr node; + + g_return_if_fail(GVIR_IS_CONFIG_DEVICE_DISK(disk)); + node = gvir_config_object_add_child(GVIR_CONFIG_OBJECT(disk), "driver"); + g_return_if_fail(node != NULL); + xmlNewProp(node, (xmlChar*)"type", (xmlChar*)driver_type); +} + +void gvir_config_device_disk_set_target_bus(GVirConfigDeviceDisk *disk, + const char *bus) +{ + xmlNodePtr node; + + g_return_if_fail(GVIR_IS_CONFIG_DEVICE_DISK(disk)); + node = gvir_config_object_add_child(GVIR_CONFIG_OBJECT(disk), "target"); + g_return_if_fail(node != NULL); + xmlNewProp(node, (xmlChar*)"bus", (xmlChar*)bus); +} + +void gvir_config_device_disk_set_target_dev(GVirConfigDeviceDisk *disk, + const char *dev) +{ + xmlNodePtr node; + + g_return_if_fail(GVIR_IS_CONFIG_DEVICE_DISK(disk)); + node = gvir_config_object_add_child(GVIR_CONFIG_OBJECT(disk), "target"); + g_return_if_fail(node != NULL); + xmlNewProp(node, (xmlChar*)"dev", (xmlChar*)dev); +} diff --git a/libvirt-gconfig/libvirt-gconfig-device-disk.h b/libvirt-gconfig/libvirt-gconfig-device-disk.h index e597815..ac89d9b 100644 --- a/libvirt-gconfig/libvirt-gconfig-device-disk.h +++ b/libvirt-gconfig/libvirt-gconfig-device-disk.h @@ -87,6 +87,16 @@ void gvir_config_device_disk_set_guest_device_type(GVirConfigDeviceDisk *disk, GVirConfigDeviceDiskGuestDeviceType type); void gvir_config_device_disk_set_snapshot_type(GVirConfigDeviceDisk *disk, GVirConfigDeviceDiskSnapshotType type); +void gvir_config_device_disk_set_source(GVirConfigDeviceDisk *disk, + const char *source); +void gvir_config_device_disk_set_driver_name(GVirConfigDeviceDisk *disk, + const char *driver_name); +void gvir_config_device_disk_set_driver_type(GVirConfigDeviceDisk *disk, + const char *driver_type); +void gvir_config_device_disk_set_target_bus(GVirConfigDeviceDisk *disk, + const char *bus); +void gvir_config_device_disk_set_target_dev(GVirConfigDeviceDisk *disk, + const char *dev); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 35dc3c7..e33ecf5 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -20,8 +20,13 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_device_disk_type_get_type; gvir_config_device_disk_new; gvir_config_device_disk_new_from_xml; - gvir_config_device_disk_set_snapshot_type; + gvir_config_device_disk_set_driver_name; + gvir_config_device_disk_set_driver_type; gvir_config_device_disk_set_guest_device_type; + gvir_config_device_disk_set_snapshot_type; + gvir_config_device_disk_set_source; + gvir_config_device_disk_set_target_bus; + gvir_config_device_disk_set_target_dev; gvir_config_device_disk_set_type; gvir_config_domain_get_type; -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:20PM +0100, Christophe Fergeau wrote:
-- v2: fix gvir_config_device_disk_set_source use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-device-disk.c | 78 ++++++++++++++++++++++++- libvirt-gconfig/libvirt-gconfig-device-disk.h | 10 +++ libvirt-gconfig/libvirt-gconfig.sym | 7 ++- 3 files changed, 93 insertions(+), 2 deletions(-)
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/tests/test-domain-create.c | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/tests/test-domain-create.c b/libvirt-gconfig/tests/test-domain-create.c index af960a9..db22eb5 100644 --- a/libvirt-gconfig/tests/test-domain-create.c +++ b/libvirt-gconfig/tests/test-domain-create.c @@ -80,8 +80,27 @@ int main(void) GINT_TO_POINTER(GVIR_CONFIG_OS_BOOT_DEVICE_NETWORK)); gvir_config_os_set_boot_devices(os, devices); g_list_free(devices); + devices = NULL; gvir_config_domain_set_os(domain, os); + /* device node */ + GVirConfigDeviceDisk *disk; + + disk = gvir_config_device_disk_new(); + gvir_config_device_disk_set_type(disk, GVIR_CONFIG_DEVICE_DISK_FILE); + gvir_config_device_disk_set_guest_device_type(disk, GVIR_CONFIG_DEVICE_DISK_GUEST_DEVICE_DISK); + gvir_config_device_disk_set_source(disk, "/tmp/foo/bar"); + gvir_config_device_disk_set_driver_name(disk, "qemu"); + gvir_config_device_disk_set_driver_type(disk, "qcow2"); + gvir_config_device_disk_set_target_bus(disk, "ide"); + gvir_config_device_disk_set_target_dev(disk, "hda"); + + devices = g_list_append(devices, disk); + gvir_config_domain_set_devices(domain, devices); + g_list_free(devices); + devices = NULL; + + xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(domain)); g_print("%s\n", xml); g_free(xml); -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:21PM +0100, Christophe Fergeau wrote:
--- libvirt-gconfig/tests/test-domain-create.c | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-)
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 base class is mainly useful as a generic type when we manipulate list of devices regardless of their actual type. --- libvirt-gconfig/libvirt-gconfig-interface.c | 2 +- libvirt-gconfig/libvirt-gconfig-interface.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-interface.c b/libvirt-gconfig/libvirt-gconfig-interface.c index b58a4b4..aadbc96 100644 --- a/libvirt-gconfig/libvirt-gconfig-interface.c +++ b/libvirt-gconfig/libvirt-gconfig-interface.c @@ -39,7 +39,7 @@ struct _GVirConfigInterfacePrivate gboolean unused; }; -G_DEFINE_TYPE(GVirConfigInterface, gvir_config_interface, GVIR_TYPE_CONFIG_OBJECT); +G_DEFINE_TYPE(GVirConfigInterface, gvir_config_interface, GVIR_TYPE_CONFIG_DEVICE); static void gvir_config_interface_class_init(GVirConfigInterfaceClass *klass) diff --git a/libvirt-gconfig/libvirt-gconfig-interface.h b/libvirt-gconfig/libvirt-gconfig-interface.h index 0728c29..2877341 100644 --- a/libvirt-gconfig/libvirt-gconfig-interface.h +++ b/libvirt-gconfig/libvirt-gconfig-interface.h @@ -42,7 +42,7 @@ typedef struct _GVirConfigInterfaceClass GVirConfigInterfaceClass; struct _GVirConfigInterface { - GVirConfigObject parent; + GVirConfigDevice parent; GVirConfigInterfacePrivate *priv; @@ -51,7 +51,7 @@ struct _GVirConfigInterface struct _GVirConfigInterfaceClass { - GVirConfigObjectClass parent_class; + GVirConfigDeviceClass parent_class; gpointer padding[20]; }; -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:22PM +0100, Christophe Fergeau wrote:
This base class is mainly useful as a generic type when we manipulate list of devices regardless of their actual type. --- libvirt-gconfig/libvirt-gconfig-interface.c | 2 +- libvirt-gconfig/libvirt-gconfig-interface.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
Hmm, I don't believe this is correct. GVirConfigInterface is a top level XML document used for the GVirInterface object in libvirt. NB, not to be confused with the GVirConfigDomainInterface which is a device element within the GVirConfigDomain XML document. So NACK to this 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, Nov 22, 2011 at 01:14:41PM +0000, Daniel P. Berrange wrote:
On Mon, Nov 21, 2011 at 07:04:22PM +0100, Christophe Fergeau wrote:
This base class is mainly useful as a generic type when we manipulate list of devices regardless of their actual type. --- libvirt-gconfig/libvirt-gconfig-interface.c | 2 +- libvirt-gconfig/libvirt-gconfig-interface.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
Hmm, I don't believe this is correct. GVirConfigInterface is a top level XML document used for the GVirInterface object in libvirt.
NB, not to be confused with the GVirConfigDomainInterface which is a device element within the GVirConfigDomain XML document.
Ah good catch, I indeed got confused.. Renamed to GVirConfigDomainInterface Christophe

Make GVirConfigInterface an abstract base class, and move the actual code in subclasses. This will make handling of the various types of network interfaces more understandable and more logical with respect to the corresponding XML. -- v2: use g_return_if_fail to test function args for sanity --- libvirt-gconfig/Makefile.am | 2 + .../libvirt-gconfig-interface-network.c | 94 ++++++++++++++++++++ .../libvirt-gconfig-interface-network.h | 67 ++++++++++++++ libvirt-gconfig/libvirt-gconfig-interface.c | 28 +----- libvirt-gconfig/libvirt-gconfig-interface.h | 5 - libvirt-gconfig/libvirt-gconfig.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 6 +- 7 files changed, 171 insertions(+), 32 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-interface-network.c create mode 100644 libvirt-gconfig/libvirt-gconfig-interface-network.h diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index 4bc7a21..4318124 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -18,6 +18,7 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-domain-snapshot.h \ libvirt-gconfig-helpers.h \ libvirt-gconfig-interface.h \ + libvirt-gconfig-interface-network.h \ libvirt-gconfig-network.h \ libvirt-gconfig-network-filter.h \ libvirt-gconfig-node-device.h \ @@ -40,6 +41,7 @@ GCONFIG_SOURCE_FILES = \ libvirt-gconfig-enum-types.c \ libvirt-gconfig-helpers.c \ libvirt-gconfig-interface.c \ + libvirt-gconfig-interface-network.c \ libvirt-gconfig-network.c \ libvirt-gconfig-network-filter.c \ libvirt-gconfig-node-device.c \ diff --git a/libvirt-gconfig/libvirt-gconfig-interface-network.c b/libvirt-gconfig/libvirt-gconfig-interface-network.c new file mode 100644 index 0000000..6e88cda --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-interface-network.c @@ -0,0 +1,94 @@ +/* + * libvirt-gobject-config-interface_network-network.c: libvirt glib integration + * + * Copyright (C) 2008 Daniel P. Berrange + * Copyright (C) 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 + * + * Author: Daniel P. Berrange <berrange@redhat.com> + * Author: Christophe Fergeau <cfergeau@redhat.com> + */ + +#include <config.h> + +#include <string.h> + +#include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" +#include "libvirt-gconfig/libvirt-gconfig-object-private.h" + +extern gboolean debugFlag; + +#define DEBUG(fmt, ...) do { if (G_UNLIKELY(debugFlag)) g_debug(fmt, ## __VA_ARGS__); } while (0) + +#define GVIR_CONFIG_INTERFACE_NETWORK_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_INTERFACE_NETWORK, GVirConfigInterfaceNetworkPrivate)) + +struct _GVirConfigInterfaceNetworkPrivate +{ + gboolean unused; +}; + +G_DEFINE_TYPE(GVirConfigInterfaceNetwork, gvir_config_interface_network, GVIR_TYPE_CONFIG_INTERFACE); + + +static void gvir_config_interface_network_class_init(GVirConfigInterfaceNetworkClass *klass) +{ + g_type_class_add_private(klass, sizeof(GVirConfigInterfaceNetworkPrivate)); +} + + +static void gvir_config_interface_network_init(GVirConfigInterfaceNetwork *conn) +{ + GVirConfigInterfaceNetworkPrivate *priv; + + DEBUG("Init GVirConfigInterfaceNetwork=%p", conn); + + priv = conn->priv = GVIR_CONFIG_INTERFACE_NETWORK_GET_PRIVATE(conn); + + memset(priv, 0, sizeof(*priv)); +} + + +GVirConfigInterfaceNetwork *gvir_config_interface_network_new(void) +{ + xmlDocPtr doc; + xmlNodePtr node; + + doc = xmlNewDoc((xmlChar *)"1.0"); + node= xmlNewDocNode(doc, NULL, (xmlChar *)"interface", NULL); + xmlNewProp(doc->children, (xmlChar*)"type", (xmlChar*)"network"); + xmlDocSetRootElement(doc, node); + return GVIR_CONFIG_INTERFACE_NETWORK(g_object_new(GVIR_TYPE_CONFIG_INTERFACE_NETWORK, + "node", node, + "schema", DATADIR "/libvirt/schemas/interface.rng", + NULL)); +} + +GVirConfigInterfaceNetwork *gvir_config_interface_network_new_from_xml(const gchar *xml, + GError **error) +{ + xmlNodePtr node; + + node = gvir_config_xml_parse(xml, "interface", error); + if ((error != NULL) && (*error != NULL)) + return NULL; + xmlNewProp(node, (xmlChar*)"type", (xmlChar*)"network"); + return GVIR_CONFIG_INTERFACE_NETWORK(g_object_new(GVIR_TYPE_CONFIG_INTERFACE_NETWORK, + "node", node, + "schema", DATADIR "/libvirt/schemas/interface.rng", + NULL)); +} diff --git a/libvirt-gconfig/libvirt-gconfig-interface-network.h b/libvirt-gconfig/libvirt-gconfig-interface-network.h new file mode 100644 index 0000000..0c0e542 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-interface-network.h @@ -0,0 +1,67 @@ +/* + * libvirt-gobject-config-interface-network.c: libvirt gobject integration + * + * Copyright (C) 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 + * + * Author: Daniel P. Berrange <berrange@redhat.com> + * Author: Christophe Fergeau <cfergeau@redhat.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_INTERFACE_NETWORK_H__ +#define __LIBVIRT_GCONFIG_INTERFACE_NETWORK_H__ + +G_BEGIN_DECLS + +#define GVIR_TYPE_CONFIG_INTERFACE_NETWORK (gvir_config_interface_network_get_type ()) +#define GVIR_CONFIG_INTERFACE_NETWORK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GVIR_TYPE_CONFIG_INTERFACE, GVirConfigInterfaceNetwork)) +#define GVIR_CONFIG_INTERFACE_NETWORK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GVIR_TYPE_CONFIG_INTERFACE, GVirConfigInterfaceNetworkClass)) +#define GVIR_IS_CONFIG_INTERFACE_NETWORK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GVIR_TYPE_CONFIG_INTERFACE)) +#define GVIR_IS_CONFIG_INTERFACE_NETWORK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GVIR_TYPE_CONFIG_INTERFACE)) +#define GVIR_CONFIG_INTERFACE_NETWORK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GVIR_TYPE_CONFIG_INTERFACE, GVirConfigInterfaceNetworkClass)) + +typedef struct _GVirConfigInterfaceNetwork GVirConfigInterfaceNetwork; +typedef struct _GVirConfigInterfaceNetworkPrivate GVirConfigInterfaceNetworkPrivate; +typedef struct _GVirConfigInterfaceNetworkClass GVirConfigInterfaceNetworkClass; + +struct _GVirConfigInterfaceNetwork +{ + GVirConfigInterface parent; + + GVirConfigInterfaceNetworkPrivate *priv; + + /* Do not add fields to this struct */ +}; + +struct _GVirConfigInterfaceNetworkClass +{ + GVirConfigInterfaceClass parent_class; + + gpointer padding[20]; +}; + +GType gvir_config_interface_network_get_type(void); + +GVirConfigInterfaceNetwork *gvir_config_interface_network_new(void); +GVirConfigInterfaceNetwork *gvir_config_interface_network_new_from_xml(const gchar *xml, + GError **error); +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_INTERFACE_NETWORK_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig-interface.c b/libvirt-gconfig/libvirt-gconfig-interface.c index aadbc96..336d715 100644 --- a/libvirt-gconfig/libvirt-gconfig-interface.c +++ b/libvirt-gconfig/libvirt-gconfig-interface.c @@ -26,6 +26,8 @@ #include <string.h> #include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" +#include "libvirt-gconfig/libvirt-gconfig-object-private.h" extern gboolean debugFlag; @@ -39,7 +41,7 @@ struct _GVirConfigInterfacePrivate gboolean unused; }; -G_DEFINE_TYPE(GVirConfigInterface, gvir_config_interface, GVIR_TYPE_CONFIG_DEVICE); +G_DEFINE_ABSTRACT_TYPE(GVirConfigInterface, gvir_config_interface, GVIR_TYPE_CONFIG_DEVICE); static void gvir_config_interface_class_init(GVirConfigInterfaceClass *klass) @@ -58,27 +60,3 @@ static void gvir_config_interface_init(GVirConfigInterface *conn) memset(priv, 0, sizeof(*priv)); } - - -GVirConfigInterface *gvir_config_interface_new(void) -{ - GVirConfigObject *object; - - object = gvir_config_object_new(GVIR_TYPE_CONFIG_INTERFACE, - "interface", - DATADIR "/libvirt/schemas/interface.rng"); - return GVIR_CONFIG_INTERFACE(object); -} - -GVirConfigInterface *gvir_config_interface_new_from_xml(const gchar *xml, - GError **error) -{ - GVirConfigObject *object; - - object = gvir_config_object_new_from_xml(GVIR_TYPE_CONFIG_INTERFACE, - "interface", - DATADIR "/libvirt/schemas/interface.rng", - xml, error); - return GVIR_CONFIG_INTERFACE(object); -} - diff --git a/libvirt-gconfig/libvirt-gconfig-interface.h b/libvirt-gconfig/libvirt-gconfig-interface.h index 2877341..88b7d46 100644 --- a/libvirt-gconfig/libvirt-gconfig-interface.h +++ b/libvirt-gconfig/libvirt-gconfig-interface.h @@ -56,13 +56,8 @@ struct _GVirConfigInterfaceClass gpointer padding[20]; }; - GType gvir_config_interface_get_type(void); -GVirConfigInterface *gvir_config_interface_new(void); -GVirConfigInterface *gvir_config_interface_new_from_xml(const gchar *xml, - GError **error); - G_END_DECLS #endif /* __LIBVIRT_GCONFIG_INTERFACE_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.h b/libvirt-gconfig/libvirt-gconfig.h index 01a1af3..c0deae9 100644 --- a/libvirt-gconfig/libvirt-gconfig.h +++ b/libvirt-gconfig/libvirt-gconfig.h @@ -35,6 +35,7 @@ #include <libvirt-gconfig/libvirt-gconfig-enum-types.h> #include <libvirt-gconfig/libvirt-gconfig-helpers.h> #include <libvirt-gconfig/libvirt-gconfig-interface.h> +#include <libvirt-gconfig/libvirt-gconfig-interface-network.h> #include <libvirt-gconfig/libvirt-gconfig-network.h> #include <libvirt-gconfig/libvirt-gconfig-network-filter.h> #include <libvirt-gconfig/libvirt-gconfig-node-device.h> diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index e33ecf5..25eab10 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -49,8 +49,10 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_domain_snapshot_new_from_xml; gvir_config_interface_get_type; - gvir_config_interface_new; - gvir_config_interface_new_from_xml; + + gvir_config_interface_network_get_type; + gvir_config_interface_network_new; + gvir_config_interface_network_new_from_xml; gvir_config_network_get_type; gvir_config_network_new; -- 1.7.7.3

--- .../libvirt-gconfig-interface-network.c | 13 +++++++++++++ .../libvirt-gconfig-interface-network.h | 3 +++ libvirt-gconfig/libvirt-gconfig.sym | 1 + 3 files changed, 17 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-interface-network.c b/libvirt-gconfig/libvirt-gconfig-interface-network.c index 6e88cda..aaeb44e 100644 --- a/libvirt-gconfig/libvirt-gconfig-interface-network.c +++ b/libvirt-gconfig/libvirt-gconfig-interface-network.c @@ -92,3 +92,16 @@ GVirConfigInterfaceNetwork *gvir_config_interface_network_new_from_xml(const gch "schema", DATADIR "/libvirt/schemas/interface.rng", NULL)); } + +void gvir_config_interface_network_set_source(GVirConfigInterfaceNetwork *interface, + const char *source) +{ + xmlNodePtr source_node; + + g_return_if_fail(GVIR_IS_CONFIG_INTERFACE_NETWORK(interface)); + + source_node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(interface), + "source"); + g_return_if_fail(source_node != NULL); + xmlNewProp(source_node, (xmlChar*)"network", (xmlChar*)source); +} diff --git a/libvirt-gconfig/libvirt-gconfig-interface-network.h b/libvirt-gconfig/libvirt-gconfig-interface-network.h index 0c0e542..ce29746 100644 --- a/libvirt-gconfig/libvirt-gconfig-interface-network.h +++ b/libvirt-gconfig/libvirt-gconfig-interface-network.h @@ -62,6 +62,9 @@ GType gvir_config_interface_network_get_type(void); GVirConfigInterfaceNetwork *gvir_config_interface_network_new(void); GVirConfigInterfaceNetwork *gvir_config_interface_network_new_from_xml(const gchar *xml, GError **error); + +void gvir_config_interface_network_set_source(GVirConfigInterfaceNetwork *interface, + const char *source); G_END_DECLS #endif /* __LIBVIRT_GCONFIG_INTERFACE_NETWORK_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 25eab10..6d7ee0e 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -53,6 +53,7 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_interface_network_get_type; gvir_config_interface_network_new; gvir_config_interface_network_new_from_xml; + gvir_config_interface_network_set_source; gvir_config_network_get_type; gvir_config_network_new; -- 1.7.7.3

--- libvirt-gconfig/tests/test-domain-create.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) diff --git a/libvirt-gconfig/tests/test-domain-create.c b/libvirt-gconfig/tests/test-domain-create.c index db22eb5..fa949f7 100644 --- a/libvirt-gconfig/tests/test-domain-create.c +++ b/libvirt-gconfig/tests/test-domain-create.c @@ -83,7 +83,7 @@ int main(void) devices = NULL; gvir_config_domain_set_os(domain, os); - /* device node */ + /* disk node */ GVirConfigDeviceDisk *disk; disk = gvir_config_device_disk_new(); @@ -96,6 +96,14 @@ int main(void) gvir_config_device_disk_set_target_dev(disk, "hda"); devices = g_list_append(devices, disk); + + /* network interface node */ + GVirConfigInterfaceNetwork *interface; + + interface = gvir_config_interface_network_new(); + gvir_config_interface_network_set_source(interface, "default"); + devices = g_list_append(devices, interface); + gvir_config_domain_set_devices(domain, devices); g_list_free(devices); devices = NULL; -- 1.7.7.3

-- v2: use enum for input bus type use g_return_if_fail to test function args for sanity --- libvirt-gconfig/Makefile.am | 2 + libvirt-gconfig/libvirt-gconfig-device-input.c | 113 ++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-device-input.h | 82 +++++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 7 ++ libvirt-gconfig/tests/test-domain-create.c | 15 +++- 6 files changed, 217 insertions(+), 3 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-device-input.c create mode 100644 libvirt-gconfig/libvirt-gconfig-device-input.h diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index 4318124..76861a1 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -14,6 +14,7 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-clock.h \ libvirt-gconfig-device.h \ libvirt-gconfig-device-disk.h \ + libvirt-gconfig-device-input.h \ libvirt-gconfig-domain.h \ libvirt-gconfig-domain-snapshot.h \ libvirt-gconfig-helpers.h \ @@ -36,6 +37,7 @@ GCONFIG_SOURCE_FILES = \ libvirt-gconfig-clock.c \ libvirt-gconfig-device.c \ libvirt-gconfig-device-disk.c \ + libvirt-gconfig-device-input.c \ libvirt-gconfig-domain.c \ libvirt-gconfig-domain-snapshot.c \ libvirt-gconfig-enum-types.c \ diff --git a/libvirt-gconfig/libvirt-gconfig-device-input.c b/libvirt-gconfig/libvirt-gconfig-device-input.c new file mode 100644 index 0000000..ed654e0 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-device-input.c @@ -0,0 +1,113 @@ +/* + * libvirt-gobject-config-device_input.c: libvirt glib integration + * + * Copyright (C) 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 + * + * Author: Christophe Fergeau <cfergeau@gmail.com> + */ + +#include <config.h> + +#include <string.h> + +#include <libxml/tree.h> + +#include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" +#include "libvirt-gconfig/libvirt-gconfig-object-private.h" + +extern gboolean debugFlag; + +#define DEBUG(fmt, ...) do { if (G_UNLIKELY(debugFlag)) g_debug(fmt, ## __VA_ARGS__); } while (0) + +#define GVIR_CONFIG_DEVICE_INPUT_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DEVICE_INPUT, GVirConfigDeviceInputPrivate)) + +struct _GVirConfigDeviceInputPrivate +{ + gboolean unused; +}; + +G_DEFINE_TYPE(GVirConfigDeviceInput, gvir_config_device_input, GVIR_TYPE_CONFIG_DEVICE); + + +static void gvir_config_device_input_class_init(GVirConfigDeviceInputClass *klass) +{ + g_type_class_add_private(klass, sizeof(GVirConfigDeviceInputPrivate)); +} + + +static void gvir_config_device_input_init(GVirConfigDeviceInput *device_input) +{ + GVirConfigDeviceInputPrivate *priv; + + DEBUG("Init GVirConfigDeviceInput=%p", device_input); + + priv = device_input->priv = GVIR_CONFIG_DEVICE_INPUT_GET_PRIVATE(device_input); + + memset(priv, 0, sizeof(*priv)); +} + + +GVirConfigDeviceInput *gvir_config_device_input_new(void) +{ + GVirConfigObject *object; + + object = gvir_config_object_new(GVIR_TYPE_CONFIG_DEVICE_INPUT, + "input", NULL); + return GVIR_CONFIG_DEVICE_INPUT(object); +} + +GVirConfigDeviceInput *gvir_config_device_input_new_from_xml(const gchar *xml, + GError **error) +{ + GVirConfigObject *object; + + object = gvir_config_object_new_from_xml(GVIR_TYPE_CONFIG_DEVICE_INPUT, + "input", NULL, xml, error); + return GVIR_CONFIG_DEVICE_INPUT(object); +} + +void gvir_config_device_input_set_device_type(GVirConfigDeviceInput *input, + GVirConfigDeviceInputDeviceType type) +{ + xmlNodePtr node; + const char *type_str; + + g_return_if_fail(GVIR_IS_CONFIG_DEVICE_INPUT(input)); + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(input)); + g_return_if_fail(node != NULL); + type_str = gvir_config_genum_get_nick(GVIR_TYPE_CONFIG_DEVICE_INPUT_DEVICE_TYPE, + type); + g_return_if_fail(type_str != NULL); + xmlNewProp(node, (xmlChar*)"type", (xmlChar*)type_str); +} + +void gvir_config_device_input_set_bus(GVirConfigDeviceInput *input, + GVirConfigDeviceInputBus bus) +{ + xmlNodePtr node; + const char *bus_str; + + g_return_if_fail(GVIR_IS_CONFIG_DEVICE_INPUT(input)); + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(input)); + g_return_if_fail(node != NULL); + bus_str = gvir_config_genum_get_nick(GVIR_TYPE_CONFIG_DEVICE_INPUT_BUS, + bus); + g_return_if_fail(bus_str != NULL); + xmlNewProp(node, (xmlChar*)"bus", (xmlChar*)bus_str); +} diff --git a/libvirt-gconfig/libvirt-gconfig-device-input.h b/libvirt-gconfig/libvirt-gconfig-device-input.h new file mode 100644 index 0000000..205ad88 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-device-input.h @@ -0,0 +1,82 @@ +/* + * libvirt-gobject-device-input.c: libvirt gobject integration + * + * Copyright (C) 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 + * + * Author: 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_DEVICE_INPUT_H__ +#define __LIBVIRT_GCONFIG_DEVICE_INPUT_H__ + +G_BEGIN_DECLS + +#define GVIR_TYPE_CONFIG_DEVICE_INPUT (gvir_config_device_input_get_type ()) +#define GVIR_CONFIG_DEVICE_INPUT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GVIR_TYPE_CONFIG_DEVICE_INPUT, GVirConfigDeviceInput)) +#define GVIR_CONFIG_DEVICE_INPUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GVIR_TYPE_CONFIG_DEVICE_INPUT, GVirConfigDeviceInputClass)) +#define GVIR_IS_CONFIG_DEVICE_INPUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GVIR_TYPE_CONFIG_DEVICE_INPUT)) +#define GVIR_IS_CONFIG_DEVICE_INPUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GVIR_TYPE_CONFIG_DEVICE_INPUT)) +#define GVIR_CONFIG_DEVICE_INPUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GVIR_TYPE_CONFIG_DEVICE_INPUT, GVirConfigDeviceInputClass)) + +typedef struct _GVirConfigDeviceInput GVirConfigDeviceInput; +typedef struct _GVirConfigDeviceInputPrivate GVirConfigDeviceInputPrivate; +typedef struct _GVirConfigDeviceInputClass GVirConfigDeviceInputClass; + +struct _GVirConfigDeviceInput +{ + GVirConfigDevice parent; + + GVirConfigDeviceInputPrivate *priv; + + /* Do not add fields to this struct */ +}; + +struct _GVirConfigDeviceInputClass +{ + GVirConfigDeviceClass parent_class; + + gpointer padding[20]; +}; + +typedef enum { + GVIR_CONFIG_DEVICE_INPUT_DEVICE_MOUSE, + GVIR_CONFIG_DEVICE_INPUT_DEVICE_TABLET +} GVirConfigDeviceInputDeviceType; + +typedef enum { + GVIR_CONFIG_DEVICE_INPUT_BUS_PS2, + GVIR_CONFIG_DEVICE_INPUT_BUS_USB, + GVIR_CONFIG_DEVICE_INPUT_BUS_XEN +} GVirConfigDeviceInputBus; + +GType gvir_config_device_input_get_type(void); + +GVirConfigDeviceInput *gvir_config_device_input_new(void); +GVirConfigDeviceInput *gvir_config_device_input_new_from_xml(const gchar *xml, + GError **error); +void gvir_config_device_input_set_device_type(GVirConfigDeviceInput *input, + GVirConfigDeviceInputDeviceType type); +void gvir_config_device_input_set_bus(GVirConfigDeviceInput *input, + GVirConfigDeviceInputBus bus); + +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_DEVICE_INPUT_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.h b/libvirt-gconfig/libvirt-gconfig.h index c0deae9..0f0abb7 100644 --- a/libvirt-gconfig/libvirt-gconfig.h +++ b/libvirt-gconfig/libvirt-gconfig.h @@ -31,6 +31,7 @@ #include <libvirt-gconfig/libvirt-gconfig-clock.h> #include <libvirt-gconfig/libvirt-gconfig-device.h> #include <libvirt-gconfig/libvirt-gconfig-device-disk.h> +#include <libvirt-gconfig/libvirt-gconfig-device-input.h> #include <libvirt-gconfig/libvirt-gconfig-domain-snapshot.h> #include <libvirt-gconfig/libvirt-gconfig-enum-types.h> #include <libvirt-gconfig/libvirt-gconfig-helpers.h> diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 6d7ee0e..326a421 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -29,6 +29,13 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_device_disk_set_target_dev; gvir_config_device_disk_set_type; + gvir_config_device_input_get_type; + gvir_config_device_input_device_type_get_type; + gvir_config_device_input_new; + gvir_config_device_input_new_from_xml; + gvir_config_device_input_set_device_type; + gvir_config_device_input_set_bus; + gvir_config_domain_get_type; gvir_config_domain_new; gvir_config_domain_new_from_xml; diff --git a/libvirt-gconfig/tests/test-domain-create.c b/libvirt-gconfig/tests/test-domain-create.c index fa949f7..63a625f 100644 --- a/libvirt-gconfig/tests/test-domain-create.c +++ b/libvirt-gconfig/tests/test-domain-create.c @@ -94,15 +94,24 @@ int main(void) gvir_config_device_disk_set_driver_type(disk, "qcow2"); gvir_config_device_disk_set_target_bus(disk, "ide"); gvir_config_device_disk_set_target_dev(disk, "hda"); - - devices = g_list_append(devices, disk); + devices = g_list_append(devices, GVIR_CONFIG_DEVICE(disk)); /* network interface node */ GVirConfigInterfaceNetwork *interface; interface = gvir_config_interface_network_new(); gvir_config_interface_network_set_source(interface, "default"); - devices = g_list_append(devices, interface); + devices = g_list_append(devices, GVIR_CONFIG_DEVICE(interface)); + + /* input node */ + GVirConfigDeviceInput *input; + + input = gvir_config_device_input_new(); + gvir_config_device_input_set_device_type(input, + GVIR_CONFIG_DEVICE_INPUT_DEVICE_TABLET); + gvir_config_device_input_set_bus(input, GVIR_CONFIG_DEVICE_INPUT_BUS_USB); + devices = g_list_append(devices, GVIR_CONFIG_DEVICE(input)); + gvir_config_domain_set_devices(domain, devices); g_list_free(devices); -- 1.7.7.3

This is an abstract type which will be used as a base class for the various type of <graphics> devices (spice, vnc, ...) --- libvirt-gconfig/Makefile.am | 2 + libvirt-gconfig/libvirt-gconfig-device-graphics.c | 61 ++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-device-graphics.h | 64 +++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 2 + 5 files changed, 130 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-device-graphics.c create mode 100644 libvirt-gconfig/libvirt-gconfig-device-graphics.h diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index 76861a1..8aaa827 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -14,6 +14,7 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-clock.h \ libvirt-gconfig-device.h \ libvirt-gconfig-device-disk.h \ + libvirt-gconfig-device-graphics.h \ libvirt-gconfig-device-input.h \ libvirt-gconfig-domain.h \ libvirt-gconfig-domain-snapshot.h \ @@ -37,6 +38,7 @@ GCONFIG_SOURCE_FILES = \ libvirt-gconfig-clock.c \ libvirt-gconfig-device.c \ libvirt-gconfig-device-disk.c \ + libvirt-gconfig-device-graphics.c \ libvirt-gconfig-device-input.c \ libvirt-gconfig-domain.c \ libvirt-gconfig-domain-snapshot.c \ diff --git a/libvirt-gconfig/libvirt-gconfig-device-graphics.c b/libvirt-gconfig/libvirt-gconfig-device-graphics.c new file mode 100644 index 0000000..b659d08 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-device-graphics.c @@ -0,0 +1,61 @@ +/* + * libvirt-gobject-config-device-graphics.c: libvirt glib integration + * + * Copyright (C) 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 + * + * Author: Christophe Fergeau <cfergeau@gmail.com> + */ + +#include <config.h> + +#include <string.h> + +#include <libxml/tree.h> + +#include "libvirt-gconfig/libvirt-gconfig.h" + +extern gboolean debugFlag; + +#define DEBUG(fmt, ...) do { if (G_UNLIKELY(debugFlag)) g_debug(fmt, ## __VA_ARGS__); } while (0) + +#define GVIR_CONFIG_DEVICE_GRAPHICS_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DEVICE_GRAPHICS, GVirConfigDeviceGraphicsPrivate)) + +struct _GVirConfigDeviceGraphicsPrivate +{ + gboolean unused; +}; + +G_DEFINE_ABSTRACT_TYPE(GVirConfigDeviceGraphics, gvir_config_device_graphics, GVIR_TYPE_CONFIG_DEVICE); + + +static void gvir_config_device_graphics_class_init(GVirConfigDeviceGraphicsClass *klass) +{ + g_type_class_add_private(klass, sizeof(GVirConfigDeviceGraphicsPrivate)); +} + + +static void gvir_config_device_graphics_init(GVirConfigDeviceGraphics *device_graphics) +{ + GVirConfigDeviceGraphicsPrivate *priv; + + DEBUG("Init GVirConfigDeviceGraphics=%p", device_graphics); + + priv = device_graphics->priv = GVIR_CONFIG_DEVICE_GRAPHICS_GET_PRIVATE(device_graphics); + + memset(priv, 0, sizeof(*priv)); +} diff --git a/libvirt-gconfig/libvirt-gconfig-device-graphics.h b/libvirt-gconfig/libvirt-gconfig-device-graphics.h new file mode 100644 index 0000000..12f1d5b --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-device-graphics.h @@ -0,0 +1,64 @@ +/* + * libvirt-gobject-device-graphics.c: libvirt gobject integration + * + * Copyright (C) 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 + * + * Author: 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_DEVICE_GRAPHICS_H__ +#define __LIBVIRT_GCONFIG_DEVICE_GRAPHICS_H__ + +G_BEGIN_DECLS + +#define GVIR_TYPE_CONFIG_DEVICE_GRAPHICS (gvir_config_device_graphics_get_type ()) +#define GVIR_CONFIG_DEVICE_GRAPHICS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GVIR_TYPE_CONFIG_DEVICE_GRAPHICS, GVirConfigDeviceGraphics)) +#define GVIR_CONFIG_DEVICE_GRAPHICS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GVIR_TYPE_CONFIG_DEVICE_GRAPHICS, GVirConfigDeviceGraphicsClass)) +#define GVIR_IS_CONFIG_DEVICE_GRAPHICS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GVIR_TYPE_CONFIG_DEVICE_GRAPHICS)) +#define GVIR_IS_CONFIG_DEVICE_GRAPHICS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GVIR_TYPE_CONFIG_DEVICE_GRAPHICS)) +#define GVIR_CONFIG_DEVICE_GRAPHICS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GVIR_TYPE_CONFIG_DEVICE_GRAPHICS, GVirConfigDeviceGraphicsClass)) + +typedef struct _GVirConfigDeviceGraphics GVirConfigDeviceGraphics; +typedef struct _GVirConfigDeviceGraphicsPrivate GVirConfigDeviceGraphicsPrivate; +typedef struct _GVirConfigDeviceGraphicsClass GVirConfigDeviceGraphicsClass; + +struct _GVirConfigDeviceGraphics +{ + GVirConfigDevice parent; + + GVirConfigDeviceGraphicsPrivate *priv; + + /* Do not add fields to this struct */ +}; + +struct _GVirConfigDeviceGraphicsClass +{ + GVirConfigDeviceClass parent_class; + + gpointer padding[20]; +}; + + +GType gvir_config_device_graphics_get_type(void); + +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_DEVICE_GRAPHICS_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.h b/libvirt-gconfig/libvirt-gconfig.h index 0f0abb7..8b56655 100644 --- a/libvirt-gconfig/libvirt-gconfig.h +++ b/libvirt-gconfig/libvirt-gconfig.h @@ -31,6 +31,7 @@ #include <libvirt-gconfig/libvirt-gconfig-clock.h> #include <libvirt-gconfig/libvirt-gconfig-device.h> #include <libvirt-gconfig/libvirt-gconfig-device-disk.h> +#include <libvirt-gconfig/libvirt-gconfig-device-graphics.h> #include <libvirt-gconfig/libvirt-gconfig-device-input.h> #include <libvirt-gconfig/libvirt-gconfig-domain-snapshot.h> #include <libvirt-gconfig/libvirt-gconfig-enum-types.h> diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 326a421..484ae39 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -29,6 +29,8 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_device_disk_set_target_dev; gvir_config_device_disk_set_type; + gvir_config_device_graphics_get_type; + gvir_config_device_input_get_type; gvir_config_device_input_device_type_get_type; gvir_config_device_input_new; -- 1.7.7.3

Only the (non-TLS) port can be set on it -- v2: rename to GVirConfigDeviceGraphicsSpice fix node creation (missing "type" attribute) derive GVirConfigDeviceGraphicsSpice from GVirConfigDeviceGraphics use g_return_if_fail to test function args for sanity --- libvirt-gconfig/Makefile.am | 2 + .../libvirt-gconfig-device-graphics-spice.c | 106 ++++++++++++++++++++ .../libvirt-gconfig-device-graphics-spice.h | 69 +++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 5 + libvirt-gconfig/tests/test-domain-create.c | 7 ++ 6 files changed, 190 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-device-graphics-spice.c create mode 100644 libvirt-gconfig/libvirt-gconfig-device-graphics-spice.h diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index 8aaa827..1be6233 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -15,6 +15,7 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-device.h \ libvirt-gconfig-device-disk.h \ libvirt-gconfig-device-graphics.h \ + libvirt-gconfig-device-graphics-spice.h \ libvirt-gconfig-device-input.h \ libvirt-gconfig-domain.h \ libvirt-gconfig-domain-snapshot.h \ @@ -39,6 +40,7 @@ GCONFIG_SOURCE_FILES = \ libvirt-gconfig-device.c \ libvirt-gconfig-device-disk.c \ libvirt-gconfig-device-graphics.c \ + libvirt-gconfig-device-graphics-spice.c \ libvirt-gconfig-device-input.c \ libvirt-gconfig-domain.c \ libvirt-gconfig-domain-snapshot.c \ diff --git a/libvirt-gconfig/libvirt-gconfig-device-graphics-spice.c b/libvirt-gconfig/libvirt-gconfig-device-graphics-spice.c new file mode 100644 index 0000000..6694f57 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-device-graphics-spice.c @@ -0,0 +1,106 @@ +/* + * libvirt-gobject-config-device-graphics-spice.c: libvirt glib integration + * + * Copyright (C) 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 + * + * Author: Christophe Fergeau <cfergeau@gmail.com> + */ + +#include <config.h> + +#include <string.h> + +#include <libxml/tree.h> + +#include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" +#include "libvirt-gconfig/libvirt-gconfig-object-private.h" + +extern gboolean debugFlag; + +#define DEBUG(fmt, ...) do { if (G_UNLIKELY(debugFlag)) g_debug(fmt, ## __VA_ARGS__); } while (0) + +#define GVIR_CONFIG_DEVICE_GRAPHICS_SPICE_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DEVICE_GRAPHICS_SPICE, GVirConfigDeviceGraphicsSpicePrivate)) + +struct _GVirConfigDeviceGraphicsSpicePrivate +{ + gboolean unused; +}; + +G_DEFINE_TYPE(GVirConfigDeviceGraphicsSpice, gvir_config_device_graphics_spice, GVIR_TYPE_CONFIG_DEVICE_GRAPHICS); + + +static void gvir_config_device_graphics_spice_class_init(GVirConfigDeviceGraphicsSpiceClass *klass) +{ + g_type_class_add_private(klass, sizeof(GVirConfigDeviceGraphicsSpicePrivate)); +} + + +static void gvir_config_device_graphics_spice_init(GVirConfigDeviceGraphicsSpice *graphics_spice) +{ + GVirConfigDeviceGraphicsSpicePrivate *priv; + + DEBUG("Init GVirConfigDeviceGraphicsSpice=%p", graphics_spice); + + priv = graphics_spice->priv = GVIR_CONFIG_DEVICE_GRAPHICS_SPICE_GET_PRIVATE(graphics_spice); + + memset(priv, 0, sizeof(*priv)); +} + + +GVirConfigDeviceGraphicsSpice *gvir_config_device_graphics_spice_new(void) +{ + xmlDocPtr doc; + xmlNodePtr node; + + doc = xmlNewDoc((xmlChar *)"1.0"); + node= xmlNewDocNode(doc, NULL, (xmlChar *)"graphics", NULL); + xmlNewProp(doc->children, (xmlChar*)"type", (xmlChar*)"spice"); + xmlDocSetRootElement(doc, node); + return GVIR_CONFIG_DEVICE_GRAPHICS_SPICE(g_object_new(GVIR_TYPE_CONFIG_DEVICE_GRAPHICS_SPICE, + "node", node, + NULL)); +} + +GVirConfigDeviceGraphicsSpice *gvir_config_device_graphics_spice_new_from_xml(const gchar *xml, + GError **error) +{ + xmlNodePtr node; + + node = gvir_config_xml_parse(xml, "graphics", error); + if ((error != NULL) && (*error != NULL)) + return NULL; + xmlNewProp(node, (xmlChar*)"type", (xmlChar*)"spice"); + return GVIR_CONFIG_DEVICE_GRAPHICS_SPICE(g_object_new(GVIR_TYPE_CONFIG_DEVICE_GRAPHICS_SPICE, + "node", node, + NULL)); +} + +void gvir_config_device_graphics_spice_set_port(GVirConfigDeviceGraphicsSpice *graphics, + unsigned int port) +{ + xmlNodePtr node; + char *port_str; + + g_return_if_fail(GVIR_IS_CONFIG_DEVICE_GRAPHICS_SPICE(graphics)); + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(graphics)); + g_return_if_fail(node != NULL); + port_str = g_strdup_printf("%u", port); + xmlNewProp(node, (xmlChar*)"port", (xmlChar*)port_str); + g_free(port_str); +} diff --git a/libvirt-gconfig/libvirt-gconfig-device-graphics-spice.h b/libvirt-gconfig/libvirt-gconfig-device-graphics-spice.h new file mode 100644 index 0000000..39cba74 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-device-graphics-spice.h @@ -0,0 +1,69 @@ +/* + * libvirt-gconfig-device-graphics-spice.h: libvirt gobject integration + * + * Copyright (C) 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 + * + * Author: 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_DEVICE_GRAPHICS_SPICE_H__ +#define __LIBVIRT_GCONFIG_DEVICE_GRAPHICS_SPICE_H__ + +G_BEGIN_DECLS + +#define GVIR_TYPE_CONFIG_DEVICE_GRAPHICS_SPICE (gvir_config_device_graphics_spice_get_type ()) +#define GVIR_CONFIG_DEVICE_GRAPHICS_SPICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GVIR_TYPE_CONFIG_DEVICE_GRAPHICS_SPICE, GVirConfigDeviceGraphicsSpice)) +#define GVIR_CONFIG_DEVICE_GRAPHICS_SPICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GVIR_TYPE_CONFIG_DEVICE_GRAPHICS_SPICE, GVirConfigDeviceGraphicsSpiceClass)) +#define GVIR_IS_CONFIG_DEVICE_GRAPHICS_SPICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GVIR_TYPE_CONFIG_DEVICE_GRAPHICS_SPICE)) +#define GVIR_IS_CONFIG_DEVICE_GRAPHICS_SPICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GVIR_TYPE_CONFIG_DEVICE_GRAPHICS_SPICE)) +#define GVIR_CONFIG_DEVICE_GRAPHICS_SPICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GVIR_TYPE_CONFIG_DEVICE_GRAPHICS_SPICE, GVirConfigDeviceGraphicsSpiceClass)) + +typedef struct _GVirConfigDeviceGraphicsSpice GVirConfigDeviceGraphicsSpice; +typedef struct _GVirConfigDeviceGraphicsSpicePrivate GVirConfigDeviceGraphicsSpicePrivate; +typedef struct _GVirConfigDeviceGraphicsSpiceClass GVirConfigDeviceGraphicsSpiceClass; + +struct _GVirConfigDeviceGraphicsSpice +{ + GVirConfigDeviceGraphics parent; + + GVirConfigDeviceGraphicsSpicePrivate *priv; + + /* Do not add fields to this struct */ +}; + +struct _GVirConfigDeviceGraphicsSpiceClass +{ + GVirConfigDeviceGraphicsClass parent_class; + + gpointer padding[20]; +}; + +GType gvir_config_device_graphics_spice_get_type(void); + +GVirConfigDeviceGraphicsSpice *gvir_config_device_graphics_spice_new(void); +GVirConfigDeviceGraphicsSpice *gvir_config_device_graphics_spice_new_from_xml(const gchar *xml, + GError **error); +void gvir_config_device_graphics_spice_set_port(GVirConfigDeviceGraphicsSpice *graphics, + unsigned int port); + +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_DEVICE_GRAPHICS_SPICE_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.h b/libvirt-gconfig/libvirt-gconfig.h index 8b56655..7e2e531 100644 --- a/libvirt-gconfig/libvirt-gconfig.h +++ b/libvirt-gconfig/libvirt-gconfig.h @@ -35,6 +35,7 @@ #include <libvirt-gconfig/libvirt-gconfig-device-input.h> #include <libvirt-gconfig/libvirt-gconfig-domain-snapshot.h> #include <libvirt-gconfig/libvirt-gconfig-enum-types.h> +#include <libvirt-gconfig/libvirt-gconfig-device-graphics-spice.h> #include <libvirt-gconfig/libvirt-gconfig-helpers.h> #include <libvirt-gconfig/libvirt-gconfig-interface.h> #include <libvirt-gconfig/libvirt-gconfig-interface-network.h> diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 484ae39..71bca2c 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -31,6 +31,11 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_device_graphics_get_type; + gvir_config_device_graphics_spice_get_type; + gvir_config_device_graphics_spice_new; + gvir_config_device_graphics_spice_new_from_xml; + gvir_config_device_graphics_spice_set_port; + gvir_config_device_input_get_type; gvir_config_device_input_device_type_get_type; gvir_config_device_input_new; diff --git a/libvirt-gconfig/tests/test-domain-create.c b/libvirt-gconfig/tests/test-domain-create.c index 63a625f..6b0486e 100644 --- a/libvirt-gconfig/tests/test-domain-create.c +++ b/libvirt-gconfig/tests/test-domain-create.c @@ -112,6 +112,13 @@ int main(void) gvir_config_device_input_set_bus(input, GVIR_CONFIG_DEVICE_INPUT_BUS_USB); devices = g_list_append(devices, GVIR_CONFIG_DEVICE(input)); + /* graphics node */ + GVirConfigDeviceGraphicsSpice *graphics; + + graphics = gvir_config_device_graphics_spice_new(); + gvir_config_device_graphics_spice_set_port(graphics, 1234); + devices = g_list_append(devices, GVIR_CONFIG_DEVICE(graphics)); + gvir_config_domain_set_devices(domain, devices); g_list_free(devices); -- 1.7.7.3

-- v2: use g_return_if_fail to test function args for sanity --- libvirt-gconfig/Makefile.am | 2 + libvirt-gconfig/libvirt-gconfig-device-video.c | 133 ++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-device-video.h | 82 +++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 8 ++ libvirt-gconfig/tests/test-domain-create.c | 9 ++ 6 files changed, 235 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-device-video.c create mode 100644 libvirt-gconfig/libvirt-gconfig-device-video.h diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index 1be6233..05cdbd0 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -17,6 +17,7 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-device-graphics.h \ libvirt-gconfig-device-graphics-spice.h \ libvirt-gconfig-device-input.h \ + libvirt-gconfig-device-video.h \ libvirt-gconfig-domain.h \ libvirt-gconfig-domain-snapshot.h \ libvirt-gconfig-helpers.h \ @@ -42,6 +43,7 @@ GCONFIG_SOURCE_FILES = \ libvirt-gconfig-device-graphics.c \ libvirt-gconfig-device-graphics-spice.c \ libvirt-gconfig-device-input.c \ + libvirt-gconfig-device-video.c \ libvirt-gconfig-domain.c \ libvirt-gconfig-domain-snapshot.c \ libvirt-gconfig-enum-types.c \ diff --git a/libvirt-gconfig/libvirt-gconfig-device-video.c b/libvirt-gconfig/libvirt-gconfig-device-video.c new file mode 100644 index 0000000..cbaf2f4 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-device-video.c @@ -0,0 +1,133 @@ +/* + * libvirt-gobject-config-device-video.c: libvirt glib integration + * + * Copyright (C) 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 + * + * Author: Christophe Fergeau <cfergeau@gmail.com> + */ + +#include <config.h> + +#include <string.h> + +#include <libxml/tree.h> + +#include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" +#include "libvirt-gconfig/libvirt-gconfig-object-private.h" + +extern gboolean debugFlag; + +#define DEBUG(fmt, ...) do { if (G_UNLIKELY(debugFlag)) g_debug(fmt, ## __VA_ARGS__); } while (0) + +#define GVIR_CONFIG_DEVICE_VIDEO_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DEVICE_VIDEO, GVirConfigDeviceVideoPrivate)) + +struct _GVirConfigDeviceVideoPrivate +{ + gboolean unused; +}; + +G_DEFINE_TYPE(GVirConfigDeviceVideo, gvir_config_device_video, GVIR_TYPE_CONFIG_DEVICE); + + +static void gvir_config_device_video_class_init(GVirConfigDeviceVideoClass *klass) +{ + g_type_class_add_private(klass, sizeof(GVirConfigDeviceVideoPrivate)); +} + + +static void gvir_config_device_video_init(GVirConfigDeviceVideo *device_video) +{ + GVirConfigDeviceVideoPrivate *priv; + + DEBUG("Init GVirConfigDeviceVideo=%p", device_video); + + priv = device_video->priv = GVIR_CONFIG_DEVICE_VIDEO_GET_PRIVATE(device_video); + + memset(priv, 0, sizeof(*priv)); +} + + +GVirConfigDeviceVideo *gvir_config_device_video_new(void) +{ + GVirConfigObject *object; + + object = gvir_config_object_new(GVIR_TYPE_CONFIG_DEVICE_VIDEO, + "video", NULL); + return GVIR_CONFIG_DEVICE_VIDEO(object); +} + +GVirConfigDeviceVideo *gvir_config_device_video_new_from_xml(const gchar *xml, + GError **error) +{ + GVirConfigObject *object; + + object = gvir_config_object_new_from_xml(GVIR_TYPE_CONFIG_DEVICE_VIDEO, + "video", NULL, xml, error); + return GVIR_CONFIG_DEVICE_VIDEO(object); +} + +void gvir_config_device_video_set_model(GVirConfigDeviceVideo *video, + GVirConfigDeviceVideoModel model) +{ + xmlNodePtr node; + const char *model_str; + + g_return_if_fail(GVIR_IS_CONFIG_DEVICE_VIDEO(video)); + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(video), + "model"); + g_return_if_fail(node != NULL); + model_str = gvir_config_genum_get_nick(GVIR_TYPE_CONFIG_DEVICE_VIDEO_MODEL, + model); + g_return_if_fail(model_str != NULL); + xmlNewProp(node, (xmlChar*)"type", (xmlChar*)model_str); +} + +void gvir_config_device_video_set_vram(GVirConfigDeviceVideo *video, + guint kbytes) +{ + xmlNodePtr node; + char *vram_str; + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(video)); + if (node == NULL) + return; + node = gvir_config_xml_get_element(node, "model", NULL); + if (node == NULL) + return; + vram_str = g_strdup_printf("%u", kbytes); + xmlNewProp(node, (xmlChar*)"vram", (xmlChar*)vram_str); + g_free(vram_str); +} + +void gvir_config_device_video_set_heads(GVirConfigDeviceVideo *video, + guint head_count) +{ + xmlNodePtr node; + char *heads_str; + + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(video)); + if (node == NULL) + return; + node = gvir_config_xml_get_element(node, "model", NULL); + if (node == NULL) + return; + heads_str = g_strdup_printf("%u", head_count); + xmlNewProp(node, (xmlChar*)"heads", (xmlChar*)heads_str); + g_free(heads_str); +} diff --git a/libvirt-gconfig/libvirt-gconfig-device-video.h b/libvirt-gconfig/libvirt-gconfig-device-video.h new file mode 100644 index 0000000..d4e1d87 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-device-video.h @@ -0,0 +1,82 @@ +/* + * libvirt-gobject-device-video.c: libvirt gobject integration + * + * Copyright (C) 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 + * + * Author: 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_DEVICE_VIDEO_H__ +#define __LIBVIRT_GCONFIG_DEVICE_VIDEO_H__ + +G_BEGIN_DECLS + +#define GVIR_TYPE_CONFIG_DEVICE_VIDEO (gvir_config_device_video_get_type ()) +#define GVIR_CONFIG_DEVICE_VIDEO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GVIR_TYPE_CONFIG_DEVICE_VIDEO, GVirConfigDeviceVideo)) +#define GVIR_CONFIG_DEVICE_VIDEO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GVIR_TYPE_CONFIG_DEVICE_VIDEO, GVirConfigDeviceVideoClass)) +#define GVIR_IS_CONFIG_DEVICE_VIDEO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GVIR_TYPE_CONFIG_DEVICE_VIDEO)) +#define GVIR_IS_CONFIG_DEVICE_VIDEO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GVIR_TYPE_CONFIG_DEVICE_VIDEO)) +#define GVIR_CONFIG_DEVICE_VIDEO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GVIR_TYPE_CONFIG_DEVICE_VIDEO, GVirConfigDeviceVideoClass)) + +typedef struct _GVirConfigDeviceVideo GVirConfigDeviceVideo; +typedef struct _GVirConfigDeviceVideoPrivate GVirConfigDeviceVideoPrivate; +typedef struct _GVirConfigDeviceVideoClass GVirConfigDeviceVideoClass; + +struct _GVirConfigDeviceVideo +{ + GVirConfigDevice parent; + + GVirConfigDeviceVideoPrivate *priv; + + /* Do not add fields to this struct */ +}; + +struct _GVirConfigDeviceVideoClass +{ + GVirConfigDeviceClass parent_class; + + gpointer padding[20]; +}; + +typedef enum { + GVIR_CONFIG_DEVICE_VIDEO_MODEL_VGA, + GVIR_CONFIG_DEVICE_VIDEO_MODEL_CIRRUS, + GVIR_CONFIG_DEVICE_VIDEO_MODEL_VMVGA, + GVIR_CONFIG_DEVICE_VIDEO_MODEL_XEN, + GVIR_CONFIG_DEVICE_VIDEO_MODEL_VBOX, + GVIR_CONFIG_DEVICE_VIDEO_MODEL_QXL +} GVirConfigDeviceVideoModel; + +GType gvir_config_device_video_get_type(void); + +GVirConfigDeviceVideo *gvir_config_device_video_new(void); +GVirConfigDeviceVideo *gvir_config_device_video_new_from_xml(const gchar *xml, + GError **error); +void gvir_config_device_video_set_model(GVirConfigDeviceVideo *video, + GVirConfigDeviceVideoModel model); +void gvir_config_device_video_set_vram(GVirConfigDeviceVideo *video, + guint kbytes); +void gvir_config_device_video_set_heads(GVirConfigDeviceVideo *video, + guint head_count); + +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_DEVICE_VIDEO_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.h b/libvirt-gconfig/libvirt-gconfig.h index 7e2e531..9087452 100644 --- a/libvirt-gconfig/libvirt-gconfig.h +++ b/libvirt-gconfig/libvirt-gconfig.h @@ -33,6 +33,7 @@ #include <libvirt-gconfig/libvirt-gconfig-device-disk.h> #include <libvirt-gconfig/libvirt-gconfig-device-graphics.h> #include <libvirt-gconfig/libvirt-gconfig-device-input.h> +#include <libvirt-gconfig/libvirt-gconfig-device-video.h> #include <libvirt-gconfig/libvirt-gconfig-domain-snapshot.h> #include <libvirt-gconfig/libvirt-gconfig-enum-types.h> #include <libvirt-gconfig/libvirt-gconfig-device-graphics-spice.h> diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 71bca2c..f806b13 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -43,6 +43,14 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_device_input_set_device_type; gvir_config_device_input_set_bus; + gvir_config_device_video_get_type; + gvir_config_device_video_model_get_type; + gvir_config_device_video_new; + gvir_config_device_video_new_from_xml; + gvir_config_device_video_set_model; + gvir_config_device_video_set_vram; + gvir_config_device_video_set_heads; + gvir_config_domain_get_type; gvir_config_domain_new; gvir_config_domain_new_from_xml; diff --git a/libvirt-gconfig/tests/test-domain-create.c b/libvirt-gconfig/tests/test-domain-create.c index 6b0486e..816ef61 100644 --- a/libvirt-gconfig/tests/test-domain-create.c +++ b/libvirt-gconfig/tests/test-domain-create.c @@ -119,6 +119,15 @@ int main(void) gvir_config_device_graphics_spice_set_port(graphics, 1234); devices = g_list_append(devices, GVIR_CONFIG_DEVICE(graphics)); + /* video node */ + GVirConfigDeviceVideo *video; + + video = gvir_config_device_video_new(); + gvir_config_device_video_set_model(video, + GVIR_CONFIG_DEVICE_VIDEO_MODEL_QXL); + devices = g_list_append(devices, GVIR_CONFIG_DEVICE(video)); + + gvir_config_domain_set_devices(domain, devices); g_list_free(devices); -- 1.7.7.3

On Mon, Nov 21, 2011 at 07:04:29PM +0100, Christophe Fergeau wrote:
-- v2: use g_return_if_fail to test function args for sanity --- libvirt-gconfig/Makefile.am | 2 + libvirt-gconfig/libvirt-gconfig-device-video.c | 133 ++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-device-video.h | 82 +++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 8 ++ libvirt-gconfig/tests/test-domain-create.c | 9 ++ 6 files changed, 235 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-device-video.c create mode 100644 libvirt-gconfig/libvirt-gconfig-device-video.h
diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index 1be6233..05cdbd0 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -17,6 +17,7 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-device-graphics.h \ libvirt-gconfig-device-graphics-spice.h \ libvirt-gconfig-device-input.h \ + libvirt-gconfig-device-video.h \ libvirt-gconfig-domain.h \ libvirt-gconfig-domain-snapshot.h \ libvirt-gconfig-helpers.h \ @@ -42,6 +43,7 @@ GCONFIG_SOURCE_FILES = \ libvirt-gconfig-device-graphics.c \ libvirt-gconfig-device-graphics-spice.c \ libvirt-gconfig-device-input.c \ + libvirt-gconfig-device-video.c \ libvirt-gconfig-domain.c \ libvirt-gconfig-domain-snapshot.c \ libvirt-gconfig-enum-types.c \
Looking again at the earlier patches, we have a naming issue here. All the objects which are used as children of GVirConfigDomain, should share the same naming prefix, eg GVirConfigDomainVideo, GVirConfigDomainGraphics, GVirConfigDomainClock, etc, otherwise we will end up having significant namespace clashes with elements from other XML documents in libvirt. 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 :|
participants (2)
-
Christophe Fergeau
-
Daniel P. Berrange