comparison 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
comparison
equal deleted inserted replaced
2321:d803ba0206f0 2322:aae574ed7f4c
3 #include "common.h" 3 #include "common.h"
4 #include "ioloop.h" 4 #include "ioloop.h"
5 #include "istream.h" 5 #include "istream.h"
6 #include "ostream.h" 6 #include "ostream.h"
7 #include "commands.h" 7 #include "commands.h"
8 #include "imap-sync.h"
8 9
9 #include <stdlib.h> 10 #include <stdlib.h>
10 11
11 #define DEFAULT_IDLE_CHECK_INTERVAL 30 12 #define DEFAULT_IDLE_CHECK_INTERVAL 30
12 13
17 client->idle_to = NULL; 18 client->idle_to = NULL;
18 } 19 }
19 20
20 o_stream_cork(client->output); 21 o_stream_cork(client->output);
21 22
22 if (client->idle_expunge) { 23 if (client->idle_expunge != 0) {
23 client_send_line(client, 24 client_send_line(client,
24 t_strdup_printf("* %u EXPUNGE", client->idle_expunge)); 25 t_strdup_printf("* %u EXPUNGE", client->idle_expunge));
25 } 26 }
26 27
27 io_remove(client->io); 28 io_remove(client->io);
28 client->io = io_add(i_stream_get_fd(client->input), 29 client->io = io_add(i_stream_get_fd(client->input),
29 IO_READ, _client_input, client); 30 IO_READ, _client_input, client);
30 31
31 if (client->mailbox != NULL) { 32 if (client->mailbox != NULL)
32 mailbox_auto_sync(client->mailbox, mailbox_check_interval != 0 ? 33 mailbox_notify_changes(client->mailbox, 0, NULL, NULL);
33 MAILBOX_SYNC_FLAG_NO_EXPUNGES :
34 MAILBOX_SYNC_AUTO_STOP,
35 mailbox_check_interval);
36 }
37 34
38 client_sync_full(client); 35 client_sync_full(client);
39 if (done_ok) 36 if (done_ok)
40 client_send_tagline(client, "OK Idle completed."); 37 client_send_tagline(client, "OK Idle completed.");
41 else 38 else
76 } 73 }
77 74
78 static void idle_timeout(void *context) 75 static void idle_timeout(void *context)
79 { 76 {
80 struct client *client = context; 77 struct client *client = context;
81 struct mailbox_status status; 78
79 /* outlook workaround - it hasn't sent anything for a long time and
80 we're about to disconnect unless it does something. send a fake
81 EXISTS to see if it responds. it's expunged later. */
82 82
83 timeout_remove(client->idle_to); 83 timeout_remove(client->idle_to);
84 client->idle_to = NULL; 84 client->idle_to = NULL;
85 85
86 if (mailbox_get_status(client->mailbox, STATUS_MESSAGES, &status) < 0) { 86 client->idle_expunge = client->messages_count+1;
87 client_send_line(client,
88 t_strdup_printf("* %u EXISTS", client->idle_expunge));
89 mailbox_notify_changes(client->mailbox, 0, NULL, NULL);
90 }
91
92 static void idle_callback(struct mailbox *box, void *context)
93 {
94 struct client *client = context;
95
96 if (imap_sync(client, box, 0) < 0) {
87 client_send_untagged_storage_error(client, 97 client_send_untagged_storage_error(client,
88 mailbox_get_storage(client->mailbox)); 98 mailbox_get_storage(client->mailbox));
89 idle_finish(client, TRUE); 99 mailbox_notify_changes(client->mailbox, 0, NULL, NULL);
90 } else {
91 client->idle_expunge = status.messages+1;
92 client_send_line(client,
93 t_strdup_printf("* %u EXISTS", client->idle_expunge));
94
95 mailbox_auto_sync(client->mailbox, MAILBOX_SYNC_AUTO_STOP, 0);
96 } 100 }
97 } 101 }
98 102
99 int cmd_idle(struct client *client) 103 int cmd_idle(struct client *client)
100 { 104 {
111 str = getenv("MAILBOX_IDLE_CHECK_INTERVAL"); 115 str = getenv("MAILBOX_IDLE_CHECK_INTERVAL");
112 interval = str == NULL ? 0 : (unsigned int)strtoul(str, NULL, 10); 116 interval = str == NULL ? 0 : (unsigned int)strtoul(str, NULL, 10);
113 if (interval == 0) 117 if (interval == 0)
114 interval = DEFAULT_IDLE_CHECK_INTERVAL; 118 interval = DEFAULT_IDLE_CHECK_INTERVAL;
115 119
116 if (client->mailbox != NULL) 120 if (client->mailbox != NULL) {
117 mailbox_auto_sync(client->mailbox, 0, interval); 121 mailbox_notify_changes(client->mailbox, interval,
118 122 idle_callback, client);
123 }
119 client_send_line(client, "+ idling"); 124 client_send_line(client, "+ idling");
120 125
121 io_remove(client->io); 126 io_remove(client->io);
122 client->io = io_add(i_stream_get_fd(client->input), 127 client->io = io_add(i_stream_get_fd(client->input),
123 IO_READ, idle_client_input, client); 128 IO_READ, idle_client_input, client);