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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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