[Libosinfo] [libosinfo PATCH v2 06/12] os: Make os aware of Guest Features

Fabiano Fidêncio fidencio at redhat.com
Fri Jan 11 14:48:25 UTC 2019


This commit adds the whole machinery needed for dealing with Guest
Features for an Os object.

Signed-off-by: Fabiano Fidêncio <fidencio at redhat.com>
---
 osinfo/libosinfo.syms |   2 +
 osinfo/osinfo_os.c    | 107 ++++++++++++++++++++++++++++++++++++++++++
 osinfo/osinfo_os.h    |   6 ++-
 3 files changed, 114 insertions(+), 1 deletion(-)

diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms
index 28b229f..1f1000f 100644
--- a/osinfo/libosinfo.syms
+++ b/osinfo/libosinfo.syms
@@ -558,9 +558,11 @@ LIBOSINFO_1.3.0 {
 
 	osinfo_media_supports_installer_script;
 
+	osinfo_os_add_feature;
 	osinfo_os_add_image;
 	osinfo_os_add_maximum_resources;
 	osinfo_os_get_all_device_links;
+	osinfo_os_get_feature_list;
 	osinfo_os_get_image_list;
 	osinfo_os_get_maximum_resources;
 
diff --git a/osinfo/osinfo_os.c b/osinfo/osinfo_os.c
index 01d2e01..a082ec2 100644
--- a/osinfo/osinfo_os.c
+++ b/osinfo/osinfo_os.c
@@ -29,6 +29,7 @@
 #include "osinfo/osinfo_product_private.h"
 #include "osinfo/osinfo_os_private.h"
 #include "osinfo/osinfo_resources_private.h"
+#include "osinfo/osinfo_feature_private.h"
 #include <glib/gi18n-lib.h>
 
 G_DEFINE_TYPE(OsinfoOs, osinfo_os, OSINFO_TYPE_PRODUCT);
@@ -59,6 +60,7 @@ struct _OsinfoOsPrivate
     OsinfoResourcesList *minimum;
     OsinfoResourcesList *recommended;
     OsinfoResourcesList *maximum;
+    OsinfoFeatureList *features;
 
     OsinfoInstallScriptList *scripts;
 
@@ -119,6 +121,7 @@ osinfo_os_finalize(GObject *object)
     g_object_unref(os->priv->minimum);
     g_object_unref(os->priv->recommended);
     g_object_unref(os->priv->maximum);
+    g_object_unref(os->priv->features);
 
     g_object_unref(os->priv->scripts);
 
@@ -186,6 +189,7 @@ osinfo_os_init(OsinfoOs *os)
     os->priv->minimum = osinfo_resourceslist_new();
     os->priv->recommended = osinfo_resourceslist_new();
     os->priv->maximum = osinfo_resourceslist_new();
+    os->priv->features = osinfo_featurelist_new();
     os->priv->scripts = osinfo_install_scriptlist_new();
     os->priv->device_drivers = osinfo_device_driverlist_new();
 }
@@ -553,6 +557,109 @@ OsinfoDeviceLink *osinfo_os_add_device(OsinfoOs *os, OsinfoDevice *dev)
     return devlink;
 }
 
+struct GetAllFeaturesData {
+    OsinfoOs *os;
+    OsinfoFeatureList *feature_list;
+    OsinfoFeatureList *unsupported_list;
+};
+
+static void get_all_features_cb(OsinfoProduct *product, gpointer user_data)
+{
+    OsinfoFeatureList *filtered_out;
+    OsinfoFeatureList *unsupported_list;
+    OsinfoFeatureList *new_list;
+    OsinfoFeatureList *new_unsupported_list;
+    OsinfoOs *os;
+    struct GetAllFeaturesData *foreach_data = (struct GetAllFeaturesData *)user_data;
+    gsize featurelist_len;
+    gsize i;
+
+    g_return_if_fail(OSINFO_IS_OS(product));
+    os = OSINFO_OS(product);
+
+    filtered_out = osinfo_featurelist_new();
+    unsupported_list = osinfo_featurelist_new();
+
+    featurelist_len = osinfo_list_get_length(OSINFO_LIST(os->priv->features));
+    for (i = 0; i < featurelist_len; i++) {
+        OsinfoFeature *feature = OSINFO_FEATURE(osinfo_list_get_nth(OSINFO_LIST(os->priv->features), i));
+
+        if (!osinfo_feature_get_supported(feature)) {
+            osinfo_list_add(OSINFO_LIST(unsupported_list), OSINFO_ENTITY(feature));
+            continue;
+        }
+
+        if (foreach_data->unsupported_list != NULL &&
+            osinfo_list_find_by_id(OSINFO_LIST(foreach_data->unsupported_list),
+                                   osinfo_feature_get_name(feature)) != NULL)
+            continue;
+
+        osinfo_list_add(OSINFO_LIST(filtered_out), OSINFO_ENTITY(feature));
+    }
+
+    if (os == foreach_data->os) {
+        foreach_data->feature_list = filtered_out;
+        foreach_data->unsupported_list = unsupported_list;
+        return;
+    }
+
+    new_list = OSINFO_FEATURELIST(osinfo_list_new_union(OSINFO_LIST(foreach_data->feature_list),
+                                                        OSINFO_LIST(filtered_out)));
+
+    new_unsupported_list = OSINFO_FEATURELIST(osinfo_list_new_union(OSINFO_LIST(foreach_data->unsupported_list),
+                                              OSINFO_LIST(unsupported_list)));
+
+    g_object_unref(filtered_out);
+    g_object_unref(foreach_data->feature_list);
+    g_object_unref(foreach_data->unsupported_list);
+    foreach_data->feature_list = new_list;
+    foreach_data->unsupported_list = new_unsupported_list;
+}
+
+/**
+ * osinfo_os_get_feature_list:
+ * @os: an operating system
+ *
+ * Get all features matching a given filter and taking into consideration
+ * all features previous set in all OSes from which @os derived and/or cloned.
+ *
+ * Returns: (transfer full): A list of OsinfoFeature
+ */
+OsinfoFeatureList *osinfo_os_get_feature_list(OsinfoOs *os)
+{
+    struct GetAllFeaturesData foreach_data = {
+        .os = os,
+        .feature_list = NULL,
+        .unsupported_list = NULL,
+    };
+
+    g_return_val_if_fail(OSINFO_IS_OS(os), NULL);
+
+    osinfo_product_foreach_related(OSINFO_PRODUCT(os),
+                                   OSINFO_PRODUCT_FOREACH_FLAG_DERIVES_FROM |
+                                   OSINFO_PRODUCT_FOREACH_FLAG_CLONES,
+                                   get_all_features_cb,
+                                   &foreach_data);
+
+    if (foreach_data.unsupported_list != NULL)
+        g_object_unref(foreach_data.unsupported_list);
+    return foreach_data.feature_list;
+}
+
+/** osinfo_os_add_feature:
+ * @os: an operating system
+ * @feature: (transfer none): the feature to associate with
+ *
+ * Adds @feature to list of features of operating system @os.
+ */
+void osinfo_os_add_feature(OsinfoOs *os, OsinfoFeature *feature)
+{
+    g_return_if_fail(OSINFO_IS_OS(os));
+    g_return_if_fail(OSINFO_IS_FEATURE(feature));
+
+    osinfo_list_add(OSINFO_LIST(os->priv->features), OSINFO_ENTITY(feature));
+}
+
 /**
  * osinfo_os_get_family:
  * @os: an #OsinfoOs
diff --git a/osinfo/osinfo_os.h b/osinfo/osinfo_os.h
index 4eb4b1b..5a3127c 100644
--- a/osinfo/osinfo_os.h
+++ b/osinfo/osinfo_os.h
@@ -34,6 +34,7 @@
 #include <osinfo/osinfo_tree.h>
 #include <osinfo/osinfo_resources.h>
 #include <osinfo/osinfo_resourceslist.h>
+#include <osinfo/osinfo_feature.h>
 #include <osinfo/osinfo_image.h>
 #include <osinfo/osinfo_imagelist.h>
 
@@ -110,8 +111,8 @@ OsinfoDeviceList *osinfo_os_get_devices_by_property(OsinfoOs *os,
                                                     gboolean inherited);
 OsinfoDeviceLinkList *osinfo_os_get_device_links(OsinfoOs *os, OsinfoFilter *filter);
 OsinfoDeviceLinkList *osinfo_os_get_all_device_links(OsinfoOs *os, OsinfoFilter *filter);
-
 OsinfoDeviceLink *osinfo_os_add_device(OsinfoOs *os, OsinfoDevice *dev);
+
 const gchar *osinfo_os_get_family(OsinfoOs *os);
 const gchar *osinfo_os_get_distro(OsinfoOs *os);
 int osinfo_os_get_release_status(OsinfoOs *os);
@@ -137,6 +138,9 @@ 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);
 
+OsinfoFeatureList *osinfo_os_get_feature_list(OsinfoOs *os);
+void osinfo_os_add_feature(OsinfoOs *os, OsinfoFeature *feature);
+
 #endif /* __OSINFO_OS_H__ */
 /*
  * Local variables:
-- 
2.19.2




More information about the Libosinfo mailing list