Mercurial > dovecot > original-hg > dovecot-1.2
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); |