From: "Zeeshan Ali (Khattak)" <zeeshanak@xxxxxxxxx> --- osinfo/libosinfo.syms | 1 + osinfo/osinfo_os.c | 41 +++++++++++++++++++++++++++++++++++++++++ osinfo/osinfo_os.h | 4 ++++ 3 files changed, 46 insertions(+), 0 deletions(-) diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms index de1ff18..8e2d929 100644 --- a/osinfo/libosinfo.syms +++ b/osinfo/libosinfo.syms @@ -109,6 +109,7 @@ LIBOSINFO_0.0.6 { osinfo_os_new; osinfo_os_get_devices; osinfo_os_get_all_devices; + osinfo_os_get_device_by_property; 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 0facb08..ec7886a 100644 --- a/osinfo/osinfo_os.c +++ b/osinfo/osinfo_os.c @@ -238,6 +238,47 @@ OsinfoDeviceList *osinfo_os_get_all_devices(OsinfoOs *os, OsinfoFilter *filter) } /** + * osinfo_os_get_device_by_property: + * @os: an operating system + * @property: the property of interest + * @value: the required value of property @property + * @inherited: Should devices from inherited and cloned OSs be included in the + * search. + * + * A utility function that gets the first device found from the list of devices + * @os supports, for which the value of @property is @value. + * + * Returns: (transfer full): The found device or NULL + */ +OsinfoDevice *osinfo_os_get_device_by_property(OsinfoOs *os, + const gchar *property, + const gchar *value, + gboolean inherited) +{ + OsinfoDevice *ret; + OsinfoDeviceList *devices; + OsinfoFilter *filter; + + filter = osinfo_filter_new(); + osinfo_filter_add_constraint(filter, property, value); + + if (inherited) + devices = osinfo_os_get_all_devices(os, filter); + else + devices = osinfo_os_get_devices(os, filter); + g_object_unref (filter); + + if (osinfo_list_get_length(OSINFO_LIST(devices)) > 0) + ret = OSINFO_DEVICE (osinfo_list_get_nth(OSINFO_LIST(devices), 0)); + else + ret = NULL; + + g_object_unref(devices); + + return ret; +} + +/** * osinfo_os_get_device_links: * @os: an operating system * @filter: (allow-none)(transfer none): an optional device property filter diff --git a/osinfo/osinfo_os.h b/osinfo/osinfo_os.h index e1daff1..68e0ea9 100644 --- a/osinfo/osinfo_os.h +++ b/osinfo/osinfo_os.h @@ -77,6 +77,10 @@ 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); +OsinfoDevice *osinfo_os_get_device_by_property(OsinfoOs *os, + const char *property, + const char *value, + gboolean inherited); OsinfoDeviceLinkList *osinfo_os_get_device_links(OsinfoOs *os, OsinfoFilter *filter); OsinfoDeviceLink *osinfo_os_add_device(OsinfoOs *os, OsinfoDevice *dev); -- 1.7.7.5