Return trunk to a working state by including compat.h in minimime.
[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 #include "asterisk/compat.h"
44
45 #define MM_MIME_LINELEN 998
46 #define MM_BASE64_LINELEN 76
47
48 TAILQ_HEAD(mm_mimeheaders, mm_mimeheader);
49 TAILQ_HEAD(mm_mimeparts, mm_mimepart);
50 TAILQ_HEAD(mm_params, mm_param);
51 SLIST_HEAD(mm_codecs, mm_codec);
52 SLIST_HEAD(mm_warnings, mm_warning);
53
54 /*
55  * Parser modes
56  */
57 enum mm_parsemodes
58 {
59         /** Parse loosely, accept some MIME quirks */
60         MM_PARSE_LOOSE = 0,
61         /** Parse as strict as possible */
62         MM_PARSE_STRICT
63 };
64
65 /*
66  * Available parser flags
67  */
68 enum mm_parseflags
69 {
70         MM_PARSE_NONE = (1L << 0),
71         MM_PARSE_STRIPCOMMENTS = (1L << 1)
72 };
73
74 /*
75  * Enumeration of MIME encodings
76  */
77 enum mm_encoding
78 {
79         MM_ENCODING_NONE = 0,
80         MM_ENCODING_BASE64,
81         MM_ENCODING_QUOTEDPRINTABLE,
82         MM_ENCODING_UNKNOWN
83 };
84
85 /*
86  * Message type
87  */
88 enum mm_messagetype
89 {
90         /** Flat message */
91         MM_MSGTYPE_FLAT = 0,
92         /** Composite message */
93         MM_MSGTYPE_MULTIPART
94 };
95
96 /*
97  * Enumeration of error categories
98  */
99 enum mm_errors
100 {
101         MM_ERROR_NONE = 0,
102         MM_ERROR_UNDEF,
103         MM_ERROR_ERRNO, 
104         MM_ERROR_PARSE,         
105         MM_ERROR_MIME,
106         MM_ERROR_CODEC,
107         MM_ERROR_PROGRAM
108 };
109
110 enum mm_warning_ids
111 {
112         MM_WARN_NONE = 0,
113         MM_WARN_PARSE,
114         MM_WARN_MIME,
115         MM_WARN_CODEC
116 };
117
118 enum mm_addressfields {
119         MM_ADDR_TO = 0,
120         MM_ADDR_CC,
121         MM_ADDR_BCC,
122         MM_ADDR_FROM,
123         MM_ADDR_SENDER,
124         MM_ADDR_REPLY_TO
125 };
126
127 enum mm_flatten_flags {
128         MM_FLATTEN_NONE = 0,
129         MM_FLATTEN_SKIPENVELOPE = (1L << 1),
130         MM_FLATTEN_OPAQUE = (1L << 2),
131         MM_FLATTEN_NOPREAMBLE = (1L << 3)
132 };      
133
134 /*
135  * More information about an error
136  */
137 struct mm_error_data
138 {
139         int error_id;
140         int error_where;
141         int lineno;
142         char error_msg[128];
143 };
144
145 extern int mm_errno;
146 extern struct mm_error_data mm_error;
147
148 enum mm_warning_code
149 {
150         MM_WARNING_NONE = 0,
151         MM_WARNING_INVHDR,
152 };
153
154 /*
155  * A parser warning
156  */
157 struct mm_warning
158 {
159         enum mm_warning_code warning;
160         uint32_t lineno;
161         SLIST_ENTRY(mm_warning) next;
162 };
163
164 /*
165  * Representation of a MiniMIME codec object
166  */
167 struct mm_codec
168 {
169         enum mm_encoding id;
170         char *encoding;
171
172         char *(*encoder)(char *, uint32_t);
173         char *(*decoder)(char *);
174
175         SLIST_ENTRY(mm_codec) next;
176 };
177
178 /*
179  * Representation of a MIME Content-Type parameter
180  */
181 struct mm_param
182 {
183         char *name; 
184         char *value; 
185
186         TAILQ_ENTRY(mm_param) next;
187 };
188
189 /*
190  * Representation of a mail or MIME header field
191  */
192 struct mm_mimeheader
193 {
194         char *name; 
195         char *value;
196
197         struct mm_params params;
198
199         TAILQ_ENTRY(mm_mimeheader) next;
200 };
201
202 /*
203  * Representation of a MIME Content-Type object
204  */
205 struct mm_content
206 {
207         char *maintype;
208         char *subtype;
209         char *disposition_type;
210
211         struct mm_params type_params;
212         struct mm_params disposition_params;
213
214         char *encstring;
215         enum mm_encoding encoding;
216 };
217
218 /*
219  * Representation of a MIME part 
220  */
221 struct mm_mimepart
222 {
223         struct mm_mimeheaders headers;
224         
225         size_t opaque_length;
226         char *opaque_body;
227
228         size_t length;
229         char *body;
230
231         struct mm_content *type;
232
233         TAILQ_ENTRY(mm_mimepart) next;
234 };
235
236 /*
237  * Represantation of a MiniMIME context
238  */
239 struct mm_context
240 {
241         struct mm_mimeparts parts;
242         enum mm_messagetype messagetype;
243         struct mm_warnings warnings;
244         struct mm_codecs codecs;
245         char *boundary;
246         char *preamble;
247         size_t max_message_size;
248 };
249
250 typedef struct mm_context MM_CTX;
251 typedef struct mm_context mm_ctx_t;
252
253 char *mm_unquote(const char *);
254 char *mm_uncomment(const char *);
255 char *mm_stripchars(char *, char *);
256 char *mm_addchars(char *, char *, uint16_t);
257 int mm_gendate(char **);
258 void mm_striptrailing(char **, const char *);
259 int mm_mimeutil_genboundary(char *, size_t, char **);
260
261 int mm_library_init(void);
262 int mm_library_isinitialized(void);
263
264 int mm_parse_mem(MM_CTX *, const char *, int, int);
265 int mm_parse_file(MM_CTX *, const char *, int, int);
266 int mm_parse_fileptr(MM_CTX *, FILE *, int, int);
267
268 MM_CTX *mm_context_new(void);
269 void mm_context_free(MM_CTX *);
270 int mm_context_attachpart(MM_CTX *, struct mm_mimepart *);
271 int mm_context_deletepart(MM_CTX *, int, int);
272 int mm_context_countparts(MM_CTX *);
273 struct mm_mimepart *mm_context_getpart(MM_CTX *, int);
274 int mm_context_iscomposite(MM_CTX *);
275 int mm_context_haswarnings(MM_CTX *);
276 int mm_context_flatten(MM_CTX *, char **, size_t *, int);
277
278 int mm_envelope_getheaders(MM_CTX *, char **, size_t *);
279 int mm_envelope_setheader(MM_CTX *, const char *, const char *, ...);
280
281 struct mm_mimeheader *mm_mimeheader_new(void);
282 void mm_mimeheader_free(struct mm_mimeheader *);
283 struct mm_mimeheader *mm_mimeheader_generate(const char *, const char *);
284 int mm_mimeheader_uncomment(struct mm_mimeheader *);
285 int mm_mimeheader_uncommentbyname(struct mm_mimepart *, const char *);
286 int mm_mimeheader_uncommentall(struct mm_mimepart *);
287 int mm_mimeheader_tostring(struct mm_mimeheader *);
288 char *mm_mimeheader_getparambyname(struct mm_mimeheader *hdr, const char *name);
289 int mm_mimeheader_attachparam(struct mm_mimeheader *hdr, struct mm_param *param);
290
291 struct mm_mimepart *mm_mimepart_new(void);
292 void mm_mimepart_free(struct mm_mimepart *);
293 int mm_mimepart_attachheader(struct mm_mimepart *, struct mm_mimeheader *);
294 int mm_mimepart_countheaders(struct mm_mimepart *part);
295 int mm_mimepart_countheaderbyname(struct mm_mimepart *, const char *);
296 struct mm_mimeheader *mm_mimepart_getheaderbyname(struct mm_mimepart *, const char *, int);
297 const char *mm_mimepart_getheadervalue(struct mm_mimepart *, const char *, int);
298 int mm_mimepart_headers_start(struct mm_mimepart *, struct mm_mimeheader **);
299 struct mm_mimeheader *mm_mimepart_headers_next(struct mm_mimepart *, struct mm_mimeheader **);
300 char *mm_mimepart_decode(struct mm_mimepart *);
301 struct mm_content *mm_mimepart_getcontent(struct mm_mimepart *);
302 size_t mm_mimepart_getlength(struct mm_mimepart *);
303 char *mm_mimepart_getbody(struct mm_mimepart *, int);
304 void mm_mimepart_attachcontenttype(struct mm_mimepart *, struct mm_content *);
305 int mm_mimepart_setdefaultcontenttype(struct mm_mimepart *, int);
306 int mm_mimepart_flatten(struct mm_mimepart *, char **, size_t *, int);
307 struct mm_mimepart *mm_mimepart_fromfile(const char *);
308
309 struct mm_content *mm_content_new(void);
310 void mm_content_free(struct mm_content *);
311 int mm_content_attachtypeparam(struct mm_content *, struct mm_param *);
312 int mm_content_attachdispositionparam(struct mm_content *, struct mm_param *);
313 struct mm_content *mm_content_parse(const char *, int);
314 char *mm_content_gettypeparambyname(struct mm_content *, const char *);
315 char *mm_content_getdispositionparambyname(struct mm_content *, const char *);
316 struct mm_param *mm_content_gettypeparamobjbyname(struct mm_content *, const char *);
317 struct mm_param *mm_content_getdispositionparamobjbyname(struct mm_content *, const char *);
318 int mm_content_setmaintype(struct mm_content *, char *, int);
319 int mm_content_setsubtype(struct mm_content *, char *, int);
320 int mm_content_settype(struct mm_content *, const char *, ...);
321 int mm_content_setdispositiontype(struct mm_content *ct, char *value, int copy);
322 char *mm_content_getmaintype(struct mm_content *);
323 char *mm_content_getsubtype(struct mm_content *);
324 char *mm_content_gettype(struct mm_content *);
325 char *mm_content_getdispositiontype(struct mm_content *ct);
326 int mm_content_iscomposite(struct mm_content *);
327 int mm_content_isvalidencoding(const char *);
328 int mm_content_setencoding(struct mm_content *, const char *);
329 char *mm_content_typeparamstostring(struct mm_content *);
330 char *mm_content_dispositionparamstostring(struct mm_content *);
331 char *mm_content_tostring(struct mm_content *);
332
333 struct mm_param *mm_param_new(void);
334 void mm_param_free(struct mm_param *);
335
336 char *mm_flatten_mimepart(struct mm_mimepart *);
337 char *mm_flatten_context(MM_CTX *);
338
339 int mm_codec_isregistered(const char *);
340 int mm_codec_hasdecoder(const char *);
341 int mm_codec_hasencoder(const char *);
342 int mm_codec_register(const char *, char *(*encoder)(char *, uint32_t), char *(*decoder)(char *));
343 int mm_codec_unregister(const char *);
344 int mm_codec_unregisterall(void);
345 void mm_codec_registerdefaultcodecs(void);
346
347 char *mm_base64_decode(char *);
348 char *mm_base64_encode(char *, uint32_t);
349
350 void mm_error_init(void);
351 void mm_error_setmsg(const char *, ...);
352 void mm_error_setlineno(int lineno);
353 char *mm_error_string(void);
354 int mm_error_lineno(void);
355
356 void mm_warning_add(MM_CTX *, int, const char *, ...);
357 struct mm_warning *mm_warning_next(MM_CTX *, struct mm_warning **);
358
359 #ifndef HAVE_STRLCPY
360 size_t strlcpy(char *, const char *, size_t);
361 #endif /* ! HAVE_STRLCPY */
362 #ifndef HAVE_STRLCAT
363 size_t strlcat(char *, const char *, size_t);
364 #endif /* ! HAVE_STRLCAT */
365
366 #define MM_ISINIT() do { \
367         assert(mm_library_isinitialized() == 1); \
368 } while (0);
369
370 #endif /* ! _MM_H_INCLUDED */