summaryrefslogtreecommitdiff
blob: 052f1d5b7f4a7b7be9b6af4c10a637f1807ab69b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
From 8b8ddbd16eeb3217a7a15b59e8f966b61d989977 Mon Sep 17 00:00:00 2001
From: Milan Crha <mcrha@redhat.com>
Date: Thu, 08 Aug 2013 05:48:49 +0000
Subject: Bug #705446 - Old POP3 mails can be removed before getting them

---
diff --git a/libemail-engine/mail-ops.c b/libemail-engine/mail-ops.c
index dccd001..643b82c 100644
--- a/libemail-engine/mail-ops.c
+++ b/libemail-engine/mail-ops.c
@@ -348,7 +348,7 @@ fetch_mail_exec (struct _fetch_mail_msg *m,
 			g_object_ref (fm->destination);
 		}
 
-		if (!local_error) {
+		if (!local_error && !g_cancellable_is_cancelled (cancellable)) {
 			folder_uids = camel_folder_get_uids (folder);
 			cache_uids = camel_uid_cache_get_new_uids (cache, folder_uids);
 
@@ -373,11 +373,26 @@ fetch_mail_exec (struct _fetch_mail_msg *m,
 					g_cancellable_reset (m->cancellable);
 
 				if (!success) {
+					GPtrArray *uncached_uids;
+					GHashTable *uncached_hash;
+
+					uncached_uids = camel_folder_get_uncached_uids (folder, cache_uids, NULL);
+					uncached_hash = g_hash_table_new (g_str_hash, g_str_equal);
+
+					for (i = 0; uncached_uids && i < uncached_uids->len; i++) {
+						g_hash_table_insert (uncached_hash, uncached_uids->pdata[i], uncached_uids->pdata[i]);
+					}
+
 					/* re-enter known UIDs, thus they are not
 					 * re-fetched next time */
 					for (i = 0; i < cache_uids->len; i++) {
-						camel_uid_cache_save_uid (cache, cache_uids->pdata[i]);
+						/* skip uncached UIDs */
+						if (!g_hash_table_lookup (uncached_hash, cache_uids->pdata[i]))
+							camel_uid_cache_save_uid (cache, cache_uids->pdata[i]);
 					}
+
+					g_hash_table_destroy (uncached_hash);
+					camel_folder_free_uids (folder, uncached_uids);
 				}
 
 				/* save the cache of uids that we've just downloaded */
@@ -433,9 +448,18 @@ exit:
 
 	/* also disconnect if not a local delivery mbox;
 	 * there is no need to keep the connection alive forever */
-	if (!is_local_delivery)
+	if (!is_local_delivery) {
+		gboolean was_cancelled;
+
+		was_cancelled = g_cancellable_is_cancelled (cancellable);
+
+		/* pity, but otherwise it doesn't disconnect */
+		if (was_cancelled)
+			g_cancellable_reset (cancellable);
+
 		camel_service_disconnect_sync (
-			service, TRUE, cancellable, NULL);
+			service, !was_cancelled, cancellable, NULL);
+	}
 
 	g_object_unref (session);
 }
--
cgit v0.9.2