[gnome-software/wip/hughsie/cachekey: 26/28] fwupd: Use custom GsApp GType



commit 68ef530a5e25fdc3eb2fd629f8aa3947b4d60fea
Author: Richard Hughes <richard hughsie com>
Date:   Thu Jun 20 11:38:48 2019 +0100

    fwupd: Use custom GsApp GType

 plugins/fwupd/gs-fwupd-app.c    | 215 +++++++++++++++++++++++++++++-----------
 plugins/fwupd/gs-fwupd-app.h    |  13 ++-
 plugins/fwupd/gs-plugin-fwupd.c |  41 ++------
 3 files changed, 173 insertions(+), 96 deletions(-)
---
diff --git a/plugins/fwupd/gs-fwupd-app.c b/plugins/fwupd/gs-fwupd-app.c
index 6c9d50a2..7b4e8113 100644
--- a/plugins/fwupd/gs-fwupd-app.c
+++ b/plugins/fwupd/gs-fwupd-app.c
@@ -11,50 +11,159 @@
 
 #include "gs-fwupd-app.h"
 
+struct _GsFwupdApp
+{
+       GsApp                    parent_instance;
+       gchar                   *device_id;
+       gchar                   *remote_id;
+       gchar                   *update_uri;
+       gboolean                 is_locked;
+       gboolean                 only_offline;
+};
+
+G_DEFINE_TYPE (GsFwupdApp, gs_fwupd_app, GS_TYPE_APP)
+
+static gboolean
+_g_set_str (gchar **str_ptr, const gchar *new_str)
+{
+       if (*str_ptr == new_str || g_strcmp0 (*str_ptr, new_str) == 0)
+               return FALSE;
+       g_free (*str_ptr);
+       *str_ptr = g_strdup (new_str);
+       return TRUE;
+}
+
+static void
+gs_fwupd_app_to_string (GsApp *app, GString *str)
+{
+       GsFwupdApp *self = GS_FWUPD_APP (app);
+       if (self->device_id != NULL) {
+               gs_utils_append_key_value (str, 20, "fwupd::device-id",
+                                          self->device_id);
+       }
+       if (self->remote_id != NULL) {
+               gs_utils_append_key_value (str, 20, "fwupd::remote-id",
+                                          self->remote_id);
+       }
+       if (self->update_uri != NULL) {
+               gs_utils_append_key_value (str, 20, "fwupd::update-uri",
+                                          self->update_uri);
+       }
+       gs_utils_append_key_value (str, 20, "fwupd::is-locked",
+                                  self->is_locked ? "yes" : "no");
+       gs_utils_append_key_value (str, 20, "fwupd::only-offline",
+                                  self->only_offline ? "yes" : "no");
+}
+
 const gchar *
 gs_fwupd_app_get_device_id (GsApp *app)
 {
-       return gs_app_get_metadata_item (app, "fwupd::DeviceID");
+       GsFwupdApp *self = GS_FWUPD_APP (app);
+       return self->device_id;
+}
+
+const gchar *
+gs_fwupd_app_get_remote_id (GsApp *app)
+{
+       GsFwupdApp *self = GS_FWUPD_APP (app);
+       return self->remote_id;
 }
 
 const gchar *
 gs_fwupd_app_get_update_uri (GsApp *app)
 {
-       return gs_app_get_metadata_item (app, "fwupd::UpdateID");
+       GsFwupdApp *self = GS_FWUPD_APP (app);
+       return self->update_uri;
 }
 
 gboolean
 gs_fwupd_app_get_is_locked (GsApp *app)
 {
-       GVariant *tmp = gs_app_get_metadata_variant (app, "fwupd::IsLocked");
-       if (tmp == NULL)
-               return FALSE;
-       return g_variant_get_boolean (tmp);
+       GsFwupdApp *self = GS_FWUPD_APP (app);
+       return self->is_locked;
+}
+
+gboolean
+gs_fwupd_app_get_only_offline (GsApp *app)
+{
+       GsFwupdApp *self = GS_FWUPD_APP (app);
+       return self->only_offline;
 }
 
 void
 gs_fwupd_app_set_device_id (GsApp *app, const gchar *device_id)
 {
-       gs_app_set_metadata (app, "fwupd::DeviceID", device_id);
+       GsFwupdApp *self = GS_FWUPD_APP (app);
+       _g_set_str (&self->device_id, device_id);
+}
+
+void
+gs_fwupd_app_set_remote_id (GsApp *app, const gchar *remote_id)
+{
+       GsFwupdApp *self = GS_FWUPD_APP (app);
+       _g_set_str (&self->remote_id, remote_id);
 }
 
 void
 gs_fwupd_app_set_update_uri (GsApp *app, const gchar *update_uri)
 {
-       gs_app_set_metadata (app, "fwupd::UpdateID", update_uri);
+       GsFwupdApp *self = GS_FWUPD_APP (app);
+       _g_set_str (&self->update_uri, update_uri);
 }
 
 void
 gs_fwupd_app_set_is_locked (GsApp *app, gboolean is_locked)
 {
-       g_autoptr(GVariant) tmp = g_variant_new_boolean (is_locked);
-       gs_app_set_metadata_variant (app, "fwupd::IsLocked", tmp);
+       GsFwupdApp *self = GS_FWUPD_APP (app);
+       self->is_locked = is_locked;
+}
+
+static void
+gs_fwupd_app_refine_release (GsApp *app, FwupdRelease *rel)
+{
+       if (fwupd_release_get_appstream_id (rel) != NULL)
+               gs_app_set_id (app, fwupd_release_get_appstream_id (rel));
+       if (fwupd_release_get_name (rel) != NULL) {
+               gs_app_set_name (app, GS_APP_QUALITY_NORMAL,
+                                fwupd_release_get_name (rel));
+       }
+       if (fwupd_release_get_summary (rel) != NULL) {
+               gs_app_set_summary (app, GS_APP_QUALITY_NORMAL,
+                                   fwupd_release_get_summary (rel));
+       }
+       if (fwupd_release_get_homepage (rel) != NULL) {
+               gs_app_set_url (app, AS_URL_KIND_HOMEPAGE,
+                               fwupd_release_get_homepage (rel));
+       }
+       if (fwupd_release_get_size (rel) != 0) {
+               gs_app_set_size_installed (app, 0);
+               gs_app_set_size_download (app, fwupd_release_get_size (rel));
+       }
+       if (fwupd_release_get_version (rel) != NULL)
+               gs_app_set_update_version (app, fwupd_release_get_version (rel));
+       if (fwupd_release_get_license (rel) != NULL) {
+               gs_app_set_license (app, GS_APP_QUALITY_NORMAL,
+                                   fwupd_release_get_license (rel));
+       }
+       if (fwupd_release_get_uri (rel) != NULL) {
+               gs_app_set_origin_hostname (app,
+                                           fwupd_release_get_uri (rel));
+               gs_fwupd_app_set_update_uri (app, fwupd_release_get_uri (rel));
+       }
+       if (fwupd_release_get_description (rel) != NULL) {
+               g_autofree gchar *tmp = NULL;
+               tmp = as_markup_convert (fwupd_release_get_description (rel),
+                                        AS_MARKUP_CONVERT_FORMAT_SIMPLE, NULL);
+               if (tmp != NULL)
+                       gs_app_set_update_details (app, tmp);
+       }
 }
 
 void
-gs_fwupd_app_set_from_device (GsApp *app, FwupdDevice *dev)
+gs_fwupd_app_refine (GsApp *app, FwupdDevice *dev)
 {
-       GPtrArray *guids;
+       GsFwupdApp *self = GS_FWUPD_APP (app);
+       FwupdRelease *rel = fwupd_device_get_release_default (dev);
 
        /* something can be done */
        if (fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_UPDATABLE))
@@ -62,8 +171,7 @@ gs_fwupd_app_set_from_device (GsApp *app, FwupdDevice *dev)
 
        /* only can be applied in systemd-offline */
        if (fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_ONLY_OFFLINE))
-               gs_app_set_metadata (app, "fwupd::OnlyOffline", "");
-
+               self->only_offline = TRUE;
 
        /* reboot required to apply update */
        if (fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_NEEDS_REBOOT))
@@ -73,15 +181,6 @@ gs_fwupd_app_set_from_device (GsApp *app, FwupdDevice *dev)
        if (!fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_INTERNAL))
                gs_app_add_quirk (app, GS_APP_QUIRK_REMOVABLE_HARDWARE);
 
-       guids = fwupd_device_get_guids (dev);
-       if (guids->len > 0) {
-               g_autofree gchar *guid_str = NULL;
-               g_auto(GStrv) tmp = g_new0 (gchar *, guids->len + 1);
-               for (guint i = 0; i < guids->len; i++)
-                       tmp[i] = g_strdup (g_ptr_array_index (guids, i));
-               guid_str = g_strjoinv (",", tmp);
-               gs_app_set_metadata (app, "fwupd::Guid", guid_str);
-       }
        if (fwupd_device_get_name (dev) != NULL) {
                g_autofree gchar *vendor_name = NULL;
                if (fwupd_device_get_vendor (dev) == NULL ||
@@ -117,43 +216,41 @@ gs_fwupd_app_set_from_device (GsApp *app, FwupdDevice *dev)
                gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_USER_ACTION);
        else
                gs_app_remove_quirk (app, GS_APP_QUIRK_NEEDS_USER_ACTION);
+
+       /* only valid from some methods */
+       if (rel != NULL)
+               gs_fwupd_app_refine_release (app, rel);
 }
 
-void
-gs_fwupd_app_set_from_release (GsApp *app, FwupdRelease *rel)
+static void
+gs_fwupd_app_finalize (GObject *object)
 {
-       if (fwupd_release_get_name (rel) != NULL) {
-               gs_app_set_name (app, GS_APP_QUALITY_NORMAL,
-                                fwupd_release_get_name (rel));
-       }
-       if (fwupd_release_get_summary (rel) != NULL) {
-               gs_app_set_summary (app, GS_APP_QUALITY_NORMAL,
-                                   fwupd_release_get_summary (rel));
-       }
-       if (fwupd_release_get_homepage (rel) != NULL) {
-               gs_app_set_url (app, AS_URL_KIND_HOMEPAGE,
-                               fwupd_release_get_homepage (rel));
-       }
-       if (fwupd_release_get_size (rel) != 0) {
-               gs_app_set_size_installed (app, 0);
-               gs_app_set_size_download (app, fwupd_release_get_size (rel));
-       }
-       if (fwupd_release_get_version (rel) != NULL)
-               gs_app_set_update_version (app, fwupd_release_get_version (rel));
-       if (fwupd_release_get_license (rel) != NULL) {
-               gs_app_set_license (app, GS_APP_QUALITY_NORMAL,
-                                   fwupd_release_get_license (rel));
-       }
-       if (fwupd_release_get_uri (rel) != NULL) {
-               gs_app_set_origin_hostname (app,
-                                           fwupd_release_get_uri (rel));
-               gs_fwupd_app_set_update_uri (app, fwupd_release_get_uri (rel));
-       }
-       if (fwupd_release_get_description (rel) != NULL) {
-               g_autofree gchar *tmp = NULL;
-               tmp = as_markup_convert (fwupd_release_get_description (rel),
-                                        AS_MARKUP_CONVERT_FORMAT_SIMPLE, NULL);
-               if (tmp != NULL)
-                       gs_app_set_update_details (app, tmp);
-       }
+       GsFwupdApp *self = GS_FWUPD_APP (object);
+       g_free (self->device_id);
+       g_free (self->remote_id);
+       g_free (self->update_uri);
+       G_OBJECT_CLASS (gs_fwupd_app_parent_class)->finalize (object);
+}
+
+static void
+gs_fwupd_app_class_init (GsFwupdAppClass *klass)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+       GsAppClass *klass_app = GS_APP_CLASS (klass);
+       klass_app->to_string = gs_fwupd_app_to_string;
+       object_class->finalize = gs_fwupd_app_finalize;
+}
+
+static void
+gs_fwupd_app_init (GsFwupdApp *self)
+{
+}
+
+GsApp *
+gs_fwupd_app_new (const gchar *id)
+{
+       GsApp *app = GS_APP (g_object_new (GS_TYPE_FWUPD_APP, "id", id, NULL));
+       gs_app_set_management_plugin (app, "fwupd");
+       gs_app_set_scope (app, AS_APP_SCOPE_SYSTEM);
+       return app;
 }
diff --git a/plugins/fwupd/gs-fwupd-app.h b/plugins/fwupd/gs-fwupd-app.h
index fdb63e52..cb9ade3a 100644
--- a/plugins/fwupd/gs-fwupd-app.h
+++ b/plugins/fwupd/gs-fwupd-app.h
@@ -12,19 +12,26 @@
 
 G_BEGIN_DECLS
 
+#define GS_TYPE_FWUPD_APP (gs_fwupd_app_get_type ())
+
+G_DECLARE_FINAL_TYPE (GsFwupdApp, gs_fwupd_app, GS, FWUPD_APP, GsApp)
+
+GsApp                  *gs_fwupd_app_new                       (const gchar    *id);
 const gchar            *gs_fwupd_app_get_device_id             (GsApp          *app);
+const gchar            *gs_fwupd_app_get_remote_id             (GsApp          *app);
 const gchar            *gs_fwupd_app_get_update_uri            (GsApp          *app);
 gboolean                gs_fwupd_app_get_is_locked             (GsApp          *app);
+gboolean                gs_fwupd_app_get_only_offline          (GsApp          *app);
 
 void                    gs_fwupd_app_set_device_id             (GsApp          *app,
                                                                 const gchar    *device_id);
+void                    gs_fwupd_app_set_remote_id             (GsApp          *app,
+                                                                const gchar    *remote_id);
 void                    gs_fwupd_app_set_update_uri            (GsApp          *app,
                                                                 const gchar    *update_uri);
 void                    gs_fwupd_app_set_is_locked             (GsApp          *app,
                                                                 gboolean        is_locked);
-void                    gs_fwupd_app_set_from_device           (GsApp          *app,
+void                    gs_fwupd_app_refine                    (GsApp          *app,
                                                                 FwupdDevice    *dev);
-void                    gs_fwupd_app_set_from_release          (GsApp          *app,
-                                                                FwupdRelease   *rel);
 
 G_END_DECLS
diff --git a/plugins/fwupd/gs-plugin-fwupd.c b/plugins/fwupd/gs-plugin-fwupd.c
index 071471b2..457eca20 100644
--- a/plugins/fwupd/gs-plugin-fwupd.c
+++ b/plugins/fwupd/gs-plugin-fwupd.c
@@ -219,7 +219,6 @@ gs_plugin_setup (GsPlugin *plugin, GCancellable *cancellable, GError **error)
 
        /* add source */
        priv->cached_origin = gs_app_new (gs_plugin_get_name (plugin));
-       gs_app_set_kind (priv->cached_origin, AS_APP_KIND_SOURCE);
        gs_app_set_bundle_kind (priv->cached_origin, AS_BUNDLE_KIND_CABINET);
 
        /* add the source to the plugin cache which allows us to match the
@@ -266,7 +265,7 @@ gs_plugin_fwupd_new_app_from_device (GsPlugin *plugin, FwupdDevice *dev)
                                       NULL);
        app = gs_plugin_cache_lookup (plugin, id);
        if (app == NULL) {
-               app = gs_app_new (id);
+               app = gs_fwupd_app_new (id);
                gs_plugin_cache_add (plugin, id, app);
        }
 
@@ -274,7 +273,6 @@ gs_plugin_fwupd_new_app_from_device (GsPlugin *plugin, FwupdDevice *dev)
        gs_app_set_kind (app, AS_APP_KIND_FIRMWARE);
        gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_CABINET);
        gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE);
-       gs_app_set_management_plugin (app, "fwupd");
        gs_app_add_category (app, "System");
        gs_fwupd_app_set_device_id (app, fwupd_device_get_id (dev));
 
@@ -283,18 +281,7 @@ gs_plugin_fwupd_new_app_from_device (GsPlugin *plugin, FwupdDevice *dev)
        as_icon_set_kind (icon, AS_ICON_KIND_STOCK);
        as_icon_set_name (icon, "application-x-firmware");
        gs_app_add_icon (app, icon);
-       gs_fwupd_app_set_from_release (app, rel);
-       gs_fwupd_app_set_from_device (app, dev);
-
-       if (fwupd_release_get_appstream_id (rel) != NULL)
-               gs_app_set_id (app, fwupd_release_get_appstream_id (rel));
-
-       /* the same as we have already */
-       if (g_strcmp0 (fwupd_device_get_version (dev),
-                      fwupd_release_get_version (rel)) == 0) {
-               g_warning ("same firmware version as installed");
-       }
-
+       gs_fwupd_app_refine (app, dev);
        return app;
 }
 
@@ -315,9 +302,8 @@ gs_plugin_fwupd_new_app_from_device_raw (GsPlugin *plugin, FwupdDevice *device)
 
        /* create a GsApp based on the device, not the release */
        id = gs_plugin_fwupd_build_device_id (device);
-       app = gs_app_new (id);
+       app = gs_fwupd_app_new (id);
        gs_app_set_kind (app, AS_APP_KIND_FIRMWARE);
-       gs_app_set_scope (app, AS_APP_SCOPE_SYSTEM);
        gs_app_set_state (app, AS_APP_STATE_INSTALLED);
        gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE);
        gs_app_set_version (app, fwupd_device_get_version (device));
@@ -326,7 +312,6 @@ gs_plugin_fwupd_new_app_from_device_raw (GsPlugin *plugin, FwupdDevice *device)
        gs_app_set_description (app, GS_APP_QUALITY_LOWEST, fwupd_device_get_description (device));
        gs_app_set_origin (app, fwupd_device_get_vendor (device));
        gs_fwupd_app_set_device_id (app, fwupd_device_get_id (device));
-       gs_app_set_management_plugin (app, "fwupd");
 
        /* create icon */
        icons = fwupd_device_get_icons (device);
@@ -790,7 +775,7 @@ gs_plugin_fwupd_install (GsPlugin *plugin,
        g_set_object (&priv->app_current, app);
 
        /* only offline supported */
-       if (gs_app_get_metadata_item (app, "fwupd::OnlyOffline") != NULL)
+       if (gs_fwupd_app_get_only_offline (app))
                install_flags |= FWUPD_INSTALL_FLAG_OFFLINE;
 
        gs_app_set_state (app, AS_APP_STATE_INSTALLING);
@@ -812,19 +797,10 @@ gs_plugin_fwupd_modify_source (GsPlugin *plugin, GsApp *app, gboolean enabled,
                               GCancellable *cancellable, GError **error)
 {
        GsPluginData *priv = gs_plugin_get_data (plugin);
-       const gchar *remote_id = gs_app_get_metadata_item (app, "fwupd::remote-id");
-       if (remote_id == NULL) {
-               g_set_error (error,
-                            GS_PLUGIN_ERROR,
-                            GS_PLUGIN_ERROR_FAILED,
-                            "not enough data for fwupd %s",
-                            gs_app_get_unique_id (app));
-               return FALSE;
-       }
        gs_app_set_state (app, enabled ?
                          AS_APP_STATE_INSTALLING : AS_APP_STATE_REMOVING);
        if (!fwupd_client_modify_remote (priv->client,
-                                        remote_id,
+                                        gs_fwupd_app_get_remote_id (app),
                                         "Enabled",
                                         enabled ? "true" : "false",
                                         cancellable,
@@ -1019,9 +995,8 @@ gs_plugin_add_sources (GsPlugin *plugin,
 
                /* create something that we can use to enable/disable */
                id = g_strdup_printf ("org.fwupd.%s.remote", fwupd_remote_get_id (remote));
-               app = gs_app_new (id);
+               app = gs_fwupd_app_new (id);
                gs_app_set_kind (app, AS_APP_KIND_SOURCE);
-               gs_app_set_scope (app, AS_APP_SCOPE_SYSTEM);
                gs_app_set_state (app, fwupd_remote_get_enabled (remote) ?
                                  AS_APP_STATE_INSTALLED : AS_APP_STATE_AVAILABLE);
                gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE);
@@ -1032,9 +1007,7 @@ gs_plugin_add_sources (GsPlugin *plugin,
 #endif
                gs_app_set_url (app, AS_URL_KIND_HOMEPAGE,
                                fwupd_remote_get_metadata_uri (remote));
-               gs_app_set_metadata (app, "fwupd::remote-id",
-                                    fwupd_remote_get_id (remote));
-               gs_app_set_management_plugin (app, "fwupd");
+               gs_fwupd_app_set_remote_id (app, fwupd_remote_get_id (remote));
                gs_app_list_add (list, app);
        }
        return TRUE;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]