Sync the changes before refreshing
authorChenthill Palanisamy <pchenthill@novell.com>
Thu, 31 Dec 2009 07:58:33 +0000 (13:28 +0530)
committerChenthill Palanisamy <pchenthill@novell.com>
Thu, 31 Dec 2009 07:58:33 +0000 (13:28 +0530)
camel/providers/imapx/camel-imapx-folder.c
camel/providers/imapx/camel-imapx-server.c
camel/providers/imapx/camel-imapx-server.h

index a96f77d..fdf3a31 100644 (file)
@@ -130,31 +130,21 @@ static void
 imapx_sync (CamelFolder *folder, gboolean expunge, CamelException *ex)
 {
        CamelIMAPXStore *is = (CamelIMAPXStore *)folder->parent_store;
-       GPtrArray *changed_uids;
 
        /* Sync twice - make sure deleted flags are written out,
           then sync again incase expunge changed anything */
        camel_exception_clear(ex);
 
-       changed_uids = camel_folder_summary_get_changed (folder->summary);
-
        if (is->server) {
                camel_imapx_server_connect (is->server, 1);
 
-               camel_imapx_server_sync_changes (is->server, folder, changed_uids, ex);
-
-               if (camel_exception_is_set (ex))
-                       goto exception;
+               camel_imapx_server_sync_changes (is->server, folder, ex);
        }
 
        if (is->server && expunge) {
                camel_imapx_server_expunge(is->server, folder, ex);
                camel_exception_clear(ex);
        }
-
-exception:
-       g_ptr_array_foreach (changed_uids, (GFunc) camel_pstring_free, NULL);
-       g_ptr_array_free (changed_uids, TRUE);
 }
 
 static CamelMimeMessage *
index fb1517f..12940c4 100644 (file)
@@ -30,6 +30,7 @@
 #include <camel/camel-stream-filter.h>
 #include <camel/camel-mime-filter-canon.h>
 #include <camel/camel-mime-message.h>
+#include "camel/camel-string-utils.h"
 #include <camel/camel-net-utils.h>
 #include <camel/camel-tcp-stream-ssl.h>
 #include <camel/camel-tcp-stream-raw.h>
@@ -3124,7 +3125,10 @@ camel_imapx_server_refresh_info(CamelIMAPXServer *is, CamelFolder *folder, Camel
                camel_folder_change_info_clear(job->u.refresh_info.changes);
        }
 
+       /* Sync changes before fetching status, else unread check later would fail. need to think about better ways for this */
+       camel_imapx_server_sync_changes (is, folder, ex);
        total = camel_folder_summary_count (folder->summary);
+
        /* Check if a rescan is needed */
        if (is->exists == total) {
                CamelIMAPXCommand *ic;
@@ -3166,9 +3170,10 @@ imapx_sync_free_user(GArray *user_set)
 }
 
 void
-camel_imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, GPtrArray *uids, CamelException *ex)
+camel_imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, CamelException *ex)
 {
        guint i, on_orset, off_orset;
+       GPtrArray *uids;
        GArray *on_user = NULL, *off_user = NULL;
        CamelIMAPXMessageInfo *info;
        CamelIMAPXJob *job;
@@ -3183,6 +3188,12 @@ camel_imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, GPtrA
           one for each flag being turned off, including each
           info being turned off, and one for each flag being turned on.
        */
+       uids = camel_folder_summary_get_changed (folder->summary);
+
+       if (uids->len == 0) {
+               g_ptr_array_free (uids, TRUE);
+               return;
+       }
 
        off_orset = on_orset = 0;
        for (i=0; i < uids->len; i++) {
@@ -3279,6 +3290,9 @@ camel_imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, GPtrA
 
        imapx_sync_free_user(on_user);
        imapx_sync_free_user(off_user);
+
+       g_ptr_array_foreach (uids, (GFunc) camel_pstring_free, NULL);
+       g_ptr_array_free (uids, TRUE);
 }
 
 /* expunge-uids? */
index 2e3e595..e434870 100644 (file)
@@ -106,7 +106,7 @@ gboolean camel_imapx_server_connect(CamelIMAPXServer *is, gint state);
 GPtrArray *camel_imapx_server_list(CamelIMAPXServer *is, const gchar *top, guint32 flags, CamelException *ex);
 
 void camel_imapx_server_refresh_info(CamelIMAPXServer *is, CamelFolder *folder, struct _CamelException *ex);
-void camel_imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, GPtrArray *infos, CamelException *ex);
+void camel_imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, CamelException *ex);
 void camel_imapx_server_expunge(CamelIMAPXServer *is, CamelFolder *folder, CamelException *ex);
 
 CamelStream *camel_imapx_server_get_message(CamelIMAPXServer *is, CamelFolder *folder, const gchar *uid, struct _CamelException *ex);