Now that we've OsinfoImage and OsinfoImageList objects in place, we can properly load the images' informations present in osinfo-db. https://gitlab.com/libosinfo/osinfo-db/issues/10 Signed-off-by: Fabiano Fidêncio <fidencio@xxxxxxxxxx> --- osinfo/osinfo_loader.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c index d1bf61d..ad7b989 100644 --- a/osinfo/osinfo_loader.c +++ b/osinfo/osinfo_loader.c @@ -38,6 +38,7 @@ #include "ignore-value.h" #include "osinfo_install_script_private.h" #include "osinfo_device_driver_private.h" +#include "osinfo_image_private.h" #ifndef USB_IDS #define USB_IDS PKG_DATA_DIR "/usb.ids" @@ -1238,6 +1239,27 @@ static OsinfoTree *osinfo_loader_tree(OsinfoLoader *loader, return tree; } +static OsinfoImage *osinfo_loader_image(OsinfoLoader *loader, + xmlXPathContextPtr ctxt, + xmlNodePtr root, + const gchar *id, + GError **err) +{ + const OsinfoEntityKey keys[] = { + { OSINFO_IMAGE_PROP_URL, G_TYPE_STRING }, + { OSINFO_IMAGE_PROP_PRODUCT_NAME, G_TYPE_STRING }, + { NULL, G_TYPE_INVALID } + }; + + gchar *arch = (gchar *)xmlGetProp(root, BAD_CAST "arch"); + OsinfoImage *image = osinfo_image_new(id, arch); + xmlFree(arch); + + osinfo_loader_entity(loader, OSINFO_ENTITY(image), keys, ctxt, root, err); + + return image; +} + static OsinfoOsVariant *osinfo_loader_os_variant(OsinfoLoader *loader, xmlXPathContextPtr ctxt, xmlNodePtr root, @@ -1488,6 +1510,26 @@ static void osinfo_loader_os(OsinfoLoader *loader, g_free(nodes); + nnodes = osinfo_loader_nodeset("./image", loader, ctxt, &nodes, err); + if (error_is_set(err)) + goto cleanup; + + for (i = 0; i < nnodes; i++) { + xmlNodePtr saved = ctxt->node; + ctxt->node = nodes[i]; + gchar *image_id = g_strdup_printf("%s:%u", id, i); + OsinfoImage *image = osinfo_loader_image(loader, ctxt, nodes[i], image_id, err); + g_free(image_id); + ctxt->node = saved; + if (error_is_set(err)) + goto cleanup; + + osinfo_os_add_image(os, image); + g_object_unref(G_OBJECT(image)); + } + + g_free(nodes); + nnodes = osinfo_loader_nodeset("./variant", loader, ctxt, &nodes, err); if (error_is_set(err)) goto cleanup; -- 2.19.1 _______________________________________________ Libosinfo mailing list Libosinfo@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libosinfo