[gnome-packagekit] Use a PkPackageList in gpk-appliction to store the package list, and remove some insanity with saved



commit 1932188060399a32eacadfe5c179f3033400448d
Author: Richard Hughes <richard hughsie com>
Date:   Wed Jul 1 13:28:43 2009 +0100

    Use a PkPackageList in gpk-appliction to store the package list, and remove some insanity with saved state

 src/gpk-application.c         |  246 +++++++++++++++++++++++++++-------------
 src/gpk-helper-deps-install.c |    4 +-
 src/gpk-helper-deps-install.h |    2 +-
 src/gpk-helper-deps-remove.c  |    6 +-
 src/gpk-helper-deps-remove.h  |    2 +-
 5 files changed, 173 insertions(+), 87 deletions(-)
---
diff --git a/src/gpk-application.c b/src/gpk-application.c
index 2329c7e..ed36068 100644
--- a/src/gpk-application.c
+++ b/src/gpk-application.c
@@ -90,7 +90,6 @@ struct GpkApplicationPrivate
 	PkClient		*client_secondary;
 	PkConnection		*pconnection;
 	PkDesktop		*desktop;
-	gchar			*package;
 	gchar			*group;
 	gchar			*url;
 	gchar			*search_text;
@@ -104,7 +103,7 @@ struct GpkApplicationPrivate
 	PkSearchType		 search_type;
 	PkSearchMode		 search_mode;
 	PkActionMode		 action;
-	GPtrArray		*package_list;
+	PkPackageList		*package_list;
 	GtkWidget		*image_status;
 	GpkHelperRepoSignature	*helper_repo_signature;
 	GpkHelperEula		*helper_eula;
@@ -360,11 +359,13 @@ gpk_application_set_buttons_apply_clear (GpkApplication *application)
 	PkBitfield state;
 	gboolean enabled;
 	gchar *package_id;
+	gint len;
 
 	g_return_if_fail (GPK_IS_APPLICATION (application));
 
 	/* okay to apply? */
-	if (application->priv->package_list->len == 0) {
+	len = PK_OBJ_LIST (application->priv->package_list)->len;
+	if (len == 0) {
 		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "button_apply"));
 		gtk_widget_set_sensitive (widget, FALSE);
 		widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "button_clear"));
@@ -403,46 +404,71 @@ gpk_application_set_buttons_apply_clear (GpkApplication *application)
 	}
 }
 
+
+
 /**
- * gpk_application_find_in_queue:
+ * gpk_application_get_selected_package:
  **/
-static gchar *
-gpk_application_find_in_queue (GpkApplication *application, const gchar *package_id)
+static gboolean
+gpk_application_get_selected_package (GpkApplication *application, gchar **package_id, gchar **summary)
 {
-	guint i;
-	gchar *value;
+	GtkTreeView *treeview;
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	GtkTreeSelection *selection;
+	gboolean ret;
+
+	/* get the selection and add */
+	treeview = GTK_TREE_VIEW (gtk_builder_get_object (application->priv->builder, "treeview_packages"));
+	selection = gtk_tree_view_get_selection (treeview);
+	ret = gtk_tree_selection_get_selected (selection, &model, &iter);
+	if (!ret) {
+		egg_warning ("no selection");
+		goto out;
+	}
 
-	for (i=0; i<application->priv->package_list->len; i++) {
-		value = g_ptr_array_index (application->priv->package_list, i);
-		if (strcmp (value, package_id) == 0)
-			return value;
+	/* get data */
+	if (summary == NULL) {
+		gtk_tree_model_get (model, &iter,
+				    PACKAGES_COLUMN_ID, package_id,
+				    -1);
+	} else {
+		gtk_tree_model_get (model, &iter,
+				    PACKAGES_COLUMN_ID, package_id,
+				    PACKAGES_COLUMN_SUMMARY, summary,
+				    -1);
 	}
-	return NULL;
+out:
+	return ret;
 }
 
+
 /**
  * gpk_application_install:
  **/
 static gboolean
 gpk_application_install (GpkApplication *application)
 {
-	gchar *value;
+	gboolean ret;
+	PkPackageId *id;
+	gchar *package_id_selected = NULL;
+	gchar *summary_selected = NULL;
 
 	g_return_val_if_fail (GPK_IS_APPLICATION (application), FALSE);
 
-	/* shouldn't be possible */
-	if (application->priv->package == NULL) {
-		egg_warning ("no package");
-		return FALSE;
+	/* get selection */
+	ret = gpk_application_get_selected_package (application, &package_id_selected, &summary_selected);
+	if (!ret) {
+		egg_warning ("no package selected");
+		goto out;
 	}
 
 	/* changed mind, or wrong mode */
 	if (application->priv->action == PK_ACTION_REMOVE) {
-		value = gpk_application_find_in_queue (application, application->priv->package);
-		if (value != NULL) {
-			egg_debug ("removed %s from package list", value);
-			g_ptr_array_remove (application->priv->package_list, value);
-			g_free (value);
+		ret = pk_package_list_contains (application->priv->package_list, package_id_selected);
+		if (ret) {
+			egg_debug ("removed %s from package list", package_id_selected);
+			pk_package_list_remove (application->priv->package_list, package_id_selected);
 
 			/* correct buttons */
 			gpk_application_allow_install (application, FALSE);
@@ -456,21 +482,29 @@ gpk_application_install (GpkApplication *application)
 	}
 
 	/* already added */
-	value = gpk_application_find_in_queue (application, application->priv->package);
-	if (value != NULL) {
+	ret = !pk_package_list_contains (application->priv->package_list, package_id_selected);
+	if (!ret) {
 		egg_warning ("already added");
-		return FALSE;
+		goto out;
 	}
 
+	/* set mode */
 	application->priv->action = PK_ACTION_INSTALL;
-	g_ptr_array_add (application->priv->package_list, g_strdup (application->priv->package));
+
+	/* add to list */
+	id = pk_package_id_new_from_string (package_id_selected);
+	pk_package_list_add (application->priv->package_list, PK_INFO_ENUM_AVAILABLE, id, summary_selected);
+	pk_package_id_free (id);
 
 	/* correct buttons */
 	gpk_application_allow_install (application, FALSE);
 	gpk_application_allow_remove (application, TRUE);
 	gpk_application_packages_checkbox_invert (application);
 	gpk_application_set_buttons_apply_clear (application);
-	return TRUE;
+out:
+	g_free (package_id_selected);
+	g_free (summary_selected);
+	return ret;
 }
 
 /**
@@ -501,9 +535,17 @@ gpk_application_menu_files_cb (GtkAction *action, GpkApplication *application)
 	gboolean ret;
 	GError *error = NULL;
 	gchar **package_ids = NULL;
+	gchar *package_id_selected = NULL;
 
 	g_return_if_fail (GPK_IS_APPLICATION (application));
 
+	/* get selection */
+	ret = gpk_application_get_selected_package (application, &package_id_selected, NULL);
+	if (!ret) {
+		egg_warning ("no package selected");
+		goto out;
+	}
+
 	/* reset client */
 	ret = pk_client_reset (application->priv->client_primary, &error);
 	if (!ret) {
@@ -513,14 +555,15 @@ gpk_application_menu_files_cb (GtkAction *action, GpkApplication *application)
 	}
 
 	/* set correct view */
-	package_ids = pk_package_ids_from_id (application->priv->package);
+	package_ids = pk_package_ids_from_id (package_id_selected);
 	ret = pk_client_get_files (application->priv->client_primary, package_ids, &error);
 	if (!ret) {
-		egg_warning ("cannot get file lists for %s: %s", application->priv->package, error->message);
+		egg_warning ("cannot get file lists for %s: %s", package_id_selected, error->message);
 		g_error_free (error);
 		goto out;
 	}
 out:
+	g_free (package_id_selected);
 	g_strfreev (package_ids);
 }
 
@@ -530,23 +573,26 @@ out:
 static gboolean
 gpk_application_remove (GpkApplication *application)
 {
-	gchar *value;
+	gboolean ret;
+	PkPackageId *id;
+	gchar *package_id_selected = NULL;
+	gchar *summary_selected = NULL;
 
 	g_return_val_if_fail (GPK_IS_APPLICATION (application), FALSE);
 
-	/* shouldn't be possible */
-	if (application->priv->package == NULL) {
-		egg_warning ("no package");
-		return FALSE;
+	/* get selection */
+	ret = gpk_application_get_selected_package (application, &package_id_selected, &summary_selected);
+	if (!ret) {
+		egg_warning ("no package selected");
+		goto out;
 	}
 
 	/* changed mind, or wrong mode */
 	if (application->priv->action == PK_ACTION_INSTALL) {
-		value = gpk_application_find_in_queue (application, application->priv->package);
-		if (value != NULL) {
-			egg_debug ("removed %s from package list", value);
-			g_ptr_array_remove (application->priv->package_list, value);
-			g_free (value);
+		ret = pk_package_list_contains (application->priv->package_list, package_id_selected);
+		if (ret) {
+			egg_debug ("removed %s from package list", package_id_selected);
+			pk_package_list_remove (application->priv->package_list, package_id_selected);
 
 			/* correct buttons */
 			gpk_application_allow_install (application, TRUE);
@@ -560,20 +606,25 @@ gpk_application_remove (GpkApplication *application)
 	}
 
 	/* already added */
-	value = gpk_application_find_in_queue (application, application->priv->package);
-	if (value != NULL) {
+	ret = !pk_package_list_contains (application->priv->package_list, package_id_selected);
+	if (!ret) {
 		egg_warning ("already added");
-		return FALSE;
+		goto out;
 	}
 
 	application->priv->action = PK_ACTION_REMOVE;
-	g_ptr_array_add (application->priv->package_list, g_strdup (application->priv->package));
+	id = pk_package_id_new_from_string (package_id_selected);
+	pk_package_list_add (application->priv->package_list, PK_INFO_ENUM_AVAILABLE, id, summary_selected);
+	pk_package_id_free (id);
 
 	/* correct buttons */
 	gpk_application_allow_install (application, TRUE);
 	gpk_application_allow_remove (application, FALSE);
 	gpk_application_packages_checkbox_invert (application);
 	gpk_application_set_buttons_apply_clear (application);
+out:
+	g_free (package_id_selected);
+	g_free (summary_selected);
 	return TRUE;
 }
 
@@ -643,6 +694,14 @@ gpk_application_menu_requires_cb (GtkAction *action, GpkApplication *application
 	GError *error = NULL;
 	gboolean ret;
 	gchar **package_ids = NULL;
+	gchar *package_id_selected = NULL;
+
+	/* get selection */
+	ret = gpk_application_get_selected_package (application, &package_id_selected, NULL);
+	if (!ret) {
+		egg_warning ("no package selected");
+		goto out;
+	}
 
 	/* cancel any previous request */
 	ret = pk_client_reset (application->priv->client_primary, &error);
@@ -653,7 +712,7 @@ gpk_application_menu_requires_cb (GtkAction *action, GpkApplication *application
 	}
 
 	/* get the requires */
-	package_ids = pk_package_ids_from_id (application->priv->package);
+	package_ids = pk_package_ids_from_id (package_id_selected);
 	application->priv->dep_check_info_only = TRUE;
 	ret = pk_client_get_requires (application->priv->client_primary, PK_FILTER_ENUM_NONE,
 				      package_ids, TRUE, &error);
@@ -663,6 +722,7 @@ gpk_application_menu_requires_cb (GtkAction *action, GpkApplication *application
 		goto out;
 	}
 out:
+	g_free (package_id_selected);
 	g_strfreev (package_ids);
 }
 
@@ -675,6 +735,14 @@ gpk_application_menu_depends_cb (GtkAction *action, GpkApplication *application)
 	GError *error = NULL;
 	gboolean ret;
 	gchar **package_ids = NULL;
+	gchar *package_id_selected = NULL;
+
+	/* get selection */
+	ret = gpk_application_get_selected_package (application, &package_id_selected, NULL);
+	if (!ret) {
+		egg_warning ("no package selected");
+		goto out;
+	}
 
 	/* cancel any previous request */
 	ret = pk_client_reset (application->priv->client_primary, &error);
@@ -685,7 +753,7 @@ gpk_application_menu_depends_cb (GtkAction *action, GpkApplication *application)
 	}
 
 	/* get the depends */
-	package_ids = pk_package_ids_from_id (application->priv->package);
+	package_ids = pk_package_ids_from_id (package_id_selected);
 	application->priv->dep_check_info_only = TRUE;
 	ret = pk_client_get_depends (application->priv->client_primary, PK_FILTER_ENUM_NONE,
 				     package_ids, TRUE, &error);
@@ -695,6 +763,7 @@ gpk_application_menu_depends_cb (GtkAction *action, GpkApplication *application)
 		goto out;
 	}
 out:
+	g_free (package_id_selected);
 	g_strfreev (package_ids);
 }
 
@@ -963,7 +1032,7 @@ gpk_application_package_cb (PkClient *client, const PkPackageObj *obj, GpkApplic
 	application->priv->has_package = TRUE;
 
 	/* are we in the package list? */
-	in_queue = (gpk_application_find_in_queue (application, package_id) != NULL);
+	in_queue = pk_package_list_contains (application->priv->package_list, package_id);
 	installed = (obj->info == PK_INFO_ENUM_INSTALLED) || (obj->info == PK_INFO_ENUM_COLLECTION_INSTALLED);
 
 	if (installed)
@@ -1089,6 +1158,15 @@ gpk_application_finished_get_depends (GpkApplication *application, PkPackageList
 	gchar **package_ids = NULL;
 	guint length;
 	GtkWidget *dialog;
+	gchar *package_id_selected = NULL;
+	gboolean ret;
+
+	/* get selection */
+	ret = gpk_application_get_selected_package (application, &package_id_selected, NULL);
+	if (!ret) {
+		egg_warning ("no package selected");
+		goto out;
+	}
 
 	/* empty list */
 	window = GTK_WINDOW (gtk_builder_get_object (application->priv->builder, "window_manager"));
@@ -1102,7 +1180,7 @@ gpk_application_finished_get_depends (GpkApplication *application, PkPackageList
 	}
 
 	length = pk_package_list_get_size (list);
-	package_ids = pk_package_ids_from_id (application->priv->package);
+	package_ids = pk_package_ids_from_id (package_id_selected);
 	name = gpk_dialog_package_id_name_join_locale (package_ids);
 	/* TRANSLATORS: title: show the number of other packages we depend on */
 	title = g_strdup_printf (ngettext ("%i additional package is required for %s",
@@ -1122,6 +1200,7 @@ gpk_application_finished_get_depends (GpkApplication *application, PkPackageList
 	gtk_dialog_run (GTK_DIALOG (dialog));
 	gtk_widget_destroy (GTK_WIDGET (dialog));
 out:
+	g_free (package_id_selected);
 	g_strfreev (package_ids);
 	g_free (name);
 	g_free (title);
@@ -1141,6 +1220,15 @@ gpk_application_finished_get_requires (GpkApplication *application, PkPackageLis
 	gchar **package_ids = NULL;
 	guint length;
 	GtkWidget *dialog;
+	gchar *package_id_selected = NULL;
+	gboolean ret;
+
+	/* get selection */
+	ret = gpk_application_get_selected_package (application, &package_id_selected, NULL);
+	if (!ret) {
+		egg_warning ("no package selected");
+		goto out;
+	}
 
 	/* empty list */
 	window = GTK_WINDOW (gtk_builder_get_object (application->priv->builder, "window_manager"));
@@ -1154,7 +1242,7 @@ gpk_application_finished_get_requires (GpkApplication *application, PkPackageLis
 	}
 
 	length = pk_package_list_get_size (list);
-	package_ids = pk_package_ids_from_id (application->priv->package);
+	package_ids = pk_package_ids_from_id (package_id_selected);
 	name = gpk_dialog_package_id_name_join_locale (package_ids);
 	/* TRANSLATORS: title: how many packages require this package */
 	title = g_strdup_printf (ngettext ("%i package requires %s",
@@ -1174,6 +1262,7 @@ gpk_application_finished_get_requires (GpkApplication *application, PkPackageLis
 	gtk_dialog_run (GTK_DIALOG (dialog));
 	gtk_widget_destroy (GTK_WIDGET (dialog));
 out:
+	g_free (package_id_selected);
 	g_strfreev (package_ids);
 	g_free (name);
 	g_free (title);
@@ -1397,8 +1486,7 @@ gpk_application_finished_cb (PkClient *client, PkExitEnum exit_enum, guint runti
 			gpk_application_run_installed (application);
 
 			/* clear if success */
-			g_ptr_array_foreach (application->priv->package_list, (GFunc) g_free, NULL);
-			g_ptr_array_set_size (application->priv->package_list, 0);
+			pk_obj_list_clear (PK_OBJ_LIST (application->priv->package_list));
 			application->priv->action = PK_ACTION_NONE;
 			gpk_application_set_buttons_apply_clear (application);
 		}
@@ -1611,6 +1699,7 @@ gpk_application_find_cb (GtkWidget *button_widget, GpkApplication *application)
 static gboolean
 gpk_application_quit (GpkApplication *application)
 {
+	gint len;
 	gboolean ret;
 	GtkResponseType result;
 	GError *error = NULL;
@@ -1620,7 +1709,8 @@ gpk_application_quit (GpkApplication *application)
 	g_return_val_if_fail (GPK_IS_APPLICATION (application), FALSE);
 
 	/* do we have any items queued for removal or installation? */
-	if (application->priv->package_list->len != 0) {
+	len = PK_OBJ_LIST (application->priv->package_list)->len;
+	if (len != 0) {
 		window = GTK_WINDOW (gtk_builder_get_object (application->priv->builder, "window_manager"));
 		dialog = gtk_message_dialog_new (window, GTK_DIALOG_MODAL,
 						 GTK_MESSAGE_WARNING, GTK_BUTTONS_CANCEL,
@@ -1739,10 +1829,9 @@ gpk_application_packages_installed_clicked_cb (GtkCellRendererToggle *cell, gcha
 
 	/* get toggled iter */
 	gtk_tree_model_get_iter (model, &iter, path);
-	g_free (application->priv->package);
 	gtk_tree_model_get (model, &iter,
 			    PACKAGES_COLUMN_STATE, &state,
-			    PACKAGES_COLUMN_ID, &application->priv->package, -1);
+			    -1);
 
 	/* enforce the selection in case we just fire at the checkbox without selecting */
 	selection = gtk_tree_view_get_selection (treeview);
@@ -1811,8 +1900,7 @@ gpk_application_button_clear_cb (GtkWidget *widget_button, GpkApplication *appli
 	}
 
 	/* clear queue */
-	g_ptr_array_foreach (application->priv->package_list, (GFunc) g_free, NULL);
-	g_ptr_array_set_size (application->priv->package_list, 0);
+	pk_obj_list_clear (PK_OBJ_LIST (application->priv->package_list));
 
 	/* force a button refresh */
 	selection = gtk_tree_view_get_selection (treeview);
@@ -1833,7 +1921,7 @@ gpk_application_button_apply_cb (GtkWidget *widget, GpkApplication *application)
 
 	g_return_if_fail (GPK_IS_APPLICATION (application));
 
-	package_ids = pk_ptr_array_to_strv (application->priv->package_list);
+	package_ids = pk_package_list_to_strv (application->priv->package_list);
 	if (application->priv->action == PK_ACTION_INSTALL) {
 
 		/* reset client */
@@ -2010,10 +2098,6 @@ gpk_application_packages_treeview_clicked_cb (GtkTreeSelection *selection, GpkAp
 
 	g_return_if_fail (GPK_IS_APPLICATION (application));
 
-	/* reset */
-	g_free (application->priv->package);
-	application->priv->package = NULL;
-
 	/* This will only work in single or browse selection mode! */
 	if (!gtk_tree_selection_get_selected (selection, &model, &iter)) {
 		egg_debug ("no row selected");
@@ -2030,7 +2114,10 @@ gpk_application_packages_treeview_clicked_cb (GtkTreeSelection *selection, GpkAp
 	}
 
 	/* check we aren't a help line */
-	gtk_tree_model_get (model, &iter, PACKAGES_COLUMN_ID, &package_id, -1);
+	gtk_tree_model_get (model, &iter,
+			    PACKAGES_COLUMN_STATE, &state,
+			    PACKAGES_COLUMN_ID, &package_id,
+			    -1);
 	if (package_id == NULL) {
 		egg_debug ("ignoring help click");
 		goto out;
@@ -2040,11 +2127,6 @@ gpk_application_packages_treeview_clicked_cb (GtkTreeSelection *selection, GpkAp
 	widget = GTK_WIDGET (gtk_builder_get_object (application->priv->builder, "menuitem_selection"));
 	gtk_widget_show (widget);
 
-	/* get data */
-	gtk_tree_model_get (model, &iter,
-			    PACKAGES_COLUMN_STATE, &state,
-			    PACKAGES_COLUMN_ID, &application->priv->package, -1);
-
 	show_install = (state == 0 ||
 			state == pk_bitfield_from_enums (GPK_STATE_INSTALLED, GPK_STATE_IN_LIST, -1));
 	show_remove = (state == pk_bitfield_value (GPK_STATE_INSTALLED) ||
@@ -2076,7 +2158,7 @@ gpk_application_packages_treeview_clicked_cb (GtkTreeSelection *selection, GpkAp
 	}
 
 	/* get the details */
-	package_ids = pk_package_ids_from_id (application->priv->package);
+	package_ids = pk_package_ids_from_id (package_id);
 	ret = pk_client_get_details (application->priv->client_primary, package_ids, &error);
 	if (!ret) {
 		egg_warning ("failed to get details: %s", error->message);
@@ -2790,7 +2872,6 @@ gpk_application_allow_cancel_cb (PkClient *client, gboolean allow_cancel, GpkApp
 	gtk_widget_set_sensitive (widget, allow_cancel);
 }
 
-
 /**
  * gpk_application_repo_signature_event_cb:
  **/
@@ -2878,7 +2959,7 @@ gpk_application_deps_remove_event_cb (GpkHelperDepsRemove *helper_deps_remove, G
 	}
 
 	/* actually remove packages this time */
-	package_ids = pk_ptr_array_to_strv (application->priv->package_list);
+	package_ids = pk_package_list_to_strv (application->priv->package_list);
 	ret = pk_client_remove_packages (application->priv->client_primary, package_ids, TRUE, FALSE, &error);
 	if (!ret) {
 		egg_warning ("cannot remove packages: %s", error->message);
@@ -2912,7 +2993,7 @@ gpk_application_deps_install_event_cb (GpkHelperDepsInstall *helper_deps_install
 	}
 
 	/* actually remove packages this time */
-	package_ids = pk_ptr_array_to_strv (application->priv->package_list);
+	package_ids = pk_package_list_to_strv (application->priv->package_list);
 #if PK_CHECK_VERSION(0,5,0)
 	ret = pk_client_install_packages (application->priv->client_primary, TRUE, package_ids, &error);
 #else
@@ -3000,10 +3081,9 @@ gpk_application_package_row_activated_cb (GtkTreeView *treeview, GtkTreePath *pa
 		return;
 	}
 
-	g_free (application->priv->package);
 	gtk_tree_model_get (model, &iter,
 			    PACKAGES_COLUMN_STATE, &state,
-			    PACKAGES_COLUMN_ID, &application->priv->package, -1);
+			    -1);
 	if (gpk_application_state_get_checkbox (state))
 		gpk_application_remove (application);
 	else
@@ -3365,9 +3445,18 @@ gpk_application_files_cb (PkClient *client, const gchar *package_id,
 	GtkWindow *window;
 	GtkWidget *dialog;
 	PkPackageId *id;
+	gchar *package_id_selected = NULL;
+	gboolean ret;
 
 	g_return_if_fail (GPK_IS_APPLICATION (application));
 
+	/* get selection */
+	ret = gpk_application_get_selected_package (application, &package_id_selected, NULL);
+	if (!ret) {
+		egg_warning ("no package selected");
+		goto out;
+	}
+
 	files = g_strsplit (filelist, ";", -1);
 
 	/* convert to pointer array */
@@ -3375,7 +3464,7 @@ gpk_application_files_cb (PkClient *client, const gchar *package_id,
 	g_ptr_array_sort (array, (GCompareFunc) gpk_application_strcmp_indirect);
 
 	/* title */
-	id = pk_package_id_new_from_string (application->priv->package);
+	id = pk_package_id_new_from_string (package_id_selected);
 	/* TRANSLATORS: title: how many files are installed by the application */
 	title = g_strdup_printf (ngettext ("%i file installed by %s",
 					   "%i files installed by %s",
@@ -3396,6 +3485,8 @@ gpk_application_files_cb (PkClient *client, const gchar *package_id,
 	g_ptr_array_free (array, TRUE);
 	g_strfreev (files);
 	pk_package_id_free (id);
+out:
+	g_free (package_id_selected);
 }
 
 /**
@@ -3418,14 +3509,13 @@ gpk_application_init (GpkApplication *application)
 	GtkBox *box;
 
 	application->priv = GPK_APPLICATION_GET_PRIVATE (application);
-	application->priv->package = NULL;
 	application->priv->group = NULL;
 	application->priv->url = NULL;
 	application->priv->search_text = NULL;
 	application->priv->has_package = FALSE;
 	application->priv->dep_check_info_only = FALSE;
 	application->priv->details_event_id = 0;
-	application->priv->package_list = g_ptr_array_new ();
+	application->priv->package_list = pk_package_list_new ();
 
 	application->priv->gconf_client = gconf_client_get_default ();
 	application->priv->repos = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
@@ -4037,12 +4127,8 @@ gpk_application_finalize (GObject *object)
 	g_object_unref (application->priv->helper_media_change);
 	g_object_unref (application->priv->helper_repo_signature);
 
-	g_ptr_array_foreach (application->priv->package_list, (GFunc) g_free, NULL);
-	g_ptr_array_set_size (application->priv->package_list, 0);
-
 	g_free (application->priv->url);
 	g_free (application->priv->group);
-	g_free (application->priv->package);
 	g_free (application->priv->search_text);
 	g_hash_table_destroy (application->priv->repos);
 
diff --git a/src/gpk-helper-deps-install.c b/src/gpk-helper-deps-install.c
index c5c0e20..ccfc8f6 100644
--- a/src/gpk-helper-deps-install.c
+++ b/src/gpk-helper-deps-install.c
@@ -57,7 +57,7 @@ G_DEFINE_TYPE (GpkHelperDepsInstall, gpk_helper_deps_install, G_TYPE_OBJECT)
  * Return value: if we agreed
  **/
 gboolean
-gpk_helper_deps_install_show (GpkHelperDepsInstall *helper, GPtrArray *packages, PkPackageList *deps_list)
+gpk_helper_deps_install_show (GpkHelperDepsInstall *helper, PkPackageList *packages, PkPackageList *deps_list)
 {
 	gchar *name = NULL;
 	gchar *title = NULL;
@@ -88,7 +88,7 @@ gpk_helper_deps_install_show (GpkHelperDepsInstall *helper, GPtrArray *packages,
 					   "%i additional packages also have to be installed",
 					   length), length);
 
-	package_ids = pk_ptr_array_to_strv (packages);
+	package_ids = pk_package_list_to_strv (packages);
 	name = gpk_dialog_package_id_name_join_locale (package_ids);
 
 	/* TRANSLATORS: message: describe in detail why it must happen */
diff --git a/src/gpk-helper-deps-install.h b/src/gpk-helper-deps-install.h
index e5ec600..1e16327 100644
--- a/src/gpk-helper-deps-install.h
+++ b/src/gpk-helper-deps-install.h
@@ -57,7 +57,7 @@ GpkHelperDepsInstall	*gpk_helper_deps_install_new	(void);
 gboolean	 gpk_helper_deps_install_set_parent	(GpkHelperDepsInstall	*helper,
 							 GtkWindow		*window);
 gboolean	 gpk_helper_deps_install_show		(GpkHelperDepsInstall	*helper,
-							 GPtrArray		*packages,
+							 PkPackageList		*packages,
 							 PkPackageList		*deps_list);
 
 G_END_DECLS
diff --git a/src/gpk-helper-deps-remove.c b/src/gpk-helper-deps-remove.c
index 940b6b7..dce44de 100644
--- a/src/gpk-helper-deps-remove.c
+++ b/src/gpk-helper-deps-remove.c
@@ -55,7 +55,7 @@ G_DEFINE_TYPE (GpkHelperDepsRemove, gpk_helper_deps_remove, G_TYPE_OBJECT)
  * Return value: if we agreed
  **/
 gboolean
-gpk_helper_deps_remove_show (GpkHelperDepsRemove *helper, GPtrArray *packages, PkPackageList *deps_list)
+gpk_helper_deps_remove_show (GpkHelperDepsRemove *helper, PkPackageList *packages, PkPackageList *deps_list)
 {
 	gchar *name = NULL;
 	gchar *title = NULL;
@@ -77,13 +77,13 @@ gpk_helper_deps_remove_show (GpkHelperDepsRemove *helper, GPtrArray *packages, P
 					   "%i additional packages also have to be removed",
 					   length), length);
 
-	package_ids = pk_ptr_array_to_strv (packages);
+	package_ids = pk_package_list_to_strv (packages);
 	name = gpk_dialog_package_id_name_join_locale (package_ids);
 
 	/* TRANSLATORS: message: describe in detail why it must happen */
 	message = g_strdup_printf (ngettext ("To remove %s other packages that depend on it must also be removed.",
 					     "To remove %s other packages that depend on them must also be removed.",
-					     packages->len), name);
+					     PK_OBJ_LIST(packages)->len), name);
 
 	dialog = gtk_message_dialog_new (helper->priv->window, GTK_DIALOG_DESTROY_WITH_PARENT,
 					 GTK_MESSAGE_INFO, GTK_BUTTONS_CANCEL, "%s", title);
diff --git a/src/gpk-helper-deps-remove.h b/src/gpk-helper-deps-remove.h
index 30d64d3..8f1b2e5 100644
--- a/src/gpk-helper-deps-remove.h
+++ b/src/gpk-helper-deps-remove.h
@@ -57,7 +57,7 @@ GpkHelperDepsRemove	*gpk_helper_deps_remove_new	(void);
 gboolean	 gpk_helper_deps_remove_set_parent	(GpkHelperDepsRemove	*helper,
 							 GtkWindow		*window);
 gboolean	 gpk_helper_deps_remove_show		(GpkHelperDepsRemove	*helper,
-							 GPtrArray		*packages,
+							 PkPackageList		*packages,
 							 PkPackageList		*deps_list);
 
 G_END_DECLS



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