Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/imap/cmd-list.c @ 1748:588326f1cd84 HEAD
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 06 Sep 2003 20:29:52 +0300 |
parents | a85af58a363c |
children | fd33cf8a1261 |
rev | line source |
---|---|
0 | 1 /* Copyright (C) 2002 Timo Sirainen */ |
2 | |
3 #include "common.h" | |
1329
ae229b7acb4c
Mailbox names are now sent through imap-quoter instead of just escaping it.
Timo Sirainen <tss@iki.fi>
parents:
1310
diff
changeset
|
4 #include "str.h" |
896
21ffcce83c70
Rewrote rfc822-tokenize.c to work one token at a time so it won't uselessly
Timo Sirainen <tss@iki.fi>
parents:
886
diff
changeset
|
5 #include "strescape.h" |
1329
ae229b7acb4c
Mailbox names are now sent through imap-quoter instead of just escaping it.
Timo Sirainen <tss@iki.fi>
parents:
1310
diff
changeset
|
6 #include "imap-quote.h" |
1218
a70ebd3a59e2
Removed list-sort workarounds. It's pretty much needed for maildir listing.
Timo Sirainen <tss@iki.fi>
parents:
1198
diff
changeset
|
7 #include "imap-match.h" |
0 | 8 #include "commands.h" |
1655 | 9 #include "namespace.h" |
0 | 10 |
1748
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
11 enum imap_list_flags { |
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
12 IMAP_LIST_FLAG_EXT = 0x01, |
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
13 IMAP_LIST_FLAG_CHILDREN |
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
14 }; |
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
15 |
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
16 static const char * |
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
17 mailbox_flags2str(enum mailbox_flags flags, enum mailbox_list_flags list_flags, |
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
18 int listext) |
0 | 19 { |
20 const char *str; | |
21 | |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
22 if (flags & MAILBOX_PLACEHOLDER) { |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
23 i_assert((flags & ~MAILBOX_CHILDREN) == MAILBOX_PLACEHOLDER); |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
24 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
25 if (!listext) |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
26 flags = MAILBOX_NOSELECT; |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
27 flags |= MAILBOX_CHILDREN; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
28 } |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
29 if ((flags & MAILBOX_NONEXISTENT) != 0 && !listext) |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
30 flags |= MAILBOX_NOSELECT; |
1218
a70ebd3a59e2
Removed list-sort workarounds. It's pretty much needed for maildir listing.
Timo Sirainen <tss@iki.fi>
parents:
1198
diff
changeset
|
31 |
1748
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
32 if (listext && (list_flags & MAILBOX_LIST_CHILDREN) == 0) { |
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
33 /* LISTEXT used and we didn't want children info */ |
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
34 flags &= ~(MAILBOX_CHILDREN|MAILBOX_NOCHILDREN); |
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
35 } |
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
36 |
0 | 37 str = t_strconcat((flags & MAILBOX_NOSELECT) ? " \\Noselect" : "", |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
38 (flags & MAILBOX_NONEXISTENT) ? " \\NonExistent" : "", |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
39 (flags & MAILBOX_PLACEHOLDER) ? " \\PlaceHolder" : "", |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
40 (flags & MAILBOX_CHILDREN) ? " \\Children" : "", |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
41 (flags & MAILBOX_NOCHILDREN) ? " \\NoChildren" : "", |
0 | 42 (flags & MAILBOX_NOINFERIORS) ? " \\NoInferiors" : "", |
43 (flags & MAILBOX_MARKED) ? " \\Marked" : "", | |
44 (flags & MAILBOX_UNMARKED) ? " \\UnMarked" : "", | |
45 NULL); | |
46 | |
47 return *str == '\0' ? "" : str+1; | |
48 } | |
49 | |
1654
31c4bb26a1e9
Getting ready for namespaces. LIST is still broken with them.
Timo Sirainen <tss@iki.fi>
parents:
1650
diff
changeset
|
50 static int mailbox_list(struct client *client, struct mail_storage *storage, |
31c4bb26a1e9
Getting ready for namespaces. LIST is still broken with them.
Timo Sirainen <tss@iki.fi>
parents:
1650
diff
changeset
|
51 const char *mask, const char *sep, const char *reply, |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
52 enum mailbox_list_flags list_flags, int listext) |
0 | 53 { |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
54 struct mailbox_list_context *ctx; |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
55 struct mailbox_list *list; |
1329
ae229b7acb4c
Mailbox names are now sent through imap-quoter instead of just escaping it.
Timo Sirainen <tss@iki.fi>
parents:
1310
diff
changeset
|
56 string_t *str; |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
57 |
1654
31c4bb26a1e9
Getting ready for namespaces. LIST is still broken with them.
Timo Sirainen <tss@iki.fi>
parents:
1650
diff
changeset
|
58 ctx = storage->list_mailbox_init(storage, mask, list_flags); |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
59 if (ctx == NULL) |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
60 return FALSE; |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
61 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
62 str = t_str_new(256); |
1654
31c4bb26a1e9
Getting ready for namespaces. LIST is still broken with them.
Timo Sirainen <tss@iki.fi>
parents:
1650
diff
changeset
|
63 while ((list = storage->list_mailbox_next(ctx)) != NULL) { |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
64 str_truncate(str, 0); |
1329
ae229b7acb4c
Mailbox names are now sent through imap-quoter instead of just escaping it.
Timo Sirainen <tss@iki.fi>
parents:
1310
diff
changeset
|
65 str_printfa(str, "* %s (%s) \"%s\" ", reply, |
1748
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
66 mailbox_flags2str(list->flags, list_flags, listext), |
1329
ae229b7acb4c
Mailbox names are now sent through imap-quoter instead of just escaping it.
Timo Sirainen <tss@iki.fi>
parents:
1310
diff
changeset
|
67 sep); |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
68 if (strcasecmp(list->name, "INBOX") == 0) |
1329
ae229b7acb4c
Mailbox names are now sent through imap-quoter instead of just escaping it.
Timo Sirainen <tss@iki.fi>
parents:
1310
diff
changeset
|
69 str_append(str, "INBOX"); |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
70 else |
1568
235f67c3cc9f
LIST and STATUS replies shouldn't strip tabs and spaces from mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
1538
diff
changeset
|
71 imap_quote_append_string(str, list->name, FALSE); |
1329
ae229b7acb4c
Mailbox names are now sent through imap-quoter instead of just escaping it.
Timo Sirainen <tss@iki.fi>
parents:
1310
diff
changeset
|
72 client_send_line(client, str_c(str)); |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
73 } |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
74 |
1654
31c4bb26a1e9
Getting ready for namespaces. LIST is still broken with them.
Timo Sirainen <tss@iki.fi>
parents:
1650
diff
changeset
|
75 return storage->list_mailbox_deinit(ctx); |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
76 } |
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
77 |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
78 static int parse_list_flags(struct client *client, struct imap_arg *args, |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
79 enum mailbox_list_flags *list_flags) |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
80 { |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
81 const char *atom; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
82 |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
83 while (args->type != IMAP_ARG_EOL) { |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
84 if (args->type != IMAP_ARG_ATOM) { |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
85 client_send_command_error(client, |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
86 "List options contains non-atoms."); |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
87 return FALSE; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
88 } |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
89 |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
90 atom = IMAP_ARG_STR(args); |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
91 |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
92 if (strcasecmp(atom, "SUBSCRIBED") == 0) |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
93 *list_flags |= MAILBOX_LIST_SUBSCRIBED; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
94 else if (strcasecmp(atom, "CHILDREN") == 0) |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
95 *list_flags |= MAILBOX_LIST_CHILDREN; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
96 else { |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
97 client_send_tagline(client, t_strconcat( |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
98 "BAD Invalid list option ", atom, NULL)); |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
99 return FALSE; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
100 } |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
101 args++; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
102 } |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
103 return TRUE; |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
104 } |
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
105 |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
106 int _cmd_list_full(struct client *client, int lsub) |
0 | 107 { |
1657 | 108 struct namespace *ns; |
1654
31c4bb26a1e9
Getting ready for namespaces. LIST is still broken with them.
Timo Sirainen <tss@iki.fi>
parents:
1650
diff
changeset
|
109 struct mail_storage *storage; |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
110 struct imap_arg *args; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
111 enum mailbox_list_flags list_flags; |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
112 const char *ref, *mask; |
0 | 113 char sep_chr, sep[3]; |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
114 int failed, listext; |
0 | 115 |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
116 /* [(<options>)] <reference> <mailbox wildcards> */ |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
117 if (!client_read_args(client, 0, 0, &args)) |
0 | 118 return FALSE; |
119 | |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
120 listext = FALSE; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
121 if (lsub) |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
122 list_flags = MAILBOX_LIST_SUBSCRIBED | MAILBOX_LIST_FAST_FLAGS; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
123 else { |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
124 list_flags = 0; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
125 if (args[0].type == IMAP_ARG_LIST) { |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
126 listext = TRUE; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
127 if (!parse_list_flags(client, |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
128 IMAP_ARG_LIST(&args[0])->args, |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
129 &list_flags)) |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
130 return TRUE; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
131 args++; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
132 } |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
133 } |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
134 |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
135 ref = imap_arg_string(&args[0]); |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
136 mask = imap_arg_string(&args[1]); |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
137 |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
138 if (ref == NULL || mask == NULL) { |
1538
4d1c65eded2c
Give more verbose protocol level errors + some fixes.
Timo Sirainen <tss@iki.fi>
parents:
1329
diff
changeset
|
139 client_send_command_error(client, "Invalid arguments."); |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
140 return TRUE; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
141 } |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
142 |
1657 | 143 /* FIXME: really needs some work.. */ |
144 ns = namespace_find(client->namespaces, mask); | |
145 if (ns != NULL) | |
146 storage = ns->storage; | |
147 else | |
148 storage = client->namespaces->storage; | |
149 | |
150 sep_chr = storage->hierarchy_sep; | |
151 if (sep_chr == '"' || sep_chr == '\\') { | |
152 sep[0] = '\\'; | |
153 sep[1] = sep_chr; | |
154 sep[2] = '\0'; | |
155 } else { | |
156 sep[0] = sep_chr; | |
157 sep[1] = '\0'; | |
158 } | |
159 | |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
160 if (*mask == '\0' && !lsub) { |
0 | 161 /* special request to return the hierarchy delimiter */ |
162 client_send_line(client, t_strconcat( | |
163 "* LIST (\\Noselect) \"", sep, "\" \"\"", NULL)); | |
754
b531f5cd415e
Rewrote imap_match() function. Maybe not as fast as before, but at least
Timo Sirainen <tss@iki.fi>
parents:
699
diff
changeset
|
164 failed = FALSE; |
0 | 165 } else { |
166 if (*ref != '\0') { | |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
167 /* join reference + mask */ |
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
168 if (*mask == sep_chr && |
0 | 169 ref[strlen(ref)-1] == sep_chr) { |
170 /* LIST A. .B -> A.B */ | |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
171 mask++; |
0 | 172 } |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
173 if (*mask != sep_chr && |
886
3a4f468a53c6
Handle LIST A B same way as LIST "" A.B
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
174 ref[strlen(ref)-1] != sep_chr) { |
3a4f468a53c6
Handle LIST A B same way as LIST "" A.B
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
175 /* LIST A B -> A.B */ |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
176 mask = t_strconcat(ref, sep, mask, NULL); |
886
3a4f468a53c6
Handle LIST A B same way as LIST "" A.B
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
177 } else { |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
178 mask = t_strconcat(ref, mask, NULL); |
886
3a4f468a53c6
Handle LIST A B same way as LIST "" A.B
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
179 } |
0 | 180 } |
181 | |
1654
31c4bb26a1e9
Getting ready for namespaces. LIST is still broken with them.
Timo Sirainen <tss@iki.fi>
parents:
1650
diff
changeset
|
182 failed = !mailbox_list(client, storage, mask, sep, |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
183 lsub ? "LSUB" : "LIST", |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
184 list_flags, listext); |
0 | 185 } |
186 | |
754
b531f5cd415e
Rewrote imap_match() function. Maybe not as fast as before, but at least
Timo Sirainen <tss@iki.fi>
parents:
699
diff
changeset
|
187 if (failed) |
1654
31c4bb26a1e9
Getting ready for namespaces. LIST is still broken with them.
Timo Sirainen <tss@iki.fi>
parents:
1650
diff
changeset
|
188 client_send_storage_error(client, storage); |
754
b531f5cd415e
Rewrote imap_match() function. Maybe not as fast as before, but at least
Timo Sirainen <tss@iki.fi>
parents:
699
diff
changeset
|
189 else { |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
190 client_send_tagline(client, lsub ? |
754
b531f5cd415e
Rewrote imap_match() function. Maybe not as fast as before, but at least
Timo Sirainen <tss@iki.fi>
parents:
699
diff
changeset
|
191 "OK Lsub completed." : |
b531f5cd415e
Rewrote imap_match() function. Maybe not as fast as before, but at least
Timo Sirainen <tss@iki.fi>
parents:
699
diff
changeset
|
192 "OK List completed."); |
b531f5cd415e
Rewrote imap_match() function. Maybe not as fast as before, but at least
Timo Sirainen <tss@iki.fi>
parents:
699
diff
changeset
|
193 } |
0 | 194 return TRUE; |
195 } | |
196 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
197 int cmd_list(struct client *client) |
0 | 198 { |
699
cc795d74d08f
Use more warnings with GCC by default. Fixed several warnings.
Timo Sirainen <tss@iki.fi>
parents:
97
diff
changeset
|
199 return _cmd_list_full(client, FALSE); |
0 | 200 } |