From: "Zeeshan Ali (Khattak)" <zeeshanak(a)gnome.org>
This changes gvir_config_object_attach_replace to accept a NULL
child object. Since we need to be able to find the node to remove
when this happens, gvir_config_object_attach_replace gets a third
argument with the name of the node to add/remove.
---
.../libvirt-gconfig-domain-controller.c | 9 ++++--
libvirt-gconfig/libvirt-gconfig-domain-redirdev.c | 9 ++++--
libvirt-gconfig/libvirt-gconfig-domain.c | 34 ++++++++++++++++----
libvirt-gconfig/libvirt-gconfig-object-private.h | 1 +
libvirt-gconfig/libvirt-gconfig-object.c | 11 +++++--
.../libvirt-gconfig-storage-pool-target.c | 10 ++++--
libvirt-gconfig/libvirt-gconfig-storage-pool.c | 20 +++++++++---
.../libvirt-gconfig-storage-vol-target.c | 10 ++++--
libvirt-gconfig/libvirt-gconfig-storage-vol.c | 20 +++++++++---
9 files changed, 100 insertions(+), 24 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain-controller.c
b/libvirt-gconfig/libvirt-gconfig-domain-controller.c
index 2024b54..4fed84c 100644
--- a/libvirt-gconfig/libvirt-gconfig-domain-controller.c
+++ b/libvirt-gconfig/libvirt-gconfig-domain-controller.c
@@ -115,12 +115,17 @@ guint
gvir_config_domain_controller_get_index(GVirConfigDomainController *contro
return index;
}
+/**
+ * gvir_config_domain_controller_set_address:
+ * @address: (allow-none):
+ */
void gvir_config_domain_controller_set_address(GVirConfigDomainController *controller,
GVirConfigDomainAddress *address)
{
g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_CONTROLLER(controller));
- g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_ADDRESS(address));
+ g_return_if_fail(address == NULL || GVIR_CONFIG_IS_DOMAIN_ADDRESS(address));
gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(controller),
- GVIR_CONFIG_OBJECT(address));
+ "address",
+ (GVirConfigObject *)address);
}
diff --git a/libvirt-gconfig/libvirt-gconfig-domain-redirdev.c
b/libvirt-gconfig/libvirt-gconfig-domain-redirdev.c
index efecb5a..435abff 100644
--- a/libvirt-gconfig/libvirt-gconfig-domain-redirdev.c
+++ b/libvirt-gconfig/libvirt-gconfig-domain-redirdev.c
@@ -81,12 +81,17 @@ void gvir_config_domain_redirdev_set_bus(GVirConfigDomainRedirdev
*redirdev,
NULL);
}
+/**
+ * gvir_config_domain_redirdev_set_address:
+ * @address: (allow-none):
+ */
void gvir_config_domain_redirdev_set_address(GVirConfigDomainRedirdev *redirdev,
GVirConfigDomainAddress *address)
{
g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_REDIRDEV(redirdev));
- g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_ADDRESS(address));
+ g_return_if_fail(address == NULL || GVIR_CONFIG_IS_DOMAIN_ADDRESS(address));
gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(redirdev),
- GVIR_CONFIG_OBJECT(address));
+ "address",
+ (GVirConfigObject *)address);
}
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c
b/libvirt-gconfig/libvirt-gconfig-domain.c
index d100009..52ce0ef 100644
--- a/libvirt-gconfig/libvirt-gconfig-domain.c
+++ b/libvirt-gconfig/libvirt-gconfig-domain.c
@@ -321,14 +321,19 @@ void gvir_config_domain_set_features(GVirConfigDomain *domain,
g_object_notify(G_OBJECT(domain), "features");
}
+/**
+ * gvir_config_domain_set_clock:
+ * @klock: (allow-none):
+ */
void gvir_config_domain_set_clock(GVirConfigDomain *domain,
GVirConfigDomainClock *klock)
{
g_return_if_fail(GVIR_CONFIG_IS_DOMAIN(domain));
- g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_CLOCK(klock));
+ g_return_if_fail(klock != NULL || GVIR_CONFIG_IS_DOMAIN_CLOCK(klock));
gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(domain),
- GVIR_CONFIG_OBJECT(klock));
+ "clock",
+ (GVirConfigObject *)klock);
}
/**
@@ -349,24 +354,35 @@ GVirConfigDomainOs *gvir_config_domain_get_os(GVirConfigDomain
*domain)
return GVIR_CONFIG_DOMAIN_OS(object);
}
+/**
+ * gvir_config_domain_set_os:
+ * @os: (allow-none):
+ */
void gvir_config_domain_set_os(GVirConfigDomain *domain,
GVirConfigDomainOs *os)
{
g_return_if_fail(GVIR_CONFIG_IS_DOMAIN(domain));
- g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
+ g_return_if_fail(os == NULL || GVIR_CONFIG_IS_DOMAIN_OS(os));
gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(domain),
- GVIR_CONFIG_OBJECT(os));
+ "os",
+ (GVirConfigObject *)os);
}
+/**
+ * gvir_config_domain_set_seclabel:
+ * @seclabel: (allow-none):
+ */
void gvir_config_domain_set_seclabel(GVirConfigDomain *domain,
GVirConfigDomainSeclabel *seclabel)
{
g_return_if_fail(GVIR_CONFIG_IS_DOMAIN(domain));
- g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_SECLABEL(seclabel));
+ g_return_if_fail(seclabel == NULL ||
+ GVIR_CONFIG_IS_DOMAIN_SECLABEL(seclabel));
gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(domain),
- GVIR_CONFIG_OBJECT(seclabel));
+ "seclabel",
+ (GVirConfigObject *)seclabel);
}
void gvir_config_domain_set_lifecycle(GVirConfigDomain *domain,
@@ -402,8 +418,13 @@ void gvir_config_domain_set_devices(GVirConfigDomain *domain,
g_return_if_fail(GVIR_CONFIG_IS_DOMAIN(domain));
+ if (devices == NULL) {
+ gvir_config_object_delete_children(GVIR_CONFIG_OBJECT(domain),
"devices", NULL);
+ return;
+ }
devices_node = gvir_config_object_new(GVIR_CONFIG_TYPE_OBJECT,
"devices", NULL);
+
for (it = devices; it != NULL; it = it->next) {
if (!GVIR_CONFIG_IS_DOMAIN_DEVICE(it->data)) {
g_warn_if_reached();
@@ -414,6 +435,7 @@ void gvir_config_domain_set_devices(GVirConfigDomain *domain,
}
gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(domain),
+ "devices",
devices_node);
g_object_unref(G_OBJECT(devices_node));
}
diff --git a/libvirt-gconfig/libvirt-gconfig-object-private.h
b/libvirt-gconfig/libvirt-gconfig-object-private.h
index eb2cc09..a22b945 100644
--- a/libvirt-gconfig/libvirt-gconfig-object-private.h
+++ b/libvirt-gconfig/libvirt-gconfig-object-private.h
@@ -85,6 +85,7 @@ void gvir_config_object_set_child(GVirConfigObject *object,
void gvir_config_object_attach_add(GVirConfigObject *parent,
GVirConfigObject *child);
void gvir_config_object_attach_replace(GVirConfigObject *parent,
+ const char *child_name,
GVirConfigObject *child);
void gvir_config_object_set_attribute(GVirConfigObject *object,
...) G_GNUC_NULL_TERMINATED;
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c
b/libvirt-gconfig/libvirt-gconfig-object.c
index 288bbc4..76e3134 100644
--- a/libvirt-gconfig/libvirt-gconfig-object.c
+++ b/libvirt-gconfig/libvirt-gconfig-object.c
@@ -839,9 +839,16 @@ gvir_config_object_attach(GVirConfigObject *parent, GVirConfigObject
*child, gbo
}
G_GNUC_INTERNAL void
-gvir_config_object_attach_replace(GVirConfigObject *parent, GVirConfigObject *child)
+gvir_config_object_attach_replace(GVirConfigObject *parent,
+ const char *child_name,
+ GVirConfigObject *child)
{
- gvir_config_object_attach(parent, child, TRUE);
+ g_return_if_fail(child_name != NULL);
+
+ if (child == NULL)
+ gvir_config_object_delete_children(parent, child_name, NULL);
+ else
+ gvir_config_object_attach(parent, child, TRUE);
}
G_GNUC_INTERNAL void
diff --git a/libvirt-gconfig/libvirt-gconfig-storage-pool-target.c
b/libvirt-gconfig/libvirt-gconfig-storage-pool-target.c
index bf97194..cd8c9ee 100644
--- a/libvirt-gconfig/libvirt-gconfig-storage-pool-target.c
+++ b/libvirt-gconfig/libvirt-gconfig-storage-pool-target.c
@@ -84,12 +84,18 @@ void
gvir_config_storage_pool_target_set_path(GVirConfigStoragePoolTarget *targe
"path", path);
}
+/**
+ * gvir_config_storage_pool_perms_set_permissions:
+ * @perms: (allow-none):
+ */
void gvir_config_storage_pool_target_set_permissions(GVirConfigStoragePoolTarget
*target,
GVirConfigStoragePermissions
*perms)
{
g_return_if_fail(GVIR_CONFIG_IS_STORAGE_POOL_TARGET(target));
- g_return_if_fail(GVIR_CONFIG_IS_STORAGE_PERMISSIONS(perms));
+ g_return_if_fail(perms == NULL ||
+ GVIR_CONFIG_IS_STORAGE_PERMISSIONS(perms));
gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(target),
- GVIR_CONFIG_OBJECT(perms));
+ "permissions",
+ (GVirConfigObject *)perms);
}
diff --git a/libvirt-gconfig/libvirt-gconfig-storage-pool.c
b/libvirt-gconfig/libvirt-gconfig-storage-pool.c
index 1bbcfe9..1ea410a 100644
--- a/libvirt-gconfig/libvirt-gconfig-storage-pool.c
+++ b/libvirt-gconfig/libvirt-gconfig-storage-pool.c
@@ -139,22 +139,34 @@ void gvir_config_storage_pool_set_available(GVirConfigStoragePool
*pool,
"available", available);
}
+/**
+ * gvir_config_storage_pool_set_source:
+ * @source: (allow-none):
+ */
void gvir_config_storage_pool_set_source(GVirConfigStoragePool *pool,
GVirConfigStoragePoolSource *source)
{
g_return_if_fail(GVIR_CONFIG_IS_STORAGE_POOL(pool));
- g_return_if_fail(GVIR_CONFIG_IS_STORAGE_POOL_SOURCE(source));
+ g_return_if_fail(source == NULL ||
+ GVIR_CONFIG_IS_STORAGE_POOL_SOURCE(source));
gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(pool),
- GVIR_CONFIG_OBJECT(source));
+ "source",
+ (GVirConfigObject *)source);
}
+/**
+ * gvir_config_storage_pool_set_target:
+ * @target: (allow-none):
+ */
void gvir_config_storage_pool_set_target(GVirConfigStoragePool *pool,
GVirConfigStoragePoolTarget *target)
{
g_return_if_fail(GVIR_CONFIG_IS_STORAGE_POOL(pool));
- g_return_if_fail(GVIR_CONFIG_IS_STORAGE_POOL_TARGET(target));
+ g_return_if_fail(target == NULL ||
+ GVIR_CONFIG_IS_STORAGE_POOL_TARGET(target));
gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(pool),
- GVIR_CONFIG_OBJECT(target));
+ "target",
+ (GVirConfigObject *)target);
}
diff --git a/libvirt-gconfig/libvirt-gconfig-storage-vol-target.c
b/libvirt-gconfig/libvirt-gconfig-storage-vol-target.c
index 3786e2b..5ffcfe4 100644
--- a/libvirt-gconfig/libvirt-gconfig-storage-vol-target.c
+++ b/libvirt-gconfig/libvirt-gconfig-storage-vol-target.c
@@ -84,12 +84,18 @@ void
gvir_config_storage_vol_target_set_format(GVirConfigStorageVolTarget *targe
g_object_unref(G_OBJECT(node));
}
+/**
+ * gvir_config_storage_vol_target_set_permissions:
+ * @perms: (allow-none):
+ */
void gvir_config_storage_vol_target_set_permissions(GVirConfigStorageVolTarget *target,
GVirConfigStoragePermissions *perms)
{
g_return_if_fail(GVIR_CONFIG_IS_STORAGE_VOL_TARGET(target));
- g_return_if_fail(GVIR_CONFIG_IS_STORAGE_PERMISSIONS(perms));
+ g_return_if_fail(perms == NULL ||
+ GVIR_CONFIG_IS_STORAGE_PERMISSIONS(perms));
gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(target),
- GVIR_CONFIG_OBJECT(perms));
+ "permissions",
+ (GVirConfigObject *)perms);
}
diff --git a/libvirt-gconfig/libvirt-gconfig-storage-vol.c
b/libvirt-gconfig/libvirt-gconfig-storage-vol.c
index e20dca3..316ea9e 100644
--- a/libvirt-gconfig/libvirt-gconfig-storage-vol.c
+++ b/libvirt-gconfig/libvirt-gconfig-storage-vol.c
@@ -105,22 +105,34 @@ void gvir_config_storage_vol_set_allocation(GVirConfigStorageVol
*vol,
"allocation", allocation);
}
+/**
+ * gvir_config_storage_vol_set_target:
+ * @target: (allow-none):
+ */
void gvir_config_storage_vol_set_target(GVirConfigStorageVol *vol,
GVirConfigStorageVolTarget *target)
{
g_return_if_fail(GVIR_CONFIG_IS_STORAGE_VOL(vol));
- g_return_if_fail(GVIR_CONFIG_IS_STORAGE_VOL_TARGET(target));
+ g_return_if_fail(target == NULL ||
+ GVIR_CONFIG_IS_STORAGE_VOL_TARGET(target));
gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(vol),
- GVIR_CONFIG_OBJECT(target));
+ "target",
+ (GVirConfigObject *)target);
}
+/**
+ * gvir_config_storage_vol_set_backing_store:
+ * @backing_store: (allow-none):
+ */
void gvir_config_storage_vol_set_backing_store(GVirConfigStorageVol *vol,
GVirConfigStorageVolBackingStore
*backing_store)
{
g_return_if_fail(GVIR_CONFIG_IS_STORAGE_VOL(vol));
- g_return_if_fail(GVIR_CONFIG_IS_STORAGE_VOL_BACKING_STORE(backing_store));
+ g_return_if_fail(backing_store == NULL ||
+ GVIR_CONFIG_IS_STORAGE_VOL_BACKING_STORE(backing_store));
gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(vol),
- GVIR_CONFIG_OBJECT(backing_store));
+ "backingStore",
+ (GVirConfigObject *)backing_store);
}
--
1.7.10.1