annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1172
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (C) 2002 Timo Sirainen */
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "common.h"
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "ioloop.h"
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "istream.h"
1225
8c85c03e0485 cork the output before sending the ending IDLE replies.
Timo Sirainen <tss@iki.fi>
parents: 1221
diff changeset
6 #include "ostream.h"
1172
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "commands.h"
2322
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
8 #include "imap-sync.h"
1172
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include <stdlib.h>
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #define DEFAULT_IDLE_CHECK_INTERVAL 30
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13
1220
Timo Sirainen <tss@iki.fi>
parents: 1213
diff changeset
14 static void idle_finish(struct client *client, int done_ok)
1172
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 {
1212
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
16 if (client->idle_to != NULL) {
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
17 timeout_remove(client->idle_to);
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
18 client->idle_to = NULL;
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
19 }
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
20
1225
8c85c03e0485 cork the output before sending the ending IDLE replies.
Timo Sirainen <tss@iki.fi>
parents: 1221
diff changeset
21 o_stream_cork(client->output);
8c85c03e0485 cork the output before sending the ending IDLE replies.
Timo Sirainen <tss@iki.fi>
parents: 1221
diff changeset
22
2322
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
23 if (client->idle_expunge != 0) {
1212
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
24 client_send_line(client,
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
25 t_strdup_printf("* %u EXPUNGE", client->idle_expunge));
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
26 }
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
27
1172
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 io_remove(client->io);
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 client->io = io_add(i_stream_get_fd(client->input),
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 IO_READ, _client_input, client);
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31
2322
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
32 if (client->mailbox != NULL)
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
33 mailbox_notify_changes(client->mailbox, 0, NULL, NULL);
1172
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 client_sync_full(client);
1220
Timo Sirainen <tss@iki.fi>
parents: 1213
diff changeset
36 if (done_ok)
Timo Sirainen <tss@iki.fi>
parents: 1213
diff changeset
37 client_send_tagline(client, "OK Idle completed.");
Timo Sirainen <tss@iki.fi>
parents: 1213
diff changeset
38 else
Timo Sirainen <tss@iki.fi>
parents: 1213
diff changeset
39 client_send_tagline(client, "BAD Expected DONE.");
Timo Sirainen <tss@iki.fi>
parents: 1213
diff changeset
40
1225
8c85c03e0485 cork the output before sending the ending IDLE replies.
Timo Sirainen <tss@iki.fi>
parents: 1221
diff changeset
41 o_stream_flush(client->output);
8c85c03e0485 cork the output before sending the ending IDLE replies.
Timo Sirainen <tss@iki.fi>
parents: 1221
diff changeset
42
1220
Timo Sirainen <tss@iki.fi>
parents: 1213
diff changeset
43 _client_reset_command(client);
Timo Sirainen <tss@iki.fi>
parents: 1213
diff changeset
44 client->bad_counter = 0;
1172
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 }
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 static void idle_client_input(void *context)
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 {
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 struct client *client = context;
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 char *line;
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 client->last_input = ioloop_time;
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 switch (i_stream_read(client->input)) {
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 case -1:
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 /* disconnected */
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 client_destroy(client);
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 return;
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 case -2:
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 client->input_skip_line = TRUE;
1220
Timo Sirainen <tss@iki.fi>
parents: 1213
diff changeset
61 idle_finish(client, FALSE);
1221
bff971233e5d handle error condition better
Timo Sirainen <tss@iki.fi>
parents: 1220
diff changeset
62 return;
1172
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 }
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 while ((line = i_stream_next_line(client->input)) != NULL) {
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 if (client->input_skip_line)
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 client->input_skip_line = FALSE;
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 else {
1220
Timo Sirainen <tss@iki.fi>
parents: 1213
diff changeset
69 idle_finish(client, strcmp(line, "DONE") == 0);
1172
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 break;
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 }
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 }
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 }
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74
1212
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
75 static void idle_timeout(void *context)
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
76 {
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
77 struct client *client = context;
2322
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
78
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
79 /* outlook workaround - it hasn't sent anything for a long time and
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
80 we're about to disconnect unless it does something. send a fake
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
81 EXISTS to see if it responds. it's expunged later. */
1212
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
82
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
83 timeout_remove(client->idle_to);
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
84 client->idle_to = NULL;
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
85
2322
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
86 client->idle_expunge = client->messages_count+1;
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
87 client_send_line(client,
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
88 t_strdup_printf("* %u EXISTS", client->idle_expunge));
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
89 mailbox_notify_changes(client->mailbox, 0, NULL, NULL);
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
90 }
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
91
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
92 static void idle_callback(struct mailbox *box, void *context)
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
93 {
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
94 struct client *client = context;
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
95
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
96 if (imap_sync(client, box, 0) < 0) {
1654
31c4bb26a1e9 Getting ready for namespaces. LIST is still broken with them.
Timo Sirainen <tss@iki.fi>
parents: 1225
diff changeset
97 client_send_untagged_storage_error(client,
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents: 1732
diff changeset
98 mailbox_get_storage(client->mailbox));
2322
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
99 mailbox_notify_changes(client->mailbox, 0, NULL, NULL);
1212
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
100 }
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
101 }
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
102
1172
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 int cmd_idle(struct client *client)
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 {
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 const char *str;
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 unsigned int interval;
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107
1212
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
108 client->idle_expunge = 0;
1225
8c85c03e0485 cork the output before sending the ending IDLE replies.
Timo Sirainen <tss@iki.fi>
parents: 1221
diff changeset
109 if ((client_workarounds & WORKAROUND_OUTLOOK_IDLE) != 0 &&
8c85c03e0485 cork the output before sending the ending IDLE replies.
Timo Sirainen <tss@iki.fi>
parents: 1221
diff changeset
110 client->mailbox != NULL) {
1212
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
111 client->idle_to = timeout_add((CLIENT_IDLE_TIMEOUT - 60) * 1000,
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
112 idle_timeout, client);
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
113 }
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1172
diff changeset
114
1172
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 str = getenv("MAILBOX_IDLE_CHECK_INTERVAL");
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 interval = str == NULL ? 0 : (unsigned int)strtoul(str, NULL, 10);
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 if (interval == 0)
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 interval = DEFAULT_IDLE_CHECK_INTERVAL;
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119
2322
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
120 if (client->mailbox != NULL) {
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
121 mailbox_notify_changes(client->mailbox, interval,
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
122 idle_callback, client);
aae574ed7f4c Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
123 }
1172
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 client_send_line(client, "+ idling");
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 io_remove(client->io);
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 client->io = io_add(i_stream_get_fd(client->input),
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 IO_READ, idle_client_input, client);
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 return FALSE;
f7c273202dc3 Support for IDLE extension.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 }