Convert minimime to use the proper uint*_t types, rather than u_int*_t
[asterisk/asterisk.git] / main / minimime / mm.h
1 /*
2  * $Id$
3  *
4  * MiniMIME - a library for handling MIME messages
5  *
6  * Copyright (C) 2003 Jann Fischer <rezine@mistrust.net>
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. Neither the name of the author nor the names of the contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY JANN FISCHER AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL JANN FISCHER OR THE VOICES IN HIS HEAD
26  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32  * THE POSSIBILITY OF SUCH DAMAGE.
33  */
34
35 #ifndef _MM_H_INCLUDED
36 #define _MM_H_INCLUDED
37
38 #include <sys/types.h>
39 #include <assert.h>
40 #include "mm_queue.h"
41 #include "mm_mem.h"
42
43 #define MM_MIME_LINELEN 998
44 #define MM_BASE64_LINELEN 76
45
46 TAILQ_HEAD(mm_mimeheaders, mm_mimeheader);
47 TAILQ_HEAD(mm_mimeparts, mm_mimepart);
48 TAILQ_HEAD(mm_params, mm_param);
49 SLIST_HEAD(mm_codecs, mm_codec);
50 SLIST_HEAD(mm_warnings, mm_warning);
51
52 /*
53  * Parser modes
54  */
55 enum mm_parsemodes
56 {
57         /** Parse loosely, accept some MIME quirks */
58         MM_PARSE_LOOSE = 0,
59         /** Parse as strict as possible */
60         MM_PARSE_STRICT
61 };
62
63 /*
64  * Available parser flags
65  */
66 enum mm_parseflags
67 {
68         MM_PARSE_NONE = (1L << 0),
69         MM_PARSE_STRIPCOMMENTS = (1L << 1)
70 };
71
72 /*
73  * Enumeration of MIME encodings
74  */
75 enum mm_encoding
76 {
77         MM_ENCODING_NONE = 0,
78         MM_ENCODING_BASE64,
79         MM_ENCODING_QUOTEDPRINTABLE,
80         MM_ENCODING_UNKNOWN
81 };
82
83 /*
84  * Message type
85  */
86 enum mm_messagetype
87 {
88         /** Flat message */
89         MM_MSGTYPE_FLAT = 0,
90         /** Composite message */
91         MM_MSGTYPE_MULTIPART
92 };
93
94 /*
95  * Enumeration of error categories
96  */
97 enum mm_errors
98 {
99         MM_ERROR_NONE = 0,
100         MM_ERROR_UNDEF,
101         MM_ERROR_ERRNO, 
102         MM_ERROR_PARSE,         
103         MM_ERROR_MIME,
104         MM_ERROR_CODEC,
105         MM_ERROR_PROGRAM
106 };
107
108 enum mm_warning_ids
109 {
110         MM_WARN_NONE = 0,
111         MM_WARN_PARSE,
112         MM_WARN_MIME,
113         MM_WARN_CODEC
114 };
115
116 enum mm_addressfields {
117         MM_ADDR_TO = 0,
118         MM_ADDR_CC,
119         MM_ADDR_BCC,
120         MM_ADDR_FROM,
121         MM_ADDR_SENDER,
122         MM_ADDR_REPLY_TO
123 };
124
125 enum mm_flatten_flags {
126         MM_FLATTEN_NONE = 0,
127         MM_FLATTEN_SKIPENVELOPE = (1L << 1),
128         MM_FLATTEN_OPAQUE = (1L << 2),
129         MM_FLATTEN_NOPREAMBLE = (1L << 3)
130 };      
131
132 /*
133  * More information about an error
134  */
135 struct mm_error_data
136 {
137         int error_id;
138         int error_where;
139         int lineno;
140         char error_msg[128];
141 };
142
143 extern int mm_errno;
144 extern struct mm_error_data mm_error;
145
146 enum mm_warning_code
147 {
148         MM_WARNING_NONE = 0,
149         MM_WARNING_INVHDR,
150 };
151
152 /*
153  * A parser warning
154  */
155 struct mm_warning
156 {
157         enum mm_warning_code warning;
158         uint32_t lineno;
159         SLIST_ENTRY(mm_warning) next;
160 };
161
162 /*
163  * Representation of a MiniMIME codec object
164  */
165 struct mm_codec
166 {
167         enum mm_encoding id;
168         char *encoding;
169
170         char *(*encoder)(char *, uint32_t);
171         char *(*decoder)(char *);
172
173         SLIST_ENTRY(mm_codec) next;
174 };
175
176 /*
177  * Representation of a MIME Content-Type parameter
178  */
179 struct mm_param
180 {
181         char *name; 
182         char *value; 
183
184         TAILQ_ENTRY(mm_param) next;
185 };
186
187 /*
188  * Representation of a mail or MIME header field
189  */
190 struct mm_mimeheader
191 {
192         char *name; 
193         char *value;
194
195         struct mm_params params;
196
197         TAILQ_ENTRY(mm_mimeheader) next;
198 };
199
200 /*
201  * Representation of a MIME Content-Type object
202  */
203 struct mm_content
204 {
205         char *maintype;
206         char *subtype;
207         char *disposition_type;
208
209         struct mm_params type_params;
210         struct mm_params disposition_params;
211
212         char *encstring;
213         enum mm_encoding encoding;
214 };
215
216 /*
217  * Representation of a MIME part 
218  */
219 struct mm_mimepart
220 {
221         struct mm_mimeheaders headers;
222         
223         size_t opaque_length;
224         char *opaque_body;
225
226         size_t length;
227         char *body;
228
229         struct mm_content *type;
230
231         TAILQ_ENTRY(mm_mimepart) next;
232 };
233
234 /*
235  * Represantation of a MiniMIME context
236  */
237 struct mm_context
238 {
239         struct mm_mimeparts parts;
240         enum mm_messagetype messagetype;
241         struct mm_warnings warnings;
242         struct mm_codecs codecs;
243         char *boundary;
244         char *preamble;
245         size_t max_message_size;
246 };
247
248 typedef struct mm_context MM_CTX;
249 typedef struct mm_context mm_ctx_t;
250
251 char *mm_unquote(const char *);
252 char *mm_uncomment(const char *);
253 char *mm_stripchars(char *, char *);
254 char *mm_addchars(char *, char *, uint16_t);
255 int mm_gendate(char **);
256 void mm_striptrailing(char **, const char *);
257 int mm_mimeutil_genboundary(char *, size_t, char **);
258
259 int mm_library_init(void);
260 int mm_library_isinitialized(void);
261
262 int mm_parse_mem(MM_CTX *, const char *, int, int);
263 int mm_parse_file(MM_CTX *, const char *, int, int);
264 int mm_parse_fileptr(MM_CTX *, FILE *, int, int);
265
266 MM_CTX *mm_context_new(void);
267 void mm_context_free(MM_CTX *);
268 int mm_context_attachpart(MM_CTX *, struct mm_mimepart *);
269 int mm_context_deletepart(MM_CTX *, int, int);
270 int mm_context_countparts(MM_CTX *);
271 struct mm_mimepart *mm_context_getpart(MM_CTX *, int);
272 int mm_context_iscomposite(MM_CTX *);
273 int mm_context_haswarnings(MM_CTX *);
274 int mm_context_flatten(MM_CTX *, char **, size_t *, int);
275
276 int mm_envelope_getheaders(MM_CTX *, char **, size_t *);
277 int mm_envelope_setheader(MM_CTX *, const char *, const char *, ...);
278
279 struct mm_mimeheader *mm_mimeheader_new(void);
280 void mm_mimeheader_free(struct mm_mimeheader *);
281 struct mm_mimeheader *mm_mimeheader_generate(const char *, const char *);
282 int mm_mimeheader_uncomment(struct mm_mimeheader *);
283 int mm_mimeheader_uncommentbyname(struct mm_mimepart *, const char *);
284 int mm_mimeheader_uncommentall(struct mm_mimepart *);
285 int mm_mimeheader_tostring(struct mm_mimeheader *);
286 char *mm_mimeheader_getparambyname(struct mm_mimeheader *hdr, const char *name);
287 int mm_mimeheader_attachparam(struct mm_mimeheader *hdr, struct mm_param *param);
288
289 struct mm_mimepart *mm_mimepart_new(void);
290 void mm_mimepart_free(struct mm_mimepart *);
291 int mm_mimepart_attachheader(struct mm_mimepart *, struct mm_mimeheader *);
292 int mm_mimepart_countheaders(struct mm_mimepart *part);
293 int mm_mimepart_countheaderbyname(struct mm_mimepart *, const char *);
294 struct mm_mimeheader *mm_mimepart_getheaderbyname(struct mm_mimepart *, const char *, int);
295 const char *mm_mimepart_getheadervalue(struct mm_mimepart *, const char *, int);
296 int mm_mimepart_headers_start(struct mm_mimepart *, struct mm_mimeheader **);
297 struct mm_mimeheader *mm_mimepart_headers_next(struct mm_mimepart *, struct mm_mimeheader **);
298 char *mm_mimepart_decode(struct mm_mimepart *);
299 struct mm_content *mm_mimepart_getcontent(struct mm_mimepart *);
300 size_t mm_mimepart_getlength(struct mm_mimepart *);
301 char *mm_mimepart_getbody(struct mm_mimepart *, int);
302 void mm_mimepart_attachcontenttype(struct mm_mimepart *, struct mm_content *);
303 int mm_mimepart_setdefaultcontenttype(struct mm_mimepart *, int);
304 int mm_mimepart_flatten(struct mm_mimepart *, char **, size_t *, int);
305 struct mm_mimepart *mm_mimepart_fromfile(const char *);
306
307 struct mm_content *mm_content_new(void);
308 void mm_content_free(struct mm_content *);
309 int mm_content_attachtypeparam(struct mm_content *, struct mm_param *);
310 int mm_content_attachdispositionparam(struct mm_content *, struct mm_param *);
311 struct mm_content *mm_content_parse(const char *, int);
312 char *mm_content_gettypeparambyname(struct mm_content *, const char *);
313 char *mm_content_getdispositionparambyname(struct mm_content *, const char *);
314 struct mm_param *mm_content_gettypeparamobjbyname(struct mm_content *, const char *);
315 struct mm_param *mm_content_getdispositionparamobjbyname(struct mm_content *, const char *);
316 int mm_content_setmaintype(struct mm_content *, char *, int);
317 int mm_content_setsubtype(struct mm_content *, char *, int);
318 int mm_content_settype(struct mm_content *, const char *, ...);
319 int mm_content_setdispositiontype(struct mm_content *ct, char *value, int copy);
320 char *mm_content_getmaintype(struct mm_content *);
321 char *mm_content_getsubtype(struct mm_content *);
322 char *mm_content_gettype(struct mm_content *);
323 char *mm_content_getdispositiontype(struct mm_content *ct);
324 int mm_content_iscomposite(struct mm_content *);
325 int mm_content_isvalidencoding(const char *);
326 int mm_content_setencoding(struct mm_content *, const char *);
327 char *mm_content_typeparamstostring(struct mm_content *);
328 char *mm_content_dispositionparamstostring(struct mm_content *);
329 char *mm_content_tostring(struct mm_content *);
330
331 struct mm_param *mm_param_new(void);
332 void mm_param_free(struct mm_param *);
333
334 char *mm_flatten_mimepart(struct mm_mimepart *);
335 char *mm_flatten_context(MM_CTX *);
336
337 int mm_codec_isregistered(const char *);
338 int mm_codec_hasdecoder(const char *);
339 int mm_codec_hasencoder(const char *);
340 int mm_codec_register(const char *, char *(*encoder)(char *, uint32_t), char *(*decoder)(char *));
341 int mm_codec_unregister(const char *);
342 int mm_codec_unregisterall(void);
343 void mm_codec_registerdefaultcodecs(void);
344
345 char *mm_base64_decode(char *);
346 char *mm_base64_encode(char *, uint32_t);
347
348 void mm_error_init(void);
349 void mm_error_setmsg(const char *, ...);
350 void mm_error_setlineno(int lineno);
351 char *mm_error_string(void);
352 int mm_error_lineno(void);
353
354 void mm_warning_add(MM_CTX *, int, const char *, ...);
355 struct mm_warning *mm_warning_next(MM_CTX *, struct mm_warning **);
356
357 #ifndef HAVE_STRLCPY
358 size_t strlcpy(char *, const char *, size_t);
359 #endif /* ! HAVE_STRLCPY */
360 #ifndef HAVE_STRLCAT
361 size_t strlcat(char *, const char *, size_t);
362 #endif /* ! HAVE_STRLCAT */
363
364 #define MM_ISINIT() do { \
365         assert(mm_library_isinitialized() == 1); \
366 } while (0);
367
368 #endif /* ! _MM_H_INCLUDED */