[evolution-ews] Bug 779804 - Mail message Date header received in UTC
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-ews] Bug 779804 - Mail message Date header received in UTC
- Date: Mon, 20 Mar 2017 17:17:53 +0000 (UTC)
commit 5a62b9eeaf39291cdfc868ba1a40f707c459c042
Author: Milan Crha <mcrha redhat com>
Date: Mon Mar 20 18:17:03 2017 +0100
Bug 779804 - Mail message Date header received in UTC
src/camel/camel-ews-folder.c | 40 +++++++++++++++++++++++++++++-----------
src/server/e-ews-connection.c | 11 +++++++++--
src/server/e-ews-connection.h | 3 ++-
src/server/e-ews-item.c | 27 +++++++++++++++++++++++++++
src/server/e-ews-item.h | 1 +
5 files changed, 68 insertions(+), 14 deletions(-)
---
diff --git a/src/camel/camel-ews-folder.c b/src/camel/camel-ews-folder.c
index 23d1a98..b56724b 100644
--- a/src/camel/camel-ews-folder.c
+++ b/src/camel/camel-ews-folder.c
@@ -590,6 +590,7 @@ camel_ews_folder_get_message (CamelFolder *folder,
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,
@@ -698,7 +699,8 @@ camel_ews_folder_get_message (CamelFolder *folder,
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);
@@ -709,8 +711,6 @@ camel_ews_folder_get_message (CamelFolder *folder,
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)
@@ -721,16 +721,34 @@ camel_ews_folder_get_message (CamelFolder *folder,
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);
+ }
}
exit:
diff --git a/src/server/e-ews-connection.c b/src/server/e-ews-connection.c
index 23dc779..0c7d84a 100644
--- a/src/server/e-ews-connection.c
+++ b/src/server/e-ews-connection.c
@@ -381,9 +381,16 @@ 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)
{
- 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 --git a/src/server/e-ews-connection.h b/src/server/e-ews-connection.h
index a5a409a..7d472dc 100644
--- a/src/server/e-ews-connection.h
+++ b/src/server/e-ews-connection.h
@@ -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 --git a/src/server/e-ews-item.c b/src/server/e-ews-item.c
index 701e9dd..3f9ae98 100644
--- a/src/server/e-ews-item.c
+++ b/src/server/e-ews-item.c
@@ -106,6 +106,7 @@ struct _EEwsItemPrivate {
gchar *subject;
gchar *mime_content;
+ gchar *date_header;
time_t date_received;
time_t date_sent;
time_t date_created;
@@ -208,6 +209,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;
@@ -1041,6 +1045,20 @@ e_ews_item_set_from_soap_parameter (EEwsItem *item,
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);
@@ -1307,6 +1325,7 @@ e_ews_item_get_in_replyto (EEwsItem *item)
return (const gchar *) item->priv->in_replyto;
}
+
const gchar *
e_ews_item_get_references (EEwsItem *item)
{
@@ -1315,6 +1334,14 @@ e_ews_item_get_references (EEwsItem *item)
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 --git a/src/server/e-ews-item.h b/src/server/e-ews-item.h
index 03b43f3..832057a 100644
--- a/src/server/e-ews-item.h
+++ b/src/server/e-ews-item.h
@@ -185,6 +185,7 @@ const gchar * e_ews_item_get_msg_id (EEwsItem *item);
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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]