/src/pigeonhole/src/lib-sieve/sieve-message.h
Line | Count | Source |
1 | | #ifndef SIEVE_MESSAGE_H |
2 | | #define SIEVE_MESSAGE_H |
3 | | |
4 | | #include "sieve-common.h" |
5 | | #include "sieve-stringlist.h" |
6 | | #include "sieve-objects.h" |
7 | | |
8 | | /* |
9 | | * Message transmission |
10 | | */ |
11 | | |
12 | | const char *sieve_message_get_new_id(const struct sieve_instance *svinst); |
13 | | |
14 | | /* |
15 | | * Message context |
16 | | */ |
17 | | |
18 | | struct sieve_message_context; |
19 | | |
20 | | struct sieve_message_context * |
21 | | sieve_message_context_create(struct sieve_instance *svinst, |
22 | | struct mail_user *mail_user, |
23 | | const struct sieve_message_data *msgdata); |
24 | | void sieve_message_context_ref(struct sieve_message_context *msgctx); |
25 | | void sieve_message_context_unref(struct sieve_message_context **msgctx); |
26 | | |
27 | | void sieve_message_context_reset(struct sieve_message_context *msgctx); |
28 | | |
29 | | pool_t sieve_message_context_pool( |
30 | | struct sieve_message_context *msgctx) ATTR_PURE; |
31 | | void sieve_message_context_time(struct sieve_message_context *msgctx, |
32 | | struct timeval *time); |
33 | | |
34 | | /* Extension support */ |
35 | | |
36 | | void sieve_message_context_extension_set(struct sieve_message_context *msgctx, |
37 | | const struct sieve_extension *ext, |
38 | | void *context); |
39 | | void *sieve_message_context_extension_get(struct sieve_message_context *msgctx, |
40 | | const struct sieve_extension *ext); |
41 | | |
42 | | /* Envelope */ |
43 | | |
44 | | const struct smtp_address * |
45 | | sieve_message_get_final_recipient(struct sieve_message_context *msgctx); |
46 | | const struct smtp_address * |
47 | | sieve_message_get_orig_recipient(struct sieve_message_context *msgctx); |
48 | | |
49 | | const struct smtp_address * |
50 | | sieve_message_get_sender(struct sieve_message_context *msgctx); |
51 | | |
52 | | /* Mail */ |
53 | | |
54 | | struct mail *sieve_message_get_mail(struct sieve_message_context *msgctx); |
55 | | |
56 | | int sieve_message_substitute(struct sieve_message_context *msgctx, |
57 | | struct istream *input); |
58 | | struct edit_mail *sieve_message_edit(struct sieve_message_context *msgctx); |
59 | | void sieve_message_snapshot(struct sieve_message_context *msgctx); |
60 | | |
61 | | /* |
62 | | * Header stringlist |
63 | | */ |
64 | | |
65 | | struct sieve_header_list { |
66 | | struct sieve_stringlist strlist; |
67 | | |
68 | | int (*next_item)(struct sieve_header_list *_hdrlist, |
69 | | const char **name_r, string_t **value_r) ATTR_NULL(2); |
70 | | }; |
71 | | |
72 | | static inline int |
73 | | sieve_header_list_next_item(struct sieve_header_list *hdrlist, |
74 | | const char **name_r, string_t **value_r) |
75 | | ATTR_NULL(2) |
76 | 0 | { |
77 | 0 | return hdrlist->next_item(hdrlist, name_r, value_r); |
78 | 0 | } Unexecuted instantiation: testsuite-common.c:sieve_header_list_next_item Unexecuted instantiation: testsuite-message.c:sieve_header_list_next_item Unexecuted instantiation: cmd-test-message.c:sieve_header_list_next_item |
79 | | |
80 | | static inline void |
81 | | sieve_header_list_reset(struct sieve_header_list *hdrlist) |
82 | 0 | { |
83 | 0 | sieve_stringlist_reset(&hdrlist->strlist); |
84 | 0 | } Unexecuted instantiation: testsuite-common.c:sieve_header_list_reset Unexecuted instantiation: testsuite-message.c:sieve_header_list_reset Unexecuted instantiation: cmd-test-message.c:sieve_header_list_reset |
85 | | |
86 | | static inline int |
87 | | sieve_header_list_get_length(struct sieve_header_list *hdrlist) |
88 | 0 | { |
89 | 0 | return sieve_stringlist_get_length(&hdrlist->strlist); |
90 | 0 | } Unexecuted instantiation: testsuite-common.c:sieve_header_list_get_length Unexecuted instantiation: testsuite-message.c:sieve_header_list_get_length Unexecuted instantiation: cmd-test-message.c:sieve_header_list_get_length |
91 | | |
92 | | static inline void |
93 | | sieve_header_list_set_trace(struct sieve_header_list *hdrlist, bool trace) |
94 | 0 | { |
95 | 0 | sieve_stringlist_set_trace(&hdrlist->strlist, trace); |
96 | 0 | } Unexecuted instantiation: testsuite-common.c:sieve_header_list_set_trace Unexecuted instantiation: testsuite-message.c:sieve_header_list_set_trace Unexecuted instantiation: cmd-test-message.c:sieve_header_list_set_trace |
97 | | |
98 | | struct sieve_header_list * |
99 | | sieve_message_header_list_create(const struct sieve_runtime_env *renv, |
100 | | struct sieve_stringlist *field_names, |
101 | | bool mime_decode); |
102 | | |
103 | | /* |
104 | | * Message override |
105 | | */ |
106 | | |
107 | | /* Header override object */ |
108 | | |
109 | | struct sieve_message_override_def { |
110 | | struct sieve_object_def obj_def; |
111 | | |
112 | | unsigned int sequence; |
113 | | |
114 | | /* Context coding */ |
115 | | |
116 | | bool (*dump_context)(const struct sieve_message_override *svmo, |
117 | | const struct sieve_dumptime_env *denv, |
118 | | sieve_size_t *address); |
119 | | int (*read_context)(const struct sieve_message_override *svmo, |
120 | | const struct sieve_runtime_env *renv, |
121 | | sieve_size_t *address, void **se_context); |
122 | | |
123 | | /* Override */ |
124 | | |
125 | | int (*header_override)(const struct sieve_message_override *svmo, |
126 | | const struct sieve_runtime_env *renv, |
127 | | bool mime_decode, |
128 | | struct sieve_stringlist **headers); |
129 | | }; |
130 | | |
131 | | struct sieve_message_override { |
132 | | struct sieve_object object; |
133 | | |
134 | | const struct sieve_message_override_def *def; |
135 | | |
136 | | void *context; |
137 | | }; |
138 | | |
139 | | ARRAY_DEFINE_TYPE(sieve_message_override, |
140 | | struct sieve_message_override); |
141 | | |
142 | | /* |
143 | | * Message override operand |
144 | | */ |
145 | | |
146 | | #define SIEVE_EXT_DEFINE_MESSAGE_OVERRIDE(SVMO) SIEVE_EXT_DEFINE_OBJECT(SVMO) |
147 | | #define SIEVE_EXT_DEFINE_MESSAGE_OVERRIDES(SVMOS) SIEVE_EXT_DEFINE_OBJECTS(SMOS) |
148 | | |
149 | | #define SIEVE_OPT_MESSAGE_OVERRIDE (-2) |
150 | | |
151 | | extern const struct sieve_operand_class |
152 | | sieve_message_override_operand_class; |
153 | | |
154 | | static inline void |
155 | | sieve_opr_message_override_emit(struct sieve_binary_block *sblock, |
156 | | const struct sieve_extension *ext, |
157 | | const struct sieve_message_override_def *seff) |
158 | 0 | { |
159 | 0 | sieve_opr_object_emit(sblock, ext, &seff->obj_def); |
160 | 0 | } Unexecuted instantiation: testsuite-common.c:sieve_opr_message_override_emit Unexecuted instantiation: testsuite-message.c:sieve_opr_message_override_emit Unexecuted instantiation: cmd-test-message.c:sieve_opr_message_override_emit |
161 | | |
162 | | bool sieve_opr_message_override_dump(const struct sieve_dumptime_env *denv, |
163 | | sieve_size_t *address); |
164 | | int sieve_opr_message_override_read(const struct sieve_runtime_env *renv, |
165 | | sieve_size_t *address, |
166 | | struct sieve_message_override *svmo); |
167 | | |
168 | | /* |
169 | | * Optional operands |
170 | | */ |
171 | | |
172 | | int sieve_message_opr_optional_dump(const struct sieve_dumptime_env *denv, |
173 | | sieve_size_t *address, |
174 | | signed int *opt_code); |
175 | | |
176 | | int sieve_message_opr_optional_read(const struct sieve_runtime_env *renv, |
177 | | sieve_size_t *address, signed int *opt_code, |
178 | | int *exec_status, |
179 | | struct sieve_address_part *addrp, |
180 | | struct sieve_match_type *mcht, |
181 | | struct sieve_comparator *cmp, |
182 | | ARRAY_TYPE(sieve_message_override) *svmos); |
183 | | |
184 | | /* |
185 | | * Message header |
186 | | */ |
187 | | |
188 | | int sieve_message_get_header_fields(const struct sieve_runtime_env *renv, |
189 | | struct sieve_stringlist *field_names, |
190 | | ARRAY_TYPE(sieve_message_override) *svmos, |
191 | | bool mime_decode, |
192 | | struct sieve_stringlist **fields_r); |
193 | | |
194 | | /* |
195 | | * Message part |
196 | | */ |
197 | | |
198 | | struct sieve_message_part; |
199 | | |
200 | | struct sieve_message_part_data { |
201 | | const char *content_type; |
202 | | const char *content_disposition; |
203 | | |
204 | | const char *content; |
205 | | unsigned long size; |
206 | | }; |
207 | | |
208 | | struct sieve_message_part * |
209 | | sieve_message_part_parent(struct sieve_message_part *mpart) ATTR_PURE; |
210 | | struct sieve_message_part * |
211 | | sieve_message_part_next(struct sieve_message_part *mpart) ATTR_PURE; |
212 | | struct sieve_message_part * |
213 | | sieve_message_part_children(struct sieve_message_part *mpart) ATTR_PURE; |
214 | | |
215 | | const char * |
216 | | sieve_message_part_content_type(struct sieve_message_part *mpart) ATTR_PURE; |
217 | | const char * |
218 | | sieve_message_part_content_disposition(struct sieve_message_part *mpart) |
219 | | ATTR_PURE; |
220 | | |
221 | | int sieve_message_part_get_first_header(struct sieve_message_part *mpart, |
222 | | const char *field, |
223 | | const char **value_r); |
224 | | |
225 | | void sieve_message_part_get_data(struct sieve_message_part *mpart, |
226 | | struct sieve_message_part_data *data, |
227 | | bool text); |
228 | | |
229 | | /* |
230 | | * Message body |
231 | | */ |
232 | | |
233 | | int sieve_message_body_get_content(const struct sieve_runtime_env *renv, |
234 | | const char *const *content_types, |
235 | | struct sieve_message_part_data **parts_r); |
236 | | int sieve_message_body_get_text(const struct sieve_runtime_env *renv, |
237 | | struct sieve_message_part_data **parts_r); |
238 | | int sieve_message_body_get_raw(const struct sieve_runtime_env *renv, |
239 | | struct sieve_message_part_data **parts_r); |
240 | | |
241 | | /* |
242 | | * Message part iterator |
243 | | */ |
244 | | |
245 | | struct sieve_message_part_iter { |
246 | | const struct sieve_runtime_env *renv; |
247 | | struct sieve_message_part *root; |
248 | | unsigned int index, offset; |
249 | | }; |
250 | | |
251 | | int sieve_message_part_iter_init(struct sieve_message_part_iter *iter, |
252 | | const struct sieve_runtime_env *renv); |
253 | | void sieve_message_part_iter_subtree(struct sieve_message_part_iter *iter, |
254 | | struct sieve_message_part_iter *subtree); |
255 | | void sieve_message_part_iter_children(struct sieve_message_part_iter *iter, |
256 | | struct sieve_message_part_iter *child); |
257 | | |
258 | | struct sieve_message_part * |
259 | | sieve_message_part_iter_current(struct sieve_message_part_iter *iter); |
260 | | struct sieve_message_part * |
261 | | sieve_message_part_iter_next(struct sieve_message_part_iter *iter); |
262 | | |
263 | | void sieve_message_part_iter_reset(struct sieve_message_part_iter *iter); |
264 | | |
265 | | /* |
266 | | * MIME header list |
267 | | */ |
268 | | |
269 | | struct sieve_header_list * |
270 | | sieve_mime_header_list_create(const struct sieve_runtime_env *renv, |
271 | | struct sieve_stringlist *field_names, |
272 | | struct sieve_message_part_iter *part_iter, |
273 | | bool mime_decode, bool children); |
274 | | |
275 | | #endif |