Richard Hughes 7ca9061
diff --git a/lib/packagekit-glib2/pk-enum.c b/lib/packagekit-glib2/pk-enum.c
Richard Hughes 7ca9061
index bc08d7c..8f556a6 100644
Richard Hughes 7ca9061
--- a/lib/packagekit-glib2/pk-enum.c
Richard Hughes 7ca9061
+++ b/lib/packagekit-glib2/pk-enum.c
Richard Hughes 7ca9061
@@ -401,7 +401,7 @@ static const PkEnumMatch enum_upgrade_kind[] = {
Richard Hughes 7ca9061
 static const PkEnumMatch enum_transaction_flag[] = {
Richard Hughes 7ca9061
 	{PK_TRANSACTION_FLAG_ENUM_NONE,		"none"},	/* fall though value */
Richard Hughes 7ca9061
 	{PK_TRANSACTION_FLAG_ENUM_ONLY_TRUSTED,	"only-trusted"},
Richard Hughes 7ca9061
-	{PK_TRANSACTION_FLAG_ENUM_SIMULATE,	"simluate"},
Richard Hughes 7ca9061
+	{PK_TRANSACTION_FLAG_ENUM_SIMULATE,	"simulate"},
Richard Hughes 7ca9061
 	{PK_TRANSACTION_FLAG_ENUM_ONLY_DOWNLOAD, "only-download"},
Richard Hughes 7ca9061
 	{0, NULL}
Richard Hughes 7ca9061
 };
Richard Hughes 43d4ca3
diff --git a/src/pk-backend-job.c b/src/pk-backend-job.c
Richard Hughes 43d4ca3
index d9f920a..a575800 100644
Richard Hughes 43d4ca3
--- a/src/pk-backend-job.c
Richard Hughes 43d4ca3
+++ b/src/pk-backend-job.c
Richard Hughes 43d4ca3
@@ -574,6 +574,59 @@ typedef struct {
Richard Hughes 43d4ca3
 } PkBackendJobVFuncHelper;
Richard Hughes 43d4ca3
 
Richard Hughes 43d4ca3
 /**
Richard Hughes 43d4ca3
+ * pk_backend_job_signal_to_string:
Richard Hughes 43d4ca3
+ **/
Richard Hughes 43d4ca3
+static const gchar *
Richard Hughes 43d4ca3
+pk_backend_job_signal_to_string (PkBackendJobSignal id)
Richard Hughes 43d4ca3
+{
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_ALLOW_CANCEL)
Richard Hughes 43d4ca3
+		return "AllowCancel";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_DETAILS)
Richard Hughes 43d4ca3
+		return "Details";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_ERROR_CODE)
Richard Hughes 43d4ca3
+		return "ErrorCode";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_DISTRO_UPGRADE)
Richard Hughes 43d4ca3
+		return "DistroUpgrade";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_FINISHED)
Richard Hughes 43d4ca3
+		return "Finished";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_MESSAGE)
Richard Hughes 43d4ca3
+		return "Message";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_PACKAGE)
Richard Hughes 43d4ca3
+		return "Package";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_ITEM_PROGRESS)
Richard Hughes 43d4ca3
+		return "ItemProgress";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_FILES)
Richard Hughes 43d4ca3
+		return "Files";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_PERCENTAGE)
Richard Hughes 43d4ca3
+		return "Percentage";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_REMAINING)
Richard Hughes 43d4ca3
+		return "Remaining";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_SPEED)
Richard Hughes 43d4ca3
+		return "Speed";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_DOWNLOAD_SIZE_REMAINING)
Richard Hughes 43d4ca3
+		return "DownloadSizeRemaining";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_REPO_DETAIL)
Richard Hughes 43d4ca3
+		return "RepoDetail";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_REPO_SIGNATURE_REQUIRED)
Richard Hughes 43d4ca3
+		return "RepoSignatureRequired";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_EULA_REQUIRED)
Richard Hughes 43d4ca3
+		return "EulaRequired";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_MEDIA_CHANGE_REQUIRED)
Richard Hughes 43d4ca3
+		return "MediaChangeRequired";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_REQUIRE_RESTART)
Richard Hughes 43d4ca3
+		return "RequireRestart";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_STATUS_CHANGED)
Richard Hughes 43d4ca3
+		return "StatusChanged";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_LOCKED_CHANGED)
Richard Hughes 43d4ca3
+		return "LockedChanged";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_UPDATE_DETAIL)
Richard Hughes 43d4ca3
+		return "UpdateDetail";
Richard Hughes 43d4ca3
+	if (id == PK_BACKEND_SIGNAL_CATEGORY)
Richard Hughes 43d4ca3
+		return "Category";
Richard Hughes 43d4ca3
+	return NULL;
Richard Hughes 43d4ca3
+}
Richard Hughes 43d4ca3
+
Richard Hughes 43d4ca3
+/**
Richard Hughes 43d4ca3
  * pk_backend_job_call_vfunc_idle_cb:
Richard Hughes 43d4ca3
  **/
Richard Hughes 43d4ca3
 static gboolean
Richard Hughes 43d4ca3
@@ -584,13 +637,13 @@ pk_backend_job_call_vfunc_idle_cb (gpointer user_data)
Richard Hughes 43d4ca3
 
Richard Hughes 43d4ca3
 	/* call transaction vfunc on main thread */
Richard Hughes 43d4ca3
 	item = &helper->job->priv->vfunc_items[helper->signal_kind];
Richard Hughes 43d4ca3
-	if (item != NULL) {
Richard Hughes 43d4ca3
+	if (item != NULL && item->vfunc != NULL) {
Richard Hughes 43d4ca3
 		item->vfunc (helper->job,
Richard Hughes 43d4ca3
 			     helper->object,
Richard Hughes 43d4ca3
 			     item->user_data);
Richard Hughes 43d4ca3
 	} else {
Richard Hughes 43d4ca3
-		g_warning ("tried to do signal %i when no longer connected",
Richard Hughes 43d4ca3
-			   helper->signal_kind);
Richard Hughes 43d4ca3
+		g_warning ("tried to do signal %s when no longer connected",
Richard Hughes 43d4ca3
+			   pk_backend_job_signal_to_string (helper->signal_kind));
Richard Hughes 43d4ca3
 	}
Richard Hughes 43d4ca3
 	if (helper->destroy_func != NULL)
Richard Hughes 43d4ca3
 		helper->destroy_func (helper->object);
Richard Hughes 43d4ca3
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
Richard Hughes 43d4ca3
index 75d6136..810c771 100644
Richard Hughes 43d4ca3
--- a/src/pk-transaction.c
Richard Hughes 43d4ca3
+++ b/src/pk-transaction.c
Richard Hughes 43d4ca3
@@ -299,6 +299,12 @@ pk_transaction_finish_invalidate_caches (PkTransaction *transaction)
Richard Hughes 43d4ca3
 	pk_cache_set_results (priv->cache, priv->role, priv->results);
Richard Hughes 43d4ca3
 
Richard Hughes 43d4ca3
 	/* could the update list have changed? */
Richard Hughes 43d4ca3
+	if (pk_bitfield_contain (transaction->priv->cached_transaction_flags,
Richard Hughes 43d4ca3
+				  PK_TRANSACTION_FLAG_ENUM_SIMULATE))
Richard Hughes 43d4ca3
+		goto out;
Richard Hughes 43d4ca3
+	if (pk_bitfield_contain (transaction->priv->cached_transaction_flags,
Richard Hughes 43d4ca3
+				  PK_TRANSACTION_FLAG_ENUM_ONLY_DOWNLOAD))
Richard Hughes 43d4ca3
+		goto out;
Richard Hughes 43d4ca3
 	if (priv->role == PK_ROLE_ENUM_UPDATE_PACKAGES ||
Richard Hughes 43d4ca3
 	    priv->role == PK_ROLE_ENUM_REMOVE_PACKAGES ||
Richard Hughes 43d4ca3
 	    priv->role == PK_ROLE_ENUM_REPO_ENABLE ||
Richard Hughes 43d4ca3
@@ -313,6 +319,7 @@ pk_transaction_finish_invalidate_caches (PkTransaction *transaction)
Richard Hughes 43d4ca3
 		pk_notify_wait_updates_changed (priv->notify,
Richard Hughes 43d4ca3
 						PK_TRANSACTION_UPDATES_CHANGED_TIMEOUT);
Richard Hughes 43d4ca3
 	}
Richard Hughes 43d4ca3
+out:
Richard Hughes 43d4ca3
 	return TRUE;
Richard Hughes 43d4ca3
 }
Richard Hughes 43d4ca3
 
Richard Hughes 43d4ca3
@@ -987,11 +994,12 @@ pk_transaction_plugin_phase (PkTransaction *transaction,
Richard Hughes 43d4ca3
 				g_main_context_iteration (context, FALSE);
Richard Hughes 43d4ca3
 		}
Richard Hughes 43d4ca3
 
Richard Hughes 43d4ca3
+		/* quit the transaction if any of the plugins fail */
Richard Hughes 43d4ca3
 		exit_code = pk_backend_job_get_exit_code (job);
Richard Hughes 43d4ca3
-		if (exit_code != PK_EXIT_ENUM_UNKNOWN) {
Richard Hughes 43d4ca3
+		if (exit_code != PK_EXIT_ENUM_UNKNOWN &&
Richard Hughes 43d4ca3
+		    exit_code != PK_EXIT_ENUM_SUCCESS) {
Richard Hughes 43d4ca3
 			pk_backend_job_set_exit_code (transaction->priv->job, exit_code);
Richard Hughes 43d4ca3
-			if (exit_code != PK_EXIT_ENUM_SUCCESS)
Richard Hughes 43d4ca3
-				break;
Richard Hughes 43d4ca3
+			break;
Richard Hughes 43d4ca3
 		}
Richard Hughes 43d4ca3
 	}
Richard Hughes 43d4ca3
 out:
Richard Hughes 43d4ca3
diff --git a/src/plugins/pk-plugin-check-shared-libraries-in-use.c b/src/plugins/pk-plugin-check-shared-libraries-in-use.c
Richard Hughes 43d4ca3
index 2a3f4a6..1c09649 100644
Richard Hughes 43d4ca3
--- a/src/plugins/pk-plugin-check-shared-libraries-in-use.c
Richard Hughes 43d4ca3
+++ b/src/plugins/pk-plugin-check-shared-libraries-in-use.c
Richard Hughes 43d4ca3
@@ -95,6 +95,17 @@ pk_plugin_finished_cb (PkBackendJob *job,
Richard Hughes 43d4ca3
 }
Richard Hughes 43d4ca3
 
Richard Hughes 43d4ca3
 /**
Richard Hughes 43d4ca3
+ * pk_plugin_package_cb:
Richard Hughes 43d4ca3
+ **/
Richard Hughes 43d4ca3
+static void
Richard Hughes 43d4ca3
+pk_plugin_package_cb (PkBackendJob *job,
Richard Hughes 43d4ca3
+		      PkPackage *package,
Richard Hughes 43d4ca3
+		      PkPlugin *plugin)
Richard Hughes 43d4ca3
+{
Richard Hughes 43d4ca3
+	g_ptr_array_add (plugin->priv->list, g_object_ref (package));
Richard Hughes 43d4ca3
+}
Richard Hughes 43d4ca3
+
Richard Hughes 43d4ca3
+/**
Richard Hughes 43d4ca3
  * pk_plugin_get_installed_package_for_file:
Richard Hughes 43d4ca3
  **/
Richard Hughes 43d4ca3
 static PkPackage *
Richard Hughes 43d4ca3
@@ -109,8 +120,8 @@ pk_plugin_get_installed_package_for_file (PkPlugin *plugin,
Richard Hughes 43d4ca3
 	g_ptr_array_set_size (plugin->priv->list, 0);
Richard Hughes 43d4ca3
 	pk_backend_reset_job (plugin->backend, plugin->job);
Richard Hughes 43d4ca3
 	pk_backend_job_set_vfunc (plugin->job,
Richard Hughes 43d4ca3
-				  PK_BACKEND_SIGNAL_FILES,
Richard Hughes 43d4ca3
-				  (PkBackendJobVFunc) pk_plugin_files_cb,
Richard Hughes 43d4ca3
+				  PK_BACKEND_SIGNAL_PACKAGE,
Richard Hughes 43d4ca3
+				  (PkBackendJobVFunc) pk_plugin_package_cb,
Richard Hughes 43d4ca3
 				  plugin);
Richard Hughes 43d4ca3
 	pk_backend_job_set_vfunc (plugin->job,
Richard Hughes 43d4ca3
 				  PK_BACKEND_SIGNAL_FINISHED,