/** * gs_plugin_packagekit_progress_cb: **/ static void gs_plugin_packagekit_progress_cb (PkProgress *progress, PkProgressType type, gpointer user_data) { ProgressData *data = (ProgressData *) user_data; GsPlugin *plugin = data->plugin; GsPluginStatus plugin_status; PkStatusEnum status; if (type != PK_PROGRESS_TYPE_STATUS) return; g_object_get (progress, "status", &status, NULL); /* profile */ if (status == PK_STATUS_ENUM_SETUP) { data->ptask = as_profile_start_literal (plugin->profile, "packagekit-refresh::transaction"); } else if (status == PK_STATUS_ENUM_FINISHED) { g_clear_pointer (&data->ptask, as_profile_task_free); } plugin_status = packagekit_status_enum_to_plugin_status (status); if (plugin_status != GS_PLUGIN_STATUS_UNKNOWN) gs_plugin_status_update (plugin, NULL, plugin_status); }
static void gs_plugin_packagekit_progress_cb (PkProgress *progress, PkProgressType type, gpointer user_data) { ProgressData *data = (ProgressData *) user_data; GsPlugin *plugin = data->plugin; if (type == PK_PROGRESS_TYPE_STATUS) { GsPluginStatus plugin_status; PkStatusEnum status; g_object_get (progress, "status", &status, NULL); /* profile */ if (status == PK_STATUS_ENUM_SETUP) { data->ptask = as_profile_start_literal (gs_plugin_get_profile (plugin), "packagekit-refine::transaction"); } else if (status == PK_STATUS_ENUM_FINISHED) { g_clear_pointer (&data->ptask, as_profile_task_free); } plugin_status = packagekit_status_enum_to_plugin_status (status); if (plugin_status != GS_PLUGIN_STATUS_UNKNOWN) gs_plugin_status_update (plugin, data->app, plugin_status); } else if (type == PK_PROGRESS_TYPE_PERCENTAGE) { gint percentage = pk_progress_get_percentage (progress); if (data->app != NULL && percentage >= 0 && percentage <= 100) gs_app_set_progress (data->app, (guint) percentage); } }
static gboolean gs_plugin_app_source_enable (GsPlugin *plugin, GsApp *app, GCancellable *cancellable, GError **error) { GsPluginData *priv = gs_plugin_get_data (plugin); ProgressData data; g_autoptr(PkResults) results = NULL; data.app = app; data.plugin = plugin; data.ptask = NULL; /* do sync call */ gs_plugin_status_update (plugin, app, GS_PLUGIN_STATUS_WAITING); results = pk_client_repo_enable (PK_CLIENT (priv->task), gs_app_get_origin (app), TRUE, cancellable, gs_plugin_packagekit_progress_cb, &data, error); if (!gs_plugin_packagekit_results_valid (results, error)) { gs_utils_error_add_unique_id (error, app); return FALSE; } return TRUE; }
/** * 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; }
/** * gs_plugin_packagekit_progress_cb: **/ static void gs_plugin_packagekit_progress_cb (PkProgress *progress, PkProgressType type, gpointer user_data) { ProgressData *data = (ProgressData *) user_data; GsPlugin *plugin = data->plugin; if (type == PK_PROGRESS_TYPE_STATUS) { GsPluginStatus plugin_status; PkStatusEnum status = pk_progress_get_status (progress); plugin_status = packagekit_status_enum_to_plugin_status (status); if (plugin_status != GS_PLUGIN_STATUS_UNKNOWN) gs_plugin_status_update (plugin, NULL, plugin_status); } else if (type == PK_PROGRESS_TYPE_PERCENTAGE) { gint percentage = pk_progress_get_percentage (progress); if (percentage >= 0 && percentage <= 100) gs_app_set_progress (data->app, percentage); } }
/** * gs_plugin_add_updates: */ gboolean gs_plugin_add_updates (GsPlugin *plugin, GList **list, GCancellable *cancellable, GError **error) { GsApp *app; /* update UI as this might take some time */ gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_WAITING); /* spin */ g_usleep (2 * G_USEC_PER_SEC); /* add a normal application */ app = gs_app_new ("gnome-boxes"); gs_app_set_name (app, GS_APP_QUALITY_NORMAL, "Boxes"); gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, "Do not segfault when using newer versons of libvirt."); gs_app_set_kind (app, GS_APP_KIND_NORMAL); gs_app_set_id_kind (app, AS_ID_KIND_DESKTOP); gs_plugin_add_app (list, app); g_object_unref (app); /* add an OS update */ app = gs_app_new ("libvirt-glib-devel;0.0.1;noarch;fedora"); gs_app_set_name (app, GS_APP_QUALITY_NORMAL, "libvirt-glib-devel"); gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, "Fix several memory leaks."); gs_app_set_kind (app, GS_APP_KIND_PACKAGE); gs_app_set_id_kind (app, AS_ID_KIND_DESKTOP); gs_plugin_add_app (list, app); g_object_unref (app); /* add a second OS update */ app = gs_app_new ("gnome-boxes-libs;0.0.1;i386;updates-testing"); gs_app_set_name (app, GS_APP_QUALITY_NORMAL, "gnome-boxes-libs"); gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, "Do not segfault when using newer versons of libvirt."); gs_app_set_kind (app, GS_APP_KIND_PACKAGE); gs_app_set_id_kind (app, AS_ID_KIND_DESKTOP); gs_plugin_add_app (list, app); g_object_unref (app); return TRUE; }
static gboolean gs_plugin_steam_update_store (GsPlugin *plugin, AsStore *store, GPtrArray *apps, GError **error) { guint i; gdouble pc; GHashTable *app; g_autoptr(GsApp) dummy = gs_app_new (NULL); for (i = 0; i < apps->len; i++) { app = g_ptr_array_index (apps, i); if (!gs_plugin_steam_update_store_app (plugin, store, app, error)) return FALSE; /* update progress */ pc = (gdouble) i * 100.f / (gdouble) apps->len; gs_app_set_progress (dummy, (guint) pc); gs_plugin_status_update (plugin, dummy, GS_PLUGIN_STATUS_DOWNLOADING); } return TRUE; }