diff options
author | Jeffrey Stedfast <fejj@helixcode.com> | 2000-08-30 01:04:54 +0800 |
---|---|---|
committer | Jeffrey Stedfast <fejj@src.gnome.org> | 2000-08-30 01:04:54 +0800 |
commit | e02a9171c4acc0d0884c32ad6b9119663b0d9bf2 (patch) | |
tree | 89bf6a1f87bbe1faa95969a9ddf9f3776ddf5b12 /camel/providers/imap | |
parent | 5fadb311e670e53e35c8cfd637c70d57ed497fb1 (diff) | |
download | gsoc2013-evolution-e02a9171c4acc0d0884c32ad6b9119663b0d9bf2.tar.gz gsoc2013-evolution-e02a9171c4acc0d0884c32ad6b9119663b0d9bf2.tar.zst gsoc2013-evolution-e02a9171c4acc0d0884c32ad6b9119663b0d9bf2.zip |
Updated to check for EXPUNGE notifications
2000-08-29 Jeffrey Stedfast <fejj@helixcode.com>
* providers/imap/camel-imap-store.c (camel_imap_command_extended):
Updated to check for EXPUNGE notifications
* providers/imap/camel-imap-folder.c (camel_imap_folder_changed):
Updated to account for messages which have been expunged (now
takes a new arg, a GPtrArray of message id's that have been
expunged)
(imap_expunge): Updated (we may want to just use the code in
folder_changed now instead of doing our own summary
expunging...but that can be fixed later)
(imap_append_message): Updated.
(imap_copy_message_to): Updated.
(imap_move_message_to): Updated.
svn path=/trunk/; revision=5098
Diffstat (limited to 'camel/providers/imap')
-rw-r--r-- | camel/providers/imap/camel-imap-folder.c | 45 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-folder.h | 3 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-store.c | 41 |
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); } |