aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog12
-rw-r--r--camel/providers/imap/camel-imap-folder.c27
2 files changed, 34 insertions, 5 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index aff141f306..33c482a2c3 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,15 @@
+2002-09-23 Jeffrey Stedfast <fejj@ximian.com>
+
+ * providers/imap/camel-imap-folder.c (add_message_from_data):
+ Decode the INTERNALDATE if we've got one.
+ (imap_update_summary): Instead of requesting a list of specific
+ headers, request HEADER.FIELDS.NOT (RECEIVED) to reduce bandwidth
+ usage even more.
+ (parse_fetch_response): Change slightly to allow HEADER.FIELDS or
+ HEADER.FIELDS.NOT so that we can make changes in
+ imap_update_summary and not need to keep changing this function to
+ match. Also parse an INTERNALDATE response.
+
2002-09-22 Dan Winship <danw@ximian.com>
* camel-mime-parser.c (folder_scan_drop_step): fix non-ANSI switch
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c
index 39450975d6..51c46d6d8c 100644
--- a/camel/providers/imap/camel-imap-folder.c
+++ b/camel/providers/imap/camel-imap-folder.c
@@ -2009,6 +2009,7 @@ add_message_from_data (CamelFolder *folder, GPtrArray *messages,
CamelMimeMessage *msg;
CamelStream *stream;
CamelMessageInfo *mi;
+ const char *idate;
int seq;
seq = GPOINTER_TO_INT (g_datalist_get_data (&data, "SEQUENCE"));
@@ -2020,7 +2021,7 @@ add_message_from_data (CamelFolder *folder, GPtrArray *messages,
if (seq - first >= messages->len)
g_ptr_array_set_size (messages, seq - first + 1);
-
+
msg = camel_mime_message_new ();
if (camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (msg), stream) == -1) {
camel_object_unref (CAMEL_OBJECT (msg));
@@ -2030,6 +2031,11 @@ add_message_from_data (CamelFolder *folder, GPtrArray *messages,
mi = camel_folder_summary_info_new_from_message (folder->summary, msg);
camel_object_unref (CAMEL_OBJECT (msg));
+ if ((idate = g_datalist_get_data (&data, "INTERNALDATE")))
+ mi->date_received = parse_broken_date (idate, NULL);
+ else
+ mi->date_received = mi->date_sent;
+
messages->pdata[seq - first] = mi;
}
@@ -2060,7 +2066,7 @@ imap_update_summary (CamelFolder *folder, int exists,
CAMEL_SERVICE_ASSERT_LOCKED (store, connect_lock);
if (store->server_level >= IMAP_LEVEL_IMAP4REV1)
- header_spec = "HEADER.FIELDS (" CAMEL_MESSAGE_INFO_HEADERS " " MAILING_LIST_HEADERS ")";
+ header_spec = "HEADER.FIELDS.NOT (RECEIVED)";
else
header_spec = "0";
@@ -2086,7 +2092,7 @@ imap_update_summary (CamelFolder *folder, int exists,
/* None of the new messages are cached */
size += (exists - seq) * IMAP_PRETEND_SIZEOF_HEADERS;
if (!camel_imap_command_start (store, folder, ex,
- "UID FETCH %d:* (FLAGS RFC822.SIZE BODY.PEEK[%s])",
+ "UID FETCH %d:* (FLAGS RFC822.SIZE INTERNALDATE BODY.PEEK[%s])",
maxuid + 1, header_spec))
return;
camel_operation_start (NULL, _("Fetching summary information for new messages"));
@@ -2483,7 +2489,7 @@ static GData *
parse_fetch_response (CamelImapFolder *imap_folder, char *response)
{
GData *data = NULL;
- char *start, *part_spec = NULL, *body = NULL, *uid = NULL;
+ char *start, *part_spec = NULL, *body = NULL, *uid = NULL, *idate = NULL;
gboolean cache_header = TRUE, header = FALSE;
int body_len = 0;
@@ -2530,7 +2536,7 @@ parse_fetch_response (CamelImapFolder *imap_folder, char *response)
/* HEADER], HEADER.FIELDS (...)], or 0] */
if (!g_strncasecmp (response, "HEADER", 6)) {
header = TRUE;
- if (!g_strncasecmp (response + 6, ".FIELDS ", 8))
+ if (!g_strncasecmp (response + 6, ".FIELDS", 7))
cache_header = FALSE;
} else if (!g_strncasecmp (response, "0]", 2))
header = TRUE;
@@ -2577,6 +2583,17 @@ parse_fetch_response (CamelImapFolder *imap_folder, char *response)
uid = g_strndup (response + 4, len);
g_datalist_set_data_full (&data, "UID", uid, g_free);
response += 4 + len;
+ } else if (!g_strncasecmp (response, "INTERNALDATE ", 13)) {
+ int len;
+
+ response += 13;
+ if (*response == '"') {
+ response++;
+ len = strcspn (response, "\"");
+ idate = g_strndup (response, len);
+ g_datalist_set_data_full (&data, "INTERNALDATE", idate, g_free);
+ response += len + 1;
+ }
} else {
g_warning ("Unexpected FETCH response from server: (%s", response);
break;