1 /* GNU Mailutils -- a suite of utilities for electronic mail
2 Copyright (C) 1999-2021 Free Software Foundation, Inc.
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 3 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General
15 Public License along with this library. If not, see
16 <http://www.gnu.org/licenses/>. */
17
18 #ifndef _MAILUTILS_MESSAGE_H
19 #define _MAILUTILS_MESSAGE_H
20
21 #include <mailutils/types.h>
22 #include <mailutils/datetime.h>
23
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27
28 #define MU_SCAN_SEEK 0x01
29 #define MU_SCAN_SIZE 0x02
30
31 struct mu_imapenvelope
32 {
33 struct tm date;
34 struct mu_timezone tz;
35 char *subject;
36 mu_address_t from;
37 mu_address_t sender;
38 mu_address_t reply_to;
39 mu_address_t to;
40 mu_address_t cc;
41 mu_address_t bcc;
42 char *in_reply_to;
43 char *message_id;
44 };
45
46 enum mu_message_type
47 {
48 mu_message_other,
49 mu_message_text, /* text/plain */
50 mu_message_rfc822, /* message/rfc822 */
51 mu_message_multipart /* multipart/mixed */
52 };
53
54 struct mu_bodystructure
55 {
56 enum mu_message_type body_message_type;
57 char *body_type;
58 char *body_subtype;
59 mu_assoc_t body_param;
60 char *body_id;
61 char *body_descr;
62 char *body_encoding;
63 size_t body_size;
64 /* Optional */
65 char *body_md5;
66 char *body_disposition;
67 mu_assoc_t body_disp_param;
68 char *body_language;
69 char *body_location;
70 union
71 {
72 struct
73 {
74 size_t body_lines;
75 } text;
76 struct
77 {
78 struct mu_imapenvelope *body_env;
79 struct mu_bodystructure *body_struct;
80 size_t body_lines;
81 } rfc822;
82 struct
83 {
84 mu_list_t body_parts;
85 } multipart;
86 } v;
87 };
88
89 struct mu_message_scan
90 {
91 int flags;
92 mu_off_t message_start;
93 mu_off_t message_size;
94
95 mu_off_t body_start;
96 mu_off_t body_end;
97 size_t header_lines;
98 size_t body_lines;
99 int attr_flags;
100 };
101
102 int mu_stream_scan_message (mu_stream_t stream, struct mu_message_scan *sp);
103
104 /* A message is considered to be a container for:
105 mu_header_t, mu_body_t, and its mu_attribute_t. */
106
107 extern int mu_message_create (mu_message_t *, void *owner);
108 extern void mu_message_destroy (mu_message_t *, void *owner);
109
110 extern int mu_message_create_copy (mu_message_t *to, mu_message_t from);
111
112 extern void *mu_message_get_owner (mu_message_t);
113
114 #define MU_MSG_ATTRIBUTE_MODIFIED 0x01
115 #define MU_MSG_HEADER_MODIFIED 0x02
116 #define MU_MSG_BODY_MODIFIED 0x04
117
118 extern int mu_message_is_modified (mu_message_t);
119 extern int mu_message_clear_modified (mu_message_t);
120 extern int mu_message_get_mailbox (mu_message_t, mu_mailbox_t *);
121 extern int mu_message_set_mailbox (mu_message_t, mu_mailbox_t, void *);
122
123 extern void mu_message_ref (mu_message_t);
124 extern void mu_message_unref (mu_message_t);
125
126 extern int mu_message_get_envelope (mu_message_t, mu_envelope_t *);
127 extern int mu_message_set_envelope (mu_message_t, mu_envelope_t, void *);
128
129 extern int mu_message_reconstruct_envelope (mu_message_t msg,
130 mu_envelope_t *penv);
131
132 extern int mu_message_get_header (mu_message_t, mu_header_t *);
133 extern int mu_message_set_header (mu_message_t, mu_header_t, void *);
134
135 extern int mu_message_get_body (mu_message_t, mu_body_t *);
136 extern int mu_message_set_body (mu_message_t, mu_body_t, void *);
137
138 extern int mu_message_get_streamref (mu_message_t, mu_stream_t *);
139
140 extern int mu_message_set_stream (mu_message_t, mu_stream_t, void *);
141
142 extern int mu_message_get_attribute (mu_message_t, mu_attribute_t *);
143 extern int mu_message_set_attribute (mu_message_t, mu_attribute_t, void *);
144
145 extern int mu_message_get_observable (mu_message_t, mu_observable_t *);
146
147 extern int mu_message_set_get_stream (mu_message_t,
148 int (*) (mu_message_t, mu_stream_t *),
149 void *);
150 extern int mu_message_is_multipart (mu_message_t, int *);
151 extern int mu_message_set_is_multipart (mu_message_t,
152 int (*_is_multipart) (mu_message_t,
153 int *),
154 void *);
155
156 extern int mu_message_size (mu_message_t, size_t *);
157 extern int mu_message_set_size (mu_message_t,
158 int (*_size) (mu_message_t, size_t *),
159 void *owner);
160
161 extern int mu_message_lines (mu_message_t, size_t *);
162 extern int mu_message_quick_lines (mu_message_t, size_t *);
163 extern int mu_message_set_lines (mu_message_t,
164 int (*_lines) (mu_message_t, size_t *, int),
165 void *owner);
166
167 extern int mu_message_get_num_parts (mu_message_t, size_t *nparts);
168 extern int mu_message_set_get_num_parts (mu_message_t,
169 int (*_get_num_parts) (mu_message_t,
170 size_t *),
171 void *owner);
172
173 extern int mu_message_get_part (mu_message_t, size_t, mu_message_t *);
174 extern int mu_message_set_get_part (mu_message_t,
175 int (*_get_part) (mu_message_t, size_t,
176 mu_message_t *),
177 void *owner);
178
179 extern int mu_message_get_uidl (mu_message_t, char *, size_t, size_t *);
180 extern int mu_message_set_uidl (mu_message_t,
181 int (*_get_uidl) (mu_message_t,
182 char *,
183 size_t, size_t *),
184 void *owner);
185
186 extern int mu_message_get_uid (mu_message_t, size_t *);
187 extern int mu_message_set_uid (mu_message_t,
188 int (*_get_uid) (mu_message_t,
189 size_t *),
190 void *owner);
191
192 extern int mu_message_get_qid (mu_message_t, mu_message_qid_t *);
193 extern int mu_message_set_qid (mu_message_t,
194 int (*_get_qid) (mu_message_t,
195 mu_message_qid_t *),
196 void *owner);
197
198 extern int mu_message_get_imapenvelope (mu_message_t, struct mu_imapenvelope **);
199 extern void mu_message_imapenvelope_free (struct mu_imapenvelope *);
200 extern int mu_message_set_imapenvelope (mu_message_t,
201 int (*_imapenvelope) (mu_message_t, struct mu_imapenvelope **),
202 void *owner);
203
204 extern void mu_bodystructure_free (struct mu_bodystructure *);
205 extern void mu_list_free_bodystructure (void *item);
206
207 extern int mu_message_get_bodystructure (mu_message_t,
208 struct mu_bodystructure **);
209 extern int mu_message_set_bodystructure (mu_message_t msg,
210 int (*_bodystructure) (mu_message_t, struct mu_bodystructure **),
211 void *owner);
212
213 /* misc functions */
214 extern int mu_attachment_create (mu_message_t *newmsg,
215 const char *content_type,
216 const char *encoding,
217 const char *name, const char *filename);
218 extern int mu_attachment_copy_from_stream (mu_message_t att,
219 mu_stream_t stream);
220 extern int mu_attachment_copy_from_file (mu_message_t att,
221 char const *filename);
222 extern int mu_message_create_attachment (const char *content_type,
223 const char *encoding,
224 const char *filename,
225 mu_message_t *newmsg);
226
227 extern int mu_message_save_attachment (mu_message_t msg,
228 const char *filename,
229 mu_mime_io_buffer_t buf);
230 extern int mu_message_encapsulate (mu_message_t msg, mu_message_t *newmsg,
231 mu_mime_io_buffer_t buf);
232 extern int mu_message_unencapsulate (mu_message_t msg, mu_message_t *newmsg,
233 mu_mime_io_buffer_t buf);
234
235 extern int mu_mime_io_buffer_create (mu_mime_io_buffer_t *pinfo);
236 extern void mu_mime_io_buffer_destroy (mu_mime_io_buffer_t *pinfo);
237
238 extern int mu_mime_io_buffer_set_charset (mu_mime_io_buffer_t info,
239 const char *charset);
240 extern void mu_mime_io_buffer_sget_charset (mu_mime_io_buffer_t info,
241 const char **charset);
242 extern int mu_mime_io_buffer_aget_charset (mu_mime_io_buffer_t info,
243 const char **charset);
244
245
246 extern int mu_mimehdr_get_disp (const char *str, char *buf, size_t bufsz,
247 size_t *retsz);
248 extern int mu_mimehdr_aget_disp (const char *str, char **pvalue);
249 extern int mu_mimehdr_get_param (const char *str, const char *param,
250 char *buf, size_t bufsz, size_t *retsz);
251 extern int mu_mimehdr_aget_param (const char *str, const char *param,
252 char **pval);
253 extern int mu_mimehdr_aget_decoded_param (const char *str, const char *param,
254 const char *charset,
255 char **pval, char **plang);
256
257 extern int mu_message_get_attachment_name (mu_message_t, char *name,
258 size_t bufsz, size_t* sz);
259 extern int mu_message_aget_attachment_name (mu_message_t, char **name);
260 extern int mu_message_aget_decoded_attachment_name (mu_message_t msg,
261 const char *charset,
262 char **name,
263 char **plang);
264
265 extern int mu_message_save_to_mailbox (mu_message_t msg, const char *toname,
266 int perms);
267
268
269 extern int mu_message_from_stream_with_envelope (mu_message_t *pmsg,
270 mu_stream_t instream,
271 mu_envelope_t env);
272 extern int mu_stream_to_message (mu_stream_t instream, mu_message_t *pmsg);
273
274 extern int mu_message_get_iterator (mu_message_t msg, mu_iterator_t *pitr);
275
276 /*
277 * Message part coordinates
278 */
279 typedef size_t *mu_coord_t;
280
281 int mu_coord_alloc (mu_coord_t *ptr, size_t n);
282 int mu_coord_realloc (mu_coord_t *ptr, size_t n);
283 int mu_coord_dup (mu_coord_t orig, mu_coord_t *copy);
284
285 static inline size_t
mu_coord_length(mu_coord_t c)286 mu_coord_length (mu_coord_t c)
287 {
288 return c[0];
289 }
290
291 char *mu_coord_part_string (mu_coord_t c, size_t d);
292
293 static inline char *
mu_coord_string(mu_coord_t c)294 mu_coord_string (mu_coord_t c)
295 {
296 return mu_coord_part_string (c, mu_coord_length (c));
297 }
298
299 #ifdef __cplusplus
300 }
301 #endif
302
303 #endif /* _MAILUTILS_MESSAGE_H */
304