4 * MiniMIME - a library for handling MIME messages
6 * Copyright (C) 2003 Jann Fischer <rezine@mistrust.net>
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
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.
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.
35 #ifndef _MM_H_INCLUDED
36 #define _MM_H_INCLUDED
38 #include <sys/types.h>
43 #define MM_MIME_LINELEN 998
44 #define MM_BASE64_LINELEN 76
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);
57 /** Parse loosely, accept some MIME quirks */
59 /** Parse as strict as possible */
64 * Available parser flags
68 MM_PARSE_NONE = (1L << 0),
69 MM_PARSE_STRIPCOMMENTS = (1L << 1)
73 * Enumeration of MIME encodings
79 MM_ENCODING_QUOTEDPRINTABLE,
90 /** Composite message */
95 * Enumeration of error categories
116 enum mm_addressfields {
125 enum mm_flatten_flags {
127 MM_FLATTEN_SKIPENVELOPE = (1L << 1),
128 MM_FLATTEN_OPAQUE = (1L << 2),
129 MM_FLATTEN_NOPREAMBLE = (1L << 3)
133 * More information about an error
144 extern struct mm_error_data mm_error;
157 enum mm_warning_code warning;
159 SLIST_ENTRY(mm_warning) next;
163 * Representation of a MiniMIME codec object
170 char *(*encoder)(char *, uint32_t);
171 char *(*decoder)(char *);
173 SLIST_ENTRY(mm_codec) next;
177 * Representation of a MIME Content-Type parameter
184 TAILQ_ENTRY(mm_param) next;
188 * Representation of a mail or MIME header field
195 struct mm_params params;
197 TAILQ_ENTRY(mm_mimeheader) next;
201 * Representation of a MIME Content-Type object
207 char *disposition_type;
209 struct mm_params type_params;
210 struct mm_params disposition_params;
213 enum mm_encoding encoding;
217 * Representation of a MIME part
221 struct mm_mimeheaders headers;
223 size_t opaque_length;
229 struct mm_content *type;
231 TAILQ_ENTRY(mm_mimepart) next;
235 * Represantation of a MiniMIME context
239 struct mm_mimeparts parts;
240 enum mm_messagetype messagetype;
241 struct mm_warnings warnings;
242 struct mm_codecs codecs;
245 size_t max_message_size;
248 typedef struct mm_context MM_CTX;
249 typedef struct mm_context mm_ctx_t;
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 **);
259 int mm_library_init(void);
260 int mm_library_isinitialized(void);
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);
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);
276 int mm_envelope_getheaders(MM_CTX *, char **, size_t *);
277 int mm_envelope_setheader(MM_CTX *, const char *, const char *, ...);
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);
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 *);
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 *);
331 struct mm_param *mm_param_new(void);
332 void mm_param_free(struct mm_param *);
334 char *mm_flatten_mimepart(struct mm_mimepart *);
335 char *mm_flatten_context(MM_CTX *);
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);
345 char *mm_base64_decode(char *);
346 char *mm_base64_encode(char *, uint32_t);
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);
354 void mm_warning_add(MM_CTX *, int, const char *, ...);
355 struct mm_warning *mm_warning_next(MM_CTX *, struct mm_warning **);
358 size_t strlcpy(char *, const char *, size_t);
359 #endif /* ! HAVE_STRLCPY */
361 size_t strlcat(char *, const char *, size_t);
362 #endif /* ! HAVE_STRLCAT */
364 #define MM_ISINIT() do { \
365 assert(mm_library_isinitialized() == 1); \
368 #endif /* ! _MM_H_INCLUDED */