[evolution-data-server] Bug #662929 - POP3 prevents expunge of local Inbox in offline
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Bug #662929 - POP3 prevents expunge of local Inbox in offline
- Date: Wed, 9 Nov 2011 14:25:18 +0000 (UTC)
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]