mm.h

00001 /*
00002  * $Id$
00003  *
00004  * MiniMIME - a library for handling MIME messages
00005  *
00006  * Copyright (C) 2003 Jann Fischer <rezine@mistrust.net>
00007  * All rights reserved.
00008  *
00009  * Redistribution and use in source and binary forms, with or without
00010  * modification, are permitted provided that the following conditions
00011  * are met:
00012  *
00013  * 1. Redistributions of source code must retain the above copyright
00014  *    notice, this list of conditions and the following disclaimer.
00015  * 2. Redistributions in binary form must reproduce the above copyright
00016  *    notice, this list of conditions and the following disclaimer in the
00017  *    documentation and/or other materials provided with the distribution.
00018  * 3. Neither the name of the author nor the names of the contributors
00019  *    may be used to endorse or promote products derived from this software
00020  *    without specific prior written permission.
00021  *
00022  * THIS SOFTWARE IS PROVIDED BY JANN FISCHER AND CONTRIBUTORS ``AS IS'' AND
00023  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00024  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00025  * ARE DISCLAIMED.  IN NO EVENT SHALL JANN FISCHER OR THE VOICES IN HIS HEAD
00026  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00027  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00028  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00029  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00030  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00031  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
00032  * THE POSSIBILITY OF SUCH DAMAGE.
00033  */
00034 
00035 #ifndef _MM_H_INCLUDED
00036 #define _MM_H_INCLUDED
00037 
00038 #include <sys/types.h>
00039 #include <assert.h>
00040 #include "mm_queue.h"
00041 #include "mm_mem.h"
00042 
00043 #define MM_MIME_LINELEN 998
00044 #define MM_BASE64_LINELEN 76
00045 
00046 TAILQ_HEAD(mm_mimeheaders, mm_mimeheader);
00047 TAILQ_HEAD(mm_mimeparts, mm_mimepart);
00048 TAILQ_HEAD(mm_params, mm_param);
00049 SLIST_HEAD(mm_codecs, mm_codec);
00050 SLIST_HEAD(mm_warnings, mm_warning);
00051 
00052 /*
00053  * Parser modes
00054  */
00055 enum mm_parsemodes
00056 {
00058         MM_PARSE_LOOSE = 0,
00060         MM_PARSE_STRICT
00061 };
00062 
00063 /*
00064  * Available parser flags
00065  */
00066 enum mm_parseflags
00067 {
00068         MM_PARSE_NONE = (1L << 0),
00069         MM_PARSE_STRIPCOMMENTS = (1L << 1)
00070 };
00071 
00072 /*
00073  * Enumeration of MIME encodings
00074  */
00075 enum mm_encoding
00076 {
00077         MM_ENCODING_NONE = 0,
00078         MM_ENCODING_BASE64,
00079         MM_ENCODING_QUOTEDPRINTABLE,
00080         MM_ENCODING_UNKNOWN
00081 };
00082 
00083 /*
00084  * Message type
00085  */
00086 enum mm_messagetype
00087 {
00089         MM_MSGTYPE_FLAT = 0,
00091         MM_MSGTYPE_MULTIPART
00092 };
00093 
00094 /*
00095  * Enumeration of error categories
00096  */
00097 enum mm_errors
00098 {
00099         MM_ERROR_NONE = 0,
00100         MM_ERROR_UNDEF,
00101         MM_ERROR_ERRNO, 
00102         MM_ERROR_PARSE,         
00103         MM_ERROR_MIME,
00104         MM_ERROR_CODEC,
00105         MM_ERROR_PROGRAM
00106 };
00107 
00108 enum mm_warning_ids
00109 {
00110         MM_WARN_NONE = 0,
00111         MM_WARN_PARSE,
00112         MM_WARN_MIME,
00113         MM_WARN_CODEC
00114 };
00115 
00116 enum mm_addressfields {
00117         MM_ADDR_TO = 0,
00118         MM_ADDR_CC,
00119         MM_ADDR_BCC,
00120         MM_ADDR_FROM,
00121         MM_ADDR_SENDER,
00122         MM_ADDR_REPLY_TO
00123 };
00124 
00125 enum mm_flatten_flags {
00126         MM_FLATTEN_NONE = 0,
00127         MM_FLATTEN_SKIPENVELOPE = (1L << 1),
00128         MM_FLATTEN_OPAQUE = (1L << 2),
00129         MM_FLATTEN_NOPREAMBLE = (1L << 3)
00130 };      
00131 
00132 /*
00133  * More information about an error
00134  */
00135 struct mm_error_data
00136 {
00137         int error_id;
00138         int error_where;
00139         int lineno;
00140         char error_msg[128];
00141 };
00142 
00143 extern int mm_errno;
00144 extern struct mm_error_data mm_error;
00145 
00146 enum mm_warning_code
00147 {
00148         MM_WARNING_NONE = 0,
00149         MM_WARNING_INVHDR,
00150 };
00151 
00152 /*
00153  * A parser warning
00154  */
00155 struct mm_warning
00156 {
00157         enum mm_warning_code warning;
00158         u_int32_t lineno;
00159         SLIST_ENTRY(mm_warning) next;
00160 };
00161 
00162 /*
00163  * Representation of a MiniMIME codec object
00164  */
00165 struct mm_codec
00166 {
00167         enum mm_encoding id;
00168         char *encoding;
00169 
00170         char *(*encoder)(char *, u_int32_t);
00171         char *(*decoder)(char *);
00172 
00173         SLIST_ENTRY(mm_codec) next;
00174 };
00175 
00176 /*
00177  * Representation of a mail or MIME header field
00178  */
00179 struct mm_mimeheader
00180 {
00181         char *name; 
00182         char *value;
00183 
00184         TAILQ_ENTRY(mm_mimeheader) next;
00185 };
00186 
00187 /*
00188  * Representation of a MIME Content-Type parameter
00189  */
00190 struct mm_param
00191 {
00192         char *name; 
00193         char *value; 
00194 
00195         TAILQ_ENTRY(mm_param) next;
00196 };
00197 
00198 /*
00199  * Representation of a MIME Content-Type object
00200  */
00201 struct mm_content
00202 {
00203         char *maintype;
00204         char *subtype;
00205 
00206         struct mm_params params;
00207 
00208         char *encstring;
00209         enum mm_encoding encoding;
00210 };
00211 
00212 /*
00213  * Representation of a MIME part 
00214  */
00215 struct mm_mimepart
00216 {
00217         struct mm_mimeheaders headers;
00218         
00219         size_t opaque_length;
00220         char *opaque_body;
00221 
00222         size_t length;
00223         char *body;
00224 
00225         struct mm_content *type;
00226 
00227         char *disposition_type;
00228         char *filename;
00229         char *creation_date;
00230         char *modification_date;
00231         char *read_date;
00232         char *disposition_size;
00233         
00234         TAILQ_ENTRY(mm_mimepart) next;
00235 };
00236 
00237 /*
00238  * Represantation of a MiniMIME context
00239  */
00240 struct mm_context
00241 {
00242         struct mm_mimeparts parts;
00243         enum mm_messagetype messagetype;
00244         struct mm_warnings warnings;
00245         struct mm_codecs codecs;
00246         char *boundary;
00247         char *preamble;
00248         size_t max_message_size;
00249 };
00250 
00251 typedef struct mm_context MM_CTX;
00252 typedef struct mm_context mm_ctx_t;
00253 
00254 char *mm_unquote(const char *);
00255 char *mm_uncomment(const char *);
00256 char *mm_stripchars(char *, char *);
00257 char *mm_addchars(char *, char *, u_int16_t);
00258 int mm_gendate(char **);
00259 void mm_striptrailing(char **, const char *);
00260 int mm_mimeutil_genboundary(char *, size_t, char **);
00261 
00262 int mm_library_init(void);
00263 int mm_library_isinitialized(void);
00264 
00265 int mm_parse_mem(MM_CTX *, const char *, int, int);
00266 int mm_parse_file(MM_CTX *, const char *, int, int);
00267 
00268 MM_CTX *mm_context_new(void);
00269 void mm_context_free(MM_CTX *);
00270 int mm_context_attachpart(MM_CTX *, struct mm_mimepart *);
00271 int mm_context_deletepart(MM_CTX *, int, int);
00272 int mm_context_countparts(MM_CTX *);
00273 struct mm_mimepart *mm_context_getpart(MM_CTX *, int);
00274 int mm_context_iscomposite(MM_CTX *);
00275 int mm_context_haswarnings(MM_CTX *);
00276 int mm_context_flatten(MM_CTX *, char **, size_t *, int);
00277 
00278 int mm_envelope_getheaders(MM_CTX *, char **, size_t *);
00279 int mm_envelope_setheader(MM_CTX *, const char *, const char *, ...);
00280 
00281 struct mm_mimeheader *mm_mimeheader_new(void);
00282 void mm_mimeheader_free(struct mm_mimeheader *);
00283 struct mm_mimeheader *mm_mimeheader_generate(const char *, const char *);
00284 int mm_mimeheader_uncomment(struct mm_mimeheader *);
00285 int mm_mimeheader_uncommentbyname(struct mm_mimepart *, const char *);
00286 int mm_mimeheader_uncommentall(struct mm_mimepart *);
00287 int mm_mimeheader_tostring(struct mm_mimeheader *);
00288 
00289 struct mm_mimepart *mm_mimepart_new(void);
00290 void mm_mimepart_free(struct mm_mimepart *);
00291 int mm_mimepart_attachheader(struct mm_mimepart *, struct mm_mimeheader *);
00292 int mm_mimepart_countheaders(struct mm_mimepart *part);
00293 int mm_mimepart_countheaderbyname(struct mm_mimepart *, const char *);
00294 struct mm_mimeheader *mm_mimepart_getheaderbyname(struct mm_mimepart *, const char *, int);
00295 const char *mm_mimepart_getheadervalue(struct mm_mimepart *, const char *, int);
00296 int mm_mimepart_headers_start(struct mm_mimepart *, struct mm_mimeheader **);
00297 struct mm_mimeheader *mm_mimepart_headers_next(struct mm_mimepart *, struct mm_mimeheader **);
00298 char *mm_mimepart_decode(struct mm_mimepart *);
00299 struct mm_content *mm_mimepart_gettype(struct mm_mimepart *);
00300 size_t mm_mimepart_getlength(struct mm_mimepart *);
00301 char *mm_mimepart_getbody(struct mm_mimepart *, int);
00302 void mm_mimepart_attachcontenttype(struct mm_mimepart *, struct mm_content *);
00303 int mm_mimepart_setdefaultcontenttype(struct mm_mimepart *, int);
00304 int mm_mimepart_flatten(struct mm_mimepart *, char **, size_t *, int);
00305 struct mm_mimepart *mm_mimepart_fromfile(const char *);
00306 
00307 struct mm_content *mm_content_new(void);
00308 void mm_content_free(struct mm_content *);
00309 int mm_content_attachparam(struct mm_content *, struct mm_param *);
00310 struct mm_content *mm_content_parse(const char *, int);
00311 char *mm_content_getparambyname(struct mm_content *, const char *);
00312 struct mm_param *mm_content_getparamobjbyname(struct mm_content *, const char *);
00313 int mm_content_setmaintype(struct mm_content *, char *, int);
00314 int mm_content_setsubtype(struct mm_content *, char *, int);
00315 int mm_content_settype(struct mm_content *, const char *, ...);
00316 char *mm_content_getmaintype(struct mm_content *);
00317 char *mm_content_getsubtype(struct mm_content *);
00318 char *mm_content_gettype(struct mm_content *);
00319 int mm_content_iscomposite(struct mm_content *);
00320 int mm_content_isvalidencoding(const char *);
00321 int mm_content_setencoding(struct mm_content *, const char *);
00322 char *mm_content_paramstostring(struct mm_content *);
00323 char *mm_content_tostring(struct mm_content *);
00324 
00325 struct mm_param *mm_param_new(void);
00326 void mm_param_free(struct mm_param *);
00327 
00328 char *mm_flatten_mimepart(struct mm_mimepart *);
00329 char *mm_flatten_context(MM_CTX *);
00330 
00331 int mm_codec_isregistered(const char *);
00332 int mm_codec_hasdecoder(const char *);
00333 int mm_codec_hasencoder(const char *);
00334 int mm_codec_register(const char *, char *(*encoder)(char *, u_int32_t), char *(*decoder)(char *));
00335 int mm_codec_unregister(const char *);
00336 int mm_codec_unregisterall(void);
00337 void mm_codec_registerdefaultcodecs(void);
00338 
00339 char *mm_base64_decode(char *);
00340 char *mm_base64_encode(char *, u_int32_t);
00341 
00342 void mm_error_init(void);
00343 void mm_error_setmsg(const char *, ...);
00344 void mm_error_setlineno(int lineno);
00345 char *mm_error_string(void);
00346 int mm_error_lineno(void);
00347 
00348 void mm_warning_add(MM_CTX *, int, const char *, ...);
00349 struct mm_warning *mm_warning_next(MM_CTX *, struct mm_warning **);
00350 
00351 #ifndef HAVE_STRLCPY
00352 size_t strlcpy(char *, const char *, size_t);
00353 #endif /* ! HAVE_STRLCPY */
00354 #ifndef HAVE_STRLCAT
00355 size_t strlcat(char *, const char *, size_t);
00356 #endif /* ! HAVE_STRLCAT */
00357 
00358 #define MM_ISINIT() do { \
00359         assert(mm_library_isinitialized() == 1); \
00360 } while (0);
00361 
00362 #endif /* ! _MM_H_INCLUDED */

Generated on Thu Mar 29 17:59:08 2007 for MiniMIME by  doxygen 1.5.1