Let's add APIs for both adding a firmware to or retrieving the list of firmwares from an OS. Signed-off-by: Fabiano Fidêncio <fidencio@xxxxxxxxxx> --- osinfo/libosinfo.syms | 3 ++ osinfo/osinfo_os.c | 96 +++++++++++++++++++++++++++++++++++++++++++ osinfo/osinfo_os.h | 3 ++ 3 files changed, 102 insertions(+) diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms index 7f6dd65..c00bb35 100644 --- a/osinfo/libosinfo.syms +++ b/osinfo/libosinfo.syms @@ -584,6 +584,9 @@ LIBOSINFO_1.5.0 { osinfo_install_config_get_installation_url; osinfo_install_config_set_installation_url; + osinfo_os_add_firmware; + osinfo_os_get_firmware_list; + osinfo_product_get_short_id_list; osinfo_tree_get_os; diff --git a/osinfo/osinfo_os.c b/osinfo/osinfo_os.c index e458a45..fb4c3f7 100644 --- a/osinfo/osinfo_os.c +++ b/osinfo/osinfo_os.c @@ -51,6 +51,7 @@ struct _OsinfoOsPrivate // Value: List of device_link structs GList *deviceLinks; + OsinfoFirmwareList *firmwares; OsinfoMediaList *medias; OsinfoTreeList *trees; OsinfoImageList *images; @@ -112,6 +113,7 @@ osinfo_os_finalize(GObject *object) OsinfoOs *os = OSINFO_OS(object); g_list_free_full(os->priv->deviceLinks, g_object_unref); + g_object_unref(os->priv->firmwares); g_object_unref(os->priv->medias); g_object_unref(os->priv->trees); g_object_unref(os->priv->images); @@ -180,6 +182,7 @@ osinfo_os_init(OsinfoOs *os) os->priv = OSINFO_OS_GET_PRIVATE(os); os->priv->deviceLinks = NULL; + os->priv->firmwares = osinfo_firmwarelist_new(); os->priv->medias = osinfo_medialist_new(); os->priv->trees = osinfo_treelist_new(); os->priv->images = osinfo_imagelist_new(); @@ -1142,3 +1145,96 @@ void osinfo_os_add_device_driver(OsinfoOs *os, OsinfoDeviceDriver *driver) osinfo_list_add(OSINFO_LIST(os->priv->device_drivers), OSINFO_ENTITY(driver)); } + +struct GetAllFirmwaresData { + OsinfoFilter *filter; + OsinfoFilter *unsupported_filter; + OsinfoFirmwareList *firmwares; + OsinfoFirmwareList *unsupported_firmwares; +}; + +static void get_all_firmwares_cb(OsinfoProduct *product, gpointer user_data) +{ + OsinfoList *tmp_list; + OsinfoList *tmp_union_list; + OsinfoOs *os = OSINFO_OS(product); + gsize len, i; + gsize unsupported_len, j; + struct GetAllFirmwaresData *foreach_data = user_data; + + g_return_if_fail(OSINFO_IS_OS(os)); + + tmp_list = osinfo_list_new_filtered(OSINFO_LIST(os->priv->firmwares), + foreach_data->unsupported_filter); + tmp_union_list = osinfo_list_new_union(tmp_list, + OSINFO_LIST(foreach_data->unsupported_firmwares)); + g_object_unref(tmp_list); + g_object_unref(foreach_data->unsupported_firmwares); + foreach_data->unsupported_firmwares = OSINFO_FIRMWARELIST(tmp_union_list); + + len = osinfo_list_get_length(OSINFO_LIST(os->priv->firmwares)); + unsupported_len = osinfo_list_get_length(OSINFO_LIST(foreach_data->unsupported_firmwares)); + for (i = 0; i < len; i++) { + OsinfoFirmware *firmware = OSINFO_FIRMWARE(osinfo_list_get_nth(OSINFO_LIST(os->priv->firmwares), i)); + const gchar *arch = osinfo_firmware_get_architecture(firmware); + const gchar *type = osinfo_firmware_get_firmware_type(firmware); + gboolean add = TRUE; + + if (foreach_data->filter && !osinfo_filter_matches(foreach_data->filter, OSINFO_ENTITY(firmware))) + add = FALSE; + + if (add) { + for (j = 0; j < unsupported_len; j++) { + OsinfoFirmware *unsupported = OSINFO_FIRMWARE(osinfo_list_get_nth(OSINFO_LIST(foreach_data->unsupported_firmwares), j)); + const gchar *unsupported_arch = osinfo_firmware_get_architecture(unsupported); + const gchar *unsupported_type = osinfo_firmware_get_firmware_type(unsupported); + + if (g_str_equal(arch, unsupported_arch) && + g_str_equal(type, unsupported_type)) { + add = FALSE; + break; + } + } + } + + if (add) + osinfo_list_add(OSINFO_LIST(foreach_data->firmwares), OSINFO_ENTITY(firmware)); + } +} + +OsinfoFirmwareList *osinfo_os_get_firmware_list(OsinfoOs *os, OsinfoFilter *filter) +{ + g_return_val_if_fail(OSINFO_IS_OS(os), NULL); + g_return_val_if_fail(!filter || OSINFO_IS_FILTER(filter), NULL); + + struct GetAllFirmwaresData foreach_data = { + .filter = filter, + .unsupported_filter = NULL, + .firmwares = osinfo_firmwarelist_new(), + .unsupported_firmwares = osinfo_firmwarelist_new() + }; + + foreach_data.unsupported_filter = osinfo_filter_new(); + osinfo_filter_add_constraint(foreach_data.unsupported_filter, + OSINFO_FIRMWARE_PROP_SUPPORTED, + "false"); + + osinfo_product_foreach_related(OSINFO_PRODUCT(os), + OSINFO_PRODUCT_FOREACH_FLAG_DERIVES_FROM | + OSINFO_PRODUCT_FOREACH_FLAG_CLONES, + get_all_firmwares_cb, + &foreach_data); + + g_object_unref(foreach_data.unsupported_filter); + g_object_unref(foreach_data.unsupported_firmwares); + + return foreach_data.firmwares; +} + +void osinfo_os_add_firmware(OsinfoOs *os, OsinfoFirmware *firmware) +{ + g_return_if_fail(OSINFO_IS_OS(os)); + g_return_if_fail(OSINFO_IS_FIRMWARE(firmware)); + + osinfo_list_add(OSINFO_LIST(os->priv->firmwares), OSINFO_ENTITY(firmware)); +} diff --git a/osinfo/osinfo_os.h b/osinfo/osinfo_os.h index 7c10475..ed9c5c9 100644 --- a/osinfo/osinfo_os.h +++ b/osinfo/osinfo_os.h @@ -142,4 +142,7 @@ void osinfo_os_add_install_script(OsinfoOs *os, OsinfoInstallScript *script); OsinfoDeviceDriverList *osinfo_os_get_device_drivers(OsinfoOs *os); void osinfo_os_add_device_driver(OsinfoOs *os, OsinfoDeviceDriver *driver); +OsinfoFirmwareList *osinfo_os_get_firmware_list(OsinfoOs *os, OsinfoFilter *filter); +void osinfo_os_add_firmware(OsinfoOs *os, OsinfoFirmware *firmware); + #endif /* __OSINFO_OS_H__ */ -- 2.21.0 _______________________________________________ Libosinfo mailing list Libosinfo@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libosinfo