X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/636b3bab53e3fc2154bb86fb02aeecf433cc977a..a5aa6164d9e9c178c800187fa606f83c1bac916f:/h/mhparse.h?ds=inline diff --git a/h/mhparse.h b/h/mhparse.h index eb7cb18e..16083816 100644 --- a/h/mhparse.h +++ b/h/mhparse.h @@ -2,8 +2,6 @@ /* * mhparse.h -- definitions for parsing/building of MIME content * -- (mhparse.c/mhbuildsbr.c) - * - * $Id$ */ #define NPARTS 50 @@ -18,9 +16,10 @@ typedef struct hfield *HF; /* * Abstract types for MIME parsing/building */ -typedef struct cefile *CE; -typedef struct CTinfo *CI; -typedef struct Content *CT; +typedef struct cefile *CE; +typedef struct CTinfo *CI; +typedef struct Content *CT; +typedef struct Parameter *PM; /* * type for Init function (both type and transfer encoding) @@ -45,6 +44,17 @@ struct hfield { HF next; /* link to next header field */ }; +/* + * Structure for holding MIME parameter elements. + */ +struct Parameter { + char *pm_name; /* Parameter name */ + char *pm_value; /* Parameter value */ + char *pm_charset; /* Parameter character set (optional) */ + char *pm_lang; /* Parameter language tag (optional) */ + PM pm_next; /* Pointer to next element */ +}; + /* * Structure for storing parsed elements * of the Content-Type component. @@ -52,8 +62,8 @@ struct hfield { struct CTinfo { char *ci_type; /* content type */ char *ci_subtype; /* content subtype */ - char *ci_attrs[NPARMS + 2]; /* attribute names */ - char *ci_values[NPARMS]; /* attribute values */ + PM ci_first_pm; /* Pointer to first MIME parameter */ + PM ci_last_pm; /* Pointer to last MIME parameter */ char *ci_comment; /* RFC-822 comments */ char *ci_magic; }; @@ -70,6 +80,16 @@ struct cefile { /* * Primary structure for handling Content (Entity) + * + * Some more explanation of this: + * + * This structure recursively describes a complete MIME message. + * At the top level, the c_first_hf list has a list of all message + * headers. If the content-type is multipart (c_type == CT_MULTIPART) + * then c_ctparams will contain a pointer to a struct multipart. + * A struct multipart contains (among other trhings) a linked list + * of struct part elements, and THOSE contain a pointer to the sub-part's + * Content structure. */ struct Content { /* source (read) file */ @@ -91,6 +111,9 @@ struct Content { char *c_id; /* Content-ID: */ char *c_descr; /* Content-Description: */ char *c_dispo; /* Content-Disposition: */ + char *c_dispo_type; /* Type of Content-Disposition */ + PM c_dispo_first; /* Pointer to first disposition parm */ + PM c_dispo_last; /* Pointer to last disposition parm */ char *c_partno; /* within multipart content */ /* Content-Type info */ @@ -99,8 +122,9 @@ struct Content { int c_subtype; /* internal flag for content subtype */ /* Content-Transfer-Encoding info (decoded contents) */ - CE c_cefile; /* structure holding decoded content */ + struct cefile c_cefile; /* structure holding decoded content */ int c_encoding; /* internal flag for encoding type */ + int c_reqencoding; /* Requested encoding (by mhbuild) */ /* Content-MD5 info */ int c_digested; /* have we seen this header before? */ @@ -164,10 +188,8 @@ struct Content { #define TEXT_ENRICHED 0x03 /* Flags for character sets */ -#define CHARSET_UNKNOWN 0x00 +#define CHARSET_SPECIFIED 0x00 #define CHARSET_UNSPECIFIED 0x01 /* only needed when building drafts */ -#define CHARSET_USASCII 0x01 -#define CHARSET_LATIN 0x02 /* Structure for text content */ struct text { @@ -195,6 +217,8 @@ struct part { struct multipart { char *mp_start; /* boundary string separating parts */ char *mp_stop; /* terminating boundary string */ + char *mp_content_before; /* any content before the first subpart */ + char *mp_content_after; /* any content after the last subpart */ struct part *mp_parts; /* pointer to first subpart structure */ }; @@ -233,6 +257,7 @@ struct exbody { char *eb_server; char *eb_subject; char *eb_body; + char *eb_url; }; /* @@ -276,10 +301,138 @@ extern struct str2init str2methods[]; */ int pidcheck (int); CT parse_mime (char *); + +/* + * Translate a composition file into a MIME data structure. Arguments are: + * + * infile - Name of input filename + * autobuild - A flag to indicate if the composition file parser is + * being run in automatic mode or not. In auto mode, + * if a MIME-Version header is encountered it is assumed + * that the composition file is already in MIME format + * and will not be processed further. Otherwise, an + * error is generated. + * dist - A flag to indicate if we are being run by "dist". In + * that case, add no MIME headers to the message. Existing + * headers will still be encoded by RFC 2047. + * directives - A flag to control whether or not build directives are + * processed by default. + * encoding - The default encoding to use when doing RFC 2047 header + * encoding. Must be one of CE_UNKNOWN, CE_BASE64, or + * CE_QUOTED. + * maxunencoded - The maximum line length before the default encoding for + * text parts is quoted-printable. + * + * Returns a CT structure describing the resulting MIME message. If the + * -auto flag is set and a MIME-Version header is encountered, the return + * value is NULL. + */ +CT build_mime (char *infile, int autobuild, int dist, int directives, + int encoding, size_t maxunencoded); + int add_header (CT, char *, char *); -int get_ctinfo (unsigned char *, CT, int); +int get_ctinfo (char *, CT, int); int params_external (CT, int); int open7Bit (CT, char **); void close_encoding (CT); +void free_content (CT); +char *ct_type_str (int); +char *ct_subtype_str (int, int); +const struct str2init *get_ct_init (int); +const char *ce_str (int); +const struct str2init *get_ce_method (const char *); + +/* + * Parse a series of MIME attributes (or parameters) given a header as + * input. + * + * Arguments include: + * + * filename - Name of input file (for error messages) + * fieldname - Name of field being processed + * headerp - Pointer to pointer of the beginning of the MIME attributes. + * Updated to point to end of attributes when finished. + * param_head - Pointer to head of parameter list + * param_tail - Pointer to tail of parameter list + * commentp - Pointer to header comment pointer (may be NULL) + * + * Returns OK if parsing was successful, NOTOK if parsing failed, and + * DONE to indicate a benign error (minor parsing error, but the program + * should continue). + */ +int parse_header_attrs (const char *filename, const char *fieldname, + char **headerp, PM *param_head, PM *param_tail, + char **commentp); + +/* + * Given a linked list of parameters, build an output string for them. This + * string is designed to be concatenated on an already-built header. + * + * Arguments are: + * + * initialwidth - Current width of the header. Used to compute when to wrap + * parameters on the first line. The following lines will + * be prefixed by a tab (\t) character. + * params - Pointer to head of linked list of parameters. + * offsetout - The final line offset after all the parameters have been + * output. May be NULL. + * external - If set, outputting an external-body type and will not + * output a "body" parameter. + + * Returns a pointer to the resulting parameter string. This string must + * be free()'d by the caller. Returns NULL on error. + */ +char *output_params(size_t initialwidth, PM params, int *offsetout, + int external); + +/* + * Add a parameter to the parameter linked list. + * + * Arguments are: + * + * first - Pointer to head of linked list + * last - Pointer to tail of linked list + * name - Name of parameter + * value - Value of parameter + * + * Returned allocated parameter element + */ +PM add_param(PM *first, PM *last, const char *name, const char *value); + +/* + * Retrieve a parameter value from a parameter linked list. Convert to the + * local character set if required. + * + * Arguments are: + * + * first - Pointer to head of parameter linked list. + * name - Name of parameter. + * replace - If characters in the parameter list cannot be converted to + * the local character set, replace with this character. + * fetchonly - If true, return pointer to original value, no conversion + * performed. + * + * Returns parameter value if found, NULL otherwise. Memory must be free()'d + * unless fetchonly is set. + */ + +char *get_param(PM first, const char *name, char replace, int fetchonly); + +/* + * Fetch a parameter value from a parameter structure, converting it to + * the local character set. + * + * Arguments are: + * + * pm - Pointer to parameter structure + * replace - If characters in the parameter list cannot be converted to + * the local character set, replace with this character. + * + * Returns a pointer to the parameter value. Memory is stored in an + * internal buffer, so the returned value is only valid until the next + * call to get_param_value() or get_param() (get_param() uses get_param_value() + * internally). + */ +char *get_param_value(PM pm, char replace); extern int checksw; /* Add Content-MD5 field */