Mercurial > dovecot > core-2.2
annotate src/lib-imap/imap-arg.h @ 12636:fa4b84059ae2
IMAP LIST: Never return subscribed children state if RECURSIVEMATCH isn't specified.
Not even when backends give it automatically.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 02 Feb 2011 05:31:46 +0200 |
parents | 1e88287fc721 |
children | 68a8b650578e |
rev | line source |
---|---|
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 #ifndef IMAP_ARG_H |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 #define IMAP_ARG_H |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 /* We use this macro to read atoms from input. It should probably contain |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 everything some day, but for now we can't handle some input otherwise: |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 ']' is required for parsing section (FETCH BODY[]) |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 '%', '*' and ']' are valid list-chars for LIST patterns |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 '\' is used in flags */ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #define IS_ATOM_SPECIAL_INPUT(c) \ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 ((c) == '(' || (c) == ')' || (c) == '{' || \ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 (c) == '"' || (c) <= 32 || (c) == 0x7f) |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 #define IS_ATOM_SPECIAL(c) \ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 (IS_ATOM_SPECIAL_INPUT(c) || \ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 (c) == ']' || (c) == '%' || (c) == '*' || (c) == '\\') |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 enum imap_arg_type { |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 IMAP_ARG_NIL = 0, |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 IMAP_ARG_ATOM, |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 IMAP_ARG_STRING, |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 IMAP_ARG_LIST, |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 /* literals are returned as IMAP_ARG_STRING by default */ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 IMAP_ARG_LITERAL, |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 IMAP_ARG_LITERAL_SIZE, |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 IMAP_ARG_LITERAL_SIZE_NONSYNC, |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 IMAP_ARG_EOL /* end of argument list */ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 }; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 ARRAY_DEFINE_TYPE(imap_arg_list, struct imap_arg); |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 struct imap_arg { |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 enum imap_arg_type type; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 struct imap_arg *parent; /* always of type IMAP_ARG_LIST */ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 |
12614
1e88287fc721
lib-imap: struct imap_arg.str_size now contains the string value lengths.
Timo Sirainen <tss@iki.fi>
parents:
11115
diff
changeset
|
39 /* Set when _data.str is set */ |
1e88287fc721
lib-imap: struct imap_arg.str_size now contains the string value lengths.
Timo Sirainen <tss@iki.fi>
parents:
11115
diff
changeset
|
40 size_t str_len; |
1e88287fc721
lib-imap: struct imap_arg.str_size now contains the string value lengths.
Timo Sirainen <tss@iki.fi>
parents:
11115
diff
changeset
|
41 |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 union { |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 const char *str; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 uoff_t literal_size; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 ARRAY_TYPE(imap_arg_list) list; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 } _data; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 }; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 /* RFC 3501's astring type */ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 #define IMAP_ARG_TYPE_IS_ASTRING(type) \ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 ((type) == IMAP_ARG_ATOM || \ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 (type) == IMAP_ARG_STRING || \ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 (type) == IMAP_ARG_LITERAL) |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 #define IMAP_ARG_IS_ASTRING(arg) \ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 IMAP_ARG_TYPE_IS_ASTRING((arg)->type) |
11115
5ba59cc8b235
imap-arg: Added IMAP_ARG_IS_NSTRING().
Timo Sirainen <tss@iki.fi>
parents:
11063
diff
changeset
|
56 #define IMAP_ARG_IS_NSTRING(arg) \ |
5ba59cc8b235
imap-arg: Added IMAP_ARG_IS_NSTRING().
Timo Sirainen <tss@iki.fi>
parents:
11063
diff
changeset
|
57 (IMAP_ARG_IS_ASTRING(arg) || (arg)->type == IMAP_ARG_NIL) |
11063
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 #define IMAP_ARG_IS_EOL(arg) \ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 ((arg)->type == IMAP_ARG_EOL) |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 bool imap_arg_get_atom(const struct imap_arg *arg, const char **str_r) |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 ATTR_WARN_UNUSED_RESULT; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 bool imap_arg_get_quoted(const struct imap_arg *arg, const char **str_r) |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 ATTR_WARN_UNUSED_RESULT; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 bool imap_arg_get_string(const struct imap_arg *arg, const char **str_r) |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 ATTR_WARN_UNUSED_RESULT; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 bool imap_arg_get_astring(const struct imap_arg *arg, const char **str_r) |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 ATTR_WARN_UNUSED_RESULT; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 /* str is set to NULL for NIL. */ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 bool imap_arg_get_nstring(const struct imap_arg *arg, const char **str_r) |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 ATTR_WARN_UNUSED_RESULT; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 bool imap_arg_get_literal_size(const struct imap_arg *arg, uoff_t *size_r) |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 ATTR_WARN_UNUSED_RESULT; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 bool imap_arg_get_list(const struct imap_arg *arg, |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 const struct imap_arg **list_r) |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 ATTR_WARN_UNUSED_RESULT; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 bool imap_arg_get_list_full(const struct imap_arg *arg, |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 const struct imap_arg **list_r, |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 unsigned int *list_count_r) ATTR_WARN_UNUSED_RESULT; |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 /* Similar to above, but assumes that arg is already of correct type. */ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 const char *imap_arg_as_astring(const struct imap_arg *arg); |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 const char *imap_arg_as_nstring(const struct imap_arg *arg); |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 uoff_t imap_arg_as_literal_size(const struct imap_arg *arg); |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 const struct imap_arg *imap_arg_as_list(const struct imap_arg *arg); |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 /* Returns TRUE if arg is atom and case-insensitively matches str */ |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 bool imap_arg_atom_equals(const struct imap_arg *arg, const char *str); |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 |
dbc864c0cff7
lib-imap: Changed imap_arg accessing APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 #endif |