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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (C) 2002 Timo Sirainen */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "commands.h"
1655
Timo Sirainen <tss@iki.fi>
parents: 1654
diff changeset
9 #include "namespace.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 const char *str;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 (flags & MAILBOX_NOINFERIORS) ? " \\NoInferiors" : "",
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 (flags & MAILBOX_MARKED) ? " \\Marked" : "",
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 (flags & MAILBOX_UNMARKED) ? " \\UnMarked" : "",
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 NULL);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 return *str == '\0' ? "" : str+1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 {
1657
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
143 /* FIXME: really needs some work.. */
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
144 ns = namespace_find(client->namespaces, mask);
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
145 if (ns != NULL)
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
146 storage = ns->storage;
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
147 else
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
148 storage = client->namespaces->storage;
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
149
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
150 sep_chr = storage->hierarchy_sep;
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
151 if (sep_chr == '"' || sep_chr == '\\') {
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
152 sep[0] = '\\';
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
153 sep[1] = sep_chr;
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
154 sep[2] = '\0';
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
155 } else {
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
156 sep[0] = sep_chr;
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
157 sep[1] = '\0';
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
158 }
a85af58a363c A bit more temporary kludging
Timo Sirainen <tss@iki.fi>
parents: 1655
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 /* special request to return the hierarchy delimiter */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 client_send_line(client, t_strconcat(
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 } else {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 ref[strlen(ref)-1] == sep_chr) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 }