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);