Blob Blame History Raw
commit 58955c21674e37d43d7353d30ab1da3163699e94
Author: Richard Hughes <richard@hughsie.com>
Date:   Thu Sep 25 14:32:25 2008 +0100

    bugfix: finish a cached transaction in an idle loop
    
    When returning results from a cache we should always return finished in an idle
    loop so we can block and wait for a response without having to know if we need
    to wait for ::Finished()

diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index db68d4d..73f86dc 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -1093,6 +1093,19 @@ pk_transaction_commit (PkTransaction *transaction)
 }
 
 /**
+ * pk_transaction_finished_idle_cb:
+ **/
+static gboolean
+pk_transaction_finished_idle_cb (PkTransaction *transaction)
+{
+	const gchar *exit_text;
+	exit_text = pk_exit_enum_to_text (PK_EXIT_ENUM_SUCCESS);
+	egg_debug ("emitting finished '%s'", exit_text);
+	g_signal_emit (transaction, signals [PK_TRANSACTION_FINISHED], 0, exit_text, 0);
+	return FALSE;
+}
+
+/**
  * pk_transaction_search_check:
  **/
 static gboolean
@@ -1236,7 +1249,6 @@ pk_transaction_accept_eula (PkTransaction *transaction, const gchar *eula_id, DB
 {
 	gboolean ret;
 	GError *error;
-	const gchar *exit_text;
 	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
@@ -1275,10 +1287,7 @@ pk_transaction_accept_eula (PkTransaction *transaction, const gchar *eula_id, DB
 		return;
 	}
 
-	exit_text = pk_exit_enum_to_text (PK_EXIT_ENUM_SUCCESS);
-	egg_debug ("emitting finished transaction '%s', %i", exit_text, 0);
-	g_signal_emit (transaction, signals [PK_TRANSACTION_FINISHED], 0, exit_text, 0);
-
+	g_idle_add ((GSourceFunc) pk_transaction_finished_idle_cb, transaction);
 	dbus_g_method_return (context);
 }
 
@@ -1746,18 +1755,13 @@ pk_transaction_get_packages (PkTransaction *transaction, const gchar *filter, DB
 gboolean
 pk_transaction_get_old_transactions (PkTransaction *transaction, guint number, GError **error)
 {
-	const gchar *exit_text;
-
 	g_return_val_if_fail (PK_IS_TRANSACTION (transaction), FALSE);
 	g_return_val_if_fail (transaction->priv->tid != NULL, FALSE);
 
 	egg_debug ("GetOldTransactions method called");
 
 	pk_transaction_db_get_list (transaction->priv->transaction_db, number);
-
-	exit_text = pk_exit_enum_to_text (PK_EXIT_ENUM_SUCCESS);
-	egg_debug ("emitting finished transaction '%s', %i", exit_text, 0);
-	g_signal_emit (transaction, signals [PK_TRANSACTION_FINISHED], 0, exit_text, 0);
+	g_idle_add ((GSourceFunc) pk_transaction_finished_idle_cb, transaction);
 
 	return TRUE;
 }
@@ -2071,10 +2075,7 @@ pk_transaction_get_update_detail (PkTransaction *transaction, gchar **package_id
 
 	/* if we have nothing to do, i.e. everything was in the cache */
 	if (array->len == 0) {
-		const gchar *exit_text;
-		exit_text = pk_exit_enum_to_text (PK_EXIT_ENUM_SUCCESS);
-		egg_debug ("emitting finished '%s' as no more to process", exit_text);
-		g_signal_emit (transaction, signals [PK_TRANSACTION_FINISHED], 0, exit_text, 0);
+		g_idle_add ((GSourceFunc) pk_transaction_finished_idle_cb, transaction);
 		goto out;
 	}
 
@@ -2152,7 +2153,6 @@ pk_transaction_get_updates (PkTransaction *transaction, const gchar *filter, DBu
 	if (updates_cache != NULL) {
 		const PkPackageObj *obj;
 		const gchar *info_text;
-		const gchar *exit_text;
 		guint i;
 		guint length;
 
@@ -2169,10 +2169,7 @@ pk_transaction_get_updates (PkTransaction *transaction, const gchar *filter, DBu
 			g_free (package_id);
 		}
 
-		/* we are done */
-		exit_text = pk_exit_enum_to_text (PK_EXIT_ENUM_SUCCESS);
-		egg_debug ("emitting finished '%s'", exit_text);
-		g_signal_emit (transaction, signals [PK_TRANSACTION_FINISHED], 0, exit_text, 0);
+		g_idle_add ((GSourceFunc) pk_transaction_finished_idle_cb, transaction);
 
 		dbus_g_method_return (context);
 		return;