summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2011-02-01 20:07:51 +0100
committerMilan Crha <mcrha@redhat.com>2011-02-01 20:07:51 +0100
commitd6eb500aae5b8f9062bccfbcd7134595c4093bd9 (patch)
treefe54ab1eba2c339e4ab390394a1e89cb4d553da3
parentbc9e9d79f096b24ae949d66add58fd5975792aa9 (diff)
downloadevolution-data-server-d6eb500aae5b8f9062bccfbcd7134595c4093bd9.tar.gz
Bug #634743 - Moving message on GMail with real Trash set deletes it
-rw-r--r--camel/providers/imap/camel-imap-folder.c43
1 files changed, 40 insertions, 3 deletions
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c
index 86a3f9f04..81f289048 100644
--- a/camel/providers/imap/camel-imap-folder.c
+++ b/camel/providers/imap/camel-imap-folder.c
@@ -1441,6 +1441,36 @@ imap_sync_offline (CamelFolder *folder,
return TRUE;
}
+static gboolean
+host_ends_with (const gchar *host, const gchar *ends)
+{
+ gint host_len, ends_len;
+
+ g_return_val_if_fail (host != NULL, FALSE);
+ g_return_val_if_fail (ends != NULL, FALSE);
+
+ host_len = strlen (host);
+ ends_len = strlen (ends);
+
+ return ends_len <= host_len && g_ascii_strcasecmp (host + host_len - ends_len, ends) == 0;
+}
+
+static gboolean
+is_google_account (CamelStore *store)
+{
+ CamelService *service;
+
+ g_return_val_if_fail (store != NULL, FALSE);
+ g_return_val_if_fail (CAMEL_IS_STORE (store), FALSE);
+
+ service = CAMEL_SERVICE (store);
+ g_return_val_if_fail (service != NULL, FALSE);
+
+ return service->url && service->url->host && (
+ host_ends_with (service->url->host, "gmail.com") ||
+ host_ends_with (service->url->host, "googlemail.com"));
+}
+
static void
move_messages (CamelFolder *src_folder,
GPtrArray *uids,
@@ -1455,6 +1485,12 @@ move_messages (CamelFolder *src_folder,
/* moving to the same folder means expunge only */
if (src_folder != des_folder) {
+ /* Google's IMAP implementation: Moving to other folder means changing
+ a tag, so do not delete (move to a real trash) the source message
+ when moving messages between folders. */
+ if (is_google_account (camel_folder_get_parent_store (src_folder)))
+ return;
+
/* do 'copy' to not be bothered with CAMEL_MESSAGE_DELETED again */
if (!imap_transfer_messages (src_folder, uids, des_folder, NULL, FALSE, FALSE, error))
return;
@@ -1472,7 +1508,7 @@ imap_sync (CamelFolder *folder,
CamelImapStore *store;
CamelImapMessageInfo *info;
CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
- gboolean success;
+ gboolean success, is_gmail;
CamelFolder *real_junk = NULL;
CamelFolder *real_trash = NULL;
GError *local_error = NULL;
@@ -1483,6 +1519,7 @@ imap_sync (CamelFolder *folder,
parent_store = camel_folder_get_parent_store (folder);
store = CAMEL_IMAP_STORE (parent_store);
+ is_gmail = is_google_account (parent_store);
if (folder->permanent_flags == 0 || CAMEL_OFFLINE_STORE (store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) {
if (expunge) {
@@ -1582,7 +1619,7 @@ imap_sync (CamelFolder *folder,
break;
}
- if (deleted_uids && (info->info.flags & CAMEL_MESSAGE_DELETED) != 0) {
+ if (deleted_uids && !is_gmail && (info->info.flags & CAMEL_MESSAGE_DELETED) != 0) {
/* there is a real trash, do not set it on the server */
info->info.flags &= ~CAMEL_MESSAGE_DELETED;
}
@@ -1634,7 +1671,7 @@ imap_sync (CamelFolder *folder,
if (local_error == NULL) {
for (j = 0; j < matches->len; j++) {
info = matches->pdata[j];
- if (deleted_uids) {
+ if (deleted_uids && !is_gmail) {
/* there is a real trash, do not keep this set */
info->info.flags &= ~CAMEL_MESSAGE_DELETED;
}