Blob Blame History Raw
diff -up evolution-ews-3.22.6/src/camel/camel-ews-folder.c.message-date-in-utc evolution-ews-3.22.6/src/camel/camel-ews-folder.c
--- evolution-ews-3.22.6/src/camel/camel-ews-folder.c.message-date-in-utc	2017-01-13 14:13:51.000000000 +0100
+++ evolution-ews-3.22.6/src/camel/camel-ews-folder.c	2017-03-17 10:16:38.925847814 +0100
@@ -592,6 +592,7 @@ camel_ews_folder_get_message (CamelFolde
 
 	add_props = e_ews_additional_props_new ();
 	add_props->field_uri = g_strdup ("item:MimeContent message:From message:Sender");
+	add_props->indexed_furis = g_slist_prepend (NULL, e_ews_indexed_field_uri_new ("item:InternetMessageHeader", "Date"));
 
 	res = e_ews_connection_get_items_sync (
 		cnc, pri, ids, "IdOnly", add_props,
@@ -700,7 +701,8 @@ camel_ews_folder_get_message (CamelFolde
 	message = camel_ews_folder_get_message_from_cache (ews_folder, uid, cancellable, error);
 	if (message) {
 		CamelInternetAddress *from;
-		const gchar *email = NULL;
+		const gchar *email = NULL, *date_header;
+		gboolean resave = FALSE;
 
 		from = camel_mime_message_get_from (message);
 
@@ -711,8 +713,6 @@ camel_ews_folder_get_message (CamelFolde
 			if (!mailbox)
 				mailbox = e_ews_item_get_sender (items->data);
 			if (mailbox) {
-				CamelStream *cache_stream;
-
 				email = NULL;
 
 				if (g_strcmp0 (mailbox->routing_type, "EX") == 0)
@@ -723,15 +723,33 @@ camel_ews_folder_get_message (CamelFolde
 				camel_mime_message_set_from (message, from);
 				g_object_unref (from);
 
-				g_rec_mutex_lock (&priv->cache_lock);
-				/* Ignore errors here, it's nothing fatal in this case */
-				cache_stream = ews_data_cache_get (ews_folder->cache, "cur", uid, NULL);
-				if (cache_stream) {
-					camel_data_wrapper_write_to_stream_sync (CAMEL_DATA_WRAPPER (message), cache_stream, cancellable, NULL);
-					g_object_unref (cache_stream);
-				}
-				g_rec_mutex_unlock (&priv->cache_lock);
+				resave = TRUE;
+			}
+		}
+
+		date_header = e_ews_item_get_date_header (items->data);
+		if (date_header && *date_header) {
+			time_t tt;
+			gint tz_offset;
+
+			tt = camel_header_decode_date (date_header, &tz_offset);
+			if (tt > 0) {
+				camel_mime_message_set_date (message, tt, tz_offset);
+				resave = TRUE;
+			}
+		}
+
+		if (resave) {
+			CamelStream *cache_stream;
+
+			g_rec_mutex_lock (&priv->cache_lock);
+			/* Ignore errors here, it's nothing fatal in this case */
+			cache_stream = ews_data_cache_get (ews_folder->cache, "cur", uid, NULL);
+			if (cache_stream) {
+				camel_data_wrapper_write_to_stream_sync (CAMEL_DATA_WRAPPER (message), cache_stream, cancellable, NULL);
+				g_object_unref (cache_stream);
 			}
+			g_rec_mutex_unlock (&priv->cache_lock);
 		}
 	}
 
diff -up evolution-ews-3.22.6/src/server/e-ews-connection.c.message-date-in-utc evolution-ews-3.22.6/src/server/e-ews-connection.c
--- evolution-ews-3.22.6/src/server/e-ews-connection.c.message-date-in-utc	2017-01-13 14:13:51.000000000 +0100
+++ evolution-ews-3.22.6/src/server/e-ews-connection.c	2017-03-17 10:16:38.926847814 +0100
@@ -383,9 +383,16 @@ e_ews_extended_field_uri_free (EEwsExten
 }
 
 EEwsIndexedFieldURI *
-e_ews_indexed_field_uri_new (void)
+e_ews_indexed_field_uri_new (const gchar *uri,
+			     const gchar *index)
 {
-	return g_new0 (EEwsIndexedFieldURI, 1);
+	EEwsIndexedFieldURI *furi;
+
+	furi = g_new0 (EEwsIndexedFieldURI, 1);
+	furi->field_uri = g_strdup (uri);
+	furi->field_index = g_strdup (index);
+
+	return furi;
 }
 
 void
diff -up evolution-ews-3.22.6/src/server/e-ews-connection.h.message-date-in-utc evolution-ews-3.22.6/src/server/e-ews-connection.h
--- evolution-ews-3.22.6/src/server/e-ews-connection.h.message-date-in-utc	2017-01-13 14:13:51.000000000 +0100
+++ evolution-ews-3.22.6/src/server/e-ews-connection.h	2017-03-17 10:16:38.927847814 +0100
@@ -371,7 +371,8 @@ EEwsExtendedFieldURI *
 void		e_ews_extended_field_uri_free	(EEwsExtendedFieldURI *ex_field_uri);
 
 EEwsIndexedFieldURI *
-		e_ews_indexed_field_uri_new	(void);
+		e_ews_indexed_field_uri_new	(const gchar *uri,
+						 const gchar *index);
 void		e_ews_indexed_field_uri_free	(EEwsIndexedFieldURI *id_field_uri);
 
 EEwsAdditionalProps *
diff -up evolution-ews-3.22.6/src/server/e-ews-item.c.message-date-in-utc evolution-ews-3.22.6/src/server/e-ews-item.c
--- evolution-ews-3.22.6/src/server/e-ews-item.c.message-date-in-utc	2016-06-14 15:29:01.000000000 +0200
+++ evolution-ews-3.22.6/src/server/e-ews-item.c	2017-03-17 10:16:38.927847814 +0100
@@ -108,6 +108,7 @@ struct _EEwsItemPrivate {
 	gchar *subject;
 	gchar *mime_content;
 
+	gchar *date_header;
 	time_t date_received;
 	time_t date_sent;
 	time_t date_created;
@@ -210,6 +211,9 @@ e_ews_item_dispose (GObject *object)
 	g_free (priv->references);
 	priv->references = NULL;
 
+	g_free (priv->date_header);
+	priv->date_header = NULL;
+
 	g_free (priv->timezone);
 	priv->timezone = NULL;
 
@@ -1043,6 +1047,20 @@ e_ews_item_set_from_soap_parameter (EEws
 			priv->item_id->change_key = e_soap_parameter_get_property (subparam, "ChangeKey");
 		} else if (!g_ascii_strcasecmp (name, "Subject")) {
 			priv->subject = e_soap_parameter_get_string_value (subparam);
+		} else if (!g_ascii_strcasecmp (name, "InternetMessageHeaders")) {
+			for (subparam1 = e_soap_parameter_get_first_child_by_name (subparam, "InternetMessageHeader");
+			     subparam1;
+			     subparam1 = e_soap_parameter_get_next_child (subparam1)) {
+				gchar *str = e_soap_parameter_get_property (subparam1, "HeaderName");
+
+				if (g_strcmp0 (str, "Date") == 0) {
+					priv->date_header = e_soap_parameter_get_string_value (subparam1);
+					g_free (str);
+					break;
+				}
+
+				g_free (str);
+			}
 		} else if (!g_ascii_strcasecmp (name, "DateTimeReceived")) {
 			value = e_soap_parameter_get_string_value (subparam);
 			priv->date_received = ews_item_parse_date (value);
@@ -1309,6 +1327,7 @@ e_ews_item_get_in_replyto (EEwsItem *ite
 
 	return (const gchar *) item->priv->in_replyto;
 }
+
 const gchar *
 e_ews_item_get_references (EEwsItem *item)
 {
@@ -1317,6 +1336,14 @@ e_ews_item_get_references (EEwsItem *ite
 	return (const gchar *) item->priv->references;
 }
 
+const gchar *
+e_ews_item_get_date_header (EEwsItem *item)
+{
+	g_return_val_if_fail (E_IS_EWS_ITEM (item), NULL);
+
+	return item->priv->date_header;
+}
+
 time_t
 e_ews_item_get_date_received (EEwsItem *item)
 {
diff -up evolution-ews-3.22.6/src/server/e-ews-item.h.message-date-in-utc evolution-ews-3.22.6/src/server/e-ews-item.h
--- evolution-ews-3.22.6/src/server/e-ews-item.h.message-date-in-utc	2016-04-27 18:57:55.000000000 +0200
+++ evolution-ews-3.22.6/src/server/e-ews-item.h	2017-03-17 10:16:38.927847814 +0100
@@ -185,6 +185,7 @@ const gchar *	e_ews_item_get_msg_id		(EE
 const gchar *	e_ews_item_get_uid		(EEwsItem *item);
 const gchar *	e_ews_item_get_in_replyto	(EEwsItem *item);
 const gchar *	e_ews_item_get_references	(EEwsItem *item);
+const gchar *	e_ews_item_get_date_header	(EEwsItem *item);
 time_t		e_ews_item_get_date_received	(EEwsItem *item);
 time_t		e_ews_item_get_date_sent	(EEwsItem *item);
 time_t		e_ews_item_get_date_created	(EEwsItem *item);