diff options
Diffstat (limited to 'plugins/packagekit/gs-plugin-packagekit-upgrade.c')
-rw-r--r-- | plugins/packagekit/gs-plugin-packagekit-upgrade.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/plugins/packagekit/gs-plugin-packagekit-upgrade.c b/plugins/packagekit/gs-plugin-packagekit-upgrade.c new file mode 100644 index 0000000..6442dd7 --- /dev/null +++ b/plugins/packagekit/gs-plugin-packagekit-upgrade.c @@ -0,0 +1,88 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * vi:set noexpandtab tabstop=8 shiftwidth=8: + * + * Copyright (C) 2016 Richard Hughes <richard@hughsie.com> + * Copyright (C) 2016 Kalev Lember <klember@redhat.com> + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <config.h> + +#include <packagekit-glib2/packagekit.h> + +#include <gnome-software.h> + +#include "gs-packagekit-helper.h" +#include "packagekit-common.h" + +struct GsPluginData { + PkTask *task; + GMutex task_mutex; +}; + +void +gs_plugin_initialize (GsPlugin *plugin) +{ + GsPluginData *priv = gs_plugin_alloc_data (plugin, sizeof(GsPluginData)); + + g_mutex_init (&priv->task_mutex); + priv->task = pk_task_new (); + pk_task_set_only_download (priv->task, TRUE); + pk_client_set_background (PK_CLIENT (priv->task), TRUE); + pk_client_set_cache_age (PK_CLIENT (priv->task), 60 * 60 * 24); +} + +void +gs_plugin_destroy (GsPlugin *plugin) +{ + GsPluginData *priv = gs_plugin_get_data (plugin); + g_mutex_clear (&priv->task_mutex); + g_object_unref (priv->task); +} + +void +gs_plugin_adopt_app (GsPlugin *plugin, GsApp *app) +{ + if (gs_app_get_kind (app) == AS_APP_KIND_OS_UPGRADE) + gs_app_set_management_plugin (app, "packagekit"); +} + +gboolean +gs_plugin_app_upgrade_download (GsPlugin *plugin, + GsApp *app, + GCancellable *cancellable, + GError **error) +{ + GsPluginData *priv = gs_plugin_get_data (plugin); + g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin); + g_autoptr(PkResults) results = NULL; + + /* only process this app if was created by this plugin */ + if (g_strcmp0 (gs_app_get_management_plugin (app), "packagekit") != 0) + return TRUE; + + /* check is distro-upgrade */ + if (gs_app_get_kind (app) != AS_APP_KIND_OS_UPGRADE) + return TRUE; + + /* ask PK to download enough packages to upgrade the system */ + gs_app_set_state (app, AS_APP_STATE_INSTALLING); + gs_packagekit_helper_set_progress_app (helper, app); + g_mutex_lock (&priv->task_mutex); + results = pk_task_upgrade_system_sync (priv->task, + gs_app_get_version (app), + PK_UPGRADE_KIND_ENUM_COMPLETE, + cancellable, + gs_packagekit_helper_cb, helper, + error); + g_mutex_unlock (&priv->task_mutex); + if (!gs_plugin_packagekit_results_valid (results, error)) { + gs_app_set_state_recover (app); + return FALSE; + } + + /* state is known */ + gs_app_set_state (app, AS_APP_STATE_UPDATABLE); + return TRUE; +} |