aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers/imap
diff options
context:
space:
mode:
Diffstat (limited to 'camel/providers/imap')
-rw-r--r--camel/providers/imap/camel-imap-folder.c45
-rw-r--r--camel/providers/imap/camel-imap-folder.h3
-rw-r--r--camel/providers/imap/camel-imap-store.c41
3 files changed, 70 insertions, 19 deletions
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c
index 33d7d06a91..e3ce219b89 100644
--- a/camel/providers/imap/camel-imap-folder.c
+++ b/camel/providers/imap/camel-imap-folder.c
@@ -439,7 +439,7 @@ imap_expunge (CamelFolder *folder, CamelException *ex)
g_free (result);
- camel_imap_folder_changed (folder, recent, ex);
+ camel_imap_folder_changed (folder, recent, NULL, ex);
}
static gint
@@ -620,7 +620,7 @@ imap_append_message (CamelFolder *folder, CamelMimeMessage *message, const Camel
g_free (cmdid);
g_free (result);
- camel_imap_folder_changed (folder, 1, ex);
+ camel_imap_folder_changed (folder, 1, NULL, ex);
}
static void
@@ -656,7 +656,7 @@ imap_copy_message_to (CamelFolder *source, const char *uid, CamelFolder *destina
g_free (result);
g_free (folder_path);
- camel_imap_folder_changed (destination, 1, ex);
+ camel_imap_folder_changed (destination, 1, NULL, ex);
}
/* FIXME: Duplication of code! */
@@ -705,7 +705,7 @@ imap_move_message_to (CamelFolder *source, const char *uid, CamelFolder *destina
imap_set_message_flags (source, uid, CAMEL_MESSAGE_DELETED, ~(info->flags));
- camel_imap_folder_changed (destination, 1, ex);
+ camel_imap_folder_changed (destination, 1, NULL, ex);
}
static GPtrArray *
@@ -1544,11 +1544,42 @@ imap_set_message_user_flag (CamelFolder *folder, const char *uid, const char *na
}
void
-camel_imap_folder_changed (CamelFolder *folder, gint recent, CamelException *ex)
+camel_imap_folder_changed (CamelFolder *folder, gint recent, GPtrArray *expunged, CamelException *ex)
{
- d(fprintf (stderr, "camel_imap_folder_changed: recent = %d\n", recent));
+ CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
- g_return_if_fail (recent);
+ if (expunged) {
+ gint i, id;
+
+ for (i = 0; i < expunged->len; i++) {
+ id = atoi (expunged->pdata[i]);
+ d(fprintf (stderr, "Expunging message %d from the summary (i = %d)\n", id + i, i));
+
+ if (id <= imap_folder->summary->len) {
+ CamelMessageInfo *info;
+
+ info = (CamelMessageInfo *) imap_folder->summary->pdata[id - 1];
+
+ /* remove from the lookup table and summary */
+ g_hash_table_remove (imap_folder->summary_hash, info->uid);
+ g_ptr_array_remove_index (imap_folder->summary, id - 1);
+
+ /* free the info data */
+ g_free (info->subject);
+ g_free (info->from);
+ g_free (info->to);
+ g_free (info->cc);
+ g_free (info->uid);
+ g_free (info->message_id);
+ header_references_list_clear (&info->references);
+ g_free (info);
+ info = NULL;
+ } else {
+ /* Hopefully this should never happen */
+ d(fprintf (stderr, "imap expunge-error: message %d is out of range\n", id));
+ }
+ }
+ }
if (recent > 0) {
CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
diff --git a/camel/providers/imap/camel-imap-folder.h b/camel/providers/imap/camel-imap-folder.h
index bd1647c300..4df50ed027 100644
--- a/camel/providers/imap/camel-imap-folder.h
+++ b/camel/providers/imap/camel-imap-folder.h
@@ -65,7 +65,8 @@ typedef struct {
CamelFolder *camel_imap_folder_new (CamelStore *parent, char *folder_name,
CamelException *ex);
-void camel_imap_folder_changed (CamelFolder *folder, gint recent, CamelException *ex);
+void camel_imap_folder_changed (CamelFolder *folder, gint recent, GPtrArray *expunged,
+ CamelException *ex);
/* Standard Camel function */
CamelType camel_imap_folder_get_type (void);
diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c
index f7662ade84..9e57dc03d7 100644
--- a/camel/providers/imap/camel-imap-store.c
+++ b/camel/providers/imap/camel-imap-store.c
@@ -824,7 +824,7 @@ camel_imap_command_extended (CamelImapStore *store, CamelFolder *folder, char **
CamelURL *url = service->url;
gint len = 0, recent = 0, status = CAMEL_IMAP_OK;
gchar *cmdid, *cmdbuf, *respbuf;
- GPtrArray *data;
+ GPtrArray *data, *expunged = NULL;
va_list app;
int i;
@@ -893,6 +893,7 @@ camel_imap_command_extended (CamelImapStore *store, CamelFolder *folder, char **
g_free (cmdbuf);
data = g_ptr_array_new ();
+ expunged = g_ptr_array_new ();
while (1) {
CamelStreamBuffer *stream = CAMEL_STREAM_BUFFER (store->istream);
@@ -925,14 +926,27 @@ camel_imap_command_extended (CamelImapStore *store, CamelFolder *folder, char **
if (recent && *respbuf != '*')
recent = 0;
- if (*respbuf == '*' && (ptr = strstr (respbuf, "RECENT"))) {
- char *rcnt;
-
- d(fprintf (stderr, "*** We may have found a 'RECENT' flag: %s\n", respbuf));
- /* Make sure it's in the form: "* %d RECENT" */
- rcnt = imap_next_word (respbuf);
- if (*rcnt >= '0' && *rcnt <= '9' && !strncmp ("RECENT", imap_next_word (rcnt), 6))
- recent = atoi (rcnt);
+ if (*respbuf == '*') {
+ if ((ptr = strstr (respbuf, "RECENT"))) {
+ char *rcnt;
+
+ d(fprintf (stderr, "*** We may have found a 'RECENT' flag: %s\n", respbuf));
+ /* Make sure it's in the form: "* %d RECENT" */
+ rcnt = imap_next_word (respbuf);
+ if (*rcnt >= '0' && *rcnt <= '9' && !strncmp ("RECENT", imap_next_word (rcnt), 6))
+ recent = atoi (rcnt);
+ } else if ((ptr = strstr (respbuf, "EXPUNGE"))) {
+ char *id_str;
+ int id;
+
+ d(fprintf (stderr, "*** We may have found an 'EXPUNGE' flag: %s\n", respbuf));
+ /* Make sure it's in the form: "* %d EXPUNGE" */
+ id_str = imap_next_word (respbuf);
+ if (*id_str >= '0' && *id_str <= '9' && !strncmp ("EXPUNGE", imap_next_word (id_str), 7)) {
+ id = atoi (id_str);
+ g_ptr_array_add (expunged, g_strdup_printf ("%d", id));
+ }
+ }
}
}
@@ -965,7 +979,7 @@ camel_imap_command_extended (CamelImapStore *store, CamelFolder *folder, char **
} else {
if (status != CAMEL_IMAP_FAIL && respbuf) {
char *word;
-
+
word = imap_next_word (respbuf); /* word should now point to NO or BAD */
*ret = g_strdup (imap_next_word (word));
@@ -982,7 +996,12 @@ camel_imap_command_extended (CamelImapStore *store, CamelFolder *folder, char **
CamelException *ex;
ex = camel_exception_new ();
- camel_imap_folder_changed (folder, recent, ex);
+ camel_imap_folder_changed (folder, recent, expunged, ex);
+
+ for (i = 0; i < expunged->len; i++)
+ g_free (expunged->pdata[i]);
+ g_ptr_array_free (expunged, TRUE);
+
camel_exception_free (ex);
}