[evolution-ews] Bug 779804 - Mail message Date header received in 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]