[evolution-data-server] Sync the changes - imapx.
- From: Chenthill Palanisamy <pchen src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Sync the changes - imapx.
- Date: Wed, 2 Dec 2009 10:44:38 +0000 (UTC)
commit cd280385195d5c3d525cc88353d1f910ca56213d
Author: Chenthill Palanisamy <pchenthill novell com>
Date: Wed Dec 2 13:59:36 2009 +0530
Sync the changes - imapx.
camel/providers/imapx/camel-imapx-folder.c | 14 ++++++
camel/providers/imapx/camel-imapx-server.c | 69 ++++++++++++++++------------
camel/providers/imapx/camel-imapx-store.c | 8 +--
3 files changed, 57 insertions(+), 34 deletions(-)
---
diff --git a/camel/providers/imapx/camel-imapx-folder.c b/camel/providers/imapx/camel-imapx-folder.c
index dd841a5..430f0ad 100644
--- a/camel/providers/imapx/camel-imapx-folder.c
+++ b/camel/providers/imapx/camel-imapx-folder.c
@@ -35,6 +35,7 @@
#include "camel/camel-data-cache.h"
#include "camel/camel-session.h"
#include "camel/camel-file-utils.h"
+#include "camel/camel-string-utils.h"
#include "camel-folder-search.h"
#include "camel-imapx-store.h"
@@ -126,16 +127,29 @@ 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_sync_changes (is->server, folder, changed_uids, ex);
+
+ if (camel_exception_is_set (ex))
+ goto exception;
+ }
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 *
diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c
index f024e41..81d1652 100644
--- a/camel/providers/imapx/camel-imapx-server.c
+++ b/camel/providers/imapx/camel-imapx-server.c
@@ -205,7 +205,7 @@ struct _CamelIMAPXJob {
CamelFolderChangeInfo *changes;
} refresh_info;
struct {
- GPtrArray *infos;
+ GPtrArray *changed_uids;
guint32 on_set;
guint32 off_set;
GArray *on_user; /* imapx_flag_change */
@@ -1087,8 +1087,11 @@ imapx_untagged(CamelIMAPXServer *imap, CamelException *ex)
break;
}
}
- camel_folder_summary_add(job->folder->summary, mi);
- camel_folder_change_info_add_uid (job->u.refresh_info.changes, mi->uid);
+
+ if (!camel_folder_summary_check_uid (job->folder->summary, mi->uid)) {
+ camel_folder_summary_add(job->folder->summary, mi);
+ camel_folder_change_info_add_uid (job->u.refresh_info.changes, mi->uid);
+ }
}
}
}
@@ -1974,15 +1977,16 @@ imapx_job_refresh_info_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic)
info = NULL;
if (s_minfo && uid_cmp(s_minfo->uid, r->uid, s) == 0) {
- printf("already have '%s'\n", r->uid);
info = (CamelIMAPXMessageInfo *)s_minfo;
if (info->server_flags != r->server_flags
&& camel_message_info_set_flags((CamelMessageInfo *)info, info->server_flags ^ r->server_flags, r->server_flags))
camel_folder_change_info_change_uid (job->u.refresh_info.changes, camel_message_info_uid (s_minfo));
g_free(r->uid);
r->uid = NULL;
- } else
+ } else {
fetch_new = TRUE;
+ printf ("Fetch new message for %s \n", r->uid);
+ }
j = imapx_index_next (s, j);
s_minfo = camel_folder_summary_index (s, j);
@@ -2006,7 +2010,7 @@ imapx_job_refresh_info_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic)
j++;
}
-// camel_db_delete_uids (is->store, s->folder->full_name, removed, NULL);
+ camel_db_delete_uids (is->store->cdb_w, s->folder->full_name, removed, NULL);
if (camel_folder_change_info_changed(job->u.refresh_info.changes))
camel_object_trigger_event(job->folder, "folder_changed", job->u.refresh_info.changes);
@@ -2123,14 +2127,16 @@ imapx_job_sync_changes_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic)
if (job->commands == 0) {
if (!camel_exception_is_set(job->ex)) {
gint i;
-/*
- for (i=0;i<job->u.sync_changes.infos->len;i++) {
- CamelIMAPXMessageInfo *info = job->u.sync_changes.infos->pdata[i];
- info->server_flags = ((CamelMessageInfoBase *)info)->flags & CAMEL_IMAPX_SERVER_FLAGS;
+ for (i=0;i<job->u.sync_changes.changed_uids->len;i++) {
+ CamelIMAPXMessageInfo *info = camel_folder_summary_peek_info (job->folder->summary,
+ job->u.sync_changes.changed_uids->pdata[i]);
+
+ if (info)
+ info->server_flags = ((CamelMessageInfoBase *)info)->flags & CAMEL_IMAPX_SERVER_FLAGS;
- /* FIXME: move over user flags too
- }*/
+ /* FIXME: move over user flags too */
+ }
}
camel_dlist_remove((CamelDListNode *)job);
camel_msgport_reply((CamelMsg *)job);
@@ -2142,7 +2148,7 @@ imapx_job_sync_changes_start(CamelIMAPXServer *is, CamelIMAPXJob *job)
{
guint32 i, j;
struct _uidset_state ss;
- GPtrArray *infos = job->u.sync_changes.infos;
+ GPtrArray *uids = job->u.sync_changes.changed_uids;
gint on;
for (on=0;on<2;on++) {
@@ -2158,8 +2164,8 @@ imapx_job_sync_changes_start(CamelIMAPXServer *is, CamelIMAPXJob *job)
printf("checking/storing %s flags '%s'\n", on?"on":"off", flags_table[j].name);
imapx_uidset_init(&ss, 0, 100);
- for (i=0;i<infos->len;i++) {
- CamelIMAPXMessageInfo *info = infos->pdata[i];
+ for (i = 0; i < uids->len; i++) {
+ CamelIMAPXMessageInfo *info = camel_folder_summary_peek_info (job->folder->summary, uids->pdata[i]);
guint32 flags = ((CamelMessageInfoBase *)info)->flags & CAMEL_IMAPX_SERVER_FLAGS;
guint32 sflags = info->server_flags & CAMEL_IMAPX_SERVER_FLAGS;
gint send = 0;
@@ -2174,7 +2180,7 @@ imapx_job_sync_changes_start(CamelIMAPXServer *is, CamelIMAPXJob *job)
}
send = imapx_uidset_add(&ss, ic, camel_message_info_uid(info));
}
- if (send || (i == infos->len-1 && imapx_uidset_done(&ss, ic))) {
+ if (send || (i == uids->len-1 && imapx_uidset_done(&ss, ic))) {
job->commands++;
camel_imapx_command_add(ic, " %tFLAGS.SILENT (%t)", on?"+":"-", flags_table[j].name);
imapx_command_queue(is, ic);
@@ -2186,10 +2192,10 @@ imapx_job_sync_changes_start(CamelIMAPXServer *is, CamelIMAPXJob *job)
if (user_set) {
CamelIMAPXCommand *ic = NULL;
- for (j=0;j<user_set->len;j++) {
- struct _imapx_flag_change *c = &g_array_index(user_set, struct _imapx_flag_change, i);
+ for (j=0 ; j<user_set->len; j++) {
+ struct _imapx_flag_change *c = &g_array_index(user_set, struct _imapx_flag_change, j);
- for (i=0;i<c->infos->len;i++) {
+ for (i=0 ; i < c->infos->len; i++) {
CamelIMAPXMessageInfo *info = c->infos->pdata[i];
if (ic == NULL) {
@@ -2741,7 +2747,7 @@ imapx_sync_free_user(GArray *user_set)
}
void
-camel_imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, GPtrArray *infos, CamelException *ex)
+camel_imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, GPtrArray *uids, CamelException *ex)
{
guint i, on_orset, off_orset;
GArray *on_user = NULL, *off_user = NULL;
@@ -2760,11 +2766,12 @@ camel_imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, GPtrA
*/
off_orset = on_orset = 0;
- for (i=0;i<infos->len;i++) {
+ for (i=0; i < uids->len; i++) {
guint32 flags, sflags;
CamelFlag *uflags, *suflags;
+ guint j = 0;
- info = infos->pdata[i];
+ info = camel_folder_summary_peek_info (folder->summary, uids->pdata[i]);
flags = ((CamelMessageInfoBase *)info)->flags & CAMEL_IMAPX_SERVER_FLAGS;
sflags = info->server_flags & CAMEL_IMAPX_SERVER_FLAGS;
if (flags != sflags) {
@@ -2780,8 +2787,12 @@ camel_imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, GPtrA
if (uflags) {
if (suflags)
res = strcmp(uflags->name, suflags->name);
- else
+ else if (uflags->name && *uflags->name)
res = -1;
+ else {
+ uflags = uflags->next;
+ continue;
+ }
} else {
res = 1;
}
@@ -2792,25 +2803,25 @@ camel_imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, GPtrA
} else {
GArray *user_set;
CamelFlag *user_flag;
- struct _imapx_flag_change *change, add;
+ struct _imapx_flag_change *change = NULL, add;
if (res < 0) {
if (on_user == NULL)
- on_user = g_array_new(sizeof(*change), 0, 0);
+ on_user = g_array_new(FALSE, FALSE, sizeof(struct _imapx_flag_change));
user_set = on_user;
user_flag = uflags;
uflags = uflags->next;
} else {
if (off_user == NULL)
- off_user = g_array_new(sizeof(*change), 0, 0);
+ off_user = g_array_new(FALSE, FALSE, sizeof(struct _imapx_flag_change));
user_set = off_user;
user_flag = suflags;
suflags = suflags->next;
}
/* Could sort this and binary search */
- for (i=0;i<user_set->len;i++) {
- change = &g_array_index(user_set, struct _imapx_flag_change, i);
+ for (j = 0; j < user_set->len ; j++) {
+ change = &g_array_index(user_set, struct _imapx_flag_change, j);
if (strcmp(change->name, user_flag->name) == 0)
goto found;
}
@@ -2833,7 +2844,7 @@ camel_imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, GPtrA
job->pri = -50;
job->folder = folder;
job->ex = ex;
- job->u.sync_changes.infos = infos;
+ job->u.sync_changes.changed_uids = uids;
job->u.sync_changes.on_set = on_orset;
job->u.sync_changes.off_set = off_orset;
job->u.sync_changes.on_user = on_user;
diff --git a/camel/providers/imapx/camel-imapx-store.c b/camel/providers/imapx/camel-imapx-store.c
index 2f5b553..c75f5e3 100644
--- a/camel/providers/imapx/camel-imapx-store.c
+++ b/camel/providers/imapx/camel-imapx-store.c
@@ -861,11 +861,9 @@ imapx_get_folder_info(CamelStore *store, const gchar *top, guint32 flags, CamelE
return fi;
}
- if (istore->server == NULL) {
- camel_service_connect((CamelService *)store, ex);
- if (camel_exception_is_set(ex))
- return NULL;
- }
+ camel_service_connect((CamelService *)store, ex);
+ if (camel_exception_is_set(ex))
+ return NULL;
if (camel_store_summary_count (istore->summary) == 0) {
sync_folders (istore, top, ex);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]