Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/imap/cmd-select.c @ 296:d66aa1f1fb2d HEAD
Added fast-flag for mailbox opening, which doesn't do any index compressing
or cache updating. This flag is set when mailbox is opened by APPEND, COPY
or STATUS (ie. not SELECT/EXAMINE).
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 23 Sep 2002 13:42:20 +0300 |
parents | 867ec80dbf42 |
children | d0cff4da67ac |
rev | line source |
---|---|
0 | 1 /* Copyright (C) 2002 Timo Sirainen */ |
2 | |
3 #include "common.h" | |
100
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
4 #include "temp-string.h" |
0 | 5 #include "commands.h" |
6 | |
100
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
7 #define SYSTEM_PERMANENT_FLAGS \ |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
8 "\\Answered \\Flagged \\Deleted \\Seen \\Draft" |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
9 #define SYSTEM_FLAGS SYSTEM_PERMANENT_FLAGS " \\Recent" |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
10 |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
11 static const char * |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
12 get_custom_flags_string(const char *custom_flags[MAIL_CUSTOM_FLAGS_COUNT]) |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
13 { |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
14 TempString *str; |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
15 int i; |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
16 |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
17 /* first see if there even is custom flags */ |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
18 for (i = 0; i < MAIL_CUSTOM_FLAGS_COUNT; i++) { |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
19 if (custom_flags[i] != NULL) |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
20 break; |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
21 } |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
22 |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
23 if (i == MAIL_CUSTOM_FLAGS_COUNT) |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
24 return ""; |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
25 |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
26 str = t_string_new(256); |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
27 for (; i < MAIL_CUSTOM_FLAGS_COUNT; i++) { |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
28 if (custom_flags[i] != NULL) { |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
29 t_string_append_c(str, ' '); |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
30 t_string_append(str, custom_flags[i]); |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
31 } |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
32 } |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
33 return str->str; |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
34 } |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
35 |
0 | 36 int cmd_select_full(Client *client, int readonly) |
37 { | |
38 Mailbox *box; | |
39 MailboxStatus status; | |
100
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
40 const char *mailbox, *custom_flags; |
0 | 41 |
42 /* <mailbox> */ | |
43 if (!client_read_string_args(client, 1, &mailbox)) | |
44 return FALSE; | |
45 | |
46 if (client->mailbox != NULL) | |
47 client->mailbox->close(client->mailbox); | |
48 | |
49 client->mailbox = client->storage->open_mailbox(client->storage, | |
296
d66aa1f1fb2d
Added fast-flag for mailbox opening, which doesn't do any index compressing
Timo Sirainen <tss@iki.fi>
parents:
100
diff
changeset
|
50 mailbox, readonly, |
d66aa1f1fb2d
Added fast-flag for mailbox opening, which doesn't do any index compressing
Timo Sirainen <tss@iki.fi>
parents:
100
diff
changeset
|
51 FALSE); |
0 | 52 if (client->mailbox == NULL) { |
53 client_send_storage_error(client); | |
54 return TRUE; | |
55 } | |
56 | |
57 box = client->mailbox; | |
58 if (!box->get_status(box, STATUS_MESSAGES | STATUS_RECENT | | |
100
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
59 STATUS_FIRST_UNSEEN_SEQ | STATUS_UIDVALIDITY | |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
60 STATUS_CUSTOM_FLAGS, &status)) { |
0 | 61 client_send_storage_error(client); |
62 return TRUE; | |
63 } | |
64 | |
100
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
65 custom_flags = get_custom_flags_string(status.custom_flags); |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
66 |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
67 client_send_line(client, t_strconcat("* FLAGS ("SYSTEM_FLAGS, |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
68 custom_flags, ")", NULL)); |
0 | 69 if (box->readonly) { |
70 client_send_line(client, "* OK [PERMANENTFLAGS ()] " | |
71 "Read-only mailbox."); | |
72 } else { | |
100
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
73 client_send_line(client, t_strconcat("* OK [PERMANENTFLAGS (" |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
74 SYSTEM_PERMANENT_FLAGS, |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
75 custom_flags, ")] " |
867ec80dbf42
Custom flags are now shown in FLAGS and PERMANENTFLAGS lists after SELECT.
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
76 "Flags permitted.", NULL)); |
0 | 77 } |
78 | |
79 client_send_line(client, | |
80 t_strdup_printf("* %u EXISTS", status.messages)); | |
81 client_send_line(client, | |
82 t_strdup_printf("* %u RECENT", status.recent)); | |
83 | |
84 if (status.first_unseen_seq != 0) { | |
85 client_send_line(client, | |
86 t_strdup_printf("* OK [UNSEEN %u] First unseen.", | |
87 status.first_unseen_seq)); | |
88 } | |
89 | |
90 client_send_line(client, | |
91 t_strdup_printf("* OK [UIDVALIDITY %u] UIDs valid", | |
92 status.uidvalidity)); | |
93 | |
94 client_send_tagline(client, box->readonly ? | |
95 "OK [READ-ONLY] Select completed." : | |
96 "OK [READ-WRITE] Select completed."); | |
97 return TRUE; | |
98 } | |
99 | |
100 int cmd_select(Client *client) | |
101 { | |
102 return cmd_select_full(client, FALSE); | |
103 } |