[evolution-data-server] Bug #662929 - POP3 prevents expunge of local Inbox in offline



commit 7f7b8cd9351544204be6eff58f6234860759a19b
Author: Milan Crha <mcrha redhat com>
Date:   Wed Nov 9 15:24:29 2011 +0100

    Bug #662929 - POP3 prevents expunge of local Inbox in offline

 camel/camel-folder.c                     |    2 +-
 camel/camel-mime-message.c               |    3 +-
 camel/providers/pop3/camel-pop3-engine.c |   15 +++++++-
 camel/providers/pop3/camel-pop3-folder.c |   55 +++++++++++++++++++++++------
 camel/providers/pop3/camel-pop3-folder.h |    2 +-
 camel/providers/pop3/camel-pop3-store.c  |   20 ++++++++++-
 camel/providers/pop3/camel-pop3-store.h  |    2 +-
 7 files changed, 79 insertions(+), 20 deletions(-)
---
diff --git a/camel/camel-folder.c b/camel/camel-folder.c
index b987a10..01a1df6 100644
--- a/camel/camel-folder.c
+++ b/camel/camel-folder.c
@@ -3277,7 +3277,7 @@ camel_folder_get_message_sync (CamelFolder *folder,
 		camel_folder_unlock (folder, CAMEL_FOLDER_REC_LOCK);
 	}
 
-	if (message) {
+	if (message && camel_mime_message_get_source (message) == NULL) {
 		CamelStore *store;
 
 		store = camel_folder_get_parent_store (folder);
diff --git a/camel/camel-mime-message.c b/camel/camel-mime-message.c
index 2cf3f7d..2ea393d 100644
--- a/camel/camel-mime-message.c
+++ b/camel/camel-mime-message.c
@@ -768,10 +768,9 @@ camel_mime_message_set_source (CamelMimeMessage *mime_message,
 	name = "X-Evolution-Source";
 	medium = CAMEL_MEDIUM (mime_message);
 
+	camel_medium_remove_header (medium, name);
 	if (source_uid != NULL)
 		camel_medium_add_header (medium, name, source_uid);
-	else
-		camel_medium_remove_header (medium, name);
 }
 
 const gchar *
diff --git a/camel/providers/pop3/camel-pop3-engine.c b/camel/providers/pop3/camel-pop3-engine.c
index b7d5771..f720dbe 100644
--- a/camel/providers/pop3/camel-pop3-engine.c
+++ b/camel/providers/pop3/camel-pop3-engine.c
@@ -99,6 +99,8 @@ read_greeting (CamelPOP3Engine *pe,
 	guchar *line, *apop, *apopend;
 	guint len;
 
+	g_return_val_if_fail (pe != NULL, -1);
+
 	/* first, read the greeting */
 	if (camel_pop3_stream_line (pe->stream, &line, &len, cancellable, NULL) == -1
 	    || strncmp ((gchar *) line, "+OK", 3) != 0)
@@ -194,6 +196,8 @@ cmd_capa (CamelPOP3Engine *pe,
 
 	dd(printf("cmd_capa\n"));
 
+	g_return_if_fail (pe != NULL);
+
 	do {
 		ret = camel_pop3_stream_line (stream, &line, &len, cancellable, NULL);
 		if (ret >= 0) {
@@ -229,6 +233,8 @@ get_capabilities (CamelPOP3Engine *pe,
 {
 	CamelPOP3Command *pc;
 
+	g_return_if_fail (pe != NULL);
+
 	if (!(pe->flags & CAMEL_POP3_ENGINE_DISABLE_EXTENSIONS)) {
 		pc = camel_pop3_engine_command_new(pe, CAMEL_POP3_COMMAND_MULTI, cmd_capa, NULL, cancellable, NULL, "CAPA\r\n");
 		while (camel_pop3_engine_iterate (pe, pc, cancellable, NULL) > 0)
@@ -256,6 +262,9 @@ engine_command_queue (CamelPOP3Engine *pe,
                       GCancellable *cancellable,
                       GError **error)
 {
+	g_return_val_if_fail (pe != NULL, FALSE);
+	g_return_val_if_fail (pc != NULL, FALSE);
+
 	if (((pe->capa & CAMEL_POP3_CAP_PIPE) == 0 || (pe->sentlen + strlen (pc->data)) > CAMEL_POP3_SEND_LIMIT)
 	    && pe->current != NULL) {
 		camel_dlist_addtail (&pe->queue, (CamelDListNode *) pc);
@@ -291,6 +300,8 @@ camel_pop3_engine_iterate (CamelPOP3Engine *pe,
 	guint len;
 	CamelPOP3Command *pc, *pw, *pn;
 
+	g_return_val_if_fail (pe != NULL, -1);
+
 	if (pcwait && pcwait->state >= CAMEL_POP3_COMMAND_OK)
 		return 0;
 
@@ -404,6 +415,8 @@ camel_pop3_engine_command_new (CamelPOP3Engine *pe,
 	CamelPOP3Command *pc;
 	va_list ap;
 
+	g_return_val_if_fail (pe != NULL, NULL);
+
 	pc = g_malloc0 (sizeof (*pc));
 	pc->func = func;
 	pc->func_data = data;
@@ -423,7 +436,7 @@ void
 camel_pop3_engine_command_free (CamelPOP3Engine *pe,
                                 CamelPOP3Command *pc)
 {
-	if (pe->current != pc)
+	if (pe && pe->current != pc)
 		camel_dlist_remove ((CamelDListNode *) pc);
 	g_free (pc->data);
 	g_free (pc);
diff --git a/camel/providers/pop3/camel-pop3-folder.c b/camel/providers/pop3/camel-pop3-folder.c
index 7d7699c..31d76ed 100644
--- a/camel/providers/pop3/camel-pop3-folder.c
+++ b/camel/providers/pop3/camel-pop3-folder.c
@@ -217,9 +217,10 @@ pop3_folder_dispose (GObject *object)
 
 	if (pop3_folder->uids) {
 		gint i;
+		gboolean is_online = camel_service_get_connection_status (CAMEL_SERVICE (parent_store)) == CAMEL_SERVICE_CONNECTED;
 
 		for (i = 0; i < pop3_folder->uids->len; i++, fi++) {
-			if (fi[0]->cmd && pop3_store) {
+			if (fi[0]->cmd && pop3_store && is_online) {
 				while (camel_pop3_engine_iterate (pop3_store->engine, fi[0]->cmd, NULL, NULL) > 0)
 					;
 				camel_pop3_engine_command_free (pop3_store->engine, fi[0]->cmd);
@@ -349,6 +350,14 @@ pop3_folder_get_message_sync (CamelFolder *folder,
 		return NULL;
 	}
 
+	if (camel_service_get_connection_status (CAMEL_SERVICE (parent_store)) != CAMEL_SERVICE_CONNECTED) {
+		g_set_error (
+			error, CAMEL_SERVICE_ERROR,
+			CAMEL_SERVICE_ERROR_UNAVAILABLE,
+			_("You must be working online to complete this operation"));
+		return FALSE;
+	}
+
 	/* Sigh, most of the crap in this function is so that the cancel button
 	 * returns the proper exception code.  Sigh. */
 
@@ -471,6 +480,14 @@ pop3_folder_refresh_info_sync (CamelFolder *folder,
 	parent_store = camel_folder_get_parent_store (folder);
 	pop3_store = CAMEL_POP3_STORE (parent_store);
 
+	if (camel_service_get_connection_status (CAMEL_SERVICE (parent_store)) != CAMEL_SERVICE_CONNECTED) {
+		g_set_error (
+			error, CAMEL_SERVICE_ERROR,
+			CAMEL_SERVICE_ERROR_UNAVAILABLE,
+			_("You must be working online to complete this operation"));
+		return FALSE;
+	}
+
 	camel_operation_push_message (
 		cancellable, _("Retrieving POP summary"));
 
@@ -517,9 +534,6 @@ pop3_folder_refresh_info_sync (CamelFolder *folder,
 
 	camel_operation_pop_message (cancellable);
 
-	if (!success)
-		camel_service_disconnect_sync ((CamelService *) pop3_store, TRUE, NULL);
-
 	return success;
 }
 
@@ -538,6 +552,7 @@ pop3_folder_synchronize_sync (CamelFolder *folder,
 	gint delete_after_days;
 	gboolean delete_expunged;
 	gboolean keep_on_server;
+	gboolean is_online;
 	gint i;
 
 	parent_store = camel_folder_get_parent_store (folder);
@@ -547,6 +562,7 @@ pop3_folder_synchronize_sync (CamelFolder *folder,
 
 	service = CAMEL_SERVICE (parent_store);
 	settings = camel_service_get_settings (service);
+	is_online = camel_service_get_connection_status (service) == CAMEL_SERVICE_CONNECTED;
 
 	g_object_get (
 		settings,
@@ -555,7 +571,7 @@ pop3_folder_synchronize_sync (CamelFolder *folder,
 		"keep-on-server", &keep_on_server,
 		NULL);
 
-	if (delete_after_days > 0 && !expunge) {
+	if (is_online && delete_after_days > 0 && !expunge) {
 		camel_operation_push_message (
 			cancellable, _("Expunging old messages"));
 
@@ -568,6 +584,14 @@ pop3_folder_synchronize_sync (CamelFolder *folder,
 	if (!expunge || (keep_on_server && !delete_expunged))
 		return TRUE;
 
+	if (!is_online) {
+		g_set_error (
+			error, CAMEL_SERVICE_ERROR,
+			CAMEL_SERVICE_ERROR_UNAVAILABLE,
+			_("You must be working online to complete this operation"));
+		return FALSE;
+	}
+
 	camel_operation_push_message (
 		cancellable, _("Expunging deleted messages"));
 
@@ -611,9 +635,7 @@ pop3_folder_synchronize_sync (CamelFolder *folder,
 
 	camel_operation_pop_message (cancellable);
 
-	camel_pop3_store_expunge (pop3_store, cancellable, error);
-
-	return TRUE;
+	return camel_pop3_store_expunge (pop3_store, cancellable, error);
 }
 
 static void
@@ -657,6 +679,9 @@ camel_pop3_folder_new (CamelStore *parent,
 		"full-name", "inbox", "display-name", "inbox",
 		"parent-store", parent, NULL);
 
+	if (camel_service_get_connection_status (CAMEL_SERVICE (parent)) != CAMEL_SERVICE_CONNECTED)
+		return folder;
+
 	/* mt-ok, since we dont have the folder-lock for new() */
 	if (!camel_folder_refresh_info_sync (folder, cancellable, error)) {
 		g_object_unref (folder);
@@ -717,7 +742,7 @@ pop3_get_message_time_from_cache (CamelFolder *folder,
 	return res;
 }
 
-gint
+gboolean
 camel_pop3_delete_old (CamelFolder *folder,
                        gint days_to_delete,
                        GCancellable *cancellable,
@@ -733,6 +758,14 @@ camel_pop3_delete_old (CamelFolder *folder,
 
 	parent_store = camel_folder_get_parent_store (folder);
 
+	if (camel_service_get_connection_status (CAMEL_SERVICE (parent_store)) != CAMEL_SERVICE_CONNECTED) {
+		g_set_error (
+			error, CAMEL_SERVICE_ERROR,
+			CAMEL_SERVICE_ERROR_UNAVAILABLE,
+			_("You must be working online to complete this operation"));
+		return FALSE;
+	}
+
 	pop3_folder = CAMEL_POP3_FOLDER (folder);
 	pop3_store = CAMEL_POP3_STORE (parent_store);
 	temp = time (&temp);
@@ -812,7 +845,5 @@ camel_pop3_delete_old (CamelFolder *folder,
 			cancellable, (i + 1) * 100 / pop3_folder->uids->len);
 	}
 
-	camel_pop3_store_expunge (pop3_store, cancellable, error);
-
-	return 0;
+	return camel_pop3_store_expunge (pop3_store, cancellable, error);
 }
diff --git a/camel/providers/pop3/camel-pop3-folder.h b/camel/providers/pop3/camel-pop3-folder.h
index 1a6f2c5..f7ed542 100644
--- a/camel/providers/pop3/camel-pop3-folder.h
+++ b/camel/providers/pop3/camel-pop3-folder.h
@@ -79,7 +79,7 @@ GType		camel_pop3_folder_get_type	(void);
 CamelFolder *	camel_pop3_folder_new		(CamelStore *parent,
 						 GCancellable *cancellable,
 						 GError **error);
-gint		camel_pop3_delete_old		(CamelFolder *folder,
+gboolean	camel_pop3_delete_old		(CamelFolder *folder,
 						 gint days_to_delete,
 						 GCancellable *cancellable,
 						 GError **error);
diff --git a/camel/providers/pop3/camel-pop3-store.c b/camel/providers/pop3/camel-pop3-store.c
index adcba5c..afb4c4b 100644
--- a/camel/providers/pop3/camel-pop3-store.c
+++ b/camel/providers/pop3/camel-pop3-store.c
@@ -366,6 +366,14 @@ pop3_store_connect_sync (CamelService *service,
 	settings = camel_service_get_settings (service);
 	user_data_dir = camel_service_get_user_data_dir (service);
 
+	if (!camel_session_get_online (session)) {
+		g_set_error (
+			error, CAMEL_SERVICE_ERROR,
+			CAMEL_SERVICE_ERROR_UNAVAILABLE,
+			_("You must be working online to complete this operation"));
+		return FALSE;
+	}
+
 	mechanism = camel_network_settings_get_auth_mechanism (
 		CAMEL_NETWORK_SETTINGS (settings));
 
@@ -748,13 +756,21 @@ camel_pop3_store_init (CamelPOP3Store *pop3_store)
  * being closed, which may cause later commands to fail if they can't
  * reconnect.
  **/
-void
+gboolean
 camel_pop3_store_expunge (CamelPOP3Store *store,
                           GCancellable *cancellable,
                           GError **error)
 {
 	CamelPOP3Command *pc;
 
+	if (!camel_service_get_connection_status (CAMEL_SERVICE (store)) == CAMEL_SERVICE_CONNECTED) {
+		g_set_error (
+			error, CAMEL_SERVICE_ERROR,
+			CAMEL_SERVICE_ERROR_UNAVAILABLE,
+			_("You must be working online to complete this operation"));
+		return FALSE;
+	}
+
 	pc = camel_pop3_engine_command_new (
 		store->engine, 0, NULL, NULL, cancellable, error, "QUIT\r\n");
 
@@ -763,5 +779,5 @@ camel_pop3_store_expunge (CamelPOP3Store *store,
 
 	camel_pop3_engine_command_free (store->engine, pc);
 
-	camel_service_disconnect_sync (CAMEL_SERVICE (store), FALSE, error);
+	return TRUE;
 }
diff --git a/camel/providers/pop3/camel-pop3-store.h b/camel/providers/pop3/camel-pop3-store.h
index 67b58d5..77630a1 100644
--- a/camel/providers/pop3/camel-pop3-store.h
+++ b/camel/providers/pop3/camel-pop3-store.h
@@ -68,7 +68,7 @@ struct _CamelPOP3StoreClass {
 };
 
 GType		camel_pop3_store_get_type	(void);
-void		camel_pop3_store_expunge	(CamelPOP3Store *store,
+gboolean	camel_pop3_store_expunge	(CamelPOP3Store *store,
 						 GCancellable *cancellable,
 						 GError **error);
 



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