aboutsummaryrefslogtreecommitdiffstats
path: root/camel
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@ximian.com>2004-06-11 13:33:51 +0800
committerJeffrey Stedfast <fejj@src.gnome.org>2004-06-11 13:33:51 +0800
commit3c86a0c57cab32e0042cc58c347b2843274b9a03 (patch)
tree676c0cec39af0b57ccd2091274f7a1939a7ab997 /camel
parentf1d2d8caa47470d301eef390b403e94600e444ba (diff)
downloadgsoc2013-evolution-3c86a0c57cab32e0042cc58c347b2843274b9a03.tar.gz
gsoc2013-evolution-3c86a0c57cab32e0042cc58c347b2843274b9a03.tar.zst
gsoc2013-evolution-3c86a0c57cab32e0042cc58c347b2843274b9a03.zip
Don't bother scanning summary info if EXISTS was 0.
2004-06-11 Jeffrey Stedfast <fejj@ximian.com> * providers/imap4/camel-imap4-summary.c (camel_imap4_summary_flush_updates): Don't bother scanning summary info if EXISTS was 0. (camel_imap4_summary_set_uidvalidity): Emit the folder_changed event after clearing the summary. (camel_imap4_summary_expunge): Emit the folder_changed event after removing the message from the summary. * providers/imap4/camel-imap4-folder.c (imap4_sync): Flush updates after an EXPUNGE and don't unset expunge if we didn't delete anything (the logic was wrong anyway). (imap4_refresh_info): Implemented. svn path=/trunk/; revision=26300
Diffstat (limited to 'camel')
-rw-r--r--camel/ChangeLog15
-rw-r--r--camel/providers/imap4/camel-imap4-folder.c28
-rw-r--r--camel/providers/imap4/camel-imap4-summary.c32
3 files changed, 66 insertions, 9 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index aa7105c445..7cdfb1ff06 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,18 @@
+2004-06-11 Jeffrey Stedfast <fejj@ximian.com>
+
+ * providers/imap4/camel-imap4-summary.c
+ (camel_imap4_summary_flush_updates): Don't bother scanning summary
+ info if EXISTS was 0.
+ (camel_imap4_summary_set_uidvalidity): Emit the folder_changed
+ event after clearing the summary.
+ (camel_imap4_summary_expunge): Emit the folder_changed event after
+ removing the message from the summary.
+
+ * providers/imap4/camel-imap4-folder.c (imap4_sync): Flush updates
+ after an EXPUNGE and don't unset expunge if we didn't delete
+ anything (the logic was wrong anyway).
+ (imap4_refresh_info): Implemented.
+
2004-06-10 Jeffrey Stedfast <fejj@ximian.com>
* providers/imap4/camel-imap4-engine.c
diff --git a/camel/providers/imap4/camel-imap4-folder.c b/camel/providers/imap4/camel-imap4-folder.c
index a67d50f816..006b214488 100644
--- a/camel/providers/imap4/camel-imap4-folder.c
+++ b/camel/providers/imap4/camel-imap4-folder.c
@@ -58,6 +58,7 @@ static void camel_imap4_folder_init (CamelIMAP4Folder *folder, CamelIMAP4FolderC
static void camel_imap4_folder_finalize (CamelObject *object);
static void imap4_sync (CamelFolder *folder, gboolean expunge, CamelException *ex);
+static void imap4_refresh_info (CamelFolder *folder, CamelException *ex);
static void imap4_expunge (CamelFolder *folder, CamelException *ex);
static CamelMimeMessage *imap4_get_message (CamelFolder *folder, const char *uid, CamelException *ex);
static void imap4_append_message (CamelFolder *folder, CamelMimeMessage *message,
@@ -96,6 +97,7 @@ camel_imap4_folder_class_init (CamelIMAP4FolderClass *klass)
parent_class = (CamelFolderClass *) camel_type_get_global_classfuncs (CAMEL_FOLDER_TYPE);
folder_class->sync = imap4_sync;
+ folder_class->refresh_info = imap4_refresh_info;
folder_class->expunge = imap4_expunge;
folder_class->get_message = imap4_get_message;
folder_class->append_message = imap4_append_message;
@@ -522,7 +524,6 @@ imap4_sync (CamelFolder *folder, gboolean expunge, CamelException *ex)
max = camel_folder_summary_count (folder->summary);
for (i = 0; i < max; i++) {
iinfo = (CamelIMAP4MessageInfo *) info = camel_folder_summary_index (folder->summary, i);
- expunge = expunge && (info->flags & CAMEL_MESSAGE_DELETED);
if (info->flags & CAMEL_MESSAGE_FOLDER_FLAGGED) {
camel_imap4_flags_diff (&diff, iinfo->server_flags, info->flags);
diff.changed &= folder->permanent_flags;
@@ -557,6 +558,9 @@ imap4_sync (CamelFolder *folder, gboolean expunge, CamelException *ex)
;
switch (ic->result) {
+ case CAMEL_IMAP4_RESULT_OK:
+ camel_imap4_summary_flush_updates (folder->summary, ex);
+ break;
case CAMEL_IMAP4_RESULT_NO:
/* FIXME: would be good to save the NO reason into the err message */
camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
@@ -571,6 +575,8 @@ imap4_sync (CamelFolder *folder, gboolean expunge, CamelException *ex)
}
camel_imap4_command_unref (ic);
+ } else {
+ camel_imap4_summary_flush_updates (folder->summary, ex);
}
camel_folder_summary_save (folder->summary);
@@ -586,6 +592,26 @@ imap4_expunge (CamelFolder *folder, CamelException *ex)
imap4_sync (folder, TRUE, ex);
}
+static void
+imap4_refresh_info (CamelFolder *folder, CamelException *ex)
+{
+ CamelIMAP4Engine *engine = ((CamelIMAP4Store *) folder->parent_store)->engine;
+ CamelFolder *selected = (CamelFolder *) engine->folder;
+
+ CAMEL_SERVICE_LOCK (folder->parent_store, connect_lock);
+
+ if (folder != selected) {
+ if (camel_imap4_engine_select_folder (engine, folder, ex) == -1)
+ goto done;
+ }
+
+ if (camel_imap4_summary_flush_updates (folder->summary, ex) == -1)
+ goto done;
+
+ done:
+
+ CAMEL_SERVICE_UNLOCK (folder->parent_store, connect_lock);
+}
static int
untagged_fetch (CamelIMAP4Engine *engine, CamelIMAP4Command *ic, guint32 index, camel_imap4_token_t *token, CamelException *ex)
diff --git a/camel/providers/imap4/camel-imap4-summary.c b/camel/providers/imap4/camel-imap4-summary.c
index 8ef8d342fa..f68f892153 100644
--- a/camel/providers/imap4/camel-imap4-summary.c
+++ b/camel/providers/imap4/camel-imap4-summary.c
@@ -998,15 +998,30 @@ void
camel_imap4_summary_set_uidvalidity (CamelFolderSummary *summary, guint32 uidvalidity)
{
CamelIMAP4Summary *imap4_summary = (CamelIMAP4Summary *) summary;
+ CamelFolderChangeInfo *changes;
+ CamelMessageInfo *info;
+ int i, count;
g_return_if_fail (CAMEL_IS_IMAP4_SUMMARY (summary));
if (imap4_summary->uidvalidity == uidvalidity)
return;
- /* FIXME: emit a signal or something first? */
+ changes = camel_folder_change_info_new ();
+ count = camel_folder_summary_count (summary);
+ for (i = 0; i < count; i++) {
+ if (!(info = camel_folder_summary_index (summary, i)))
+ continue;
+
+ camel_folder_change_info_remove_uid (changes, camel_message_info_uid (info));
+ camel_folder_summary_info_free (summary, info);
+ }
+
camel_folder_summary_clear (summary);
+ camel_object_trigger_event (imap4_summary->folder, "folder_changed", changes);
+ camel_folder_change_info_free (changes);
+
imap4_summary->uidvalidity = uidvalidity;
imap4_summary->uidvalidity_changed = TRUE;
@@ -1015,6 +1030,8 @@ camel_imap4_summary_set_uidvalidity (CamelFolderSummary *summary, guint32 uidval
void
camel_imap4_summary_expunge (CamelFolderSummary *summary, int seqid)
{
+ CamelIMAP4Summary *imap4_summary = (CamelIMAP4Summary *) summary;
+ CamelFolderChangeInfo *changes;
CamelMessageInfo *info;
g_return_if_fail (CAMEL_IS_IMAP4_SUMMARY (summary));
@@ -1022,11 +1039,10 @@ camel_imap4_summary_expunge (CamelFolderSummary *summary, int seqid)
if (!(info = camel_folder_summary_index (summary, seqid)))
return;
- /* FIXME: emit a signal or something that our Folder can proxy
- * up to the app so that it can update its display and
- * whatnot? */
-
- /* emit signal */
+ changes = camel_folder_change_info_new ();
+ camel_folder_change_info_remove_uid (changes, camel_message_info_uid (info));
+ camel_object_trigger_event (imap4_summary->folder, "folder_changed", changes);
+ camel_folder_change_info_free (changes);
camel_folder_summary_info_free (summary, info);
camel_folder_summary_remove_index (summary, seqid);
@@ -1062,7 +1078,7 @@ camel_imap4_summary_flush_updates (CamelFolderSummary *summary, CamelException *
if (imap4_summary->uidvalidity_changed) {
first = 1;
- } else if (imap4_summary->exists_changed) {
+ } else if (imap4_summary->exists_changed && imap4_summary->exists > 0) {
scount = camel_folder_summary_count (summary);
ic = imap4_summary_fetch_flags (summary, 1, scount);
@@ -1082,7 +1098,7 @@ camel_imap4_summary_flush_updates (CamelFolderSummary *summary, CamelException *
camel_imap4_command_unref (ic);
}
- if (first != 0) {
+ if (first != 0 && imap4_summary->exists > 0) {
ic = imap4_summary_fetch_all (summary, first, 0);
while ((id = camel_imap4_engine_iterate (engine)) < ic->id && id != -1)