/** * gs_plugin_refresh: */ gboolean gs_plugin_refresh (GsPlugin *plugin, guint cache_age, GsPluginRefreshFlags flags, GCancellable *cancellable, GError **error) { PkBitfield filter; PkBitfield transaction_flags; ProgressData data; g_auto(GStrv) package_ids = NULL; g_autoptr(PkPackageSack) sack = NULL; g_autoptr(PkResults) results2 = NULL; g_autoptr(PkResults) results = NULL; /* not us */ if ((flags & GS_PLUGIN_REFRESH_FLAGS_UPDATES) == 0) return TRUE; /* cache age of 0 is user-initiated */ pk_client_set_background (PK_CLIENT (plugin->priv->task), cache_age > 0); data.plugin = plugin; data.ptask = NULL; /* update UI as this might take some time */ gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_WAITING); /* do sync call */ filter = pk_bitfield_value (PK_FILTER_ENUM_NONE); pk_client_set_cache_age (PK_CLIENT (plugin->priv->task), cache_age); results = pk_client_get_updates (PK_CLIENT (plugin->priv->task), filter, cancellable, gs_plugin_packagekit_progress_cb, &data, error); if (results == NULL) return FALSE; /* download all the updates */ sack = pk_results_get_package_sack (results); if (pk_package_sack_get_size (sack) == 0) return TRUE; package_ids = pk_package_sack_get_ids (sack); transaction_flags = pk_bitfield_value (PK_TRANSACTION_FLAG_ENUM_ONLY_DOWNLOAD); results2 = pk_client_update_packages (PK_CLIENT (plugin->priv->task), transaction_flags, package_ids, cancellable, gs_plugin_packagekit_progress_cb, &data, error); return results2 != NULL; }
/** * pk_plugin_transaction_action_method: */ static void pk_plugin_transaction_action_method (PkPlugin *plugin, PkTransaction *transaction, PkResults *results) { GPtrArray *invalidated = NULL; PkPackage *pkg; PkPackageSack *sack; const gchar *package_id; gchar **package_ids; guint i; /* get the existing prepared updates */ sack = pk_plugin_get_existing_prepared_updates (PK_OFFLINE_PREPARED_UPDATE_FILENAME); if (pk_package_sack_get_size (sack) == 0) goto out; /* are there any requested packages that match in prepared-updates */ package_ids = pk_transaction_get_package_ids (transaction); for (i = 0; package_ids[i] != NULL; i++) { pkg = pk_package_sack_find_by_id_name_arch (sack, package_ids[i]); if (pkg != NULL) { g_debug ("%s modified %s, invalidating prepared-updates", package_ids[i], pk_package_get_id (pkg)); pk_plugin_state_changed (plugin); g_object_unref (pkg); goto out; } } /* are there any changed deps that match a package in prepared-updates */ invalidated = pk_results_get_package_array (results); for (i = 0; i < invalidated->len; i++) { package_id = pk_package_get_id (g_ptr_array_index (invalidated, i)); pkg = pk_package_sack_find_by_id_name_arch (sack, package_id); if (pkg != NULL) { g_debug ("%s modified %s, invalidating prepared-updates", package_id, pk_package_get_id (pkg)); pk_plugin_state_changed (plugin); g_object_unref (pkg); goto out; } } out: if (invalidated != NULL) g_ptr_array_unref (invalidated); g_object_unref (sack); }