[gnome-software/wip/hughsie/lets-break-the-world: 3/3] fwupd: Port to the version 1.0 API
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/wip/hughsie/lets-break-the-world: 3/3] fwupd: Port to the version 1.0 API
- Date: Mon, 18 Sep 2017 20:42:32 +0000 (UTC)
commit 10ded344f3a329817fd6009d5d8c51b89b0b49fa
Author: Richard Hughes <richard hughsie com>
Date: Sun Sep 17 12:58:47 2017 +0100
fwupd: Port to the version 1.0 API
plugins/fwupd/gs-plugin-fwupd.c | 214 +++++++++++++++++++++++++++++++++++++++
1 files changed, 214 insertions(+), 0 deletions(-)
---
diff --git a/plugins/fwupd/gs-plugin-fwupd.c b/plugins/fwupd/gs-plugin-fwupd.c
index 112efbd..aae41c1 100644
--- a/plugins/fwupd/gs-plugin-fwupd.c
+++ b/plugins/fwupd/gs-plugin-fwupd.c
@@ -46,8 +46,10 @@ struct GsPluginData {
GPtrArray *to_ignore;
GsApp *app_current;
GsApp *cached_origin;
+#if !FWUPD_CHECK_VERSION(1,0,0)
GHashTable *remote_asc_hash;
gchar *config_fn;
+#endif
};
static void
@@ -103,6 +105,7 @@ gs_plugin_initialize (GsPlugin *plugin)
priv->client = fwupd_client_new ();
priv->to_download = g_ptr_array_new_with_free_func (g_free);
priv->to_ignore = g_ptr_array_new_with_free_func (g_free);
+#if !FWUPD_CHECK_VERSION(1,0,0)
priv->remote_asc_hash = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, g_free);
priv->config_fn = g_build_filename (SYSCONFDIR, "fwupd.conf", NULL);
@@ -115,6 +118,7 @@ gs_plugin_initialize (GsPlugin *plugin)
gs_plugin_set_enabled (plugin, FALSE);
return;
}
+#endif
/* unique to us */
gs_plugin_set_app_gtype (plugin, GS_TYPE_FWUPD_APP);
@@ -129,8 +133,10 @@ gs_plugin_destroy (GsPlugin *plugin)
GsPluginData *priv = gs_plugin_get_data (plugin);
if (priv->cached_origin != NULL)
g_object_unref (priv->cached_origin);
+#if !FWUPD_CHECK_VERSION(1,0,0)
g_hash_table_unref (priv->remote_asc_hash);
g_free (priv->config_fn);
+#endif
g_object_unref (priv->client);
g_ptr_array_unref (priv->to_download);
g_ptr_array_unref (priv->to_ignore);
@@ -150,10 +156,16 @@ gs_plugin_fwupd_changed_cb (FwupdClient *client, GsPlugin *plugin)
static void
gs_plugin_fwupd_device_changed_cb (FwupdClient *client,
+#if FWUPD_CHECK_VERSION(1,0,0)
+ FwupdDevice *dev,
+#else
FwupdResult *res,
+#endif
GsPlugin *plugin)
{
+#if !FWUPD_CHECK_VERSION(1,0,0)
FwupdDevice *dev = fwupd_result_get_device (res);
+#endif
/* fwupd >= 0.7.1 supports per-device signals, and also the
* SUPPORTED flag -- so we can limit number of UI refreshes */
@@ -237,6 +249,7 @@ gs_plugin_fwupd_get_file_checksum (const gchar *filename,
return g_compute_checksum_for_data (checksum_type, (const guchar *)data, len);
}
+#if !FWUPD_CHECK_VERSION(1,0,0)
static gboolean
gs_plugin_fwupd_setup_remote (GsPlugin *plugin, FwupdRemote *remote, GError **error)
{
@@ -290,6 +303,7 @@ gs_plugin_fwupd_setup_remotes (GsPlugin *plugin, GCancellable *cancellable, GErr
}
return TRUE;
}
+#endif
gboolean
gs_plugin_setup (GsPlugin *plugin, GCancellable *cancellable, GError **error)
@@ -322,8 +336,12 @@ gs_plugin_setup (GsPlugin *plugin, GCancellable *cancellable, GError **error)
g_signal_connect (priv->client, "notify::status",
G_CALLBACK (gs_plugin_fwupd_notify_status_cb), plugin);
+#if !FWUPD_CHECK_VERSION(1,0,0)
/* get the hashes of the previously downloaded asc files */
return gs_plugin_fwupd_setup_remotes (plugin, cancellable, error);
+#else
+ return TRUE;
+#endif
}
static void
@@ -345,11 +363,18 @@ gs_plugin_fwupd_add_required_location (GsPlugin *plugin, const gchar *location)
g_ptr_array_add (priv->to_download, g_strdup (location));
}
+#if FWUPD_CHECK_VERSION(1,0,0)
+static GsApp *
+gs_plugin_fwupd_new_app_from_device (GsPlugin *plugin, FwupdDevice *dev)
+{
+ FwupdRelease *rel = fwupd_device_get_release_default (dev);
+#else
static GsApp *
gs_plugin_fwupd_new_app_from_results (GsPlugin *plugin, FwupdResult *res)
{
FwupdDevice *dev = fwupd_result_get_device (res);
FwupdRelease *rel = fwupd_result_get_release (res);
+#endif
GsApp *app;
g_autofree gchar *id = NULL;
g_autoptr(AsIcon) icon = NULL;
@@ -397,11 +422,19 @@ gs_plugin_fwupd_new_app_from_results (GsPlugin *plugin, FwupdResult *res)
static gboolean
gs_plugin_add_update_app (GsPlugin *plugin,
GsAppList *list,
+#if FWUPD_CHECK_VERSION(1,0,0)
+ FwupdDevice *dev,
+#else
FwupdResult *res,
+#endif
gboolean is_downloaded,
GError **error)
{
+#if FWUPD_CHECK_VERSION(1,0,0)
+ FwupdRelease *rel = fwupd_device_get_release_default (dev);
+#else
FwupdRelease *rel = fwupd_result_get_release (res);
+#endif
GPtrArray *checksums;
const gchar *update_uri;
g_autofree gchar *basename = NULL;
@@ -410,7 +443,11 @@ gs_plugin_add_update_app (GsPlugin *plugin,
g_autoptr(GsApp) app = NULL;
/* update unsupported */
+#if FWUPD_CHECK_VERSION(1,0,0)
+ app = gs_plugin_fwupd_new_app_from_device (plugin, dev);
+#else
app = gs_plugin_fwupd_new_app_from_results (plugin, res);
+#endif
if (gs_app_get_state (app) != AS_APP_STATE_UPDATABLE_LIVE) {
g_set_error (error,
GS_PLUGIN_ERROR,
@@ -529,14 +566,26 @@ gs_plugin_add_updates_historical (GsPlugin *plugin,
GsPluginData *priv = gs_plugin_get_data (plugin);
g_autoptr(GError) error_local = NULL;
g_autoptr(GsApp) app = NULL;
+#if FWUPD_CHECK_VERSION(1,0,0)
+ g_autoptr(FwupdDevice) dev = NULL;
+#else
g_autoptr(FwupdResult) res = NULL;
+#endif
/* get historical updates */
+#if FWUPD_CHECK_VERSION(1,0,0)
+ dev = fwupd_client_get_results (priv->client,
+ FWUPD_DEVICE_ID_ANY,
+ cancellable,
+ &error_local);
+ if (dev == NULL) {
+#else
res = fwupd_client_get_results (priv->client,
FWUPD_DEVICE_ID_ANY,
cancellable,
&error_local);
if (res == NULL) {
+#endif
if (g_error_matches (error_local,
FWUPD_ERROR,
FWUPD_ERROR_NOTHING_TO_DO))
@@ -552,7 +601,11 @@ gs_plugin_add_updates_historical (GsPlugin *plugin,
}
/* parse */
+#if FWUPD_CHECK_VERSION(1,0,0)
+ app = gs_plugin_fwupd_new_app_from_device (plugin, dev);
+#else
app = gs_plugin_fwupd_new_app_from_results (plugin, res);
+#endif
gs_app_list_add (list, app);
return TRUE;
}
@@ -566,12 +619,23 @@ gs_plugin_fwupd_add_updates (GsPlugin *plugin,
{
GsPluginData *priv = gs_plugin_get_data (plugin);
g_autoptr(GError) error_local = NULL;
+#if FWUPD_CHECK_VERSION(1,0,0)
+ g_autoptr(GPtrArray) devices = NULL;
+#else
g_autoptr(GPtrArray) results = NULL;
+#endif
/* get current list of updates */
+#if FWUPD_CHECK_VERSION(1,0,0)
+ devices = fwupd_client_get_upgrades_all (priv->client,
+ cancellable,
+ &error_local);
+ if (devices == NULL) {
+#else
results = fwupd_client_get_updates (priv->client,
cancellable, &error_local);
if (results == NULL) {
+#endif
if (g_error_matches (error_local,
FWUPD_ERROR,
FWUPD_ERROR_NOTHING_TO_DO))
@@ -583,9 +647,14 @@ gs_plugin_fwupd_add_updates (GsPlugin *plugin,
}
/* parse */
+#if FWUPD_CHECK_VERSION(1,0,0)
+ for (guint i = 0; i < devices->len; i++) {
+ FwupdDevice *dev = g_ptr_array_index (devices, i);
+#else
for (guint i = 0; i < results->len; i++) {
FwupdResult *res = g_ptr_array_index (results, i);
FwupdDevice *dev = fwupd_result_get_device (res);
+#endif
g_autoptr(GError) error_local2 = NULL;
/* locked device that needs unlocking */
@@ -593,16 +662,26 @@ gs_plugin_fwupd_add_updates (GsPlugin *plugin,
g_autoptr(GsApp) app = NULL;
if (!is_downloaded)
continue;
+#if FWUPD_CHECK_VERSION(1,0,0)
+ app = gs_plugin_fwupd_new_app_from_device (plugin, dev);
+#else
app = gs_plugin_fwupd_new_app_from_results (plugin, res);
+#endif
gs_fwupd_app_set_is_locked (app, TRUE);
gs_app_list_add (list, app);
continue;
}
/* normal device update */
+#if FWUPD_CHECK_VERSION(1,0,0)
+ if (!gs_plugin_add_update_app (plugin, list, dev,
+ is_downloaded, &error_local2))
+ g_debug ("%s", error_local2->message);
+#else
if (!gs_plugin_add_update_app (plugin, list, res,
is_downloaded, &error_local2))
g_debug ("%s", error_local2->message);
+#endif
}
return TRUE;
@@ -634,6 +713,112 @@ gs_plugin_fwupd_refresh_remote (GsPlugin *plugin,
GError **error)
{
GsPluginData *priv = gs_plugin_get_data (plugin);
+#if FWUPD_CHECK_VERSION(1,0,0)
+ GChecksumType checksum_kind;
+ const gchar *url_sig = NULL;
+ const gchar *url = NULL;
+ g_autoptr(GError) error_local = NULL;
+ g_autofree gchar *basename = NULL;
+ g_autofree gchar *basename_sig = NULL;
+ g_autofree gchar *cache_id = NULL;
+ g_autofree gchar *checksum = NULL;
+ g_autofree gchar *filename = NULL;
+ g_autofree gchar *filename_sig = NULL;
+ g_autoptr(GBytes) data = NULL;
+ g_autoptr(GsApp) app_dl = gs_app_new (gs_plugin_get_name (plugin));
+
+ /* sanity check */
+ if (fwupd_remote_get_filename_cache_sig (remote) == NULL) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_FAILED,
+ "remote %s has no cache signature",
+ fwupd_remote_get_id (remote));
+ return FALSE;
+ }
+
+ /* check cache age */
+ if (cache_age > 0) {
+ guint64 age = fwupd_remote_get_age (remote);
+ guint tmp = age < G_MAXUINT ? (guint) age : G_MAXUINT;
+ if (tmp < cache_age) {
+ g_debug ("%s is only %u seconds old, so ignoring refresh",
+ filename_sig, tmp);
+ return TRUE;
+ }
+ }
+
+ /* download the signature first, it's smaller */
+ cache_id = g_strdup_printf ("fwupd/remotes.d/%s", fwupd_remote_get_id (remote));
+ basename_sig = g_path_get_basename (fwupd_remote_get_filename_cache_sig (remote));
+ filename_sig = gs_utils_get_cache_filename (cache_id, basename_sig,
+ GS_UTILS_CACHE_FLAG_WRITEABLE,
+ error);
+
+ /* download the signature first, it's smaller */
+ url_sig = fwupd_remote_get_metadata_uri_sig (remote);
+ gs_app_set_summary_missing (app_dl,
+ /* TRANSLATORS: status text when downloading */
+ _("Downloading firmware update signature…"));
+ data = gs_plugin_download_data (plugin, app_dl, url_sig, cancellable, error);
+ if (data == NULL) {
+ gs_utils_error_add_unique_id (error, priv->cached_origin);
+ return FALSE;
+ }
+
+ /* is the signature hash the same as we had before? */
+ checksum_kind = fwupd_checksum_guess_kind (fwupd_remote_get_checksum (remote));
+ checksum = g_compute_checksum_for_data (checksum_kind,
+ (const guchar *) g_bytes_get_data (data, NULL),
+ g_bytes_get_size (data));
+ if (g_strcmp0 (checksum, fwupd_remote_get_checksum (remote)) == 0) {
+ g_debug ("signature of %s is unchanged", url_sig);
+ return TRUE;
+ }
+
+ /* save to a file */
+ g_debug ("saving new remote signature to %s:", filename_sig);
+ if (!g_file_set_contents (filename_sig,
+ g_bytes_get_data (data, NULL),
+ (guint) g_bytes_get_size (data),
+ &error_local)) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_WRITE_FAILED,
+ "Failed to save firmware signature: %s",
+ error_local->message);
+ return FALSE;
+ }
+
+ /* download the payload and save to file */
+ basename = g_path_get_basename (fwupd_remote_get_filename_cache (remote));
+ filename = gs_utils_get_cache_filename (cache_id, basename,
+ GS_UTILS_CACHE_FLAG_WRITEABLE,
+ error);
+ if (filename == NULL)
+ return FALSE;
+ g_debug ("saving new firmware metadata to %s:", filename);
+ gs_app_set_summary_missing (app_dl,
+ /* TRANSLATORS: status text when downloading */
+ _("Downloading firmware update metadata…"));
+ url = fwupd_remote_get_metadata_uri (remote);
+ if (!gs_plugin_download_file (plugin, app_dl, url, filename,
+ cancellable, error)) {
+ gs_utils_error_add_unique_id (error, priv->cached_origin);
+ return FALSE;
+ }
+
+ /* phew, lets send all this to fwupd */
+ if (!fwupd_client_update_metadata (priv->client,
+ fwupd_remote_get_id (remote),
+ filename,
+ filename_sig,
+ cancellable,
+ error)) {
+ gs_plugin_fwupd_error_convert (error);
+ return FALSE;
+ }
+#else
const gchar *checksum_old;
const gchar *url_asc = NULL;
const gchar *url = NULL;
@@ -737,6 +922,7 @@ gs_plugin_fwupd_refresh_remote (GsPlugin *plugin,
gs_plugin_fwupd_error_convert (error);
return FALSE;
}
+#endif
return TRUE;
}
@@ -988,7 +1174,11 @@ gs_plugin_file_to_app (GsPlugin *plugin,
GsPluginData *priv = gs_plugin_get_data (plugin);
g_autofree gchar *content_type = NULL;
g_autofree gchar *filename = NULL;
+#if FWUPD_CHECK_VERSION(1,0,0)
+ g_autoptr(GPtrArray) devices = NULL;
+#else
g_autoptr(GPtrArray) results = NULL;
+#endif
const gchar *mimetypes[] = {
"application/vnd.ms-cab-compressed",
NULL };
@@ -1002,6 +1192,29 @@ gs_plugin_file_to_app (GsPlugin *plugin,
/* get results */
filename = g_file_get_path (file);
+#if FWUPD_CHECK_VERSION(1,0,0)
+ devices = fwupd_client_get_details (priv->client,
+ filename,
+ cancellable,
+ error);
+ if (devices == NULL) {
+ gs_plugin_fwupd_error_convert (error);
+ return FALSE;
+ }
+ for (guint i = 0; i < devices->len; i++) {
+ FwupdDevice *dev = g_ptr_array_index (devices, i);
+ g_autoptr(GsApp) app = NULL;
+
+ /* create each app */
+ app = gs_plugin_fwupd_new_app_from_device (plugin, dev);
+
+ /* we have no update view for local files */
+ gs_app_set_version (app, gs_app_get_update_version (app));
+ gs_app_set_description (app, GS_APP_QUALITY_NORMAL,
+ gs_app_get_update_details (app));
+ gs_app_list_add (list, app);
+ }
+#else
results = fwupd_client_get_details_local (priv->client,
filename,
cancellable,
@@ -1023,6 +1236,7 @@ gs_plugin_file_to_app (GsPlugin *plugin,
gs_app_get_update_details (app));
gs_app_list_add (list, app);
}
+#endif
return TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]