Blob Blame History Raw
commit 826973135802ee453e014dc601168690b49af25d
Author: Richard Hughes <richard@hughsie.com>
Date:   Wed Apr 1 12:25:02 2009 +0100

    bugfix: correct the allow-cancel duplicate logic so we don't remember the state of the previous transaction

diff --git a/src/pk-backend.c b/src/pk-backend.c
index 6bedd12..d55245d 100644
--- a/src/pk-backend.c
+++ b/src/pk-backend.c
@@ -74,6 +74,13 @@
  */
 #define PK_BACKEND_FINISHED_TIMEOUT_GRACE	10 /* ms */
 
+/* a boolean with unset */
+typedef enum {
+	PK_BACKEND_TRISTATE_FALSE = FALSE,
+	PK_BACKEND_TRISTATE_TRUE = TRUE,
+	PK_BACKEND_TRISTATE_UNSET
+} PkBackendTristate;
+
 struct _PkBackendPrivate
 {
 	GModule			*handle;
@@ -101,7 +108,7 @@ struct _PkBackendPrivate
 	PkBackendFileChanged	 file_changed_func;
 	gpointer		 file_changed_data;
 	gboolean		 during_initialize;
-	gboolean		 allow_cancel;
+	PkBackendTristate	 allow_cancel;
 	gboolean		 finished;
 	guint			 last_percentage;
 	guint			 last_subpercentage;
@@ -1436,9 +1443,9 @@ pk_backend_set_allow_cancel (PkBackend *backend, gboolean allow_cancel)
 	}
 
 	/* same as last state? */
-	if (backend->priv->allow_cancel == allow_cancel) {
+	if (backend->priv->allow_cancel == (PkBackendTristate) allow_cancel) {
 		egg_debug ("ignoring same allow-cancel state");
-		return TRUE;
+		return FALSE;
 	}
 
 	/* can we do the action? */
@@ -1456,9 +1463,16 @@ pk_backend_set_allow_cancel (PkBackend *backend, gboolean allow_cancel)
 gboolean
 pk_backend_get_allow_cancel (PkBackend *backend)
 {
+	gboolean allow_cancel = FALSE;
+
 	g_return_val_if_fail (PK_IS_BACKEND (backend), FALSE);
 	g_return_val_if_fail (backend->priv->locked != FALSE, FALSE);
-	return backend->priv->allow_cancel;
+
+	/* return FALSE if we never set state */
+	if (backend->priv->allow_cancel != PK_BACKEND_TRISTATE_UNSET)
+		allow_cancel = backend->priv->allow_cancel;
+
+	return allow_cancel;
 }
 
 /**
@@ -1952,11 +1966,11 @@ pk_backend_reset (PkBackend *backend)
 	backend->priv->set_error = FALSE;
 	backend->priv->set_signature = FALSE;
 	backend->priv->set_eula = FALSE;
-	backend->priv->allow_cancel = FALSE;
 	backend->priv->finished = FALSE;
 	backend->priv->has_sent_package = FALSE;
 	backend->priv->thread = NULL;
 	backend->priv->last_package = NULL;
+	backend->priv->allow_cancel = PK_BACKEND_TRISTATE_UNSET;
 	backend->priv->status = PK_STATUS_ENUM_UNKNOWN;
 	backend->priv->exit = PK_EXIT_ENUM_UNKNOWN;
 	backend->priv->role = PK_ROLE_ENUM_UNKNOWN;
@@ -2327,6 +2341,35 @@ pk_backend_test (EggTest *test)
 	egg_test_loop_wait (test, PK_BACKEND_FINISHED_ERROR_TIMEOUT + 400);
 	egg_test_loop_check (test);
 
+	/************************************************************
+	 ****************     CANCEL TRISTATE      ******************
+	 ************************************************************/
+	egg_test_title (test, "get allow cancel after reset");
+	pk_backend_reset (backend);
+	ret = pk_backend_get_allow_cancel (backend);
+	egg_test_assert (test, !ret);
+
+	/************************************************************/
+	egg_test_title (test, "set allow cancel TRUE");
+	ret = pk_backend_set_allow_cancel (backend, TRUE);
+	egg_test_assert (test, ret);
+
+	/************************************************************/
+	egg_test_title (test, "set allow cancel TRUE (repeat)");
+	ret = pk_backend_set_allow_cancel (backend, TRUE);
+	egg_test_assert (test, !ret);
+
+	/************************************************************/
+	egg_test_title (test, "set allow cancel FALSE");
+	ret = pk_backend_set_allow_cancel (backend, FALSE);
+	egg_test_assert (test, ret);
+
+	/************************************************************/
+	egg_test_title (test, "set allow cancel FALSE (after reset)");
+	pk_backend_reset (backend);
+	ret = pk_backend_set_allow_cancel (backend, FALSE);
+	egg_test_assert (test, ret);
+
 #ifdef PK_IS_DEVELOPER
 	egg_test_title (test, "check we enforce finished after error_code");
 	if (number_messages == 1)