osinfo-db schema allows that, but libosinfo never really had an API to support it. In order to add get_os_variants(), (get,set)_os APIs were also added. Signed-off-by: Fabiano Fidêncio <fidencio@xxxxxxxxxx> --- osinfo/libosinfo.syms | 4 +++ osinfo/osinfo_image.c | 82 +++++++++++++++++++++++++++++++++++++++++- osinfo/osinfo_image.h | 4 +++ osinfo/osinfo_loader.c | 19 +++++++++- osinfo/osinfo_os.c | 1 + 5 files changed, 108 insertions(+), 2 deletions(-) diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms index 0152eff..db8b595 100644 --- a/osinfo/libosinfo.syms +++ b/osinfo/libosinfo.syms @@ -570,6 +570,10 @@ LIBOSINFO_1.4.0 { LIBOSINFO_1.5.0 { global: + osinfo_image_get_os; + osinfo_image_get_os_variants; + osinfo_image_set_os; + osinfo_install_config_get_installation_url; osinfo_install_config_set_installation_url; diff --git a/osinfo/osinfo_image.c b/osinfo/osinfo_image.c index 31eec76..fcde244 100644 --- a/osinfo/osinfo_image.c +++ b/osinfo/osinfo_image.c @@ -47,7 +47,7 @@ G_DEFINE_TYPE(OsinfoImage, osinfo_image, OSINFO_TYPE_ENTITY); struct _OsinfoImagePrivate { - gboolean unused; + GWeakRef os; }; enum { @@ -131,6 +131,15 @@ osinfo_image_set_property(GObject *object, } } +static void osinfo_image_dispose(GObject *obj) +{ + OsinfoImage *image = OSINFO_IMAGE(obj); + + g_weak_ref_clear(&image->priv->os); + + G_OBJECT_CLASS(osinfo_image_parent_class)->dispose(obj); +} + static void osinfo_image_finalize(GObject *object) { @@ -145,6 +154,7 @@ osinfo_image_class_init(OsinfoImageClass *klass) GObjectClass *g_klass = G_OBJECT_CLASS(klass); GParamSpec *pspec; + g_klass->dispose = osinfo_image_dispose; g_klass->finalize = osinfo_image_finalize; g_klass->get_property = osinfo_image_get_property; g_klass->set_property = osinfo_image_set_property; @@ -194,6 +204,8 @@ static void osinfo_image_init(OsinfoImage *image) { image->priv = OSINFO_IMAGE_GET_PRIVATE(image); + + g_weak_ref_init(&image->priv->os, NULL); } OsinfoImage *osinfo_image_new(const gchar *id, @@ -267,3 +279,71 @@ gboolean osinfo_image_get_cloud_init(OsinfoImage *image) return osinfo_entity_get_param_value_boolean_with_default (OSINFO_ENTITY(image), OSINFO_IMAGE_PROP_CLOUD_INIT, FALSE); } + +/** + * osinfo_image_get_os: + * @image: an #OsinfoImage instance + * + * Returns: (transfer full): the operating system, or NULL + */ +OsinfoOs *osinfo_image_get_os(OsinfoImage *image) +{ + g_return_val_if_fail(OSINFO_IS_IMAGE(image), NULL); + + return g_weak_ref_get(&image->priv->os); +} + +/** + * osinfo_image_set_os + * @image: an #OsinfoImage instance + * @os: an #OsinfoOs instance + * + * Sets the #OsinfoOs associated to the #OsinfoImage instance. + */ +void osinfo_image_set_os(OsinfoImage *image, OsinfoOs *os) +{ + g_return_if_fail(OSINFO_IS_IMAGE(image)); + + g_object_ref(os); + g_weak_ref_set(&image->priv->os, os); + g_object_unref(os); +} + +/** + * osinfo_image_get_os_variants: + * @image: an #OsinfoImage instance + * + * Gets the varriants of the associated operating system + * + * Returns: (transfer full): the operating system variants, or NULL + */ +OsinfoOsVariantList *osinfo_image_get_os_variants(OsinfoImage *image) +{ + OsinfoOs *os; + OsinfoOsVariantList *os_variants; + OsinfoOsVariantList *image_variants; + GList *ids, *node; + OsinfoFilter *filter; + + g_return_val_if_fail(OSINFO_IS_IMAGE(image), NULL); + os = osinfo_image_get_os(image); + os_variants = osinfo_os_get_variant_list(os); + g_object_unref(os); + + ids = osinfo_entity_get_param_value_list(OSINFO_ENTITY(image), + OSINFO_IMAGE_PROP_VARIANT); + filter = osinfo_filter_new(); + image_variants = osinfo_os_variantlist_new(); + for (node = ids; node != NULL; node = node->next) { + osinfo_filter_clear_constraints(filter); + osinfo_filter_add_constraint(filter, + OSINFO_ENTITY_PROP_ID, + (const char *) node->data); + osinfo_list_add_filtered(OSINFO_LIST(image_variants), + OSINFO_LIST(os_variants), + filter); + } + g_object_unref(os_variants); + + return image_variants; +} diff --git a/osinfo/osinfo_image.h b/osinfo/osinfo_image.h index 6dff3e1..2121f0b 100644 --- a/osinfo/osinfo_image.h +++ b/osinfo/osinfo_image.h @@ -47,6 +47,7 @@ typedef struct _OsinfoImagePrivate OsinfoImagePrivate; #define OSINFO_IMAGE_PROP_FORMAT "format" #define OSINFO_IMAGE_PROP_URL "url" #define OSINFO_IMAGE_PROP_CLOUD_INIT "cloud-init" +#define OSINFO_IMAGE_PROP_VARIANT "variant" /* object */ struct _OsinfoImage @@ -75,5 +76,8 @@ const gchar *osinfo_image_get_architecture(OsinfoImage *image); const gchar *osinfo_image_get_format(OsinfoImage *image); const gchar *osinfo_image_get_url(OsinfoImage *image); gboolean osinfo_image_get_cloud_init(OsinfoImage *image); +OsinfoOs *osinfo_image_get_os(OsinfoImage *image); +void osinfo_image_set_os(OsinfoImage *image, OsinfoOs *os); +OsinfoOsVariantList *osinfo_image_get_os_variants(OsinfoImage *image); #endif /* __OSINFO_IMAGE_H__ */ diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c index 84c25e5..05e9d98 100644 --- a/osinfo/osinfo_loader.c +++ b/osinfo/osinfo_loader.c @@ -1311,7 +1311,9 @@ static OsinfoImage *osinfo_loader_image(OsinfoLoader *loader, { OSINFO_IMAGE_PROP_URL, G_TYPE_STRING }, { NULL, G_TYPE_INVALID } }; - + xmlNodePtr *nodes = NULL; + gint nnodes; + guint i; gchar *arch = (gchar *)xmlGetProp(root, BAD_CAST "arch"); gchar *format = (gchar *)xmlGetProp(root, BAD_CAST OSINFO_IMAGE_PROP_FORMAT); @@ -1321,6 +1323,21 @@ static OsinfoImage *osinfo_loader_image(OsinfoLoader *loader, xmlFree(arch); xmlFree(format); + nnodes = osinfo_loader_nodeset("./variant", loader, ctxt, &nodes, err); + if (error_is_set(err)) { + g_object_unref(image); + return NULL; + } + + for (i = 0; i < nnodes; i++) { + gchar *variant_id = (gchar *)xmlGetProp(nodes[i], BAD_CAST "id"); + osinfo_entity_add_param(OSINFO_ENTITY(image), + OSINFO_IMAGE_PROP_VARIANT, + variant_id); + xmlFree(variant_id); + } + g_free(nodes); + osinfo_loader_entity(loader, OSINFO_ENTITY(image), keys, ctxt, root, err); if (cloud_init) { osinfo_entity_set_param(OSINFO_ENTITY(image), diff --git a/osinfo/osinfo_os.c b/osinfo/osinfo_os.c index 47affce..e458a45 100644 --- a/osinfo/osinfo_os.c +++ b/osinfo/osinfo_os.c @@ -708,6 +708,7 @@ void osinfo_os_add_image(OsinfoOs *os, OsinfoImage *image) g_return_if_fail(OSINFO_IS_IMAGE(image)); osinfo_list_add(OSINFO_LIST(os->priv->images), OSINFO_ENTITY(image)); + osinfo_image_set_os(image, os); } /** -- 2.20.1 _______________________________________________ Libosinfo mailing list Libosinfo@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libosinfo