/**
 * gvir_config_capabilities_guest_arch_get_domains:
 *
 * Gets the possible domains for this architecture.
 *
 * Returns: (element-type LibvirtGConfig.CapabilitiesGuestDomain) (transfer full):
 * a newly allocated #GList of #GVirConfigCapabilitiesGuestDomain.
 */
GList *
gvir_config_capabilities_guest_arch_get_domains(GVirConfigCapabilitiesGuestArch *arch)
{
    struct GetDomainData data;

    g_return_val_if_fail(GVIR_CONFIG_IS_CAPABILITIES_GUEST_ARCH(arch), NULL);

    g_object_get(G_OBJECT(arch), "doc", &data.doc, NULL);
    g_return_val_if_fail(data.doc != NULL, NULL);
    data.schema = gvir_config_object_get_schema(GVIR_CONFIG_OBJECT(arch));
    data.domains = NULL;

    gvir_config_object_foreach_child(GVIR_CONFIG_OBJECT(arch),
                                     NULL,
                                     add_domain,
                                     &data);
    g_clear_object(&data.doc);

    return data.domains;
}
/**
 * gvir_config_capabilities_get_guests:
 *
 * Gets the list of guest capabilities.
 *
 * Returns: (element-type LibvirtGConfig.CapabilitiesGuest) (transfer full):
 * a newly allocated #GList of #GVirConfigCapabilitiesGuest.
 */
GList *
gvir_config_capabilities_get_guests(GVirConfigCapabilities *caps)
{
    struct GetGuestData data;

    g_return_val_if_fail(GVIR_CONFIG_IS_CAPABILITIES(caps), NULL);

    g_object_get(G_OBJECT(caps), "doc", &data.doc, NULL);
    data.schema = gvir_config_object_get_schema(GVIR_CONFIG_OBJECT(caps));
    data.guests = NULL;

    gvir_config_object_foreach_child(GVIR_CONFIG_OBJECT(caps),
                                     NULL,
                                     add_guest,
                                     &data);

    g_clear_object(&data.doc);

    return data.guests;
}
/**
 * gvir_config_capabilities_guest_get_features:
 *
 * Gets the CPU features for this guest.
 *
 * Returns: (element-type LibvirtGConfig.CapabilitiesGuestFeature) (transfer full):
 * a newly allocated #GList of #GVirConfigCapabilitiesGuestFeature.
 */
GList *
gvir_config_capabilities_guest_get_features(GVirConfigCapabilitiesGuest *guest)
{
    struct GetFeatureData data;

    g_return_val_if_fail(GVIR_CONFIG_IS_CAPABILITIES_GUEST(guest), NULL);

    g_object_get(G_OBJECT(guest), "doc", &data.doc, NULL);
    g_return_val_if_fail(data.doc != NULL, NULL);
    data.schema = gvir_config_object_get_schema(GVIR_CONFIG_OBJECT(guest));
    data.features = NULL;

    gvir_config_object_foreach_child(GVIR_CONFIG_OBJECT(guest),
                                     "features",
                                     add_feature,
                                     &data);

    g_clear_object(&data.doc);

    return data.features;
}
/**
 * gvir_config_capabilities_host_get_secmodels:
 * @host: a #GVirConfigCapabilitiesHost
 *
 * Get the security models listed in @host capabilities.
 *
 * Returns: (element-type LibvirtGConfig.CapabilitiesHostSecModel) (transfer full):
 * a newly allocated #GList of #GVirConfigCapabilitiesHostSecModel.
 */
GList *
gvir_config_capabilities_host_get_secmodels(GVirConfigCapabilitiesHost *host)
{
    struct GetSecModelData data;

    g_return_val_if_fail(GVIR_CONFIG_IS_CAPABILITIES_HOST(host), NULL);

    data.schema = gvir_config_object_get_schema(GVIR_CONFIG_OBJECT(host));
    g_object_get(G_OBJECT(host), "doc", &data.doc, NULL);
    g_return_val_if_fail(data.doc != NULL, NULL);
    data.secmodels = NULL;
    data.type = GVIR_CONFIG_TYPE_CAPABILITIES_HOST_SECMODEL;

    gvir_config_object_foreach_child(GVIR_CONFIG_OBJECT(host),
                                     NULL,
                                     add_secmodel,
                                     &data);

    g_clear_object(&data.doc);

    return data.secmodels;
}