[gnome-packagekit] Refresh the system package list if it does not exist in the service pack creation tool. Fixes rh#502
- From: Richard Hughes <rhughes src gnome org>
- To: svn-commits-list gnome org
- Subject: [gnome-packagekit] Refresh the system package list if it does not exist in the service pack creation tool. Fixes rh#502
- Date: Tue, 26 May 2009 07:24:49 -0400 (EDT)
commit 64b9247d2c6917b81b9bb0a891aa425cab4a7ad7
Author: Richard Hughes <richard hughsie com>
Date: Tue May 26 12:23:06 2009 +0100
Refresh the system package list if it does not exist in the service pack creation tool. Fixes rh#502589
---
src/gpk-service-pack.c | 88 ++++++++++++++++++++++++++++++++++++-----------
1 files changed, 67 insertions(+), 21 deletions(-)
diff --git a/src/gpk-service-pack.c b/src/gpk-service-pack.c
index 3f22138..9208d2c 100644
--- a/src/gpk-service-pack.c
+++ b/src/gpk-service-pack.c
@@ -49,6 +49,7 @@ typedef enum {
} GpkActionEnum;
static GtkBuilder *builder = NULL;
+static PkClient *client = NULL;
static GpkActionEnum action = GPK_ACTION_ENUM_UPDATES;
static guint pulse_id = 0;
@@ -141,8 +142,10 @@ gpk_pack_package_cb (PkServicePack *pack, const PkPackageObj *obj, gpointer data
{
GtkProgressBar *progress_bar;
gchar *text;
+
progress_bar = GTK_PROGRESS_BAR (gtk_builder_get_object (builder, "progressbar_percentage"));
- text = g_strdup_printf ("%s-%s.%s", obj->id->name, obj->id->version, obj->id->arch);
+ /* TRANSLATORS: This is the package name that is being downloaded */
+ text = g_strdup_printf ("%s: %s-%s.%s", _("Downloading"), obj->id->name, obj->id->version, obj->id->arch);
gtk_progress_bar_set_text (progress_bar, text);
g_free (text);
}
@@ -198,7 +201,7 @@ gpk_pack_percentage_cb (PkServicePack *pack, guint percentage, gpointer data)
* gpk_pack_progress_changed_cb:
**/
static void
-gpk_pack_progress_changed_cb (PkClient *client, guint percentage, guint subpercentage,
+gpk_pack_progress_changed_cb (PkClient *_client, guint percentage, guint subpercentage,
guint elapsed, guint remaining, gpointer data)
{
gpk_pack_set_percentage (percentage);
@@ -215,18 +218,20 @@ gpk_pack_resolve_package_id (const gchar *package)
gchar *package_id = NULL;
gchar **packages;
gchar *text;
- PkClient *client;
GError *error = NULL;
const PkPackageObj *obj;
gboolean ret = FALSE;
guint len;
- client = pk_client_new ();
- pk_client_set_use_buffer (client, TRUE, NULL);
- pk_client_set_synchronous (client, TRUE, NULL);
- g_signal_connect (client, "progress-changed", G_CALLBACK (gpk_pack_progress_changed_cb), NULL);
+ /* reset client */
+ ret = pk_client_reset (client, &error);
+ if (!ret) {
+ egg_warning ("could not reset client: %s", error->message);
+ g_error_free (error);
+ goto out;
+ }
- /* resolve */
+ /* get package list */
packages = g_strsplit (package, ";", 0);
ret = pk_client_resolve (client, pk_bitfield_value (PK_FILTER_ENUM_NEWEST), packages, &error);
if (!ret) {
@@ -265,7 +270,6 @@ gpk_pack_resolve_package_id (const gchar *package)
out:
if (list != NULL)
g_object_unref (list);
- g_object_unref (client);
g_strfreev (packages);
return package_id;
}
@@ -311,15 +315,20 @@ gpk_pack_copy_package_lists (const gchar *filename, GError **error)
gboolean ret = FALSE;
PkPackageList *list = NULL;
GError *error_local = NULL;
- PkClient *client;
- client = pk_client_new ();
- pk_client_set_use_buffer (client, TRUE, NULL);
- pk_client_set_synchronous (client, TRUE, NULL);
- g_signal_connect (client, "progress-changed", G_CALLBACK (gpk_pack_progress_changed_cb), NULL);
+ /* reset client */
+ ret = pk_client_reset (client, &error_local);
+ if (!ret) {
+ /* TRANSLATORS: internal error */
+ *error = g_error_new (0, 0, _("Could not reset client: %s"), error_local->message);
+ g_error_free (error_local);
+ goto out;
+ }
+ /* get package list */
ret = pk_client_get_packages (client, pk_bitfield_value (PK_FILTER_ENUM_INSTALLED), &error_local);
if (!ret) {
+ /* TRANSLATORS: cannot get package list */
*error = g_error_new (0, 0, _("Could not get list of installed packages: %s"), error_local->message);
g_error_free (error_local);
goto out;
@@ -336,7 +345,6 @@ gpk_pack_copy_package_lists (const gchar *filename, GError **error)
goto out;
}
out:
- g_object_unref (client);
if (list != NULL)
g_object_unref (list);
return ret;
@@ -359,6 +367,8 @@ gpk_pack_button_create_cb (GtkWidget *widget2, gpointer data)
PkPackageList *list = NULL;
GError *error = NULL;
gboolean ret;
+ gboolean use_default = FALSE;
+ GtkProgressBar *progress_bar;
widget = GTK_WIDGET (gtk_builder_get_object (builder, "filechooserbutton_directory"));
directory = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(widget));
@@ -386,8 +396,10 @@ gpk_pack_button_create_cb (GtkWidget *widget2, gpointer data)
/* get the exclude list, and fall back to the system copy */
widget = GTK_WIDGET (gtk_builder_get_object (builder, "filechooserbutton_exclude"));
exclude = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(widget));
- if (exclude == NULL)
+ if (exclude == NULL) {
exclude = g_strdup (PK_SYSTEM_PACKAGE_LIST_FILENAME);
+ use_default = TRUE;
+ }
/* get the package to download */
if (action == GPK_ACTION_ENUM_PACKAGE) {
@@ -405,6 +417,34 @@ gpk_pack_button_create_cb (GtkWidget *widget2, gpointer data)
goto out;
}
+ /* if we're using the default list, and it doesn't exist, refresh and create it */
+ if (use_default && !g_file_test (exclude, G_FILE_TEST_EXISTS)) {
+ /* reset client */
+ ret = pk_client_reset (client, &error);
+ if (!ret) {
+ widget = GTK_WIDGET (gtk_builder_get_object (builder, "dialog_pack"));
+ /* TRANSLATORS: we could not reset internal state */
+ gpk_error_dialog_modal (GTK_WINDOW (widget), _("Refresh error"), _("Could not reset client"), error->message);
+ g_error_free (error);
+ goto out;
+ }
+
+ /* tell the user what we are doing */
+ progress_bar = GTK_PROGRESS_BAR (gtk_builder_get_object (builder, "progressbar_percentage"));
+ /* TRANSLATORS: progressbar text */
+ gtk_progress_bar_set_text (progress_bar, _("Refreshing system package list"));
+
+ /* refresh package list */
+ ret = pk_client_refresh_cache (client, TRUE, &error);
+ if (!ret) {
+ widget = GTK_WIDGET (gtk_builder_get_object (builder, "dialog_pack"));
+ /* TRANSLATORS: we could not reset internal state */
+ gpk_error_dialog_modal (GTK_WINDOW (widget), _("Refresh error"), _("Could not refresh package list"), error->message);
+ g_error_free (error);
+ goto out;
+ }
+ }
+
/* add the exclude list */
list = pk_package_list_new ();
ret = pk_obj_list_from_file (PK_OBJ_LIST(list), exclude);
@@ -528,7 +568,7 @@ main (int argc, char *argv[])
PkControl *control;
UniqueApp *unique_app;
gboolean ret;
- GConfClient *client;
+ GConfClient *gconf_client;
gchar *option = NULL;
gchar *package = NULL;
gchar *with_list = NULL;
@@ -588,7 +628,11 @@ main (int argc, char *argv[])
/* get actions */
control = pk_control_new ();
roles = pk_control_get_actions (control, NULL);
- g_object_unref (control);
+
+ client = pk_client_new ();
+ pk_client_set_use_buffer (client, TRUE, NULL);
+ pk_client_set_synchronous (client, TRUE, NULL);
+ g_signal_connect (client, "progress-changed", G_CALLBACK (gpk_pack_progress_changed_cb), NULL);
/* get UI */
builder = gtk_builder_new ();
@@ -640,8 +684,8 @@ main (int argc, char *argv[])
gtk_widget_hide (widget);
/* autocompletion can be turned off as it's slow */
- client = gconf_client_get_default ();
- ret = gconf_client_get_bool (client, GPK_CONF_AUTOCOMPLETE, NULL);
+ gconf_client = gconf_client_get_default ();
+ ret = gconf_client_get_bool (gconf_client, GPK_CONF_AUTOCOMPLETE, NULL);
if (ret) {
/* create the completion object */
completion = gpk_package_entry_completion_new ();
@@ -649,7 +693,6 @@ main (int argc, char *argv[])
gtk_entry_set_completion (GTK_ENTRY (widget), completion);
g_object_unref (completion);
}
- g_object_unref (client);
/* if command line arguments are set, then setup UI */
if (option != NULL) {
@@ -685,7 +728,10 @@ main (int argc, char *argv[])
out_build:
g_object_unref (builder);
unique_out:
+ g_object_unref (gconf_client);
g_object_unref (unique_app);
+ g_object_unref (control);
+ g_object_unref (client);
g_free (option);
g_free (package);
g_free (with_list);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]