From: "Zeeshan Ali (Khattak)" <zeeshanak@xxxxxxxxx> Add a function to retreive all supported devices from an OS. --- osinfo/libosinfo.syms | 1 + osinfo/osinfo_os.c | 43 +++++++++++++++++++++++++++++++++++++++++++ osinfo/osinfo_os.h | 1 + 3 files changed, 45 insertions(+), 0 deletions(-) diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms index f1411f7..18415e0 100644 --- a/osinfo/libosinfo.syms +++ b/osinfo/libosinfo.syms @@ -108,6 +108,7 @@ LIBOSINFO_0.0.1 { osinfo_os_get_type; osinfo_os_new; osinfo_os_get_devices; + osinfo_os_get_all_devices; osinfo_os_get_device_links; osinfo_os_add_device; osinfo_os_get_family; diff --git a/osinfo/osinfo_os.c b/osinfo/osinfo_os.c index 968ef83..0facb08 100644 --- a/osinfo/osinfo_os.c +++ b/osinfo/osinfo_os.c @@ -192,7 +192,50 @@ OsinfoDeviceList *osinfo_os_get_devices(OsinfoOs *os, OsinfoFilter *filter) return newList; } +/** + * osinfo_os_get_all_devices: + * @os: an operating system + * @filter: (allow-none)(transfer none): an optional device property filter + * + * Get all devices matching a given filter but unlike osinfo_os_get_devices + * this function also retreives devices from all derived and cloned operating + * systems. + * + * Returns: (transfer full): A list of devices + */ +OsinfoDeviceList *osinfo_os_get_all_devices(OsinfoOs *os, OsinfoFilter *filter) +{ + OsinfoProductList *derived, *cloned, *related_list; + OsinfoDeviceList *devices; + guint i; + + devices = osinfo_os_get_devices(os, filter); + + derived = osinfo_product_get_related + (OSINFO_PRODUCT(os), OSINFO_PRODUCT_RELATIONSHIP_DERIVES_FROM); + cloned = osinfo_product_get_related(OSINFO_PRODUCT(os), + OSINFO_PRODUCT_RELATIONSHIP_CLONES); + related_list = osinfo_productlist_new_union(derived, cloned); + g_object_unref(derived); + g_object_unref(cloned); + + for (i = 0; i < osinfo_list_get_length(OSINFO_LIST(related_list)); i++) { + OsinfoEntity *related; + OsinfoDeviceList *related_devices; + + related = osinfo_list_get_nth(OSINFO_LIST(related_list), i); + related_devices = osinfo_os_get_all_devices(OSINFO_OS(related), filter); + if (osinfo_list_get_length(OSINFO_LIST(related_devices)) > 0) { + OsinfoDeviceList *tmp_list = devices; + devices = osinfo_devicelist_new_union(devices, related_devices); + g_object_unref(tmp_list); + } + } + + g_object_unref (related_list); + return devices; +} /** * osinfo_os_get_device_links: diff --git a/osinfo/osinfo_os.h b/osinfo/osinfo_os.h index efd7cea..e1daff1 100644 --- a/osinfo/osinfo_os.h +++ b/osinfo/osinfo_os.h @@ -76,6 +76,7 @@ GType osinfo_os_get_type(void); OsinfoOs *osinfo_os_new(const gchar *id); OsinfoDeviceList *osinfo_os_get_devices(OsinfoOs *os, OsinfoFilter *filter); +OsinfoDeviceList *osinfo_os_get_all_devices(OsinfoOs *os, OsinfoFilter *filter); OsinfoDeviceLinkList *osinfo_os_get_device_links(OsinfoOs *os, OsinfoFilter *filter); OsinfoDeviceLink *osinfo_os_add_device(OsinfoOs *os, OsinfoDevice *dev); -- 1.7.7.5