[libvirt] Implement gvir_config_domain_get_devices

Hi, This is the second version of the patch series introducing gvir_config_domain_get_devices. The difference from the first version is the added 4/5 patch which adds a helper function to help with ignoring blank nodes while parsing the XML document. Christophe

This header groups all libvirt-gconfig private headers. --- libvirt-gconfig/Makefile.am | 1 + .../libvirt-gconfig-domain-chardev-source-pty.c | 2 +- libvirt-gconfig/libvirt-gconfig-domain-chardev.c | 2 +- libvirt-gconfig/libvirt-gconfig-domain-clock.c | 3 +- libvirt-gconfig/libvirt-gconfig-domain-device.c | 1 + libvirt-gconfig/libvirt-gconfig-domain-disk.c | 3 +- libvirt-gconfig/libvirt-gconfig-domain-filesys.c | 3 +- .../libvirt-gconfig-domain-graphics-sdl.c | 3 +- .../libvirt-gconfig-domain-graphics-spice.c | 3 +- .../libvirt-gconfig-domain-graphics-vnc.c | 3 +- libvirt-gconfig/libvirt-gconfig-domain-input.c | 3 +- .../libvirt-gconfig-domain-interface-network.c | 3 +- .../libvirt-gconfig-domain-interface-user.c | 3 +- libvirt-gconfig/libvirt-gconfig-domain-interface.c | 2 +- .../libvirt-gconfig-domain-memballoon.c | 3 +- libvirt-gconfig/libvirt-gconfig-domain-os.c | 3 +- libvirt-gconfig/libvirt-gconfig-domain-seclabel.c | 3 +- libvirt-gconfig/libvirt-gconfig-domain-sound.c | 2 +- libvirt-gconfig/libvirt-gconfig-domain-video.c | 3 +- libvirt-gconfig/libvirt-gconfig-domain.c | 3 +- libvirt-gconfig/libvirt-gconfig-object.c | 4 +-- libvirt-gconfig/libvirt-gconfig-private.h | 30 ++++++++++++++++++++ .../libvirt-gconfig-storage-permissions.c | 2 +- .../libvirt-gconfig-storage-pool-source.c | 2 +- .../libvirt-gconfig-storage-pool-target.c | 2 +- libvirt-gconfig/libvirt-gconfig-storage-pool.c | 2 +- .../libvirt-gconfig-storage-vol-backing-store.c | 2 +- .../libvirt-gconfig-storage-vol-target.c | 2 +- libvirt-gconfig/libvirt-gconfig-storage-vol.c | 2 +- 29 files changed, 58 insertions(+), 42 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-private.h diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index 6342431..d9eb25a 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -51,6 +51,7 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-storage-vol-backing-store.h \ libvirt-gconfig-storage-vol-target.h noinst_HEADERS = \ + libvirt-gconfig-private.h \ libvirt-gconfig-helpers-private.h \ libvirt-gconfig-object-private.h \ libvirt-gconfig-xml-doc.h diff --git a/libvirt-gconfig/libvirt-gconfig-domain-chardev-source-pty.c b/libvirt-gconfig/libvirt-gconfig-domain-chardev-source-pty.c index 1965444..e3c4c25 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-chardev-source-pty.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-chardev-source-pty.c @@ -23,7 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_CHARDEV_SOURCE_PTY_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_CHARDEV_SOURCE_PTY, GVirConfigDomainChardevSourcePtyPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-chardev.c b/libvirt-gconfig/libvirt-gconfig-domain-chardev.c index 1359f8f..620773c 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-chardev.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-chardev.c @@ -23,7 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_CHARDEV_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_CHARDEV, GVirConfigDomainChardevPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-clock.c b/libvirt-gconfig/libvirt-gconfig-domain-clock.c index 16d75d5..3cb8ffb 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-clock.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-clock.c @@ -23,8 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_CLOCK_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_CLOCK, GVirConfigDomainClockPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-device.c b/libvirt-gconfig/libvirt-gconfig-domain-device.c index 980ae70..8fcf60f 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-device.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-device.c @@ -23,6 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_DEVICE_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_DEVICE, GVirConfigDomainDevicePrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-disk.c b/libvirt-gconfig/libvirt-gconfig-domain-disk.c index 18cdb1c..1f60213 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-disk.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-disk.c @@ -23,8 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_DISK_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_DISK, GVirConfigDomainDiskPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-filesys.c b/libvirt-gconfig/libvirt-gconfig-domain-filesys.c index 6c3aa9d..ef942f8 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-filesys.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-filesys.c @@ -23,8 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_FILESYS_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_FILESYS, GVirConfigDomainFilesysPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-graphics-sdl.c b/libvirt-gconfig/libvirt-gconfig-domain-graphics-sdl.c index c60e72b..1e33a1b 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-graphics-sdl.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-graphics-sdl.c @@ -23,8 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_GRAPHICS_SDL_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_GRAPHICS_SDL, GVirConfigDomainGraphicsSdlPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-graphics-spice.c b/libvirt-gconfig/libvirt-gconfig-domain-graphics-spice.c index 321b914..7aa3e2c 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-graphics-spice.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-graphics-spice.c @@ -23,8 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_GRAPHICS_SPICE_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_GRAPHICS_SPICE, GVirConfigDomainGraphicsSpicePrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-graphics-vnc.c b/libvirt-gconfig/libvirt-gconfig-domain-graphics-vnc.c index f7fd6db..b00a155 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-graphics-vnc.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-graphics-vnc.c @@ -23,8 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_GRAPHICS_VNC_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_GRAPHICS_VNC, GVirConfigDomainGraphicsVncPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-input.c b/libvirt-gconfig/libvirt-gconfig-domain-input.c index 5bc70c8..bacc693 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-input.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-input.c @@ -23,8 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_INPUT_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_INPUT, GVirConfigDomainInputPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-interface-network.c b/libvirt-gconfig/libvirt-gconfig-domain-interface-network.c index becddc8..6f24708 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-interface-network.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-interface-network.c @@ -25,8 +25,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_INTERFACE_NETWORK_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_INTERFACE_NETWORK, GVirConfigDomainInterfaceNetworkPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-interface-user.c b/libvirt-gconfig/libvirt-gconfig-domain-interface-user.c index 2c03af2..25770e0 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-interface-user.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-interface-user.c @@ -25,8 +25,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_INTERFACE_USER_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_INTERFACE_USER, GVirConfigDomainInterfaceUserPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-interface.c b/libvirt-gconfig/libvirt-gconfig-domain-interface.c index 834ce5d..2d87040 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-interface.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-interface.c @@ -25,7 +25,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_INTERFACE_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_INTERFACE, GVirConfigDomainInterfacePrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-memballoon.c b/libvirt-gconfig/libvirt-gconfig-domain-memballoon.c index ca74a72..9df7e52 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-memballoon.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-memballoon.c @@ -23,8 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_MEMBALLOON_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_MEMBALLOON, GVirConfigDomainMemballoonPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-os.c b/libvirt-gconfig/libvirt-gconfig-domain-os.c index 2b0cdff..6818abf 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-os.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-os.c @@ -23,8 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_OS_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_OS, GVirConfigDomainOsPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-seclabel.c b/libvirt-gconfig/libvirt-gconfig-domain-seclabel.c index 7537a78..2d69c6f 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-seclabel.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-seclabel.c @@ -23,8 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_SECLABEL_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_SECLABEL, GVirConfigDomainSeclabelPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-sound.c b/libvirt-gconfig/libvirt-gconfig-domain-sound.c index 56149ca..abf9a14 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-sound.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-sound.c @@ -23,7 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_SOUND_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_SOUND, GVirConfigDomainSoundPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-video.c b/libvirt-gconfig/libvirt-gconfig-domain-video.c index bba8073..90c71da 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-video.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-video.c @@ -23,8 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_VIDEO_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_VIDEO, GVirConfigDomainVideoPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index c5df963..ed48d57 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -24,8 +24,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN, GVirConfigDomainPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index cf71264..ce6cd21 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -28,9 +28,7 @@ #include <libxml/relaxng.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" -#include "libvirt-gconfig/libvirt-gconfig-xml-doc.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_OBJECT_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_OBJECT, GVirConfigObjectPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-private.h b/libvirt-gconfig/libvirt-gconfig-private.h new file mode 100644 index 0000000..e985ebd --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-private.h @@ -0,0 +1,30 @@ +/* + * libvirt-gconfig-private.h: libvirt domain device configuration + * + * Copyright (C) 2011 Red Hat, Inc. + * + * 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> + */ + +#ifndef __LIBVIRT_GCONFIG_PRIVATE_H__ +#define __LIBVIRT_GCONFIG_PRIVATE_H__ + +#include <libvirt-gconfig/libvirt-gconfig-helpers-private.h> +#include <libvirt-gconfig/libvirt-gconfig-object-private.h> +#include <libvirt-gconfig/libvirt-gconfig-xml-doc.h> + +#endif /* __LIBVIRT_GCONFIG_PRIVATE_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig-storage-permissions.c b/libvirt-gconfig/libvirt-gconfig-storage-permissions.c index c5f9f49..49e28ac 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-permissions.c +++ b/libvirt-gconfig/libvirt-gconfig-storage-permissions.c @@ -23,7 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_STORAGE_PERMISSIONS_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_STORAGE_PERMISSIONS, GVirConfigStoragePermissionsPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-storage-pool-source.c b/libvirt-gconfig/libvirt-gconfig-storage-pool-source.c index b2223a2..fafb755 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-pool-source.c +++ b/libvirt-gconfig/libvirt-gconfig-storage-pool-source.c @@ -23,7 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_STORAGE_POOL_SOURCE_GET_PRIVATE(obj) \ diff --git a/libvirt-gconfig/libvirt-gconfig-storage-pool-target.c b/libvirt-gconfig/libvirt-gconfig-storage-pool-target.c index a5af381..4ce5a12 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-pool-target.c +++ b/libvirt-gconfig/libvirt-gconfig-storage-pool-target.c @@ -23,7 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_STORAGE_POOL_TARGET_GET_PRIVATE(obj) \ diff --git a/libvirt-gconfig/libvirt-gconfig-storage-pool.c b/libvirt-gconfig/libvirt-gconfig-storage-pool.c index 95609bb..c22e160 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-pool.c +++ b/libvirt-gconfig/libvirt-gconfig-storage-pool.c @@ -25,7 +25,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_STORAGE_POOL_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_STORAGE_POOL, GVirConfigStoragePoolPrivate)) diff --git a/libvirt-gconfig/libvirt-gconfig-storage-vol-backing-store.c b/libvirt-gconfig/libvirt-gconfig-storage-vol-backing-store.c index 2530ed3..1791ba0 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-vol-backing-store.c +++ b/libvirt-gconfig/libvirt-gconfig-storage-vol-backing-store.c @@ -23,7 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_STORAGE_VOL_BACKING_STORE_GET_PRIVATE(obj) \ diff --git a/libvirt-gconfig/libvirt-gconfig-storage-vol-target.c b/libvirt-gconfig/libvirt-gconfig-storage-vol-target.c index 6a3bb0c..373f684 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-vol-target.c +++ b/libvirt-gconfig/libvirt-gconfig-storage-vol-target.c @@ -23,7 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_STORAGE_VOL_TARGET_GET_PRIVATE(obj) \ diff --git a/libvirt-gconfig/libvirt-gconfig-storage-vol.c b/libvirt-gconfig/libvirt-gconfig-storage-vol.c index 079a5fd..1864447 100644 --- a/libvirt-gconfig/libvirt-gconfig-storage-vol.c +++ b/libvirt-gconfig/libvirt-gconfig-storage-vol.c @@ -24,7 +24,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" -#include "libvirt-gconfig/libvirt-gconfig-object-private.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_STORAGE_VOL_GET_PRIVATE(obj) \ -- 1.7.7.5

On Tue, Jan 3, 2012 at 4:50 PM, Christophe Fergeau <cfergeau@redhat.com> wrote:
This header groups all libvirt-gconfig private headers.
ACK -- Regards, Zeeshan Ali (Khattak) FSF member#5124

This will be helpful to implement GVirConfig getters. --- libvirt-gconfig/libvirt-gconfig-helpers-private.h | 5 ++ libvirt-gconfig/libvirt-gconfig-helpers.c | 53 ++++++++++++++++++-- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-helpers-private.h b/libvirt-gconfig/libvirt-gconfig-helpers-private.h index 4c4a539..de18f50 100644 --- a/libvirt-gconfig/libvirt-gconfig-helpers-private.h +++ b/libvirt-gconfig/libvirt-gconfig-helpers-private.h @@ -50,7 +50,12 @@ 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); +xmlChar *gvir_config_xml_get_attribute_content(xmlNodePtr node, + const char *attr_name); +char *gvir_config_xml_get_attribute_content_glib(xmlNodePtr node, + const char *attr_name); const char *gvir_config_genum_get_nick (GType enum_type, gint value); +int gvir_config_genum_get_value (GType enum_type, const char *nick, gint default_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 c1c23da..a8001ae 100644 --- a/libvirt-gconfig/libvirt-gconfig-helpers.c +++ b/libvirt-gconfig/libvirt-gconfig-helpers.c @@ -210,22 +210,43 @@ gvir_config_xml_get_child_element_content (xmlNode *node, return xmlNodeGetContent (child_node); } +static char *libxml_to_glib(xmlChar *str) +{ + char *g_str; + + if (str == NULL) + return NULL; + g_str = g_strdup((char *)str); + xmlFree(str); + + return g_str; +} + char * gvir_config_xml_get_child_element_content_glib (xmlNode *node, const char *child_name) { xmlChar *content; - char *copy; content = gvir_config_xml_get_child_element_content (node, child_name); - if (!content) - return NULL; - copy = g_strdup ((char *) content); + return libxml_to_glib(content); +} + +G_GNUC_INTERNAL xmlChar * +gvir_config_xml_get_attribute_content(xmlNodePtr node, const char *attr_name) +{ + return xmlGetProp(node, (const xmlChar*)attr_name); +} + +G_GNUC_INTERNAL char * +gvir_config_xml_get_attribute_content_glib(xmlNodePtr node, const char *attr_name) +{ + xmlChar *attr; - xmlFree (content); + attr = gvir_config_xml_get_attribute_content(node, attr_name); - return copy; + return libxml_to_glib(attr); } const char *gvir_config_genum_get_nick (GType enum_type, gint value) @@ -244,3 +265,23 @@ const char *gvir_config_genum_get_nick (GType enum_type, gint value) g_return_val_if_reached(NULL); } + +G_GNUC_INTERNAL int +gvir_config_genum_get_value (GType enum_type, const char *nick, + gint default_value) +{ + GEnumClass *enum_class; + GEnumValue *enum_value; + + g_return_val_if_fail(G_TYPE_IS_ENUM(enum_type), default_value); + g_return_val_if_fail(nick != NULL, default_value); + + enum_class = g_type_class_ref(enum_type); + enum_value = g_enum_get_value_by_nick(enum_class, nick); + g_type_class_unref(enum_class); + + if (enum_value != NULL) + return enum_value->value; + + g_return_val_if_reached(default_value); +} -- 1.7.7.5

On Tue, Jan 3, 2012 at 4:50 PM, Christophe Fergeau <cfergeau@redhat.com> wrote:
This will be helpful to implement GVirConfig getters.
Looks good, except for a tiny nitpick:
+static char *libxml_to_glib(xmlChar *str)
Perhaps name it libxml_str_to_glib ? ACK otherwise. -- Regards, Zeeshan Ali (Khattak) FSF member#5124

This helper function will be useful to create instances of GVirConfigXXX objects when we already have a "top-level" instance (eg to create a GVirConfigDomainDisk using the tree stored in a GVirConfigDomain instance). --- libvirt-gconfig/libvirt-gconfig-object-private.h | 6 ++++++ libvirt-gconfig/libvirt-gconfig-object.c | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-object-private.h b/libvirt-gconfig/libvirt-gconfig-object-private.h index 26da723..38c129f 100644 --- a/libvirt-gconfig/libvirt-gconfig-object-private.h +++ b/libvirt-gconfig/libvirt-gconfig-object-private.h @@ -24,6 +24,12 @@ G_BEGIN_DECLS +#include <libvirt-gconfig/libvirt-gconfig-xml-doc.h> + +GVirConfigObject *gvir_config_object_new_from_tree(GType type, + GVirConfigXmlDoc *doc, + const char *schema, + xmlNodePtr tree); xmlNodePtr gvir_config_object_get_xml_node(GVirConfigObject *config); char *gvir_config_object_get_node_content(GVirConfigObject *object, const char *node_name); diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index ce6cd21..7a6d062 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -514,6 +514,21 @@ GVirConfigObject *gvir_config_object_new_from_xml(GType type, return object; } +G_GNUC_INTERNAL GVirConfigObject * +gvir_config_object_new_from_tree(GType type, GVirConfigXmlDoc *doc, + const char *schema, xmlNodePtr tree) +{ + g_return_val_if_fail(g_type_is_a(type, GVIR_TYPE_CONFIG_OBJECT), NULL); + g_return_val_if_fail(GVIR_IS_CONFIG_XML_DOC(doc), NULL); + g_return_val_if_fail(tree != NULL, NULL); + + return GVIR_CONFIG_OBJECT(g_object_new(type, + "doc", doc, + "node", tree, + "schema", schema, + NULL)); +} + GVirConfigObject *gvir_config_object_new(GType type, const char *root_name, const char *schema) -- 1.7.7.5

On Tue, Jan 3, 2012 at 4:50 PM, Christophe Fergeau <cfergeau@redhat.com> wrote:
This helper function will be useful to create instances of GVirConfigXXX objects when we already have a "top-level" instance (eg to create a GVirConfigDomainDisk using the tree stored in a GVirConfigDomain instance).
Looks good! ACK. -- Regards, Zeeshan Ali (Khattak) FSF member#5124

When iterating over xmlNodePtr children to parse an XML document describing a libvirt configuration item, we want to ignore blank nodes that may have been added to make the initial XML document "more human readable". Since this will be useful in several places, move this code to a helper function. --- libvirt-gconfig/libvirt-gconfig-domain.c | 28 +++++++++++--------- libvirt-gconfig/libvirt-gconfig-helpers-private.h | 4 +++ libvirt-gconfig/libvirt-gconfig-helpers.c | 18 +++++++++++++ libvirt-gconfig/libvirt-gconfig-object-private.h | 4 +++ libvirt-gconfig/libvirt-gconfig-object.c | 21 +++++++++++++++ 5 files changed, 62 insertions(+), 13 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index ed48d57..0d4cd8c 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -222,6 +222,18 @@ void gvir_config_domain_set_vcpus(GVirConfigDomain *domain, guint64 vcpu_count) g_object_notify(G_OBJECT(domain), "vcpu"); } +static gboolean add_one_feature(xmlNodePtr node, gpointer opaque) +{ + GPtrArray *features; + g_return_val_if_fail(opaque != NULL, FALSE); + + features = (GPtrArray *)opaque; + + g_ptr_array_add(features, g_strdup((char *)node->name)); + + return TRUE; +} + /** * gvir_config_domain_get_features: * Returns: (transfer full): @@ -229,22 +241,12 @@ void gvir_config_domain_set_vcpus(GVirConfigDomain *domain, guint64 vcpu_count) GStrv gvir_config_domain_get_features(GVirConfigDomain *domain) { GPtrArray *features; - xmlNodePtr parent_node; - xmlNodePtr node; - xmlNodePtr it; - parent_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(domain)); - if (parent_node == NULL) - return NULL; - - node = gvir_config_xml_get_element(parent_node, "features", NULL); - if (node == NULL) - return NULL; + g_return_val_if_fail(GVIR_IS_CONFIG_DOMAIN(domain), NULL); features = g_ptr_array_new(); - for (it = node->children; it != NULL; it = it->next) { - g_ptr_array_add(features, g_strdup((char *)it->name)); - } + gvir_config_object_foreach_child(GVIR_CONFIG_OBJECT(domain), "features", + add_one_feature, features); g_ptr_array_add(features, NULL); return (GStrv)g_ptr_array_free(features, FALSE); diff --git a/libvirt-gconfig/libvirt-gconfig-helpers-private.h b/libvirt-gconfig/libvirt-gconfig-helpers-private.h index de18f50..6067c76 100644 --- a/libvirt-gconfig/libvirt-gconfig-helpers-private.h +++ b/libvirt-gconfig/libvirt-gconfig-helpers-private.h @@ -45,6 +45,10 @@ void gvir_config_set_error_valist(GError **err, xmlNodePtr gvir_config_xml_parse(const char *xml, const char *root_node, GError **err); +typedef gboolean (*GVirConfigXmlNodeIterator)(xmlNodePtr node, gpointer opaque); +void gvir_config_xml_foreach_child(xmlNodePtr node, + GVirConfigXmlNodeIterator it_func, + gpointer opaque); xmlNode * gvir_config_xml_get_element (xmlNode *node, ...); xmlChar * gvir_config_xml_get_child_element_content (xmlNode *node, const char *child_name); diff --git a/libvirt-gconfig/libvirt-gconfig-helpers.c b/libvirt-gconfig/libvirt-gconfig-helpers.c index a8001ae..ebaf501 100644 --- a/libvirt-gconfig/libvirt-gconfig-helpers.c +++ b/libvirt-gconfig/libvirt-gconfig-helpers.c @@ -161,6 +161,24 @@ gvir_config_xml_parse(const char *xml, const char *root_node, GError **err) return doc->children; } +void gvir_config_xml_foreach_child(xmlNodePtr node, + GVirConfigXmlNodeIterator it_func, + gpointer opaque) +{ + xmlNodePtr it; + + g_return_if_fail(it_func != NULL); + + for (it = node->children; it != NULL; it = it->next) { + gboolean cont; + + if (xmlIsBlankNode(it)) + continue; + cont = it_func(it, opaque); + if (!cont) + break; + } +} /* * gvir_config_xml_get_element, gvir_config_xml_get_child_element_content diff --git a/libvirt-gconfig/libvirt-gconfig-object-private.h b/libvirt-gconfig/libvirt-gconfig-object-private.h index 38c129f..7c6575e 100644 --- a/libvirt-gconfig/libvirt-gconfig-object-private.h +++ b/libvirt-gconfig/libvirt-gconfig-object-private.h @@ -66,6 +66,10 @@ void gvir_config_object_set_attribute_with_type(GVirConfigObject *object, ...) G_GNUC_NULL_TERMINATED; void gvir_config_object_remove_attribute(GVirConfigObject *object, const char *attr_name); +void gvir_config_object_foreach_child(GVirConfigObject *object, + const char *parent_name, + GVirConfigXmlNodeIterator it_func, + gpointer opaque); G_END_DECLS diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 7a6d062..5c7639f 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -336,6 +336,27 @@ gvir_config_object_set_child(GVirConfigObject *object, xmlNodePtr child) gvir_config_object_set_child_internal(object, child, TRUE); } +G_GNUC_INTERNAL void +gvir_config_object_foreach_child(GVirConfigObject *object, + const char *parent_name, + GVirConfigXmlNodeIterator it_func, + gpointer opaque) +{ + xmlNodePtr root_node; + xmlNodePtr node; + + g_return_if_fail(GVIR_IS_CONFIG_OBJECT(object)); + + root_node = gvir_config_object_get_xml_node(object); + g_return_if_fail(root_node != NULL); + + node = gvir_config_xml_get_element(root_node, parent_name, NULL); + if (node == NULL) + return; + + gvir_config_xml_foreach_child(node, it_func, opaque); +} + G_GNUC_INTERNAL GVirConfigObject * gvir_config_object_add_child(GVirConfigObject *object, const char *child_name) -- 1.7.7.5

On Tue, Jan 3, 2012 at 4:50 PM, Christophe Fergeau <cfergeau@redhat.com> wrote:
When iterating over xmlNodePtr children to parse an XML document describing a libvirt configuration item, we want to ignore blank nodes that may have been added to make the initial XML document "more human readable". Since this will be useful in several places, move this code to a helper function.
Looks good, apart from the "more human readable" sarcasm. :) Oh and a few small things:
+static gboolean add_one_feature(xmlNodePtr node, gpointer opaque)
'feature' is singular so 'one_' is pretty much redundant here.
+void gvir_config_xml_foreach_child(xmlNodePtr node, + GVirConfigXmlNodeIterator it_func, + gpointer opaque)
I'd suggest using 'iter_func' or just 'func' as the parameter name but this is entirely subjective so feel free to ignore this suggestion. :)
+ for (it = node->children; it != NULL; it = it->next) { + gboolean cont; + + if (xmlIsBlankNode(it)) + continue; + cont = it_func(it, opaque); + if (!cont) + break;
Since 'cont' is only used once and there is no big line (to not fit in the 120 cols limit), I suggest not using it here. ACK otherwise. -- Regards, Zeeshan Ali (Khattak) FSF member#5124

Hey, Thanks for reviewing all these patches! On Wed, Jan 04, 2012 at 10:34:15PM +0200, Zeeshan Ali (Khattak) wrote:
On Tue, Jan 3, 2012 at 4:50 PM, Christophe Fergeau <cfergeau@redhat.com> wrote:
When iterating over xmlNodePtr children to parse an XML document describing a libvirt configuration item, we want to ignore blank nodes that may have been added to make the initial XML document "more human readable". Since this will be useful in several places, move this code to a helper function.
Looks good, apart from the "more human readable" sarcasm. :)
It's not meant as a sarcasm, it's generally why some XML documents have some extra white space, so I'm simply stating a fact :)
Oh and a few small things:
+static gboolean add_one_feature(xmlNodePtr node, gpointer opaque)
'feature' is singular so 'one_' is pretty much redundant here.
This is an habit I have for callbacks used with _foreach functions, I put a "_one_" in the name to underline it's processing one element of the collection that is being iterated over. I removed it here, and did the same in the commit introducing _get_devices which has a add_one_device function.
+void gvir_config_xml_foreach_child(xmlNodePtr node, + GVirConfigXmlNodeIterator it_func, + gpointer opaque)
I'd suggest using 'iter_func' or just 'func' as the parameter name but this is entirely subjective so feel free to ignore this suggestion. :)
Changed
+ for (it = node->children; it != NULL; it = it->next) { + gboolean cont; + + if (xmlIsBlankNode(it)) + continue; + cont = it_func(it, opaque); + if (!cont) + break;
Since 'cont' is only used once and there is no big line (to not fit in the 120 cols limit), I suggest not using it here.
I don't like hiding function calls in if() conditions like if (!it_func(it, opaque)) break, that's why I used a variable, and I'd prefer to keep it that way :) Christophe

There are some devices which we are not able to parse yet, in these cases a runtime warning is printed to tell what's going on. --- libvirt-gconfig/Makefile.am | 1 + .../libvirt-gconfig-domain-device-private.h | 45 ++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain-device.c | 62 ++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain-disk.c | 30 +++++++++- libvirt-gconfig/libvirt-gconfig-domain-graphics.c | 33 ++++++++++ libvirt-gconfig/libvirt-gconfig-domain-interface.c | 38 ++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.c | 43 ++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain.h | 1 + libvirt-gconfig/libvirt-gconfig-private.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 1 + 10 files changed, 254 insertions(+), 1 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-domain-device-private.h diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index d9eb25a..34c5cc5 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -52,6 +52,7 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-storage-vol-target.h noinst_HEADERS = \ libvirt-gconfig-private.h \ + libvirt-gconfig-domain-device-private.h \ libvirt-gconfig-helpers-private.h \ libvirt-gconfig-object-private.h \ libvirt-gconfig-xml-doc.h diff --git a/libvirt-gconfig/libvirt-gconfig-domain-device-private.h b/libvirt-gconfig/libvirt-gconfig-domain-device-private.h new file mode 100644 index 0000000..7ba7bc6 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-domain-device-private.h @@ -0,0 +1,45 @@ +/* + * libvirt-gconfig-domain-device-private.h: libvirt domain device configuration + * + * Copyright (C) 2011 Red Hat, Inc. + * + * 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> + */ + +#ifndef __LIBVIRT_GCONFIG_DOMAIN_DEVICE_PRIVATE_H__ +#define __LIBVIRT_GCONFIG_DOMAIN_DEVICE_PRIVATE_H__ + +#include <libvirt-gconfig/libvirt-gconfig-xml-doc.h> + +G_BEGIN_DECLS + +GVirConfigDomainDevice * +gvir_config_domain_device_new_from_tree(GVirConfigXmlDoc *doc, + xmlNodePtr tree); +GVirConfigDomainDevice * +gvir_config_domain_disk_new_from_tree(GVirConfigXmlDoc *doc, + xmlNodePtr tree); +GVirConfigDomainDevice * +gvir_config_domain_graphics_new_from_tree(GVirConfigXmlDoc *doc, + xmlNodePtr tree); +GVirConfigDomainDevice * +gvir_config_domain_interface_new_from_tree(GVirConfigXmlDoc *doc, + xmlNodePtr tree); + +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_DOMAIN_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig-domain-device.c b/libvirt-gconfig/libvirt-gconfig-domain-device.c index 8fcf60f..a9ae8e8 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-device.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-device.c @@ -48,3 +48,65 @@ static void gvir_config_domain_device_init(GVirConfigDomainDevice *device) device->priv = GVIR_CONFIG_DOMAIN_DEVICE_GET_PRIVATE(device); } + +G_GNUC_INTERNAL GVirConfigDomainDevice * +gvir_config_domain_device_new_from_tree(GVirConfigXmlDoc *doc, + xmlNodePtr tree) +{ + GType type; + + g_return_val_if_fail(GVIR_IS_CONFIG_XML_DOC(doc), NULL); + g_return_val_if_fail(tree != NULL, NULL); + g_return_val_if_fail(tree->name != NULL, NULL); + + if (xmlStrEqual(tree->name, (xmlChar*)"disk")) { + return gvir_config_domain_disk_new_from_tree(doc, tree); + } else if (xmlStrEqual(tree->name, (xmlChar*)"filesystem")) { + type = GVIR_TYPE_CONFIG_DOMAIN_FILESYS; + } else if (xmlStrEqual(tree->name, (xmlChar*)"controller")) { + goto unimplemented; + } else if (xmlStrEqual(tree->name, (xmlChar*)"lease")) { + goto unimplemented; + } else if (xmlStrEqual(tree->name, (xmlChar*)"hostdev")) { + goto unimplemented; + } else if (xmlStrEqual(tree->name, (xmlChar*)"redirdev")) { + goto unimplemented; + } else if (xmlStrEqual(tree->name, (xmlChar*)"smartcard")) { + goto unimplemented; + } else if (xmlStrEqual(tree->name, (xmlChar*)"interface")) { + return gvir_config_domain_interface_new_from_tree(doc, tree); + } else if (xmlStrEqual(tree->name, (xmlChar*)"input")) { + type = GVIR_TYPE_CONFIG_DOMAIN_INPUT; + } else if (xmlStrEqual(tree->name, (xmlChar*)"hub")) { + goto unimplemented; + } else if (xmlStrEqual(tree->name, (xmlChar*)"graphics")) { + return gvir_config_domain_graphics_new_from_tree(doc, tree); + } else if (xmlStrEqual(tree->name, (xmlChar*)"video")) { + type = GVIR_TYPE_CONFIG_DOMAIN_VIDEO; + } else if (xmlStrEqual(tree->name, (xmlChar*)"parallel")) { + goto unimplemented; + } else if (xmlStrEqual(tree->name, (xmlChar*)"serial")) { + goto unimplemented; + } else if (xmlStrEqual(tree->name, (xmlChar*)"console")) { + type = GVIR_TYPE_CONFIG_DOMAIN_CONSOLE; + } else if (xmlStrEqual(tree->name, (xmlChar*)"channel")) { + goto unimplemented; + } else if (xmlStrEqual(tree->name, (xmlChar*)"watchdog")) { + goto unimplemented; + } else if (xmlStrEqual(tree->name, (xmlChar*)"sound")) { + type = GVIR_TYPE_CONFIG_DOMAIN_SOUND; + } else if (xmlStrEqual(tree->name, (xmlChar*)"memballoon")) { + type = GVIR_TYPE_CONFIG_DOMAIN_MEMBALLOON; + } else { + g_warning("Unknown device node: %s", tree->name); + return NULL; + } + + g_return_val_if_fail(g_type_is_a(type, GVIR_TYPE_CONFIG_DOMAIN_DEVICE), NULL); + + return GVIR_CONFIG_DOMAIN_DEVICE(gvir_config_object_new_from_tree(type, doc, NULL, tree)); +unimplemented: + g_warning("Parsing of '%s' device nodes is unimplemented", + tree->name); + return NULL; +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain-disk.c b/libvirt-gconfig/libvirt-gconfig-domain-disk.c index 1f60213..1121007 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-disk.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-disk.c @@ -63,12 +63,40 @@ GVirConfigDomainDisk *gvir_config_domain_disk_new_from_xml(const gchar *xml, GError **error) { GVirConfigObject *object; - object = gvir_config_object_new_from_xml(GVIR_TYPE_CONFIG_DOMAIN_DISK, "disk", NULL, xml, error); + return GVIR_CONFIG_DOMAIN_DISK(object); } +GVirConfigDomainDevice * +gvir_config_domain_disk_new_from_tree(GVirConfigXmlDoc *doc, + xmlNodePtr tree) +{ + GVirConfigObject *object; + GVirConfigDomainDisk *disk; + GVirConfigDomainDiskType type; + xmlChar *type_str; + + type_str = gvir_config_xml_get_attribute_content(tree, "type"); + if (type_str == NULL) + return NULL; + + type = gvir_config_genum_get_value(GVIR_TYPE_CONFIG_DOMAIN_DISK_TYPE, + (char *)type_str, + GVIR_CONFIG_DOMAIN_DISK_FILE); + xmlFree(type_str); + if (type == -1) + return NULL; + + object = gvir_config_object_new_from_tree(GVIR_TYPE_CONFIG_DOMAIN_DISK, + doc, NULL, tree); + disk = GVIR_CONFIG_DOMAIN_DISK(object); + disk->priv->type = type; + + return GVIR_CONFIG_DOMAIN_DEVICE(object); +} + void gvir_config_domain_disk_set_type(GVirConfigDomainDisk *disk, GVirConfigDomainDiskType type) { diff --git a/libvirt-gconfig/libvirt-gconfig-domain-graphics.c b/libvirt-gconfig/libvirt-gconfig-domain-graphics.c index 53a663b..53d5e66 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-graphics.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-graphics.c @@ -23,6 +23,7 @@ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" #define GVIR_CONFIG_DOMAIN_GRAPHICS_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_GRAPHICS, GVirConfigDomainGraphicsPrivate)) @@ -47,3 +48,35 @@ static void gvir_config_domain_graphics_init(GVirConfigDomainGraphics *graphics) graphics->priv = GVIR_CONFIG_DOMAIN_GRAPHICS_GET_PRIVATE(graphics); } + +G_GNUC_INTERNAL GVirConfigDomainDevice * +gvir_config_domain_graphics_new_from_tree(GVirConfigXmlDoc *doc, + xmlNodePtr tree) +{ + xmlChar *type; + GType gtype; + + type = gvir_config_xml_get_attribute_content(tree, "type"); + if (type == NULL) + return NULL; + + if (xmlStrEqual(type, (xmlChar*)"sdl")) { + gtype = GVIR_TYPE_CONFIG_DOMAIN_GRAPHICS_SDL; + } else if (xmlStrEqual(type, (xmlChar*)"vnc")) { + gtype = GVIR_TYPE_CONFIG_DOMAIN_GRAPHICS_VNC; + } else if (xmlStrEqual(type, (xmlChar*)"spice")) { + gtype = GVIR_TYPE_CONFIG_DOMAIN_GRAPHICS_SPICE; + } else if (xmlStrEqual(type, (xmlChar*)"rdp")) { + g_warning("Parsing of '%s' graphics nodes is unimplemented", type); + return NULL; + } else if (xmlStrEqual(type, (xmlChar*)"desktop")) { + g_warning("Parsing of '%s' graphics nodes is unimplemented", type); + return NULL; + } else { + g_warning("Unknown graphics node: %s", type); + return NULL; + } + xmlFree(type); + + return GVIR_CONFIG_DOMAIN_DEVICE(gvir_config_object_new_from_tree(gtype, doc, NULL, tree)); +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain-interface.c b/libvirt-gconfig/libvirt-gconfig-domain-interface.c index 2d87040..0f427ff 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-interface.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-interface.c @@ -95,3 +95,41 @@ void gvir_config_domain_interface_set_model(GVirConfigDomainInterface *interface gvir_config_object_replace_child_with_attribute(GVIR_CONFIG_OBJECT(interface), "model", "type", model); } + +G_GNUC_INTERNAL GVirConfigDomainDevice * +gvir_config_domain_interface_new_from_tree(GVirConfigXmlDoc *doc, + xmlNodePtr tree) +{ + xmlChar *type; + GType gtype; + + type = gvir_config_xml_get_attribute_content(tree, "type"); + if (type == NULL) + return NULL; + + if (xmlStrEqual(type, (xmlChar*)"network")) { + gtype = GVIR_TYPE_CONFIG_DOMAIN_INTERFACE_NETWORK; + } else if (xmlStrEqual(type, (xmlChar*)"user")) { + gtype = GVIR_TYPE_CONFIG_DOMAIN_INTERFACE_USER; + } else if (xmlStrEqual(type, (xmlChar*)"bridge")) { + goto unimplemented; + } else if (xmlStrEqual(type, (xmlChar*)"direct")) { + goto unimplemented; + } else if (xmlStrEqual(type, (xmlChar*)"server")) { + goto unimplemented; + } else if (xmlStrEqual(type, (xmlChar*)"mcast")) { + goto unimplemented; + } else if (xmlStrEqual(type, (xmlChar*)"ethernet")) { + goto unimplemented; + } else { + g_warning("Unknown domain interface node: %s", type); + return NULL; + } + xmlFree(type); + + return GVIR_CONFIG_DOMAIN_DEVICE(gvir_config_object_new_from_tree(gtype, doc, NULL, tree)); + +unimplemented: + g_warning("Parsing of '%s' domain interface nodes is unimplemented", type); + return NULL; +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 0d4cd8c..26ffc87 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -362,3 +362,46 @@ void gvir_config_domain_add_device(GVirConfigDomain *domain, gvir_config_object_attach(devices_node, GVIR_CONFIG_OBJECT(device)); g_object_unref(G_OBJECT(devices_node)); } + +struct GetDeviceData { + GVirConfigXmlDoc *doc; + GList *devices; +}; + +static gboolean add_one_device(xmlNodePtr node, gpointer opaque) +{ + struct GetDeviceData* data = (struct GetDeviceData*)opaque; + GVirConfigDomainDevice *device; + + device = gvir_config_domain_device_new_from_tree(data->doc, node); + g_warn_if_fail(device != NULL); + if (device != NULL) + data->devices = g_list_append(data->devices, device); + + return TRUE; +} + +/** + * gvir_config_domain_get_devices: + * + * Gets the list of devices attached to @domain + * + * Returns: (element-type LibvirtGConfig.DomainDevice) (transfer full): + * a newly allocated #GList of #GVirConfigDomainDevice. + */ +GList *gvir_config_domain_get_devices(GVirConfigDomain *domain) +{ + struct GetDeviceData data; + + g_return_val_if_fail(GVIR_IS_CONFIG_DOMAIN(domain), NULL); + + g_object_get(G_OBJECT(domain), "doc", &data.doc, NULL); + data.devices = NULL; + gvir_config_object_foreach_child(GVIR_CONFIG_OBJECT(domain), "devices", + add_one_device, &data); + if (data.doc != NULL) { + g_object_unref(G_OBJECT(data.doc)); + } + + return data.devices; +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index 2b631ea..f46cc35 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -120,6 +120,7 @@ void gvir_config_domain_set_devices(GVirConfigDomain *domain, GList *devices); void gvir_config_domain_add_device(GVirConfigDomain *domain, GVirConfigDomainDevice *device); +GList *gvir_config_domain_get_devices(GVirConfigDomain *domain); void gvir_config_domain_set_lifecycle(GVirConfigDomain *domain, GVirConfigDomainLifecycleEvent event, GVirConfigDomainLifecycleAction action); diff --git a/libvirt-gconfig/libvirt-gconfig-private.h b/libvirt-gconfig/libvirt-gconfig-private.h index e985ebd..d4df030 100644 --- a/libvirt-gconfig/libvirt-gconfig-private.h +++ b/libvirt-gconfig/libvirt-gconfig-private.h @@ -23,6 +23,7 @@ #ifndef __LIBVIRT_GCONFIG_PRIVATE_H__ #define __LIBVIRT_GCONFIG_PRIVATE_H__ +#include <libvirt-gconfig/libvirt-gconfig-domain-device-private.h> #include <libvirt-gconfig/libvirt-gconfig-helpers-private.h> #include <libvirt-gconfig/libvirt-gconfig-object-private.h> #include <libvirt-gconfig/libvirt-gconfig-xml-doc.h> diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 87afa9d..7200da5 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -14,6 +14,7 @@ LIBVIRT_GCONFIG_0.0.3 { gvir_config_domain_new; gvir_config_domain_new_from_xml; gvir_config_domain_set_clock; + gvir_config_domain_get_devices; gvir_config_domain_set_devices; gvir_config_domain_get_features; gvir_config_domain_set_features; -- 1.7.7.5
participants (2)
-
Christophe Fergeau
-
Zeeshan Ali (Khattak)