aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers/imap/camel-imap-store.c
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@ximian.com>2001-08-17 07:31:34 +0800
committerJeffrey Stedfast <fejj@src.gnome.org>2001-08-17 07:31:34 +0800
commitd103befa6dce296f571319c0b69700b1f06d4a83 (patch)
treef570bff7dff692580118577bb330f00600a64063 /camel/providers/imap/camel-imap-store.c
parenta7da845f7f90ea4be385b10ef8f9001c3ceebce9 (diff)
downloadgsoc2013-evolution-d103befa6dce296f571319c0b69700b1f06d4a83.tar
gsoc2013-evolution-d103befa6dce296f571319c0b69700b1f06d4a83.tar.gz
gsoc2013-evolution-d103befa6dce296f571319c0b69700b1f06d4a83.tar.bz2
gsoc2013-evolution-d103befa6dce296f571319c0b69700b1f06d4a83.tar.lz
gsoc2013-evolution-d103befa6dce296f571319c0b69700b1f06d4a83.tar.xz
gsoc2013-evolution-d103befa6dce296f571319c0b69700b1f06d4a83.tar.zst
gsoc2013-evolution-d103befa6dce296f571319c0b69700b1f06d4a83.zip
If we are online and message flags have changed in the current folder,
2001-08-16 Jeffrey Stedfast <fejj@ximian.com> * providers/imap/camel-imap-store.c (imap_keepalive): If we are online and message flags have changed in the current folder, sync the flags else do a NOOP. This fixes bug #4666. Also lock around the NOOP command. * providers/imap/camel-imap-folder.c (imap_sync_online): Don't ever send "STORE FLAGS.SILENT ()" since Cyrus imapd doesn't like this (and maybe others too?) so what we'll do instead is to send "STORE -FLAGS.SILENT (\Seen \Answered \Deleted \Marked)" to clear all the flags (since this is in essence what we want to do anyway). svn path=/trunk/; revision=12136
Diffstat (limited to 'camel/providers/imap/camel-imap-store.c')
-rw-r--r--camel/providers/imap/camel-imap-store.c46
1 files changed, 40 insertions, 6 deletions
diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c
index fb47561d0c..cde667d9cc 100644
--- a/camel/providers/imap/camel-imap-store.c
+++ b/camel/providers/imap/camel-imap-store.c
@@ -157,9 +157,9 @@ camel_imap_store_finalize (CamelObject *object)
g_free (imap_store->storage_path);
#ifdef ENABLE_THREADS
- e_mutex_destroy(imap_store->priv->command_lock);
+ e_mutex_destroy (imap_store->priv->command_lock);
#endif
- g_free(imap_store->priv);
+ g_free (imap_store->priv);
}
static void
@@ -175,14 +175,14 @@ camel_imap_store_init (gpointer object, gpointer klass)
imap_store->current_folder = NULL;
imap_store->connected = FALSE;
imap_store->subscribed_folders = NULL;
-
+
imap_store->tag_prefix = imap_tag_prefix++;
if (imap_tag_prefix > 'Z')
imap_tag_prefix = 'A';
-
+
imap_store->priv = g_malloc0 (sizeof (*imap_store->priv));
#ifdef ENABLE_THREADS
- imap_store->priv->command_lock = e_mutex_new(E_MUTEX_REC);
+ imap_store->priv->command_lock = e_mutex_new (E_MUTEX_REC);
#endif
}
@@ -1487,12 +1487,46 @@ unsubscribe_folder (CamelStore *store, const char *folder_name,
camel_folder_info_free (fi);
}
+static gboolean
+folder_flags_have_changed (CamelFolder *folder)
+{
+ CamelMessageInfo *info;
+ int i, max;
+
+ max = camel_folder_summary_count (folder->summary);
+ for (i = 0; i < max; i++) {
+ info = camel_folder_summary_index (folder->summary, i);
+ if (!info)
+ continue;
+ if (info->flags & CAMEL_MESSAGE_FOLDER_FLAGGED) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
static void
imap_keepalive (CamelRemoteStore *store)
{
CamelImapStore *imap_store = CAMEL_IMAP_STORE (store);
CamelImapResponse *response;
-
+
+ /* FIXME: should this check to see if we are online? */
+
+ /* Note: the idea here is to sync the flags of our currently
+ selected folder if there have been changes... */
+
+ if (imap_store->current_folder && folder_flags_have_changed (imap_store->current_folder)) {
+ camel_folder_sync (imap_store->current_folder, FALSE, NULL);
+ }
+
+ /* ...but we also want to NOOP so that we get an untagged response. */
+
+ CAMEL_IMAP_STORE_LOCK (store, command_lock);
+
response = camel_imap_command (imap_store, NULL, NULL, "NOOP");
camel_imap_response_free (imap_store, response);
+
+ CAMEL_IMAP_STORE_UNLOCK (store, command_lock);
}