[evolution-data-server] Bug 793476 - [IMAPx] Message download interleave when synchronizing for offline



commit 656a5834ab7241c9df7ac9b400e044256ba09671
Author: Milan Crha <mcrha redhat com>
Date:   Tue Feb 20 11:39:54 2018 +0100

    Bug 793476 - [IMAPx] Message download interleave when synchronizing for offline

 .../providers/imapx/camel-imapx-conn-manager.c     |   13 ++++++++-----
 src/camel/providers/imapx/camel-imapx-server.c     |   11 +++++++++++
 2 files changed, 19 insertions(+), 5 deletions(-)
---
diff --git a/src/camel/providers/imapx/camel-imapx-conn-manager.c 
b/src/camel/providers/imapx/camel-imapx-conn-manager.c
index 42d5dbd..da7d32d 100644
--- a/src/camel/providers/imapx/camel-imapx-conn-manager.c
+++ b/src/camel/providers/imapx/camel-imapx-conn-manager.c
@@ -2063,9 +2063,12 @@ imapx_conn_manager_get_message_matches (CamelIMAPXJob *job,
        g_return_val_if_fail (job != NULL, FALSE);
        g_return_val_if_fail (other_job != NULL, FALSE);
 
-       if (camel_imapx_job_get_kind (job) != CAMEL_IMAPX_JOB_GET_MESSAGE ||
-           camel_imapx_job_get_kind (job) != camel_imapx_job_get_kind (other_job))
+       if ((camel_imapx_job_get_kind (job) != CAMEL_IMAPX_JOB_GET_MESSAGE &&
+           camel_imapx_job_get_kind (job) != CAMEL_IMAPX_JOB_SYNC_MESSAGE) ||
+           (camel_imapx_job_get_kind (other_job) != CAMEL_IMAPX_JOB_GET_MESSAGE &&
+           camel_imapx_job_get_kind (other_job) != CAMEL_IMAPX_JOB_SYNC_MESSAGE)) {
                return FALSE;
+       }
 
        job_data = camel_imapx_job_get_user_data (job);
        other_job_data = camel_imapx_job_get_user_data (other_job);
@@ -2073,7 +2076,7 @@ imapx_conn_manager_get_message_matches (CamelIMAPXJob *job,
        if (!job_data || !other_job_data)
                return FALSE;
 
-       return g_strcmp0 (job_data->message_uid, other_job_data->message_uid) == 0;
+       return job_data->summary == other_job_data->summary && g_strcmp0 (job_data->message_uid, 
other_job_data->message_uid) == 0;
 }
 
 static void
@@ -2115,7 +2118,7 @@ camel_imapx_conn_manager_get_message_sync (CamelIMAPXConnManager *conn_man,
 
        camel_imapx_job_set_user_data (job, job_data, get_message_job_data_free);
 
-       if (camel_imapx_conn_manager_run_job_sync (conn_man, job, NULL, cancellable, error) &&
+       if (camel_imapx_conn_manager_run_job_sync (conn_man, job, imapx_conn_manager_get_message_matches, 
cancellable, error) &&
            camel_imapx_job_take_result_data (job, &result_data)) {
                result = result_data;
        } else {
@@ -2418,7 +2421,7 @@ camel_imapx_conn_manager_sync_message_sync (CamelIMAPXConnManager *conn_man,
 
        camel_imapx_job_set_user_data (job, job_data, get_message_job_data_free);
 
-       success = camel_imapx_conn_manager_run_job_sync (conn_man, job, NULL, cancellable, error);
+       success = camel_imapx_conn_manager_run_job_sync (conn_man, job, 
imapx_conn_manager_get_message_matches, cancellable, error);
 
        camel_imapx_job_unref (job);
 
diff --git a/src/camel/providers/imapx/camel-imapx-server.c b/src/camel/providers/imapx/camel-imapx-server.c
index 02632ba..d6969a6 100644
--- a/src/camel/providers/imapx/camel-imapx-server.c
+++ b/src/camel/providers/imapx/camel-imapx-server.c
@@ -4030,6 +4030,17 @@ camel_imapx_server_get_message_sync (CamelIMAPXServer *is,
           or finished with an error. */
        camel_data_cache_remove (message_cache, "tmp", message_uid, NULL);
 
+       /* Check whether the message is already downloaded by another job */
+       cache_stream = camel_data_cache_get (message_cache, "cur", message_uid, NULL);
+       if (cache_stream) {
+               result_stream = camel_stream_new (cache_stream);
+
+               g_clear_object (&cache_stream);
+               g_clear_object (&mi);
+
+               return result_stream;
+       }
+
        cache_stream = camel_data_cache_add (message_cache, "tmp", message_uid, error);
        if (cache_stream == NULL) {
                g_clear_object (&mi);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]