On 5/10/19 9:12 PM, Fabiano FidĂȘncio wrote:
Add a way to access the <enum name="firmware"/>
element's conent from
<os/>.
Signed-off-by: Fabiano FidĂȘncio <fidencio(a)redhat.com>
---
.../libvirt-gconfig-domain-capabilities-os.c | 74 ++++++++++++++++++-
.../libvirt-gconfig-domain-capabilities-os.h | 7 +-
libvirt-gconfig/libvirt-gconfig.sym | 1 +
3 files changed, 80 insertions(+), 2 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain-capabilities-os.c
b/libvirt-gconfig/libvirt-gconfig-domain-capabilities-os.c
index d3b6e3c..98a1bff 100644
--- a/libvirt-gconfig/libvirt-gconfig-domain-capabilities-os.c
+++ b/libvirt-gconfig/libvirt-gconfig-domain-capabilities-os.c
@@ -33,11 +33,83 @@ struct _GVirConfigDomainCapabilitiesOsPrivate
G_DEFINE_TYPE_WITH_PRIVATE(GVirConfigDomainCapabilitiesOs,
gvir_config_domain_capabilities_os, GVIR_CONFIG_TYPE_OBJECT);
-static void
gvir_config_domain_capabilities_os_class_init(GVirConfigDomainCapabilitiesOsClass *klass
G_GNUC_UNUSED)
+static GList *
+_gvir_config_domain_capabilities_os_get_firmwares(GVirConfigDomainCapabilitiesOs *os);
+
+static void
gvir_config_domain_capabilities_os_class_init(GVirConfigDomainCapabilitiesOsClass *klass)
{
+ klass->get_firmwares = _gvir_config_domain_capabilities_os_get_firmwares;
}
static void gvir_config_domain_capabilities_os_init(GVirConfigDomainCapabilitiesOs
*os)
{
os->priv = GVIR_CONFIG_DOMAIN_CAPABILITIES_OS_GET_PRIVATE(os);
}
+
+static gboolean add_firmwares(xmlNodePtr node, gpointer opaque)
+{
+ GList **firmwares = opaque;
+ GVirConfigDomainOsFirmware firmware;
+
+ if (node == NULL || node->children == NULL)
+ return TRUE;
+
+ firmware = gvir_config_genum_get_value
+ (GVIR_CONFIG_TYPE_DOMAIN_OS_FIRMWARE,
+ (const gchar *)node->children->content,
+ GVIR_CONFIG_DOMAIN_OS_FIRMWARE_BIOS);
+ *firmwares = g_list_append(*firmwares, GINT_TO_POINTER(firmware));
+
+ return TRUE;
+}
+
+static gboolean search_firmwares(xmlNodePtr node, gpointer opaque)
+{
+ const gchar *content;
+
+ if (!g_str_equal(node->name, "enum"))
+ return TRUE;
+
+ content = gvir_config_xml_get_attribute_content(node, "name");
+ if (content == NULL)
+ return TRUE;
+
+ if (!g_str_equal(content, "firmware"))
+ return TRUE;
+
+ gvir_config_xml_foreach_child(node,
+ add_firmwares,
+ opaque);
+
+ return TRUE;
+}
+
+static GList *
+_gvir_config_domain_capabilities_os_get_firmwares(GVirConfigDomainCapabilitiesOs *os)
+{
+ GList *firmwares = NULL;
+
+ g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_CAPABILITIES_OS(os), NULL);
+
+ gvir_config_object_foreach_child(GVIR_CONFIG_OBJECT(os),
+ NULL,
+ search_firmwares,
+ &firmwares);
+
+ return firmwares;
+}
+
+/**
+ * gvir_config_domain_capabilities_os_get_firmwares:
+ *
+ * Gets the firmwares supported by @os. The returned list should be freed with
+ * g_list_free().
+ *
+ * Returns: (element-type LibvirtGConfig.DomainOsFirmware) (transfer container):
+ * a newly allocated #GList of #GVirConfigDomainOsFirmware.
+ */
+GList *
+gvir_config_domain_capabilities_os_get_firmwares(GVirConfigDomainCapabilitiesOs *os)
+{
+ return GVIR_CONFIG_DOMAIN_CAPABILITIES_OS_GET_CLASS(os)->get_firmwares(os);
+}
diff --git a/libvirt-gconfig/libvirt-gconfig-domain-capabilities-os.h
b/libvirt-gconfig/libvirt-gconfig-domain-capabilities-os.h
index dba8572..ce36be2 100644
--- a/libvirt-gconfig/libvirt-gconfig-domain-capabilities-os.h
+++ b/libvirt-gconfig/libvirt-gconfig-domain-capabilities-os.h
@@ -51,11 +51,16 @@ struct _GVirConfigDomainCapabilitiesOsClass
{
GVirConfigObjectClass parent_class;
- gpointer padding[20];
+ GList *(*get_firmwares)(GVirConfigDomainCapabilitiesOs *os);
+
+ gpointer padding[19];
Strictly speaking, this shouldn't be needed as this wasn't released yet,
so we can change the siz of this class. But it's a good practise, so
your call whether we'll do that or not.
Michal