diff src/imap/cmd-idle.c @ 2322:aae574ed7f4c HEAD

Broke mailbox_sync() into iterator.
author Timo Sirainen <tss@iki.fi>
date Mon, 12 Jul 2004 14:35:50 +0300
parents 79790750c349
children d141e1bfdd63
line wrap: on
line diff
--- a/src/imap/cmd-idle.c	Mon Jul 12 14:31:34 2004 +0300
+++ b/src/imap/cmd-idle.c	Mon Jul 12 14:35:50 2004 +0300
@@ -5,6 +5,7 @@
 #include "istream.h"
 #include "ostream.h"
 #include "commands.h"
+#include "imap-sync.h"
 
 #include <stdlib.h>
 
@@ -19,7 +20,7 @@
 
 	o_stream_cork(client->output);
 
-	if (client->idle_expunge) {
+	if (client->idle_expunge != 0) {
 		client_send_line(client,
 			t_strdup_printf("* %u EXPUNGE", client->idle_expunge));
 	}
@@ -28,12 +29,8 @@
 	client->io = io_add(i_stream_get_fd(client->input),
 			    IO_READ, _client_input, client);
 
-	if (client->mailbox != NULL) {
-		mailbox_auto_sync(client->mailbox, mailbox_check_interval != 0 ?
-				  MAILBOX_SYNC_FLAG_NO_EXPUNGES :
-				  MAILBOX_SYNC_AUTO_STOP,
-				  mailbox_check_interval);
-	}
+	if (client->mailbox != NULL)
+		mailbox_notify_changes(client->mailbox, 0, NULL, NULL);
 
 	client_sync_full(client);
 	if (done_ok)
@@ -78,21 +75,28 @@
 static void idle_timeout(void *context)
 {
 	struct client *client = context;
-	struct mailbox_status status;
+
+	/* outlook workaround - it hasn't sent anything for a long time and
+	   we're about to disconnect unless it does something. send a fake
+	   EXISTS to see if it responds. it's expunged later. */
 
 	timeout_remove(client->idle_to);
 	client->idle_to = NULL;
 
-	if (mailbox_get_status(client->mailbox, STATUS_MESSAGES, &status) < 0) {
+	client->idle_expunge = client->messages_count+1;
+	client_send_line(client,
+			 t_strdup_printf("* %u EXISTS", client->idle_expunge));
+	mailbox_notify_changes(client->mailbox, 0, NULL, NULL);
+}
+
+static void idle_callback(struct mailbox *box, void *context)
+{
+	struct client *client = context;
+
+	if (imap_sync(client, box, 0) < 0) {
 		client_send_untagged_storage_error(client,
 			mailbox_get_storage(client->mailbox));
-		idle_finish(client, TRUE);
-	} else {
-                client->idle_expunge = status.messages+1;
-		client_send_line(client,
-			t_strdup_printf("* %u EXISTS", client->idle_expunge));
-
-		mailbox_auto_sync(client->mailbox, MAILBOX_SYNC_AUTO_STOP, 0);
+		mailbox_notify_changes(client->mailbox, 0, NULL, NULL);
 	}
 }
 
@@ -113,9 +117,10 @@
 	if (interval == 0)
 		interval = DEFAULT_IDLE_CHECK_INTERVAL;
 
-	if (client->mailbox != NULL)
-		mailbox_auto_sync(client->mailbox, 0, interval);
-
+	if (client->mailbox != NULL) {
+		mailbox_notify_changes(client->mailbox, interval,
+				       idle_callback, client);
+	}
 	client_send_line(client, "+ idling");
 
 	io_remove(client->io);