aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers/imap4/camel-imap4-summary.c
diff options
context:
space:
mode:
Diffstat (limited to 'camel/providers/imap4/camel-imap4-summary.c')
-rw-r--r--camel/providers/imap4/camel-imap4-summary.c69
1 files changed, 48 insertions, 21 deletions
diff --git a/camel/providers/imap4/camel-imap4-summary.c b/camel/providers/imap4/camel-imap4-summary.c
index fa7cd7778a..f5fec4d05e 100644
--- a/camel/providers/imap4/camel-imap4-summary.c
+++ b/camel/providers/imap4/camel-imap4-summary.c
@@ -105,6 +105,10 @@ camel_imap4_summary_init (CamelIMAP4Summary *summary, CamelIMAP4SummaryClass *kl
CAMEL_MESSAGE_DRAFT | CAMEL_MESSAGE_FLAGGED | CAMEL_MESSAGE_SEEN;
folder_summary->message_info_size = sizeof (CamelIMAP4MessageInfo);
+
+ summary->update_flags = TRUE;
+ summary->exists_changed = FALSE;
+ summary->uidvalidity_changed = FALSE;
}
static void
@@ -156,8 +160,10 @@ imap4_header_save (CamelFolderSummary *summary, FILE *fout)
static int
envelope_decode_address (CamelIMAP4Engine *engine, GString *addrs, CamelException *ex)
{
+ char *addr, *name = NULL, *user = NULL;
+ struct _camel_header_address *cia;
camel_imap4_token_t token;
- gboolean had_name = FALSE;
+ const char *domain = NULL;
int part = 0;
if (camel_imap4_engine_next_token (engine, &token, ex) == -1)
@@ -184,25 +190,39 @@ envelope_decode_address (CamelIMAP4Engine *engine, GString *addrs, CamelExceptio
case CAMEL_IMAP4_TOKEN_QSTRING:
switch (part) {
case 0:
- g_string_append_printf (addrs, "\"%s\" <", token.v.qstring);
- had_name = TRUE;
+ name = camel_header_decode_string (token.v.qstring, NULL);
break;
case 2:
- g_string_append (addrs, token.v.qstring);
+ user = g_strdup (token.v.qstring);
break;
case 3:
- g_string_append_printf (addrs, "@%s%s", token.v.qstring, had_name ? ">" : "");
+ domain = token.v.qstring;
break;
}
break;
default:
camel_imap4_utils_set_unexpected_token_error (ex, engine, &token);
+ g_free (name);
+ g_free (user);
return -1;
}
part++;
} while (part < 4);
+ addr = g_strdup_printf ("%s@%s", user, domain);
+ g_free (user);
+
+ cia = camel_header_address_new_name (name, addr);
+ g_free (name);
+ g_free (addr);
+
+ addr = camel_header_address_list_format (cia);
+ camel_header_address_unref (cia);
+
+ g_string_append (addrs, addr);
+ g_free (addr);
+
if (camel_imap4_engine_next_token (engine, &token, ex) == -1)
return -1;
@@ -290,7 +310,7 @@ envelope_decode_date (CamelIMAP4Engine *engine, time_t *date, CamelException *ex
}
static int
-envelope_decode_nstring (CamelIMAP4Engine *engine, char **nstring, CamelException *ex)
+envelope_decode_nstring (CamelIMAP4Engine *engine, char **nstring, gboolean rfc2047, CamelException *ex)
{
camel_imap4_token_t token;
@@ -302,10 +322,16 @@ envelope_decode_nstring (CamelIMAP4Engine *engine, char **nstring, CamelExceptio
*nstring = NULL;
break;
case CAMEL_IMAP4_TOKEN_ATOM:
- *nstring = g_strdup (token.v.atom);
+ if (rfc2047)
+ *nstring = camel_header_decode_string (token.v.atom, NULL);
+ else
+ *nstring = g_strdup (token.v.atom);
break;
case CAMEL_IMAP4_TOKEN_QSTRING:
- *nstring = g_strdup (token.v.qstring);
+ if (rfc2047)
+ *nstring = camel_header_decode_string (token.v.qstring, NULL);
+ else
+ *nstring = g_strdup (token.v.qstring);
break;
default:
camel_imap4_utils_set_unexpected_token_error (ex, engine, &token);
@@ -365,7 +391,7 @@ decode_envelope (CamelIMAP4Engine *engine, CamelMessageInfo *info, camel_imap4_t
goto exception;
/* subject */
- if (envelope_decode_nstring (engine, &nstring, ex) == -1)
+ if (envelope_decode_nstring (engine, &nstring, TRUE, ex) == -1)
goto exception;
camel_message_info_set_subject (info, nstring);
@@ -400,7 +426,7 @@ decode_envelope (CamelIMAP4Engine *engine, CamelMessageInfo *info, camel_imap4_t
g_free (nstring);
/* in-reply-to */
- if (envelope_decode_nstring (engine, &nstring, ex) == -1)
+ if (envelope_decode_nstring (engine, &nstring, FALSE, ex) == -1)
goto exception;
if (nstring != NULL) {
@@ -409,7 +435,7 @@ decode_envelope (CamelIMAP4Engine *engine, CamelMessageInfo *info, camel_imap4_t
}
/* message-id */
- if (envelope_decode_nstring (engine, &nstring, ex) == -1)
+ if (envelope_decode_nstring (engine, &nstring, FALSE, ex) == -1)
goto exception;
if (nstring != NULL) {
@@ -1062,18 +1088,20 @@ camel_imap4_summary_expunge (CamelFolderSummary *summary, int seqid)
g_return_if_fail (CAMEL_IS_IMAP4_SUMMARY (summary));
- if (!(info = camel_folder_summary_index (summary, seqid - 1)))
+ seqid--;
+ if (!(info = camel_folder_summary_index (summary, seqid)))
return;
- imap4_summary->expunged_changed = TRUE;
+ imap4_summary->exists--;
changes = camel_folder_change_info_new ();
camel_folder_change_info_remove_uid (changes, camel_message_info_uid (info));
- camel_object_trigger_event (imap4_summary->folder, "folder_changed", changes);
- camel_folder_change_info_free (changes);
camel_folder_summary_info_free (summary, info);
camel_folder_summary_remove_index (summary, seqid);
+
+ camel_object_trigger_event (imap4_summary->folder, "folder_changed", changes);
+ camel_folder_change_info_free (changes);
}
@@ -1104,14 +1132,12 @@ camel_imap4_summary_flush_updates (CamelFolderSummary *summary, CamelException *
engine = ((CamelIMAP4Store *) imap4_summary->folder->parent_store)->engine;
- if (imap4_summary->expunged_changed && imap4_summary->exists_changed) {
- if (imap4_summary->exists == camel_folder_summary_count (summary))
- imap4_summary->exists_changed = FALSE;
- }
-
if (imap4_summary->uidvalidity_changed) {
first = 1;
- } else if (imap4_summary->exists_changed && imap4_summary->exists > 0) {
+ } else if (imap4_summary->update_flags || imap4_summary->exists_changed) {
+ /* this both updates flags and removes messages which
+ * have since been expunged from the server by another
+ * client */
scount = camel_folder_summary_count (summary);
ic = imap4_summary_fetch_flags (summary, 1, scount);
@@ -1151,6 +1177,7 @@ camel_imap4_summary_flush_updates (CamelFolderSummary *summary, CamelException *
g_ptr_array_sort (summary->messages, (GCompareFunc) info_uid_sort);
}
+ imap4_summary->update_flags = FALSE;
imap4_summary->exists_changed = FALSE;
imap4_summary->uidvalidity_changed = FALSE;