[gnome-packagekit/glib2: 8/79] moo



commit 0fa076427169c924fa7d8632771b21751ec95e89
Author: Richard Hughes <richard hughsie com>
Date:   Thu Sep 10 10:46:32 2009 +0100

    moo

 src/Makefile.am          |   13 ++-
 src/gpk-application.c    |  263 ++++++++++++++-----------
 src/gpk-backend-status.c |   23 ++-
 src/gpk-dbus-task.c      |    2 +-
 src/gpk-error.c          |    3 +-
 src/gpk-log.c            |    5 +-
 src/gpk-prefs.c          |   93 +++++++--
 src/gpk-repo.c           |  474 ++++++++++++++++++++++++----------------------
 src/gpk-service-pack.c   |    8 -
 src/gpk-update-viewer.c  |   45 ++++-
 10 files changed, 536 insertions(+), 393 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index 4a3c535..b3dc149 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -241,10 +241,21 @@ gpk_update_viewer_LDADD =				\
 
 gpk_repo_SOURCES =					\
 	gpk-repo.c					\
+	egg-debug.c					\
+	egg-debug.h					\
+	gpk-enum.h					\
+	gpk-enum.c					\
+	gpk-common.h					\
+	gpk-common.c					\
+	gpk-gnome.h					\
+	gpk-gnome.c					\
+	gpk-error.h					\
+	gpk-error.c					\
+	gpk-animated-icon.c				\
+	gpk-animated-icon.h				\
 	$(NULL)
 
 gpk_repo_LDADD =					\
-	libgpkshared.a					\
 	$(shared_LIBS)					\
 	$(NULL)
 
diff --git a/src/gpk-application.c b/src/gpk-application.c
index 5539d0e..5c8acd8 100644
--- a/src/gpk-application.c
+++ b/src/gpk-application.c
@@ -3520,6 +3520,150 @@ out:
 }
 
 /**
+ * pk_backend_status_get_properties_cb:
+ **/
+static void
+pk_backend_status_get_properties_cb (GObject *object, GAsyncResult *res, GMainLoop *loop)
+{
+	GtkWidget *widget;
+	GError *error = NULL;
+	PkControl *control = PK_CONTROL(object);
+	gboolean ret;
+	PkBitfield filters;
+	PkBitfield roles;
+
+	/* get the result */
+	ret = pk_control_get_properties_finish (control, res, &error);
+	if (!ret) {
+		/* TRANSLATORS: daemon is broken */
+		g_print ("%s: %s\n", _("Exiting as properties could not be retrieved"), error->message);
+		g_error_free (error);
+		g_main_loop_quit (loop);
+		goto out;
+	}
+
+	/* get values */
+	g_object_get (control,
+		      "roles", &application->priv->roles,
+		      "filters", &application->priv->filters,
+		      "groups", &application->priv->groups,
+		      NULL);
+
+	/* Remove description/file list if needed. */
+	if (pk_bitfield_contain (application->priv->roles, PK_ROLE_ENUM_GET_DETAILS) == FALSE) {
+		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "scrolledwindow2"));
+		gtk_widget_hide (widget);
+	}
+	if (pk_bitfield_contain (application->priv->roles, PK_ROLE_ENUM_GET_FILES) == FALSE) {
+		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_files"));
+		gtk_widget_hide (widget);
+	}
+	if (pk_bitfield_contain (application->priv->roles, PK_ROLE_ENUM_GET_DEPENDS) == FALSE) {
+		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_depends"));
+		gtk_widget_hide (widget);
+	}
+	if (pk_bitfield_contain (application->priv->roles, PK_ROLE_ENUM_GET_REQUIRES) == FALSE) {
+		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_requires"));
+		gtk_widget_hide (widget);
+	}
+
+	/* hide the group selector if we don't support search-groups */
+	if (pk_bitfield_contain (application->priv->roles, PK_ROLE_ENUM_SEARCH_GROUP) == FALSE) {
+		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "scrolledwindow_groups"));
+		gtk_widget_hide (widget);
+	}
+
+	/* hide the refresh cache button if we can't do it */
+	if (pk_bitfield_contain (application->priv->roles, PK_ROLE_ENUM_REFRESH_CACHE) == FALSE) {
+		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_refresh"));
+		gtk_widget_hide (widget);
+	}
+
+	/* hide the software-sources button if we can't do it */
+	if (pk_bitfield_contain (application->priv->roles, PK_ROLE_ENUM_GET_REPO_LIST) == FALSE) {
+		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_sources"));
+		gtk_widget_hide (widget);
+	}
+
+
+	/* hide the filters we can't support */
+	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_INSTALLED) == FALSE) {
+		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_installed"));
+		gtk_widget_hide (widget);
+	}
+	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_DEVELOPMENT) == FALSE) {
+		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_devel"));
+		gtk_widget_hide (widget);
+	}
+	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_GUI) == FALSE) {
+		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_gui"));
+		gtk_widget_hide (widget);
+	}
+	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_FREE) == FALSE) {
+		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_free"));
+		gtk_widget_hide (widget);
+	}
+	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_ARCH) == FALSE) {
+		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_arch"));
+		gtk_widget_hide (widget);
+	}
+	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_SOURCE) == FALSE) {
+		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_source"));
+		gtk_widget_hide (widget);
+	}
+
+	/* BASENAME, use by default, or hide */
+	widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_basename"));
+	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_BASENAME)) {
+		enabled = gconf_client_get_bool (application->priv->gconf_client,
+						 GPK_CONF_APPLICATION_FILTER_BASENAME, NULL);
+		gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (widget), enabled);
+		/* work round a gtk2+ bug: toggled should be fired when doing gtk_check_menu_item_set_active */
+		gpk_application_menu_filter_basename_cb (widget, application);
+	} else {
+		gtk_widget_hide (widget);
+	}
+
+	/* NEWEST, use by default, or hide */
+	widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_newest"));
+	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_NEWEST)) {
+		/* set from remembered state */
+		enabled = gconf_client_get_bool (application->priv->gconf_client,
+						 GPK_CONF_APPLICATION_FILTER_NEWEST, NULL);
+		gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (widget), enabled);
+		/* work round a gtk2+ bug: toggled should be fired when doing gtk_check_menu_item_set_active */
+		gpk_application_menu_filter_newest_cb (widget, application);
+	} else {
+		gtk_widget_hide (widget);
+	}
+
+	/* ARCH, use by default, or hide */
+	widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_arch"));
+	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_ARCH)) {
+		/* set from remembered state */
+		enabled = gconf_client_get_bool (application->priv->gconf_client,
+						 GPK_CONF_APPLICATION_FILTER_ARCH, NULL);
+		gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (widget), enabled);
+		/* work round a gtk2+ bug: toggled should be fired when doing gtk_check_menu_item_set_active */
+		gpk_application_menu_filter_arch_cb (widget, application);
+	} else {
+		gtk_widget_hide (widget);
+	}
+
+	/* simple list or category tree? */
+	ret = gconf_client_get_bool (application->priv->gconf_client, GPK_CONF_APPLICATION_CATEGORY_GROUPS, NULL);
+	if (ret)
+		ret = gpk_application_create_group_list_categories (application);
+
+	/* fallback to creating a simple list if we can't do category list */
+	if (!ret)
+		gpk_application_create_group_list_enum (application);
+out:
+	return;
+}
+}
+
+/**
  * gpk_application_init:
  **/
 static void
@@ -3631,13 +3775,9 @@ gpk_application_init (GpkApplication *application)
 	g_signal_connect (application->priv->client_secondary, "finished",
 			  G_CALLBACK (gpk_application_finished_cb), application);
 
-	/* get bitfield */
-	application->priv->roles = pk_control_get_actions (application->priv->control, NULL);
-	application->priv->filters = pk_control_get_filters (application->priv->control, NULL);
-	application->priv->groups = pk_control_get_groups (application->priv->control, NULL);
-
-	application->priv->pconnection = pk_connection_new ();
-	g_signal_connect (application->priv->pconnection, "connection-changed",
+	/* get properties */
+	pk_control_get_properties_async (application->priv->control, NULL, (GAsyncReadyCallback) pk_backend_status_get_properties_cb, loop);
+	g_signal_connect (application->priv->control, "connection-changed",
 			  G_CALLBACK (gpk_application_connection_changed_cb), application);
 
 	/* get localised data from sqlite database */
@@ -3856,42 +3996,6 @@ gpk_application_init (GpkApplication *application)
 	g_signal_connect (widget, "toggled",
 			  G_CALLBACK (gpk_application_menu_filter_arch_cb), application);
 
-	/* Remove description/file list if needed. */
-	if (pk_bitfield_contain (application->priv->roles, PK_ROLE_ENUM_GET_DETAILS) == FALSE) {
-		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "scrolledwindow2"));
-		gtk_widget_hide (widget);
-	}
-	if (pk_bitfield_contain (application->priv->roles, PK_ROLE_ENUM_GET_FILES) == FALSE) {
-		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_files"));
-		gtk_widget_hide (widget);
-	}
-	if (pk_bitfield_contain (application->priv->roles, PK_ROLE_ENUM_GET_DEPENDS) == FALSE) {
-		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_depends"));
-		gtk_widget_hide (widget);
-	}
-	if (pk_bitfield_contain (application->priv->roles, PK_ROLE_ENUM_GET_REQUIRES) == FALSE) {
-		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_requires"));
-		gtk_widget_hide (widget);
-	}
-
-	/* hide the group selector if we don't support search-groups */
-	if (pk_bitfield_contain (application->priv->roles, PK_ROLE_ENUM_SEARCH_GROUP) == FALSE) {
-		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "scrolledwindow_groups"));
-		gtk_widget_hide (widget);
-	}
-
-	/* hide the refresh cache button if we can't do it */
-	if (pk_bitfield_contain (application->priv->roles, PK_ROLE_ENUM_REFRESH_CACHE) == FALSE) {
-		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_refresh"));
-		gtk_widget_hide (widget);
-	}
-
-	/* hide the software-sources button if we can't do it */
-	if (pk_bitfield_contain (application->priv->roles, PK_ROLE_ENUM_GET_REPO_LIST) == FALSE) {
-		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_sources"));
-		gtk_widget_hide (widget);
-	}
-
 	/* simple find button */
 	widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "button_find"));
 	g_signal_connect (widget, "clicked",
@@ -3930,70 +4034,6 @@ gpk_application_init (GpkApplication *application)
 	g_signal_connect (widget, "icon-press",
 			  G_CALLBACK (gpk_application_entry_text_icon_press_cb), application);
 
-	/* hide the filters we can't support */
-	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_INSTALLED) == FALSE) {
-		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_installed"));
-		gtk_widget_hide (widget);
-	}
-	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_DEVELOPMENT) == FALSE) {
-		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_devel"));
-		gtk_widget_hide (widget);
-	}
-	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_GUI) == FALSE) {
-		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_gui"));
-		gtk_widget_hide (widget);
-	}
-	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_FREE) == FALSE) {
-		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_free"));
-		gtk_widget_hide (widget);
-	}
-	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_ARCH) == FALSE) {
-		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_arch"));
-		gtk_widget_hide (widget);
-	}
-	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_SOURCE) == FALSE) {
-		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_source"));
-		gtk_widget_hide (widget);
-	}
-
-	/* BASENAME, use by default, or hide */
-	widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_basename"));
-	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_BASENAME)) {
-		enabled = gconf_client_get_bool (application->priv->gconf_client,
-						 GPK_CONF_APPLICATION_FILTER_BASENAME, NULL);
-		gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (widget), enabled);
-		/* work round a gtk2+ bug: toggled should be fired when doing gtk_check_menu_item_set_active */
-		gpk_application_menu_filter_basename_cb (widget, application);
-	} else {
-		gtk_widget_hide (widget);
-	}
-
-	/* NEWEST, use by default, or hide */
-	widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_newest"));
-	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_NEWEST)) {
-		/* set from remembered state */
-		enabled = gconf_client_get_bool (application->priv->gconf_client,
-						 GPK_CONF_APPLICATION_FILTER_NEWEST, NULL);
-		gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (widget), enabled);
-		/* work round a gtk2+ bug: toggled should be fired when doing gtk_check_menu_item_set_active */
-		gpk_application_menu_filter_newest_cb (widget, application);
-	} else {
-		gtk_widget_hide (widget);
-	}
-
-	/* ARCH, use by default, or hide */
-	widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_arch"));
-	if (pk_bitfield_contain (application->priv->filters, PK_FILTER_ENUM_ARCH)) {
-		/* set from remembered state */
-		enabled = gconf_client_get_bool (application->priv->gconf_client,
-						 GPK_CONF_APPLICATION_FILTER_ARCH, NULL);
-		gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (widget), enabled);
-		/* work round a gtk2+ bug: toggled should be fired when doing gtk_check_menu_item_set_active */
-		gpk_application_menu_filter_arch_cb (widget, application);
-	} else {
-		gtk_widget_hide (widget);
-	}
-
 	widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "entry_text"));
 	g_signal_connect (widget, "key-press-event",
 			  G_CALLBACK (gpk_application_text_changed_cb), application);
@@ -4060,15 +4100,6 @@ gpk_application_init (GpkApplication *application)
 	g_signal_connect (selection, "changed",
 			  G_CALLBACK (gpk_application_groups_treeview_changed_cb), application);
 
-	/* simple list or category tree? */
-	ret = gconf_client_get_bool (application->priv->gconf_client, GPK_CONF_APPLICATION_CATEGORY_GROUPS, NULL);
-	if (ret)
-		ret = gpk_application_create_group_list_categories (application);
-
-	/* fallback to creating a simple list if we can't do category list */
-	if (!ret)
-		gpk_application_create_group_list_enum (application);
-
 	/* get repos, so we can show the full name in the software source box */
 	ret = pk_client_get_repo_list (application->priv->client_primary, PK_FILTER_ENUM_NONE, &error);
 	if (!ret) {
diff --git a/src/gpk-backend-status.c b/src/gpk-backend-status.c
index 60863c1..d72c997 100644
--- a/src/gpk-backend-status.c
+++ b/src/gpk-backend-status.c
@@ -34,10 +34,10 @@
 static GtkBuilder *builder = NULL;
 
 /**
- * pk_updates_close_cb:
+ * gpk_backend_status_close_cb:
  **/
 static void
-pk_updates_close_cb (GtkWidget *widget, gpointer data)
+gpk_backend_status_close_cb (GtkWidget *widget, gpointer data)
 {
 	GMainLoop *loop = (GMainLoop *) data;
 	egg_debug ("emitting action-close");
@@ -45,18 +45,20 @@ pk_updates_close_cb (GtkWidget *widget, gpointer data)
 }
 
 /**
- * pk_updates_delete_event_cb:
- * @event: The event type, unused.
+ * gpk_backend_status_delete_event_cb:
  **/
 static gboolean
-pk_updates_delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
+gpk_backend_status_delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
 {
-	pk_updates_close_cb (widget, data);
+	gpk_backend_status_close_cb (widget, data);
 	return FALSE;
 }
 
+/**
+ * gpk_backend_status_get_properties_cb:
+ **/
 static void
-pk_control_test_get_properties_cb (GObject *object, GAsyncResult *res, GMainLoop *loop)
+gpk_backend_status_get_properties_cb (GObject *object, GAsyncResult *res, GMainLoop *loop)
 {
 	GtkWidget *widget;
 	GError *error = NULL;
@@ -219,7 +221,6 @@ pk_control_test_get_properties_cb (GObject *object, GAsyncResult *res, GMainLoop
 out:
 	g_free (name);
 	g_free (author);
-	return;
 }
 
 /**
@@ -286,15 +287,15 @@ main (int argc, char *argv[])
 
 	widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_close"));
 	g_signal_connect (widget, "clicked",
-			  G_CALLBACK (pk_updates_close_cb), loop);
+			  G_CALLBACK (gpk_backend_status_close_cb), loop);
 
 	widget = GTK_WIDGET (gtk_builder_get_object (builder, "dialog_backend"));
 	g_signal_connect (widget, "delete_event",
-			  G_CALLBACK (pk_updates_delete_event_cb), loop);
+			  G_CALLBACK (gpk_backend_status_delete_event_cb), loop);
 	gtk_widget_show (GTK_WIDGET (widget));
 
 	/* get properties */
-	pk_control_get_properties_async (control, NULL, (GAsyncReadyCallback) pk_control_test_get_properties_cb, loop);
+	pk_control_get_properties_async (control, NULL, (GAsyncReadyCallback) gpk_backend_status_get_properties_cb, loop);
 
 	/* wait for results */
 	g_main_loop_run (loop);
diff --git a/src/gpk-dbus-task.c b/src/gpk-dbus-task.c
index f854f4d..373e28d 100644
--- a/src/gpk-dbus-task.c
+++ b/src/gpk-dbus-task.c
@@ -3311,7 +3311,7 @@ gpk_dbus_task_init (GpkDbusTask *task)
 
 	/* get actions */
 	task->priv->control = pk_control_new ();
-	task->priv->roles = pk_control_get_actions (task->priv->control, NULL);
+	task->priv->roles = pk_control_get_properties_sync (task->priv->control, NULL);
 
 	task->priv->client_primary = pk_client_new ();
 	g_signal_connect (task->priv->client_primary, "finished",
diff --git a/src/gpk-error.c b/src/gpk-error.c
index 9556770..79b9b47 100644
--- a/src/gpk-error.c
+++ b/src/gpk-error.c
@@ -29,7 +29,6 @@
 #include <packagekit-glib2/packagekit.h>
 
 #include "egg-debug.h"
-#include "egg-string.h"
 
 #include "gpk-common.h"
 #include "gpk-error.h"
@@ -115,7 +114,7 @@ gpk_error_dialog_modal_with_time (GtkWindow *window, const gchar *title, const g
 	gtk_label_set_markup (GTK_LABEL (widget), message);
 
 	/* show text in the expander */
-	if (egg_strzero (details)) {
+	if (details == NULL || details[0] == '\0') {
 		widget = GTK_WIDGET (gtk_builder_get_object (builder, "expander_details"));
 		gtk_widget_hide (widget);
 	} else {
diff --git a/src/gpk-log.c b/src/gpk-log.c
index 4bc2df8..bcc3745 100644
--- a/src/gpk-log.c
+++ b/src/gpk-log.c
@@ -575,8 +575,10 @@ gpk_log_get_old_transactions_cb (GObject *object, GAsyncResult *res, gpointer us
 
 	/* get results */
 	exit_enum = pk_results_get_exit_code (results);
-	if (exit_enum != PK_EXIT_ENUM_SUCCESS)
+	if (exit_enum != PK_EXIT_ENUM_SUCCESS) {
 		egg_warning ("failed to get old transactions: %s", pk_exit_enum_to_text (exit_enum));
+		goto out;
+	}
 
 	/* get the list */
 	if (transactions != NULL)
@@ -588,7 +590,6 @@ out:
 		g_object_unref (results);
 }
 
-
 /**
  * gpk_log_refresh
  **/
diff --git a/src/gpk-prefs.c b/src/gpk-prefs.c
index 6ecf839..cddf8ea 100644
--- a/src/gpk-prefs.c
+++ b/src/gpk-prefs.c
@@ -377,6 +377,72 @@ gpk_prefs_network_status_changed_cb (PkControl *control, PkNetworkEnum state, gp
 }
 
 /**
+ * pk_prefs_get_properties_cb:
+ **/
+static void
+pk_prefs_get_properties_cb (GObject *object, GAsyncResult *res, GMainLoop *loop)
+{
+	GtkWidget *widget;
+	GError *error = NULL;
+	PkControl *control = PK_CONTROL(object);
+	gboolean ret;
+	PkBitfield roles;
+
+	/* get the result */
+	ret = pk_control_get_properties_finish (control, res, &error);
+	if (!ret) {
+		/* TRANSLATORS: backend is broken, and won't tell us what it supports */
+		g_print ("%s: %s\n", _("Exiting as backend details could not be retrieved"), error->message);
+		g_error_free (error);
+		g_main_loop_quit (loop);
+		goto out;
+	}
+
+	/* get values */
+	g_object_get (control,
+		      "roles", &roles,
+		      NULL);
+
+	/* hide if not supported */
+	if (!pk_bitfield_contain (roles, PK_ROLE_ENUM_GET_DISTRO_UPGRADES)) {
+		widget = GTK_WIDGET (gtk_builder_get_object (builder, "label_upgrade"));
+		gtk_widget_hide (widget);
+		widget = GTK_WIDGET (gtk_builder_get_object (builder, "combobox_upgrade"));
+		gtk_widget_hide (widget);
+	}
+out:
+	return;
+}
+
+/**
+ * pk_prefs_get_network_state_cb:
+ **/
+static void
+pk_prefs_get_network_state_cb (GObject *object, GAsyncResult *res, GMainLoop *loop)
+{
+	GtkWidget *widget;
+	GError *error = NULL;
+	PkControl *control = PK_CONTROL(object);
+	PkNetworkEnum state;
+
+	/* get the result */
+	state = pk_control_get_network_state_finish (control, res, &error);
+	if (state == PK_NETWORK_ENUM_UNKNOWN) {
+		egg_warning ("network status unknown: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+
+	/* only show label on mobile broadband */
+	if (state == PK_NETWORK_ENUM_MOBILE) {
+		widget = GTK_WIDGET (gtk_builder_get_object (builder, "hbox_mobile_broadband"));
+		gtk_widget_show (widget);
+	}
+out:
+	return;
+}
+
+/**
  * main:
  **/
 int
@@ -387,13 +453,12 @@ main (int argc, char *argv[])
 	GOptionContext *context;
 	GtkWidget *main_window;
 	GtkWidget *widget;
-	PkBitfield roles;
 	PkControl *control;
 	UniqueApp *unique_app;
-	PkNetworkEnum state;
 	guint retval;
 	guint xid = 0;
 	GError *error = NULL;
+	GMainLoop *loop;
 
 	const GOptionEntry options[] = {
 		{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
@@ -443,11 +508,10 @@ main (int argc, char *argv[])
 			  G_CALLBACK (gpk_prefs_message_received_cb), NULL);
 
 	/* get actions */
+	loop = g_main_loop_new (NULL, FALSE);
 	control = pk_control_new ();
 	g_signal_connect (control, "network-state-changed",
 			  G_CALLBACK (gpk_prefs_network_status_changed_cb), NULL);
-	roles = pk_control_get_actions (control, NULL);
-	state = pk_control_get_network_state (control, NULL);
 
 	/* get UI */
 	builder = gtk_builder_new ();
@@ -476,25 +540,11 @@ main (int argc, char *argv[])
 	g_signal_connect (widget, "clicked",
 			  G_CALLBACK (pk_button_help_cb), NULL);
 
-	/* only show label on mobile broadband */
-	if (state == PK_NETWORK_ENUM_MOBILE) {
-		widget = GTK_WIDGET (gtk_builder_get_object (builder, "hbox_mobile_broadband"));
-		gtk_widget_show (widget);
-	}
-
 	/* update the combo boxes */
 	gpk_prefs_update_freq_combo_setup ();
 	gpk_prefs_upgrade_freq_combo_setup ();
 	gpk_prefs_auto_update_combo_setup ();
 
-	/* hide if not supported */
-	if (!pk_bitfield_contain (roles, PK_ROLE_ENUM_GET_DISTRO_UPGRADES)) {
-		widget = GTK_WIDGET (gtk_builder_get_object (builder, "label_upgrade"));
-		gtk_widget_hide (widget);
-		widget = GTK_WIDGET (gtk_builder_get_object (builder, "combobox_upgrade"));
-		gtk_widget_hide (widget);
-	}
-
 	gtk_widget_show (main_window);
 
 	/* set the parent window if it is specified */
@@ -503,10 +553,15 @@ main (int argc, char *argv[])
 		gpk_window_set_parent_xid (GTK_WINDOW (main_window), xid);
 	}
 
+	/* get some data */
+	pk_control_get_properties_async (control, NULL, (GAsyncReadyCallback) pk_prefs_get_properties_cb, loop);
+	pk_control_get_network_state_async (control, NULL, (GAsyncReadyCallback) pk_prefs_get_network_state_cb, loop);
+
 	/* wait */
-	gtk_main ();
+	g_main_loop_run (loop);
 
 out_build:
+	g_main_loop_unref (loop);
 	g_object_unref (control);
 	g_object_unref (builder);
 unique_out:
diff --git a/src/gpk-repo.c b/src/gpk-repo.c
index 4fa8c85..d04a7b6 100644
--- a/src/gpk-repo.c
+++ b/src/gpk-repo.c
@@ -21,20 +21,19 @@
 
 #include "config.h"
 
-#include <glib.h>
 #include <glib/gi18n.h>
 #include <locale.h>
 
 #include <gtk/gtk.h>
-#include <math.h>
-#include <string.h>
-#include <dbus/dbus-glib.h>
+//#include <math.h>
+//#include <string.h>
+//#include <dbus/dbus-glib.h>
 #include <gconf/gconf-client.h>
 #include <packagekit-glib2/packagekit.h>
 #include <unique/unique.h>
 
 #include "egg-debug.h"
-#include "egg-string.h"
+//#include "egg-string.h"
 
 #include "gpk-gnome.h"
 #include "gpk-common.h"
@@ -44,20 +43,12 @@
 
 static GtkBuilder *builder = NULL;
 static GtkListStore *list_store = NULL;
-static PkClient *client_query = NULL;
-#if PK_CHECK_VERSION(0,5,1)
-static PkClientPool *pool = NULL;
-#else
-static GPtrArray *client_array = NULL;
-#endif
+static PkClient *client = NULL;
 static PkBitfield roles;
 static GConfClient *gconf_client;
 static gboolean show_details;
 static GtkTreePath *path_global = NULL;
 static GtkWidget *image_animation = NULL;
-#if !PK_CHECK_VERSION(0,5,1)
-static PkStatusEnum status_last = PK_STATUS_ENUM_UNKNOWN;
-#endif
 static guint status_id = 0;
 
 enum {
@@ -69,10 +60,6 @@ enum {
 	REPO_COLUMN_LAST
 };
 
-#if !PK_CHECK_VERSION(0,5,1)
-static PkClient *gpk_repo_create_client (void);
-#endif
-
 /**
  * gpk_repo_find_iter_model_cb:
  **/
@@ -164,6 +151,106 @@ gpk_button_help_cb (GtkWidget *widget, gboolean  data)
 	gpk_gnome_help ("software-sources");
 }
 
+/**
+ * gpk_repo_status_changed_timeout_cb:
+ **/
+static gboolean
+gpk_repo_status_changed_timeout_cb (PkProgress *progress)
+{
+	const gchar *text;
+	GtkWidget *widget;
+	PkStatusEnum status;
+
+	/* get the last status */
+	g_object_get (progress,
+		      "status", &status,
+		      NULL);
+
+	/* set the text and show */
+	widget = GTK_WIDGET (gtk_builder_get_object (builder, "viewport_animation_preview"));
+	gtk_widget_show (widget);
+	widget = GTK_WIDGET (gtk_builder_get_object (builder, "label_animation"));
+	text = gpk_status_enum_to_localised_text (status);
+	gtk_label_set_label (GTK_LABEL (widget), text);
+
+	/* set icon */
+	gpk_set_animated_icon_from_status (GPK_ANIMATED_ICON (image_animation), status, GTK_ICON_SIZE_LARGE_TOOLBAR);
+
+	/* never repeat */
+	status_id = 0;
+	return FALSE;
+}
+
+/**
+ * gpk_repo_progress_cb:
+ **/
+static void
+gpk_repo_progress_cb (PkProgress *progress, PkProgressType type, gpointer user_data)
+{
+	PkStatusEnum status;
+	GtkWidget *widget;
+
+	if (type != PK_PROGRESS_TYPE_STATUS)
+		return;
+
+	/* get value */
+	g_object_get (progress,
+		      "status", &status,
+		      NULL);
+	egg_debug ("now %s", pk_status_enum_to_text (status));
+
+	if (status == PK_STATUS_ENUM_FINISHED) {
+		/* we've not yet shown, so don't bother */
+		if (status_id > 0) {
+			g_source_remove (status_id);
+			status_id = 0;
+		}
+		widget = GTK_WIDGET (gtk_builder_get_object (builder, "viewport_animation_preview"));
+		gtk_widget_hide (widget);
+		gpk_animated_icon_enable_animation (GPK_ANIMATED_ICON (image_animation), FALSE);
+		goto out;
+	}
+
+	/* already pending show */
+	if (status_id > 0)
+		goto out;
+
+	/* only show after some time in the transaction */
+	status_id = g_timeout_add (GPK_UI_STATUS_SHOW_DELAY, (GSourceFunc) gpk_repo_status_changed_timeout_cb, progress);
+out:
+	return;
+}
+
+/**
+ * gpk_repo_repo_enable_cb
+ **/
+static void
+gpk_repo_repo_enable_cb (GObject *object, GAsyncResult *res, gpointer user_data)
+{
+//	PkClient *client = PK_CLIENT (object);
+	GError *error = NULL;
+	PkResults *results = NULL;
+	PkExitEnum exit_enum;
+
+	/* get the results */
+	results = pk_client_generic_finish (client, res, &error);
+	if (results == NULL) {
+		egg_warning ("failed to get set repo: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+
+	/* get results */
+	exit_enum = pk_results_get_exit_code (results);
+	if (exit_enum != PK_EXIT_ENUM_SUCCESS) {
+		egg_warning ("failed to set repo: %s", pk_exit_enum_to_text (exit_enum));
+		goto out;
+	}
+out:
+	if (results != NULL)
+		g_object_unref (results);
+}
+
 static void
 gpk_misc_enabled_toggled (GtkCellRendererToggle *cell, gchar *path_str, gpointer data)
 {
@@ -171,15 +258,12 @@ gpk_misc_enabled_toggled (GtkCellRendererToggle *cell, gchar *path_str, gpointer
 	GtkTreeIter iter;
 	GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
 	gboolean enabled;
-	gchar *repo_id;
-	gboolean ret;
-	GError *error = NULL;
-	PkClient *client;
+	gchar *repo_id = NULL;
 
 	/* do we have the capability? */
 	if (pk_bitfield_contain (roles, PK_ROLE_ENUM_REPO_ENABLE) == FALSE) {
 		egg_debug ("can't change state");
-		return;
+		goto out;
 	}
 
 	/* get toggled iter */
@@ -191,26 +275,17 @@ gpk_misc_enabled_toggled (GtkCellRendererToggle *cell, gchar *path_str, gpointer
 	/* do something with the value */
 	enabled ^= 1;
 
-	/* do this to the repo */
-	egg_debug ("setting %s to %i", repo_id, enabled);
-#if PK_CHECK_VERSION(0,5,1)
-	client = pk_client_pool_create (pool);
-#else
-	client = gpk_repo_create_client ();
-#endif
-	ret = pk_client_repo_enable (client, repo_id, enabled, &error);
-	if (!ret) {
-		egg_warning ("could not set repo enabled state: %s", error->message);
-		g_error_free (error);
-		goto out;
-	}
-	g_object_unref (client);
-
 	/* set new value */
 	gtk_list_store_set (GTK_LIST_STORE (model), &iter,
 			    REPO_COLUMN_SENSITIVE, FALSE,
 			    -1);
 
+	/* set the repo */
+	egg_debug ("setting %s to %i", repo_id, enabled);
+	pk_client_repo_enable_async (client, repo_id, enabled, NULL,
+				     gpk_repo_progress_cb, NULL,
+				     gpk_repo_repo_enable_cb, NULL);
+
 out:
 	/* clean up */
 	g_free (repo_id);
@@ -218,32 +293,6 @@ out:
 }
 
 /**
- * gpk_repo_detail_cb:
- **/
-static void
-gpk_repo_detail_cb (PkClient *client, const gchar *repo_id,
-		    const gchar *description, gboolean enabled, gpointer data)
-{
-	GtkTreeIter iter;
-	GtkTreeView *treeview = GTK_TREE_VIEW (gtk_builder_get_object (builder, "treeview_repo"));
-	GtkTreeModel *model = gtk_tree_view_get_model (treeview);
-
-	egg_debug ("repo = %s:%s:%i", repo_id, description, enabled);
-
-	gpk_repo_model_get_iter (model, &iter, repo_id);
-	gtk_list_store_set (list_store, &iter,
-			    REPO_COLUMN_ENABLED, enabled,
-			    REPO_COLUMN_TEXT, description,
-			    REPO_COLUMN_ID, repo_id,
-			    REPO_COLUMN_ACTIVE, TRUE,
-			    REPO_COLUMN_SENSITIVE, TRUE,
-			    -1);
-
-	/* sort after each entry, which is okay as there shouldn't be many */
-	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(list_store), REPO_COLUMN_TEXT, GTK_SORT_ASCENDING);
-}
-
-/**
  * gpk_treeview_add_columns:
  **/
 static void
@@ -294,99 +343,77 @@ gpk_repos_treeview_clicked_cb (GtkTreeSelection *selection, gpointer data)
 }
 
 /**
- * gpk_repo_finished_cb:
+ * gpk_repo_get_repo_list_cb
  **/
 static void
-gpk_repo_finished_cb (PkClient *client, PkExitEnum exit, guint runtime, gpointer data)
+gpk_repo_get_repo_list_cb (GObject *object, GAsyncResult *res, gpointer user_data)
 {
+//	PkClient *client = PK_CLIENT (object);
+	GError *error = NULL;
+	PkResults *results = NULL;
+	PkExitEnum exit_enum;
 	GtkTreeView *treeview;
 	GtkTreeModel *model;
+	PkItemErrorCode *item_error;
+	GtkWindow *window;
+	GPtrArray *array = NULL;
+	guint i;
+	const PkItemRepoDetail *item;
+	GtkTreeIter iter;
 
-	/* remove the items that are not used */
-	treeview = GTK_TREE_VIEW (gtk_builder_get_object (builder, "treeview_repo"));
-	model = gtk_tree_view_get_model (treeview);
-	gpk_repo_remove_nonactive (model);
-}
-
-/**
- * gpk_repo_status_changed_timeout_cb:
- **/
-static gboolean
-gpk_repo_status_changed_timeout_cb (PkClient *client)
-{
-	const gchar *text;
-	GtkWidget *widget;
-	PkStatusEnum status;
-
-#if PK_CHECK_VERSION(0,5,1)
-	/* get the last status */
-	g_object_get (client,
-		      "status", &status,
-		      NULL);
-#else
-	status = status_last;
-#endif
-
-	/* set the text and show */
-	widget = GTK_WIDGET (gtk_builder_get_object (builder, "viewport_animation_preview"));
-	gtk_widget_show (widget);
-	widget = GTK_WIDGET (gtk_builder_get_object (builder, "label_animation"));
-	text = gpk_status_enum_to_localised_text (status);
-	gtk_label_set_label (GTK_LABEL (widget), text);
-
-	/* set icon */
-	gpk_set_animated_icon_from_status (GPK_ANIMATED_ICON (image_animation), status, GTK_ICON_SIZE_LARGE_TOOLBAR);
-
-	/* never repeat */
-	status_id = 0;
-	return FALSE;
-}
+	/* get the results */
+	results = pk_client_generic_finish (client, res, &error);
+	if (results == NULL) {
+		egg_warning ("failed to get repo list: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
 
-/**
- * gpk_repo_status_changed_cb:
- **/
-static void
-gpk_repo_status_changed_cb (PkClient *client, PkStatusEnum status, gpointer data)
-{
-	GtkWidget *widget;
+	/* get results */
+	exit_enum = pk_results_get_exit_code (results);
+	if (exit_enum != PK_EXIT_ENUM_SUCCESS) {
+		egg_warning ("failed to get repo list: %s", pk_exit_enum_to_text (exit_enum));
+		item_error = pk_results_get_error_code (results);
 
-	if (status == PK_STATUS_ENUM_FINISHED) {
-		/* we've not yet shown, so don't bother */
-		if (status_id > 0) {
-			g_source_remove (status_id);
-			status_id = 0;
-		}
-		widget = GTK_WIDGET (gtk_builder_get_object (builder, "viewport_animation_preview"));
-		gtk_widget_hide (widget);
-		gpk_animated_icon_enable_animation (GPK_ANIMATED_ICON (image_animation), FALSE);
+		window = GTK_WINDOW (gtk_builder_get_object (builder, "dialog_repo"));
+		/* TRANSLATORS: for one reason or another, we could not get the list of sources */
+		gpk_error_dialog_modal (window, _("Failed to get the list of sources"),
+					gpk_error_enum_to_localised_text (item_error->code), item_error->details);
+//		/* TRANSLATORS: for one reason or another, we could not enable or disable a software source */
+//		gpk_error_dialog_modal (window, _("Failed to change status"),
+//					gpk_error_enum_to_localised_text (item_error->code), item_error->details);
+
+		pk_item_error_code_unref (item_error);
 		goto out;
 	}
 
-	/* already pending show */
-	if (status_id > 0)
-		goto out;
+	/* add repos */
+	treeview = GTK_TREE_VIEW (gtk_builder_get_object (builder, "treeview_repo"));
+	model = gtk_tree_view_get_model (treeview);
+	array = pk_results_get_repo_detail_array (results);
+	for (i=0; i<array->len; i++) {
+		item = g_ptr_array_index (array, i);
+		egg_debug ("repo = %s:%s:%i", item->repo_id, item->description, item->enabled);
+		gpk_repo_model_get_iter (model, &iter, item->repo_id);
+		gtk_list_store_set (list_store, &iter,
+				    REPO_COLUMN_ENABLED, item->enabled,
+				    REPO_COLUMN_TEXT, item->description,
+				    REPO_COLUMN_ID, item->repo_id,
+				    REPO_COLUMN_ACTIVE, TRUE,
+				    REPO_COLUMN_SENSITIVE, TRUE,
+				    -1);
+	}
 
-	/* only show after some time in the transaction */
-	status_id = g_timeout_add (GPK_UI_STATUS_SHOW_DELAY, (GSourceFunc) gpk_repo_status_changed_timeout_cb, client);
-out:
-#if !PK_CHECK_VERSION(0,5,1)
-	/* save for the callback */
-	status_last = status;
-#endif
-	return;
-}
+	/* remove the items that are not now present */
+	gpk_repo_remove_nonactive (model);
 
-/**
- * gpk_repo_error_code_cb:
- **/
-static void
-gpk_repo_error_code_cb (PkClient *client, PkErrorCodeEnum code, const gchar *details, gpointer data)
-{
-	GtkWindow *window;
-	window = GTK_WINDOW (gtk_builder_get_object (builder, "dialog_repo"));
-	/* TRANSLATORS: for one reason or another, we could not enable or disable a software source */
-	gpk_error_dialog_modal (window, _("Failed to change status"),
-				gpk_error_enum_to_localised_text (code), details);
+	/* sort */
+	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(list_store), REPO_COLUMN_TEXT, GTK_SORT_ASCENDING);
+out:
+	if (array != NULL)
+		g_ptr_array_unref (array);
+	if (results != NULL)
+		g_object_unref (results);
 }
 
 /**
@@ -395,8 +422,6 @@ gpk_repo_error_code_cb (PkClient *client, PkErrorCodeEnum code, const gchar *det
 static void
 gpk_repo_repo_list_refresh (void)
 {
-	gboolean ret;
-	GError *error = NULL;
 	PkBitfield filters;
 	GtkTreeView *treeview;
 	GtkTreeModel *model;
@@ -411,11 +436,9 @@ gpk_repo_repo_list_refresh (void)
 		filters = pk_bitfield_value (PK_FILTER_ENUM_NOT_DEVELOPMENT);
 	else
 		filters = pk_bitfield_value (PK_FILTER_ENUM_NONE);
-	ret = pk_client_get_repo_list (client_query, filters, &error);
-	if (!ret) {
-		egg_warning ("failed to get repo list: %s", error->message);
-		g_error_free (error);
-	}
+	pk_client_get_repo_list_async (client, filters, NULL,
+				       gpk_repo_progress_cb, NULL,
+				       gpk_repo_get_repo_list_cb, NULL);
 }
 
 /**
@@ -452,43 +475,80 @@ gpk_repo_message_received_cb (UniqueApp *app, UniqueCommand command, UniqueMessa
 	}
 }
 
-#if !PK_CHECK_VERSION(0,5,1)
+
 /**
- * gpk_repo_destroy_cb:
+ * gpk_repo_get_properties_cb:
  **/
 static void
-gpk_repo_destroy_cb (PkClient *client, gpointer data)
+gpk_repo_get_properties_cb (GObject *object, GAsyncResult *res, GMainLoop *loop)
 {
+	GtkWidget *widget;
+	GError *error = NULL;
+	PkControl *control = PK_CONTROL(object);
 	gboolean ret;
-	egg_debug ("client destroyed");
-	ret = g_ptr_array_remove (client_array, client);
-	if (!ret)
-		egg_warning ("failed to remove %p", client);
-	/* TODO: disconnect signals? */
-	g_object_unref (client);
+//	PkBitfield roles;
+
+	/* get the result */
+	ret = pk_control_get_properties_finish (control, res, &error);
+	if (!ret) {
+		/* TRANSLATORS: backend is broken, and won't tell us what it supports */
+		g_print ("%s: %s\n", _("Exiting as backend details could not be retrieved"), error->message);
+		g_error_free (error);
+		g_main_loop_quit (loop);
+		goto out;
+	}
+
+	/* get values */
+	g_object_get (control,
+		      "roles", &roles,
+		      NULL);
+
+	/* setup GUI */
+	if (pk_bitfield_contain (roles, PK_ROLE_ENUM_GET_REPO_LIST)) {
+		/* get the update list */
+		gpk_repo_repo_list_refresh ();
+	} else {
+		GtkTreeIter iter;
+		GtkTreeView *treeview = GTK_TREE_VIEW (gtk_builder_get_object (builder, "treeview_repo"));
+		GtkTreeModel *model = gtk_tree_view_get_model (treeview);
+
+		gtk_list_store_append (GTK_LIST_STORE(model), &iter);
+		gtk_list_store_set (list_store, &iter,
+				    REPO_COLUMN_ENABLED, FALSE,
+				    REPO_COLUMN_TEXT, _("Getting software source list not supported by backend"),
+				    REPO_COLUMN_ACTIVE, FALSE,
+				    REPO_COLUMN_SENSITIVE, FALSE,
+				    -1);
+
+		widget = GTK_WIDGET (gtk_builder_get_object (builder, "treeview_repo"));
+		gtk_widget_set_sensitive (widget, FALSE);
+		widget = GTK_WIDGET (gtk_builder_get_object (builder, "checkbutton_detail"));
+		gtk_widget_set_sensitive (widget, FALSE);
+	}
+out:
+	return;
 }
 
 /**
- * gpk_repo_create_client
+ * gpk_repo_close_cb:
  **/
-static PkClient *
-gpk_repo_create_client (void)
+static void
+gpk_repo_close_cb (GtkWidget *widget, gpointer data)
 {
-	PkClient *client;
-	client = pk_client_new ();
-	g_signal_connect (client, "repo-detail",
-			  G_CALLBACK (gpk_repo_detail_cb), NULL);
-	g_signal_connect (client, "status-changed",
-			  G_CALLBACK (gpk_repo_status_changed_cb), NULL);
-	g_signal_connect (client, "error-code",
-			  G_CALLBACK (gpk_repo_error_code_cb), NULL);
-	g_signal_connect (client, "destroy",
-			  G_CALLBACK (gpk_repo_destroy_cb), NULL);
-	g_ptr_array_add (client_array, client);
-	egg_debug ("added %p", client);
-	return g_object_ref (client);
+	GMainLoop *loop = (GMainLoop *) data;
+	egg_debug ("emitting action-close");
+	g_main_loop_quit (loop);
+}
+
+/**
+ * gpk_repo_delete_event_cb:
+ **/
+static gboolean
+gpk_repo_delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+	gpk_repo_close_cb (widget, data);
+	return FALSE;
 }
-#endif
 
 /**
  * main:
@@ -508,6 +568,7 @@ main (int argc, char *argv[])
 	guint xid = 0;
 	gboolean ret;
 	GtkBox *box;
+	GMainLoop *loop;
 
 	const GOptionEntry options[] = {
 		{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
@@ -526,7 +587,6 @@ main (int argc, char *argv[])
 
 	if (! g_thread_supported ())
 		g_thread_init (NULL);
-	dbus_g_thread_init ();
 	g_type_init ();
 
 	context = g_option_context_new (NULL);
@@ -559,37 +619,16 @@ main (int argc, char *argv[])
 
 	gconf_client = gconf_client_get_default ();
 
-	client_query = pk_client_new ();
-	g_signal_connect (client_query, "repo-detail",
-			  G_CALLBACK (gpk_repo_detail_cb), NULL);
-	g_signal_connect (client_query, "status-changed",
-			  G_CALLBACK (gpk_repo_status_changed_cb), NULL);
-	g_signal_connect (client_query, "finished",
-			  G_CALLBACK (gpk_repo_finished_cb), NULL);
-	g_signal_connect (client_query, "error-code",
-			  G_CALLBACK (gpk_repo_error_code_cb), NULL);
-
-#if PK_CHECK_VERSION(0,5,1)
-	pool = pk_client_pool_new ();
-	pk_client_pool_connect (pool, "repo-detail",
-				G_CALLBACK (gpk_repo_detail_cb), NULL);
-	pk_client_pool_connect (pool, "status-changed",
-				G_CALLBACK (gpk_repo_status_changed_cb), NULL);
-	pk_client_pool_connect (pool, "error-code",
-				G_CALLBACK (gpk_repo_error_code_cb), NULL);
-#else
-	client_array = g_ptr_array_new ();
-#endif
-
+	loop = g_main_loop_new (NULL, FALSE);
+	client = pk_client_new ();
 	control = pk_control_new ();
 	g_signal_connect (control, "repo-list-changed",
 			  G_CALLBACK (gpk_repo_repo_list_changed_cb), NULL);
-	roles = pk_control_get_actions (control, NULL);
 
 	/* get UI */
 	builder = gtk_builder_new ();
 	retval = gtk_builder_add_from_file (builder, GPK_DATA "/gpk-repo.ui", &error);
-	if (error != NULL) {
+	if (retval == 0) {
 		egg_warning ("failed to load ui: %s", error->message);
 		g_error_free (error);
 		goto out_build;
@@ -604,10 +643,11 @@ main (int argc, char *argv[])
 
 	main_window = GTK_WIDGET (gtk_builder_get_object (builder, "dialog_repo"));
 	gtk_window_set_icon_name (GTK_WINDOW (main_window), GPK_ICON_SOFTWARE_SOURCES);
-	g_signal_connect_swapped (main_window, "delete_event", G_CALLBACK (gtk_main_quit), NULL);
-
+	g_signal_connect (main_window, "delete_event",
+			  G_CALLBACK (gpk_repo_delete_event_cb), loop);
 	widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_close"));
-	g_signal_connect_swapped (widget, "clicked", G_CALLBACK (gtk_main_quit), NULL);
+	g_signal_connect (widget, "clicked",
+			  G_CALLBACK (gpk_repo_close_cb), loop);
 	widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_help"));
 	g_signal_connect (widget, "clicked",
 			  G_CALLBACK (gpk_button_help_cb), NULL);
@@ -651,33 +691,19 @@ main (int argc, char *argv[])
 	widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_close"));
 	gtk_widget_grab_focus (widget);
 
-	if (pk_bitfield_contain (roles, PK_ROLE_ENUM_GET_REPO_LIST)) {
-		/* get the update list */
-		gpk_repo_repo_list_refresh ();
-	} else {
-		gpk_repo_detail_cb (client_query, "default",
-				   _("Getting software source list not supported by backend"), FALSE, NULL);
-		widget = GTK_WIDGET (gtk_builder_get_object (builder, "treeview_repo"));
-		gtk_widget_set_sensitive (widget, FALSE);
-		widget = GTK_WIDGET (gtk_builder_get_object (builder, "checkbutton_detail"));
-		gtk_widget_set_sensitive (widget, FALSE);
-	}
+	/* get properties */
+	pk_control_get_properties_async (control, NULL, (GAsyncReadyCallback) gpk_repo_get_properties_cb, loop);
 
 	/* wait */
-	gtk_main ();
+	g_main_loop_run (loop);
 
 	g_object_unref (list_store);
 out_build:
 	g_object_unref (builder);
 	g_object_unref (gconf_client);
-	g_object_unref (client_query);
 	g_object_unref (control);
-#if PK_CHECK_VERSION(0,5,1)
-	g_object_unref (pool);
-#else
-	g_ptr_array_foreach (client_array, (GFunc) g_object_unref, NULL);
-	g_ptr_array_free (client_array, TRUE);
-#endif
+	g_object_unref (client);
+	g_main_loop_unref (loop);
 unique_out:
 	g_object_unref (unique_app);
 
diff --git a/src/gpk-service-pack.c b/src/gpk-service-pack.c
index 058b9ad..a0929b6 100644
--- a/src/gpk-service-pack.c
+++ b/src/gpk-service-pack.c
@@ -550,8 +550,6 @@ main (int argc, char *argv[])
 	GtkWidget *widget;
 	GtkFileFilter *filter;
 	GtkEntryCompletion *completion;
-	PkBitfield roles;
-	PkControl *control = NULL;
 	UniqueApp *unique_app;
 	gboolean ret;
 	GConfClient *gconf_client = NULL;
@@ -611,10 +609,6 @@ main (int argc, char *argv[])
 	g_signal_connect (unique_app, "message-received",
 			  G_CALLBACK (gpk_pack_message_received_cb), NULL);
 
-	/* get actions */
-	control = pk_control_new ();
-	roles = pk_control_get_actions (control, NULL);
-
 	client = pk_client_new ();
 	g_signal_connect (client, "progress-changed", G_CALLBACK (gpk_pack_progress_changed_cb), NULL);
 
@@ -715,8 +709,6 @@ out_unique:
 	g_object_unref (unique_app);
 	if (gconf_client != NULL)
 		g_object_unref (gconf_client);
-	if (control != NULL)
-		g_object_unref (control);
 	if (client != NULL)
 		g_object_unref (client);
 	g_free (option);
diff --git a/src/gpk-update-viewer.c b/src/gpk-update-viewer.c
index 1ee1a96..b4e9095 100644
--- a/src/gpk-update-viewer.c
+++ b/src/gpk-update-viewer.c
@@ -1717,7 +1717,6 @@ gpk_update_viewer_finished_cb (PkClient *client, PkExitEnum exit, guint runtime,
 	GtkTreePath *path;
 	GtkTreeModel *model;
 	GtkTreeSelection *selection;
-	PkBitfield roles;
 	PkRoleEnum role;
 	GPtrArray *list;
 	PkRestartEnum restart;
@@ -1807,11 +1806,6 @@ gpk_update_viewer_finished_cb (PkClient *client, PkExitEnum exit, guint runtime,
 
 	if (role == PK_ROLE_ENUM_GET_DETAILS) {
 
-		/* get the distro-upgrades if we support it */
-		roles = pk_control_get_actions (control, NULL);
-		if (pk_bitfield_contain (roles, PK_ROLE_ENUM_GET_DISTRO_UPGRADES))
-			g_idle_add ((GSourceFunc) gpk_update_viewer_finished_get_distro_upgrades_cb, NULL);
-
 		/* select the first entry in the updates list now we've got data */
 		widget = GTK_WIDGET (gtk_builder_get_object (builder, "treeview_updates"));
 		selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
@@ -2737,6 +2731,40 @@ gpk_update_viewer_search_equal_func (GtkTreeModel *model, gint column, const gch
 }
 
 /**
+ * pk_prefs_get_properties_cb:
+ **/
+static void
+pk_prefs_get_properties_cb (GObject *object, GAsyncResult *res, GMainLoop *loop)
+{
+	GtkWidget *widget;
+	GError *error = NULL;
+	PkControl *control = PK_CONTROL(object);
+	gboolean ret;
+	PkBitfield roles;
+
+	/* get the result */
+	ret = pk_control_get_properties_finish (control, res, &error);
+	if (!ret) {
+		/* TRANSLATORS: backend is broken, and won't tell us what it supports */
+		g_print ("%s: %s\n", _("Exiting as backend details could not be retrieved"), error->message);
+		g_error_free (error);
+		g_main_loop_quit (loop);
+		goto out;
+	}
+
+	/* get values */
+	g_object_get (control,
+		      "roles", &roles,
+		      NULL);
+
+	/* get the distro-upgrades if we support it */
+	if (pk_bitfield_contain (roles, PK_ROLE_ENUM_GET_DISTRO_UPGRADES))
+		g_idle_add ((GSourceFunc) gpk_update_viewer_finished_get_distro_upgrades_cb, NULL);
+out:
+	return;
+}
+
+/**
  * main:
  **/
 int
@@ -2748,7 +2776,6 @@ main (int argc, char *argv[])
 	GtkWidget *main_window;
 	GtkWidget *widget;
 	GtkTreeSelection *selection;
-	PkBitfield roles;
 	gboolean ret;
 	guint retval;
 	GError *error = NULL;
@@ -2855,8 +2882,8 @@ main (int argc, char *argv[])
 	g_signal_connect (client_secondary, "finished",
 			  G_CALLBACK (gpk_update_viewer_finished_cb), NULL);
 
-	/* get actions */
-	roles = pk_control_get_actions (control, NULL);
+	/* get properties */
+	pk_control_get_properties_async (control, NULL, (GAsyncReadyCallback) pk_prefs_get_properties_cb, loop);
 
 	/* get UI */
 	builder = gtk_builder_new ();



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]