Blob Blame History Raw
diff -up evolution-data-server-3.8.5/camel/camel-imapx-job.c.detect-list-errors evolution-data-server-3.8.5/camel/camel-imapx-job.c
--- evolution-data-server-3.8.5/camel/camel-imapx-job.c.detect-list-errors	2013-07-23 07:57:42.000000000 -0400
+++ evolution-data-server-3.8.5/camel/camel-imapx-job.c	2013-12-19 13:42:15.923968414 -0500
@@ -29,6 +29,7 @@ struct _CamelIMAPXRealJob {
 	volatile gint ref_count;
 
 	GCancellable *cancellable;
+	GError *error;
 
 	/* Used for running some jobs synchronously. */
 	GCond done_cond;
@@ -113,6 +114,7 @@ camel_imapx_job_unref (CamelIMAPXJob *jo
 
 		g_cond_clear (&real_job->done_cond);
 		g_mutex_clear (&real_job->done_mutex);
+		g_clear_error (&real_job->error);
 
 		if (real_job->destroy_data != NULL)
 			real_job->destroy_data (real_job->data);
@@ -221,7 +223,10 @@ camel_imapx_job_run (CamelIMAPXJob *job,
 	if (cancel_id > 0)
 		g_cancellable_disconnect (cancellable, cancel_id);
 
-	return success;
+	if (success && g_cancellable_set_error_if_cancelled (cancellable, error))
+		return FALSE;
+
+	return success && !camel_imapx_job_propagate_error (job, error);
 }
 
 gboolean
@@ -348,3 +353,37 @@ camel_imapx_job_get_cancellable (CamelIM
 
 	return real_job->cancellable;
 }
+
+void
+camel_imapx_job_set_error (CamelIMAPXJob *job,
+			   const GError *error)
+{
+	CamelIMAPXRealJob *real_job;
+
+	g_return_if_fail (CAMEL_IS_IMAPX_JOB (job));
+
+	real_job = (CamelIMAPXRealJob *) job;
+
+	/* do not overwrite errors, the first set is kept */
+	if (!real_job->error && error)
+		real_job->error = g_error_copy (error);
+}
+
+gboolean
+camel_imapx_job_propagate_error (CamelIMAPXJob *job,
+				 GError **error)
+{
+	CamelIMAPXRealJob *real_job;
+
+	g_return_val_if_fail (CAMEL_IS_IMAPX_JOB (job), FALSE);
+
+	real_job = (CamelIMAPXRealJob *) job;
+
+	if (!real_job->error)
+		return FALSE;
+
+	if (error)
+		g_propagate_error (error, g_error_copy (real_job->error));
+
+	return TRUE;
+}
diff -up evolution-data-server-3.8.5/camel/camel-imapx-job.h.detect-list-errors evolution-data-server-3.8.5/camel/camel-imapx-job.h
--- evolution-data-server-3.8.5/camel/camel-imapx-job.h.detect-list-errors	2013-07-23 07:57:56.000000000 -0400
+++ evolution-data-server-3.8.5/camel/camel-imapx-job.h	2013-12-19 13:42:15.923968414 -0500
@@ -81,6 +81,10 @@ CamelFolder *	camel_imapx_job_ref_folder
 void		camel_imapx_job_set_folder	(CamelIMAPXJob *job,
 						 CamelFolder *folder);
 GCancellable *	camel_imapx_job_get_cancellable	(CamelIMAPXJob *job);
+void		camel_imapx_job_set_error	(CamelIMAPXJob *job,
+						 const GError *error);
+gboolean	camel_imapx_job_propagate_error	(CamelIMAPXJob *job,
+						 GError **error);
 
 G_END_DECLS
 
diff -up evolution-data-server-3.8.5/camel/camel-imapx-server.c.detect-list-errors evolution-data-server-3.8.5/camel/camel-imapx-server.c
--- evolution-data-server-3.8.5/camel/camel-imapx-server.c.detect-list-errors	2013-12-19 13:27:59.033552530 -0500
+++ evolution-data-server-3.8.5/camel/camel-imapx-server.c	2013-12-19 13:42:15.925968140 -0500
@@ -2772,6 +2772,7 @@ imapx_completion (CamelIMAPXServer *is,
 	CamelIMAPXCommand *ic;
 	gboolean success;
 	guint tag;
+	GError *local_error = NULL;
 
 	/* Given "A0001 ...", 'A' = tag prefix, '0001' = tag. */
 
@@ -2829,18 +2830,40 @@ imapx_completion (CamelIMAPXServer *is,
 		return FALSE;
 	}
 
+	camel_imapx_command_ref (ic);
 	camel_imapx_command_queue_remove (is->done, ic);
 
 	QUEUE_UNLOCK (is);
 
-	ic->status = imapx_parse_status (stream, cancellable, error);
+	ic->status = imapx_parse_status (stream, cancellable, &local_error);
+
+	if (ic->status == NULL || local_error) {
+		if (!local_error)
+			local_error = g_error_new_literal (CAMEL_IMAPX_ERROR, 1, "command parse status failed without error set");
+
+		camel_imapx_job_set_error (camel_imapx_command_get_job (ic), local_error);
+		g_propagate_error (error, local_error);
+
+		camel_imapx_command_unref (ic);
 
-	if (ic->status == NULL)
 		return FALSE;
+	}
+
+	if (ic->complete != NULL) {
+		if (!ic->complete (is, ic, cancellable, &local_error) || local_error) {
+			if (!local_error)
+				local_error = g_error_new_literal (CAMEL_IMAPX_ERROR, 1, "command complete failed without error set");
+
+			camel_imapx_job_set_error (camel_imapx_command_get_job (ic), local_error);
+			g_propagate_error (error, local_error);
+
+			camel_imapx_command_unref (ic);
 
-	if (ic->complete != NULL)
-		if (!ic->complete (is, ic, cancellable, error))
 			return FALSE;
+		}
+	}
+
+	camel_imapx_command_unref (ic);
 
 	QUEUE_LOCK (is);
 	success = imapx_command_start_next (is, cancellable, error);
diff -up evolution-data-server-3.8.5/camel/camel-imapx-store.c.detect-list-errors evolution-data-server-3.8.5/camel/camel-imapx-store.c
--- evolution-data-server-3.8.5/camel/camel-imapx-store.c.detect-list-errors	2013-12-19 13:27:59.028552534 -0500
+++ evolution-data-server-3.8.5/camel/camel-imapx-store.c	2013-12-19 13:42:15.926968007 -0500
@@ -1011,11 +1011,15 @@ fetch_folders_for_pattern (CamelIMAPXSto
                            GError **error)
 {
 	GPtrArray *folders;
+	GError *local_error = NULL;
 
 	folders = camel_imapx_server_list (
-		server, pattern, flags, ext, cancellable, error);
-	if (folders == NULL)
+		server, pattern, flags, ext, cancellable, &local_error);
+	if (folders == NULL || local_error) {
+		if (local_error)
+			g_propagate_error (error, local_error);
 		return FALSE;
+	}
 
 	add_folders_to_summary (istore, server, folders, table, (flags & CAMEL_STORE_FOLDER_INFO_SUBSCRIBED));