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



commit 9e89a771dec953049491d94dae59d38cb42b784c
Author: Richard Hughes <richard hughsie com>
Date:   Sat Oct 3 20:39:06 2009 +0100

    moo

 src/gpk-update-viewer.c |  697 ++++++++++++++++++++++++-----------------------
 1 files changed, 349 insertions(+), 348 deletions(-)
---
diff --git a/src/gpk-update-viewer.c b/src/gpk-update-viewer.c
index 17956e3..b67f4da 100644
--- a/src/gpk-update-viewer.c
+++ b/src/gpk-update-viewer.c
@@ -73,6 +73,7 @@ static guint size_total = 0;
 static GConfClient *gconf_client = NULL;
 static gchar **install_package_ids = NULL;
 static EggConsoleKit *console = NULL;
+static GCancellable *cancellable = NULL;
 
 enum {
 	GPK_UPDATES_COLUMN_TEXT,
@@ -160,77 +161,8 @@ gpk_update_viewer_button_help_cb (GtkWidget *widget, gpointer data)
 static void
 gpk_update_viewer_quit (void)
 {
-	gboolean ret;
-	gboolean allow_cancel = FALSE;
-	GError *error = NULL;
-	PkRoleEnum role;
-	PkStatusEnum status;
-	GtkWindow *window;
-	GtkWidget *dialog;
-	GtkResponseType response;
-
 	/* are we in a transaction */
-	ret = pk_client_get_role (PK_CLIENT(task), &role, NULL, &error);
-	if (!ret) {
-		egg_warning ("failed to get role: %s", error->message);
-		g_error_free (error);
-		goto out;
-	}
-	if (role == PK_ROLE_ENUM_UNKNOWN) {
-		egg_debug ("no role, so quitting");
-		goto out;
-	}
-	ret = pk_client_get_status (PK_CLIENT(task), &status, &error);
-	if (!ret) {
-		egg_warning ("failed to get status: %s", error->message);
-		g_error_free (error);
-		goto out;
-	}
-	if (status == PK_STATUS_ENUM_FINISHED) {
-		egg_debug ("status is finished, so quitting");
-		goto out;
-	}
-
-	/* can we easily cancel */
-	ret = pk_client_get_allow_cancel (PK_CLIENT(task), &allow_cancel, &error);
-	if (!ret) {
-		egg_warning ("failed to get allow cancel state: %s", error->message);
-		g_error_free (error);
-		goto out;
-	}
-
-	/* cancel the transaction */
-	if (allow_cancel) {
-		ret = g_cancellable_cancel (PK_CLIENT(task), &error);
-		if (!ret) {
-			egg_warning ("failed to cancel client: %s", error->message);
-			g_error_free (error);
-		}
-		goto out;
-	}
-
-	/* show modal dialog asking for confirmation */
-	window = GTK_WINDOW (gtk_builder_get_object (builder, "dialog_updates"));
-	dialog = gtk_message_dialog_new (window, GTK_DIALOG_MODAL,
-					 GTK_MESSAGE_INFO, GTK_BUTTONS_CANCEL,
-					 "%s", _("Cannot cancel running task"));
-
-	/* TRANSLATORS: this is the button text when we check if it's okay to download */
-	gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-quit", GTK_RESPONSE_OK);
-
-	/* TRANSLATORS, user clicked the [x] when we cannot cancel what we are doing */
-	gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
-						  "%s", _("There are tasks that cannot be cancelled."));
-
-	gtk_window_set_icon_name (GTK_WINDOW(dialog), GPK_ICON_SOFTWARE_INSTALLER);
-	response = gtk_dialog_run (GTK_DIALOG(dialog));
-	gtk_widget_destroy (dialog);
-
-	/* pressed cancel or [x] */
-	if (response != GTK_RESPONSE_OK)
-		return;
-out:
-	g_main_loop_quit (loop);
+	g_cancellable_cancel (cancellable);
 }
 
 /**
@@ -259,7 +191,7 @@ gpk_update_viewer_undisable_packages ()
 	/* set all the checkboxes sensitive */
 	valid = gtk_tree_model_get_iter_first (model, &iter);
 	while (valid) {
-		gtk_array_store_set (array_store_updates, &iter,
+		gtk_list_store_set (array_store_updates, &iter,
 				    GPK_UPDATES_COLUMN_SENSITIVE, TRUE,
 				    GPK_UPDATES_COLUMN_CLICKABLE, TRUE,
 				    -1);
@@ -330,6 +262,39 @@ out:
 }
 
 /**
+ * gpk_update_viewer_update_packages_cb:
+ **/
+static void
+gpk_update_viewer_update_packages_cb (PkTask *_task, GAsyncResult *res, GMainLoop *_loop)
+{
+	PkResults *results;
+	GError *error = NULL;
+	GPtrArray *array = NULL;
+	PkItemPackage *item;
+	guint i;
+
+	/* get the results */
+	results = pk_task_generic_finish (task, res, &error);
+	if (results == NULL) {
+		egg_warning ("failed to update packages: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+
+	/* get data */
+	array = pk_results_get_package_array (results);
+	for (i=0; i<array->len; i++) {
+		item = g_ptr_array_index (array, i);
+	}
+
+out:
+	if (array != NULL)
+		g_ptr_array_unref (array);
+	if (results != NULL)
+		g_object_unref (results);
+}
+
+/**
  * gpk_update_viewer_button_install_cb:
  **/
 static void
@@ -345,7 +310,6 @@ gpk_update_viewer_button_install_cb (GtkWidget *widget, gpointer data)
 	gboolean update;
 	gboolean selected_any = FALSE;
 	gchar *package_id;
-	GError *error = NULL;
 	GPtrArray *array = NULL;
 	gchar **package_ids = NULL;
 	PkInfoEnum info;
@@ -376,7 +340,7 @@ gpk_update_viewer_button_install_cb (GtkWidget *widget, gpointer data)
 				    GPK_UPDATES_COLUMN_ID, &package_id, -1);
 
 		/* set all the checkboxes insensitive */
-		gtk_array_store_set (array_store_updates, &iter,
+		gtk_list_store_set (array_store_updates, &iter,
 				    GPK_UPDATES_COLUMN_CLICKABLE, FALSE,
 				    GPK_UPDATES_COLUMN_SENSITIVE, FALSE, -1);
 
@@ -418,12 +382,9 @@ gpk_update_viewer_button_install_cb (GtkWidget *widget, gpointer data)
 	install_package_ids = g_strdupv (package_ids);
 
 	/* get packages that also have to be updated */
-	ret = pk_client_update_packages (PK_CLIENT(task), package_ids, &error);
-	if (!ret) {
-		egg_warning ("cannot get depends for updates: %s", error->message);
-		g_error_free (error);
-		goto out;
-	}
+	pk_task_update_packages (task, package_ids, cancellable,
+				 NULL, NULL,
+				 (GAsyncReadyCallback) gpk_update_viewer_update_packages_cb, loop);
 out:
 	g_strfreev (package_ids);
 
@@ -463,23 +424,29 @@ gpk_update_viewer_button_delete_event_cb (GtkWidget *widget, GdkEvent *event, gp
  * gpk_update_viewer_find_iter_model_cb:
  **/
 static gboolean
-gpk_update_viewer_find_iter_model_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, const gchar *id)
+gpk_update_viewer_find_iter_model_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, const gchar *package_id)
 {
-	gchar *id_tmp = NULL;
+	gchar *package_id_tmp = NULL;
 	GtkTreePath **_path = NULL;
-	gchar *id_new;
 	gboolean ret = FALSE;
+	gchar **split;
+	gchar **split_tmp;
 
 	_path = (GtkTreePath **) g_object_get_data (G_OBJECT(model), "_path");
-	gtk_tree_model_get (model, iter, GPK_UPDATES_COLUMN_ID, &id_tmp, -1);
+	gtk_tree_model_get (model, iter,
+			    GPK_UPDATES_COLUMN_ID, &package_id_tmp,
+			    -1);
 
 	/* only match on the name */
-	id_new = xxxnotneededanymore (id_tmp);
-	if (g_strcmp0 (id_new->name, id->name) == 0) {
+	split = pk_package_id_split (package_id);
+	split_tmp = pk_package_id_split (package_id_tmp);
+	if (g_strcmp0 (split[PK_PACKAGE_ID_NAME], split_tmp[PK_PACKAGE_ID_NAME]) == 0) {
 		*_path = gtk_tree_path_copy (path);
 		ret = TRUE;
 	}
-	g_free (id_new);
+	g_free (package_id_tmp);
+	g_strfreev (split);
+	g_strfreev (split_tmp);
 	return ret;
 }
 
@@ -518,133 +485,82 @@ gpk_update_viewer_details_cb (PkClient *client, const PkItemDetails *item, gpoin
 
 	gtk_tree_model_get_iter (model, &iter, path);
 	gtk_tree_path_free (path);
-	gtk_array_store_set (array_store_updates, &iter,
+	gtk_list_store_set (array_store_updates, &iter,
 			    GPK_UPDATES_COLUMN_DETAILS_OBJ, (gpointer) pk_details_item_copy (item),
 			    GPK_UPDATES_COLUMN_SIZE, (gint)item->size,
 			    GPK_UPDATES_COLUMN_SIZE_DISPLAY, (gint)item->size,
 			    -1);
 	/* in cache */
 	if (item->size == 0)
-		gtk_array_store_set (array_store_updates, &iter,
+		gtk_list_store_set (array_store_updates, &iter,
 				    GPK_UPDATES_COLUMN_STATUS, GPK_INFO_ENUM_DOWNLOADED, -1);
 }
 
 /**
- * gpk_update_viewer_is_update_info:
- **/
-static gboolean
-gpk_update_viewer_is_update_info (PkInfoEnum info)
-{
-	if (info == PK_INFO_ENUM_LOW)
-		return TRUE;
-	if (info == PK_INFO_ENUM_NORMAL)
-		return TRUE;
-	if (info == PK_INFO_ENUM_IMPORTANT)
-		return TRUE;
-	if (info == PK_INFO_ENUM_SECURITY)
-		return TRUE;
-	if (info == PK_INFO_ENUM_BUGFIX)
-		return TRUE;
-	if (info == PK_INFO_ENUM_ENHANCEMENT)
-		return TRUE;
-	return FALSE;
-}
-
-/**
  * gpk_update_viewer_package_cb:
  **/
 static void
 gpk_update_viewer_package_cb (PkClient *client, const PkItemPackage *item, gpointer data)
 {
-	PkRoleEnum role;
 	PkInfoEnum info;
-	gchar *text = NULL;
 	GtkTreeView *treeview;
 	GtkTreeIter iter;
 	GtkTreeModel *model;
 	GtkTreeViewColumn *column;
 	GtkTreePath *path;
-	gboolean selected;
 	gboolean scroll;
 
-	pk_client_get_role (PK_CLIENT(task), &role, NULL, NULL);
-	egg_debug ("role = %s, package = %s:%s:%s", pk_role_enum_to_text (role),
-		   pk_info_enum_to_text (item->info), "xxx", item->summary);
-
 	/* used for progress */
-	if (!gpk_update_viewer_is_update_info (item->info)) {
-		g_free (package_id_last);
-		package_id_last = pk_package_id_copy (item->package_id);
-
-		/* find model */
-		treeview = GTK_TREE_VIEW (gtk_builder_get_object (builder, "treeview_updates"));
-		model = gtk_tree_view_get_model (treeview);
-
-		/* update icon */
-		path = gpk_update_viewer_model_get_path (model, item->package_id);
-		if (path == NULL) {
-			egg_debug ("not found ID for package");
-			goto out;
-		}
-
-		gtk_tree_model_get_iter (model, &iter, path);
+	g_free (package_id_last);
+	package_id_last = pk_package_id_copy (item->package_id);
 
-		/* scroll to the active cell */
-		scroll = gconf_client_get_bool (gconf_client, GPK_CONF_UPDATE_VIEWER_SCROLL_ACTIVE, NULL);
-		if (scroll) {
-			column = gtk_tree_view_get_column (treeview, 3);
-			gtk_tree_view_scroll_to_cell (treeview, path, column, FALSE, 0.0f, 0.0f);
-		}
+	/* find model */
+	treeview = GTK_TREE_VIEW (gtk_builder_get_object (builder, "treeview_updates"));
+	model = gtk_tree_view_get_model (treeview);
 
-		/* if the info is finished, change the status to past tense */
-		if (item->info == PK_INFO_ENUM_FINISHED) {
-			gtk_tree_model_get (model, &iter,
-					    GPK_UPDATES_COLUMN_STATUS, &info, -1);
-			/* promote to past tense if present tense */
-			if (info < PK_INFO_ENUM_UNKNOWN)
-				info += PK_INFO_ENUM_UNKNOWN;
-		} else {
-			info = item->info;
-		}
-		gtk_array_store_set (array_store_updates, &iter,
-				    GPK_UPDATES_COLUMN_STATUS, info, -1);
+	/* update icon */
+	path = gpk_update_viewer_model_get_path (model, item->package_id);
+	if (path == NULL) {
+		egg_debug ("not found ID for package");
+		goto out;
+	}
 
-		gtk_tree_path_free (path);
+	gtk_tree_model_get_iter (model, &iter, path);
 
-		/* set package description */
-		//widget = GTK_WIDGET (gtk_builder_get_object (builder, "label_package"));
-		//gtk_label_set_label (GTK_LABEL (widget), item->summary);
+	/* scroll to the active cell */
+	scroll = gconf_client_get_bool (gconf_client, GPK_CONF_UPDATE_VIEWER_SCROLL_ACTIVE, NULL);
+	if (scroll) {
+		column = gtk_tree_view_get_column (treeview, 3);
+		gtk_tree_view_scroll_to_cell (treeview, path, column, FALSE, 0.0f, 0.0f);
+	}
 
-		goto out;
+	/* if the info is finished, change the status to past tense */
+	if (item->info == PK_INFO_ENUM_FINISHED) {
+		gtk_tree_model_get (model, &iter,
+				    GPK_UPDATES_COLUMN_STATUS, &info, -1);
+		/* promote to past tense if present tense */
+		if (info < PK_INFO_ENUM_UNKNOWN)
+			info += PK_INFO_ENUM_UNKNOWN;
+	} else {
+		info = item->info;
 	}
+	gtk_list_store_set (array_store_updates, &iter,
+			    GPK_UPDATES_COLUMN_STATUS, info, -1);
 
-	/* add to array store */
-	text = gpk_package_id_format_twoline (item->package_id, item->summary);
-	selected = (item->info != PK_INFO_ENUM_BLOCKED);
-	gtk_array_store_append (array_store_updates, &iter);
-	gtk_array_store_set (array_store_updates, &iter,
-			    GPK_UPDATES_COLUMN_TEXT, text,
-			    GPK_UPDATES_COLUMN_ID, package_id,
-			    GPK_UPDATES_COLUMN_INFO, item->info,
-			    GPK_UPDATES_COLUMN_SELECT, selected,
-			    GPK_UPDATES_COLUMN_SENSITIVE, selected,
-			    GPK_UPDATES_COLUMN_CLICKABLE, selected,
-			    GPK_UPDATES_COLUMN_RESTART, PK_RESTART_ENUM_NONE,
-			    GPK_UPDATES_COLUMN_STATUS, PK_INFO_ENUM_UNKNOWN,
-			    GPK_UPDATES_COLUMN_SIZE, 0,
-			    GPK_UPDATES_COLUMN_SIZE_DISPLAY, 0,
-			    GPK_UPDATES_COLUMN_PERCENTAGE, 0,
-			    GPK_UPDATES_COLUMN_PULSE, -1,
-			    -1);
+	gtk_tree_path_free (path);
+
+	/* set package description */
+	//widget = GTK_WIDGET (gtk_builder_get_object (builder, "label_package"));
+	//gtk_label_set_label (GTK_LABEL (widget), item->summary);
 out:
-	g_free (text);
+	return;
 }
 
 /**
  * gpk_update_viewer_update_detail_cb:
  **/
 static void
-gpk_update_viewer_update_detail_cb (PkClient *client, const PkUpdateDetailObj *item, gpointer data)
+gpk_update_viewer_update_detail_cb (PkClient *client, const PkItemUpdateDetail *item, gpointer data)
 {
 	GtkTreeView *treeview;
 	GtkTreeModel *model;
@@ -662,7 +578,7 @@ gpk_update_viewer_update_detail_cb (PkClient *client, const PkUpdateDetailObj *i
 
 	gtk_tree_model_get_iter (model, &iter, path);
 	gtk_tree_path_free (path);
-	gtk_array_store_set (array_store_updates, &iter,
+	gtk_list_store_set (array_store_updates, &iter,
 			    GPK_UPDATES_COLUMN_UPDATE_DETAIL_OBJ, (gpointer) pk_update_detail_item_copy (item),
 			    GPK_UPDATES_COLUMN_RESTART, item->restart, -1);
 }
@@ -921,7 +837,7 @@ gpk_update_viewer_treeview_update_toggled (GtkCellRendererToggle *cell, gchar *p
 	g_free (package_id);
 
 	/* set new value */
-	gtk_array_store_set (GTK_LIST_STORE (model), &iter, GPK_UPDATES_COLUMN_SELECT, update, -1);
+	gtk_list_store_set (GTK_LIST_STORE (model), &iter, GPK_UPDATES_COLUMN_SELECT, update, -1);
 
 	/* clean up */
 	gtk_tree_path_free (path);
@@ -1190,7 +1106,7 @@ gpk_update_viewer_get_uris (const gchar *url_string)
  * gpk_update_viewer_populate_details:
  **/
 static void
-gpk_update_viewer_populate_details (const PkUpdateDetailObj *item)
+gpk_update_viewer_populate_details (const PkItemUpdateDetail *item)
 {
 	GtkTreeView *treeview;
 	GtkTreeSelection *selection;
@@ -1344,7 +1260,7 @@ gpk_packages_treeview_clicked_cb (GtkTreeSelection *selection, gpointer data)
 	GtkTreeModel *model;
 	GtkTreeIter iter;
 	gchar *package_id;
-	PkUpdateDetailObj *item = NULL;
+	PkItemUpdateDetail *item = NULL;
 
 	/* This will only work in single or browse selection mode! */
 	if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
@@ -1411,71 +1327,83 @@ out:
 }
 
 /**
- * gpk_update_viewer_finished_get_details_cb:
+ * gpk_update_viewer_get_details_cb:
  **/
-static gboolean
-gpk_update_viewer_finished_get_details_cb (GPtrArray *array)
+static void
+gpk_update_viewer_get_details_cb (PkClient *client, GAsyncResult *res, GMainLoop *_loop)
 {
-	gboolean ret;
-	gchar **package_ids;
+	PkResults *results;
 	GError *error = NULL;
-	package_ids = pk_package_sack_get_ids (array);
+	GPtrArray *array = NULL;
+	PkItemDetails *item;
+	guint i;
+	GtkWidget *widget;
+	GtkTreePath *path;
+	GtkTreeModel *model;
+	GtkTreeSelection *selection;
 
-	/* get the details of all the packages */
-	ret = pk_client_get_details (PK_CLIENT(task), package_ids, &error);
-	if (!ret) {
-		egg_error ("cannot get details: %s", error->message);
+	/* get the results */
+	results = pk_client_generic_finish (client, res, &error);
+	if (results == NULL) {
+		egg_warning ("failed to get list of categories: %s", error->message);
 		g_error_free (error);
 		goto out;
 	}
-out:
-	g_strfreev (package_ids);
-	g_ptr_array_unref (array);
-	return FALSE;
-}
 
-/**
- * gpk_update_viewer_finished_get_update_details_cb:
- **/
-static gboolean
-gpk_update_viewer_finished_get_update_details_cb (GPtrArray *array)
-{
-	gboolean ret;
-	gchar **package_ids;
-	GError *error = NULL;
-	package_ids = pk_package_sack_get_ids (array);
-
-	/* get the details of all the packages */
-	ret = pk_client_get_update_detail (PK_CLIENT(task), package_ids, &error);
-	if (!ret) {
-		egg_error ("cannot get details: %s", error->message);
-		g_error_free (error);
-		goto out;
+	/* get data */
+	array = pk_results_get_details_array (results);
+	for (i=0; i<array->len; i++) {
+		item = g_ptr_array_index (array, i);
 	}
+
+	/* select the first entry in the updates array 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));
+	gtk_tree_selection_unselect_all (selection);
+	path = gtk_tree_path_new_first ();
+	gtk_tree_selection_select_path (selection, path);
+	gtk_tree_path_free (path);
+
+	/* set info */
+	gpk_update_viewer_reconsider_info (model);
 out:
-	g_strfreev (package_ids);
-	g_ptr_array_unref (array);
-	return FALSE;
+	if (array != NULL)
+		g_ptr_array_unref (array);
+	if (results != NULL)
+		g_object_unref (results);
 }
 
 /**
- * gpk_update_viewer_finished_get_distro_upgrades_cb:
+ * gpk_update_viewer_get_update_details_cb:
  **/
-static gboolean
-gpk_update_viewer_finished_get_distro_upgrades_cb (gpointer data)
+static void
+gpk_update_viewer_get_update_details_cb (PkClient *client, GAsyncResult *res, GMainLoop *_loop)
 {
-	gboolean ret;
+	PkResults *results;
 	GError *error = NULL;
+	GPtrArray *array = NULL;
+	PkItemUpdateDetail *item;
+	guint i;
 
-	/* get the details of all the packages */
-	ret = pk_client_get_distro_upgrades (PK_CLIENT(task), &error);
-	if (!ret) {
-		egg_error ("cannot get details: %s", error->message);
+	/* get the results */
+	results = pk_client_generic_finish (client, res, &error);
+	if (results == NULL) {
+		egg_warning ("failed to get update details: %s", error->message);
 		g_error_free (error);
 		goto out;
 	}
+
+	/* get data */
+	array = pk_results_get_update_detail_array (results);
+	for (i=0; i<array->len; i++) {
+		item = g_ptr_array_index (array, i);
+	}
+
 out:
-	return FALSE;
+	if (array != NULL)
+		g_ptr_array_unref (array);
+	if (results != NULL)
+		g_object_unref (results);
 }
 
 /**
@@ -1568,7 +1496,7 @@ out:
  * gpk_update_viewer_deps_update_event_cb:
  **/
 static void
-gpk_update_viewer_deps_update_event_cb (GpkHelperDepsUpdate *helper, GtkResponseType type, GPtrArray *deps_array, gpointer data)
+gpk_update_viewer_deps_update_event_cb (gpointer *helper, GtkResponseType type, GPtrArray *deps_array, gpointer data)
 {
 	gboolean ret;
 	GError *error = NULL;
@@ -1609,7 +1537,7 @@ gpk_update_viewer_deps_update_event_cb (GpkHelperDepsUpdate *helper, GtkResponse
 			/* we found a match */
 			if (g_strcmp0 (package_id_temp, item->package_id)) {
 				egg_debug ("selecting %s", id->name);
-				gtk_array_store_set (GTK_LIST_STORE (model), &iter,
+				gtk_list_store_set (GTK_LIST_STORE (model), &iter,
 						    GPK_UPDATES_COLUMN_SELECT, TRUE, -1);
 				found = TRUE;
 			}
@@ -1622,8 +1550,8 @@ gpk_update_viewer_deps_update_event_cb (GpkHelperDepsUpdate *helper, GtkResponse
 		if (!found) {
 			text = gpk_package_id_format_twoline (item->package_id, item->summary);
 			egg_debug ("adding: id=%s, text=%s", item->package_id, text);
-			gtk_array_store_append (array_store_updates, &iter);
-			gtk_array_store_set (array_store_updates, &iter,
+			gtk_list_store_append (array_store_updates, &iter);
+			gtk_list_store_set (array_store_updates, &iter,
 					    GPK_UPDATES_COLUMN_TEXT, text,
 					    GPK_UPDATES_COLUMN_ID, item->package_id,
 					    GPK_UPDATES_COLUMN_INFO, item->info,
@@ -1646,12 +1574,9 @@ gpk_update_viewer_deps_update_event_cb (GpkHelperDepsUpdate *helper, GtkResponse
 	gpk_update_viewer_reconsider_info (model);
 
 	/* actually install packages this time */
-	ret = pk_client_update_packages (PK_CLIENT(task), TRUE, install_package_ids, &error);
-	if (!ret) {
-		egg_warning ("cannot install packages: %s", error->message);
-		g_error_free (error);
-		goto out;
-	}
+	pk_task_update_packages_async (task, install_package_ids, cancellable,
+					 NULL, NULL,
+					(GAsyncReadyCallback) gpk_update_viewer_update_packages_cb, loop);
 out:
 	return;
 }
@@ -1665,17 +1590,12 @@ gpk_update_viewer_finished_cb (PkClient *client, PkExitEnum exit, guint runtime,
 	GtkWidget *widget;
 	GtkWidget *dialog;
 	GtkTreeView *treeview;
-	GtkTreePath *path;
 	GtkTreeModel *model;
-	GtkTreeSelection *selection;
 	PkRoleEnum role;
 	GPtrArray *array;
 	PkRestartEnum restart;
 	gchar *text;
 
-	pk_client_get_role (PK_CLIENT(task), &role, NULL, NULL);
-	egg_debug ("role: %s, exit: %s", pk_role_enum_to_text (role), pk_exit_enum_to_text (exit));
-
 	/* clear package */
 	widget = GTK_WIDGET (gtk_builder_get_object (builder, "label_package"));
 	gtk_label_set_label (GTK_LABEL (widget), "");
@@ -1686,14 +1606,6 @@ gpk_update_viewer_finished_cb (PkClient *client, PkExitEnum exit, guint runtime,
 	widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_quit"));
 	gtk_widget_set_sensitive (widget, TRUE);
 
-	/* if secondary, ignore */
-	if (PK_CLIENT(task) == client &&
-	    (exit == PK_EXIT_ENUM_KEY_REQUIRED ||
-	     exit == PK_EXIT_ENUM_EULA_REQUIRED)) {
-		egg_debug ("ignoring primary sig-required or eula");
-		return;
-	}
-
 	/* get model */
 	treeview = GTK_TREE_VIEW (gtk_builder_get_object (builder, "treeview_updates"));
 	model = gtk_tree_view_get_model (treeview);
@@ -1705,54 +1617,6 @@ gpk_update_viewer_finished_cb (PkClient *client, PkExitEnum exit, guint runtime,
 		return;
 	}
 
-	if (role == PK_ROLE_ENUM_GET_UPDATES) {
-		/* get the download sizes */
-		if (update_array != NULL)
-			g_object_unref (update_array);
-		update_array = pk_results_get_package_array (results);
-
-		/* sort by name */
-		gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model), GPK_UPDATES_COLUMN_ID, GTK_SORT_ASCENDING);
-
-		/* get the download sizes */
-		if (update_array->len > 0)
-			g_idle_add ((GSourceFunc) gpk_update_viewer_finished_get_update_details_cb, g_object_ref (update_array));
-
-		/* set info */
-		gpk_update_viewer_reconsider_info (model);
-	}
-
-	if (role == PK_ROLE_ENUM_GET_UPDATE_DETAIL) {
-		/* get the restarts */
-		g_idle_add ((GSourceFunc) gpk_update_viewer_finished_get_details_cb, g_object_ref (update_array));
-
-		/* are now able to do action */
-		widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_install"));
-		gtk_widget_set_sensitive (widget, TRUE);
-
-		/* set info */
-		gpk_update_viewer_reconsider_info (model);
-	}
-
-	if (role == PK_ROLE_ENUM_GET_DETAILS) {
-
-		/* select the first entry in the updates array 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));
-		gtk_tree_selection_unselect_all (selection);
-		path = gtk_tree_path_new_first ();
-		gtk_tree_selection_select_path (selection, path);
-		gtk_tree_path_free (path);
-
-		/* set info */
-		gpk_update_viewer_reconsider_info (model);
-	}
-
-	if (role == PK_ROLE_ENUM_GET_DISTRO_UPGRADES) {
-		/* set info */
-		gpk_update_viewer_reconsider_info (model);
-	}
-
 	/* we've just agreed to auth or a EULA */
 	if (role == PK_ROLE_ENUM_INSTALL_SIGNATURE ||
 	    role == PK_ROLE_ENUM_ACCEPT_EULA) {
@@ -1900,7 +1764,7 @@ gpk_update_viewer_pulse_active_rows (void)
 		if (path) {
 			gtk_tree_model_get_iter (model, &iter, path);
 			gtk_tree_model_get (model, &iter, GPK_UPDATES_COLUMN_PULSE, &val, -1);
-			gtk_array_store_set (GTK_LIST_STORE (model), &iter, GPK_UPDATES_COLUMN_PULSE, val + 1, -1);
+			gtk_list_store_set (GTK_LIST_STORE (model), &iter, GPK_UPDATES_COLUMN_PULSE, val + 1, -1);
 			gtk_tree_path_free (path);
 		}
 	}
@@ -1935,7 +1799,7 @@ gpk_update_viewer_remove_active_row (GtkTreeModel *model, GtkTreePath *path)
 	GtkTreeIter iter;
 
 	gtk_tree_model_get_iter (model, &iter, path);
-	gtk_array_store_set (GTK_LIST_STORE (model), &iter, GPK_UPDATES_COLUMN_PULSE, -1, -1);
+	gtk_list_store_set (GTK_LIST_STORE (model), &iter, GPK_UPDATES_COLUMN_PULSE, -1, -1);
 
 	ref = gtk_tree_row_reference_new (model, path);
 	link = g_slist_find_custom (active_rows, (gconstpointer)ref, (GCompareFunc)gpk_update_viewer_compare_refs);
@@ -2000,7 +1864,7 @@ gpk_update_viewer_progress_changed_cb (PkClient *client, guint percentage, guint
 	}
 
 	size_display = size - ((size * subpercentage) / 100);
-	gtk_array_store_set (array_store_updates, &iter,
+	gtk_list_store_set (array_store_updates, &iter,
 			    GPK_UPDATES_COLUMN_PERCENTAGE, subpercentage,
 			    GPK_UPDATES_COLUMN_SIZE_DISPLAY, size_display,
 			    -1);
@@ -2061,7 +1925,7 @@ gpk_update_viewer_detail_popup_menu_select_all (GtkWidget *menuitem, gpointer us
 	while (valid) {
 		gtk_tree_model_get (model, &iter, GPK_UPDATES_COLUMN_INFO, &info, -1);
 		if (info != PK_INFO_ENUM_BLOCKED)
-			gtk_array_store_set (GTK_LIST_STORE (model), &iter,
+			gtk_list_store_set (GTK_LIST_STORE (model), &iter,
 					    GPK_UPDATES_COLUMN_SELECT, TRUE, -1);
 		valid = gtk_tree_model_iter_next (model, &iter);
 	}
@@ -2089,7 +1953,7 @@ gpk_update_viewer_detail_popup_menu_select_security (GtkWidget *menuitem, gpoint
 	while (valid) {
 		gtk_tree_model_get (model, &iter, GPK_UPDATES_COLUMN_INFO, &info, -1);
 		ret = (info == PK_INFO_ENUM_SECURITY);
-		gtk_array_store_set (GTK_LIST_STORE (model), &iter,
+		gtk_list_store_set (GTK_LIST_STORE (model), &iter,
 				    GPK_UPDATES_COLUMN_SELECT, ret, -1);
 		valid = gtk_tree_model_iter_next (model, &iter);
 	}
@@ -2114,7 +1978,7 @@ gpk_update_viewer_detail_popup_menu_select_none (GtkWidget *menuitem, gpointer u
 	valid = gtk_tree_model_get_iter_first (model, &iter);
 	while (valid) {
 		gtk_tree_model_get (model, &iter, -1);
-		gtk_array_store_set (GTK_LIST_STORE (model), &iter,
+		gtk_list_store_set (GTK_LIST_STORE (model), &iter,
 				    GPK_UPDATES_COLUMN_SELECT, FALSE, -1);
 		valid = gtk_tree_model_iter_next (model, &iter);
 	}
@@ -2270,19 +2134,112 @@ gpk_update_viewer_message_received_cb (UniqueApp *app, UniqueCommand command, Un
 }
 
 /**
+ * gpk_update_viewer_get_updates_cb:
+ **/
+static void
+gpk_update_viewer_get_updates_cb (PkClient *client, GAsyncResult *res, GMainLoop *_loop)
+{
+	PkResults *results;
+	GError *error = NULL;
+	GPtrArray *array = NULL;
+	PkItemPackage *item;
+	gchar *text = NULL;
+	gboolean selected;
+	GtkTreeIter iter;
+	guint i;
+	gchar **package_ids;
+	GtkTreeView *treeview;
+	GtkTreeModel *model;
+	GtkWidget *widget;
+
+	/* get the results */
+	results = pk_client_generic_finish (client, res, &error);
+	if (results == NULL) {
+		egg_warning ("failed to get list of updates: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+
+	/* get data */
+	array = pk_results_get_package_array (results);
+	for (i=0; i<array->len; i++) {
+		item = g_ptr_array_index (array, i);
+
+		/* add to array store */
+		text = gpk_package_id_format_twoline (item->package_id, item->summary);
+		selected = (item->info != PK_INFO_ENUM_BLOCKED);
+		gtk_list_store_append (array_store_updates, &iter);
+		gtk_list_store_set (array_store_updates, &iter,
+				    GPK_UPDATES_COLUMN_TEXT, text,
+				    GPK_UPDATES_COLUMN_ID, item->package_id,
+				    GPK_UPDATES_COLUMN_INFO, item->info,
+				    GPK_UPDATES_COLUMN_SELECT, selected,
+				    GPK_UPDATES_COLUMN_SENSITIVE, selected,
+				    GPK_UPDATES_COLUMN_CLICKABLE, selected,
+				    GPK_UPDATES_COLUMN_RESTART, PK_RESTART_ENUM_NONE,
+				    GPK_UPDATES_COLUMN_STATUS, PK_INFO_ENUM_UNKNOWN,
+				    GPK_UPDATES_COLUMN_SIZE, 0,
+				    GPK_UPDATES_COLUMN_SIZE_DISPLAY, 0,
+				    GPK_UPDATES_COLUMN_PERCENTAGE, 0,
+				    GPK_UPDATES_COLUMN_PULSE, -1,
+				    -1);
+		g_free (text);
+	}
+
+	/* get the download sizes */
+	if (update_array != NULL)
+		g_ptr_array_unref (update_array);
+	update_array = pk_results_get_package_array (results);
+
+	/* sort by name */
+	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model), GPK_UPDATES_COLUMN_ID, GTK_SORT_ASCENDING);
+
+	/* get the download sizes */
+	if (update_array->len > 0) {
+		package_ids = pk_package_sack_get_ids (array);
+
+		/* get the details of all the packages */
+		pk_client_get_update_detail_async (PK_CLIENT(task), package_ids, cancellable,
+						   NULL, NULL,
+						   (GAsyncReadyCallback) gpk_update_viewer_get_details_cb, loop);
+
+		/* get the details of all the packages */
+		pk_client_get_details_async (PK_CLIENT(task), package_ids, cancellable,
+					     NULL, NULL,
+					     (GAsyncReadyCallback) gpk_update_viewer_get_details_cb, loop);
+
+		g_strfreev (package_ids);
+	}
+
+	/* are now able to do action */
+	widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_install"));
+	gtk_widget_set_sensitive (widget, TRUE);
+
+	/* set info */
+	treeview = GTK_TREE_VIEW (gtk_builder_get_object (builder, "treeview_updates"));
+	model = gtk_tree_view_get_model (treeview);
+	gpk_update_viewer_reconsider_info (model);
+
+out:
+	if (array != NULL)
+		g_ptr_array_unref (array);
+	if (results != NULL)
+		g_object_unref (results);
+}
+
+/**
  * gpk_update_viewer_get_new_update_array
  **/
 static gboolean
 gpk_update_viewer_get_new_update_array (void)
 {
 	gboolean ret;
-	GError *error = NULL;
 	GtkWidget *widget;
 	gchar *text = NULL;
 	PkBitfield filter = PK_FILTER_ENUM_NONE;
 
 	/* clear all widgets */
-	gtk_array_store_clear (array_store_updates);
+	gtk_list_store_clear (array_store_updates);
 	gtk_text_buffer_set_text (text_buffer, "", -1);
 
 	widget = GTK_WIDGET (gtk_builder_get_object (builder, "label_header_title"));
@@ -2293,17 +2250,14 @@ gpk_update_viewer_get_new_update_array (void)
 	/* only show newest updates? */
 	ret = gconf_client_get_bool (gconf_client, GPK_CONF_UPDATE_VIEWER_ONLY_NEWEST, NULL);
 	if (ret) {
-		egg_warning ("only showing newest updates");
+		egg_debug ("only showing newest updates");
 		filter = pk_bitfield_from_enums (PK_FILTER_ENUM_NEWEST, -1);
 	}
 
 	/* get new array */
-	ret = pk_client_get_updates (PK_CLIENT(task), filter, &error);
-	if (!ret) {
-		egg_warning ("Failed to get updates: %s", error->message);
-		g_error_free (error);
-	}
-out:
+	pk_client_get_updates_async (PK_CLIENT(task), filter, cancellable,
+				     NULL, NULL,
+				     (GAsyncReadyCallback) gpk_update_viewer_get_updates_cb, loop);
 	g_free (text);
 	return ret;
 }
@@ -2320,31 +2274,6 @@ gpk_update_viewer_allow_cancel_cb (PkClient *client, gboolean allow_cancel, gpoi
 }
 
 /**
- * pk_client_distro_upgrade_cb:
- **/
-static void
-pk_client_distro_upgrade_cb (PkClient *client, const PkItemDistroUpgrade *item, gpointer data)
-{
-	gchar *text;
-	gchar *text_format;
-	GtkWidget *widget;
-
-	if (item->state != PK_UPDATE_STATE_ENUM_STABLE)
-		return;
-
-	/* only display last (newest) distro */
-	widget = GTK_WIDGET (gtk_builder_get_object (builder, "label_upgrade"));
-	/* TRANSLATORS: new distro available, e.g. F9 to F10 */
-	text = g_strdup_printf (_("New distribution upgrade release '%s' is available"), item->summary);
-	text_format = g_strdup_printf ("<b>%s</b>", text);
-	gtk_label_set_label (GTK_LABEL (widget), text_format);
-	g_free (text);
-	g_free (text_format);
-	widget = GTK_WIDGET (gtk_builder_get_object (builder, "viewport_upgrade"));
-	gtk_widget_show (widget);
-}
-
-/**
  * gpk_update_viewer_textview_follow_link:
  *
  * Looks at all tags covering the position of iter in the text view,
@@ -2561,14 +2490,85 @@ gpk_update_viewer_search_equal_func (GtkTreeModel *model, gint column, const gch
 }
 
 /**
- * pk_prefs_get_properties_cb:
+ * gpk_update_viewer_get_distro_upgrades_best:
+ **/
+static PkItemDistroUpgrade *
+gpk_update_viewer_get_distro_upgrades_best (GPtrArray *array)
+{
+	PkItemDistroUpgrade *item;
+	guint i;
+
+	/* find a stable update */
+	for (i=0; i<array->len; i++) {
+		item = g_ptr_array_index (array, i);
+		if (item->state == PK_UPDATE_STATE_ENUM_STABLE)
+			goto out;
+	}
+	item = NULL;
+out:
+	return item;
+}
+
+/**
+ * gpk_update_viewer_get_distro_upgrades_cb:
  **/
 static void
-pk_prefs_get_properties_cb (GObject *object, GAsyncResult *res, GMainLoop *loop)
+gpk_update_viewer_get_distro_upgrades_cb (PkClient *client, GAsyncResult *res, GMainLoop *_loop)
 {
+	PkResults *results;
+	GError *error = NULL;
+	GPtrArray *array = NULL;
+	PkItemDistroUpgrade *item;
+	gchar *text = NULL;
+	gchar *text_format = NULL;
 	GtkWidget *widget;
+	GtkTreeView *treeview;
+	GtkTreeModel *model;
+
+	/* get the results */
+	results = pk_client_generic_finish (client, res, &error);
+	if (results == NULL) {
+		egg_warning ("failed to get list of distro upgrades: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+
+	/* get data */
+	array = pk_results_get_distro_upgrade_array (results);
+	item = gpk_update_viewer_get_distro_upgrades_best (array);
+	if (item == NULL)
+		goto out;
+
+	/* only display last (newest) distro */
+	widget = GTK_WIDGET (gtk_builder_get_object (builder, "label_upgrade"));
+	/* TRANSLATORS: new distro available, e.g. F9 to F10 */
+	text = g_strdup_printf (_("New distribution upgrade release '%s' is available"), item->summary);
+	text_format = g_strdup_printf ("<b>%s</b>", text);
+	gtk_label_set_label (GTK_LABEL (widget), text_format);
+
+	widget = GTK_WIDGET (gtk_builder_get_object (builder, "viewport_upgrade"));
+	gtk_widget_show (widget);
+
+	/* get model */
+	treeview = GTK_TREE_VIEW (gtk_builder_get_object (builder, "treeview_updates"));
+	model = gtk_tree_view_get_model (treeview);
+	gpk_update_viewer_reconsider_info (model);
+out:
+	g_free (text);
+	g_free (text_format);
+	if (array != NULL)
+		g_ptr_array_unref (array);
+	if (results != NULL)
+		g_object_unref (results);
+}
+/**
+ * gpk_update_viewer_get_properties_cb:
+ **/
+static void
+gpk_update_viewer_get_properties_cb (PkControl *_control, GAsyncResult *res, GMainLoop *_loop)
+{
+//	GtkWidget *widget;
 	GError *error = NULL;
-	PkControl *control = PK_CONTROL(object);
 	gboolean ret;
 	PkBitfield roles;
 
@@ -2588,8 +2588,11 @@ pk_prefs_get_properties_cb (GObject *object, GAsyncResult *res, GMainLoop *loop)
 		      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);
+	if (pk_bitfield_contain (roles, PK_ROLE_ENUM_GET_DISTRO_UPGRADES)) {
+		pk_client_get_distro_upgrades_async (PK_CLIENT(task), cancellable,
+						     NULL, NULL,
+						     (GAsyncReadyCallback) gpk_update_viewer_get_distro_upgrades_cb, loop);
+	}
 out:
 	return;
 }
@@ -2669,6 +2672,7 @@ main (int argc, char *argv[])
 
 	g_signal_connect (unique_app, "message-received", G_CALLBACK (gpk_update_viewer_message_received_cb), NULL);
 
+	cancellable = g_cancellable_new ();
 	markdown = egg_markdown_new ();
 	egg_markdown_set_output (markdown, EGG_MARKDOWN_OUTPUT_PANGO);
 	egg_markdown_set_escape (markdown, TRUE);
@@ -2681,10 +2685,10 @@ main (int argc, char *argv[])
 			  G_CALLBACK (gpk_update_viewer_updates_changed_cb), NULL);
 
 	/* this is what we use mainly */
-	client = PK_TASK(gpk_task_new ());
+	task = PK_TASK(gpk_task_new ());
 
 	/* get properties */
-	pk_control_get_properties_async (control, NULL, (GAsyncReadyCallback) pk_prefs_get_properties_cb, loop);
+	pk_control_get_properties_async (control, NULL, (GAsyncReadyCallback) gpk_update_viewer_get_properties_cb, loop);
 
 	/* get UI */
 	builder = gtk_builder_new ();
@@ -2700,7 +2704,7 @@ main (int argc, char *argv[])
 	gtk_window_set_icon_name (GTK_WINDOW (main_window), GPK_ICON_SOFTWARE_INSTALLER);
 
 	/* create array stores */
-	array_store_updates = gtk_array_store_new (GPK_UPDATES_COLUMN_LAST, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT,
+	array_store_updates = gtk_list_store_new (GPK_UPDATES_COLUMN_LAST, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT,
 						 G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
 						 G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT,
 						 G_TYPE_UINT, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_INT);
@@ -2811,11 +2815,7 @@ main (int argc, char *argv[])
 	g_main_loop_run (loop);
 
 	/* we might have visual stuff running, close it down */
-	ret = g_cancellable_cancel (PK_CLIENT(task), &error);
-	if (!ret) {
-		egg_warning ("failed to cancel client: %s", error->message);
-		g_clear_error (&error);
-	}
+	g_cancellable_cancel (cancellable);
 
 	g_main_loop_unref (loop);
 
@@ -2830,7 +2830,8 @@ out_build:
 	g_object_unref (gconf_client);
 	g_object_unref (control);
 	g_object_unref (markdown);
-	g_object_unref (PK_CLIENT(task));
+	g_object_unref (cancellable);
+	g_object_unref (task);
 	g_object_unref (console);
 	g_object_unref (builder);
 unique_out:



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