X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=h%2Fmhparse.h;h=1954d897758bf8006e1b3e22ebc8881da415654a;hp=812b78f5b1dae945855a430c49fd6596d5d080a5;hb=d4bcca1aa235370bc20bc2734c0cd6f700b17871;hpb=1513f7668c494c4583141d6115669b7198c14556 diff --git a/h/mhparse.h b/h/mhparse.h index 812b78f..1954d89 100644 --- a/h/mhparse.h +++ b/h/mhparse.h @@ -1,246 +1,253 @@ - /* - * mhparse.h -- definitions for parsing/building of MIME content - * -- (mhparse.c/mhbuildsbr.c) - * - * $Id$ - */ +** mhparse.h -- definitions for parsing/building of MIME content +** -- (mhparse.c/mhbuild.c) +*/ -#define NPARTS 50 -#define NTYPES 20 -#define NPARMS 10 +#define NPARTS 50 +#define NTYPES 20 +#define NPARMS 10 /* - * Abstract type for header fields - */ +** Abstract type for header fields +*/ typedef struct hfield *HF; /* - * Abstract types for MIME parsing/building - */ +** Abstract types for MIME parsing/building +*/ typedef struct cefile *CE; typedef struct CTinfo *CI; typedef struct Content *CT; /* - * type for Init function (both type and transfer encoding) - */ +** type for Init function (both type and transfer encoding) +*/ typedef int (*InitFunc) (CT); /* - * types for various transfer encoding access functions - */ +** types for various transfer encoding access functions +*/ typedef int (*OpenCEFunc) (CT, char **); typedef void (*CloseCEFunc) (CT); typedef unsigned long (*SizeCEFunc) (CT); /* - * Structure for storing/encoding/decoding - * a header field and its value. - */ +** Structure for storing/encoding/decoding +** a header field and its value. +*/ struct hfield { - char *name; /* field name */ - char *value; /* field body */ - int hf_encoding; /* internal flag for transfer encoding to use */ - HF next; /* link to next header field */ + char *name; /* field name */ + char *value; /* field body */ + int hf_encoding; /* internal flag for transfer encoding to use */ + HF next; /* link to next header field */ }; /* - * Structure for storing parsed elements - * of the Content-Type component. - */ +** Structure for storing parsed elements +** of the Content-Type component. +*/ 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 */ - char *ci_comment; /* RFC-822 comments */ - char *ci_magic; + char *ci_type; /* content type */ + char *ci_subtype; /* content subtype */ + char *ci_attrs[NPARMS + 2]; /* attribute names */ + char *ci_values[NPARMS]; /* attribute values */ + char *ci_comment; /* RFC-822 comments */ + char *ci_magic; }; /* - * Structure for storing decoded contents after - * removing Content-Transfer-Encoding. - */ +** Structure for storing decoded contents after +** removing Content-Transfer-Encoding. +*/ struct cefile { - char *ce_file; /* decoded content (file) */ - FILE *ce_fp; /* decoded content (stream) */ - int ce_unlink; /* remove file when done? */ + char *ce_file; /* decoded content (file) */ + FILE *ce_fp; /* decoded content (stream) */ + int ce_unlink; /* remove file when done? */ }; /* - * Primary structure for handling Content (Entity) - */ +** Primary structure for handling Content (Entity) +*/ struct Content { - /* source (read) file */ - char *c_file; /* read contents (file) */ - FILE *c_fp; /* read contents (stream) */ - int c_unlink; /* remove file when done? */ - - long c_begin; /* where content body starts in file */ - long c_end; /* where content body ends in file */ - - /* linked list of header fields */ - HF c_first_hf; /* pointer to first header field */ - HF c_last_hf; /* pointer to last header field */ - - /* copies of MIME related header fields */ - char *c_vrsn; /* MIME-Version: */ - char *c_ctline; /* Content-Type: */ - char *c_celine; /* Content-Transfer-Encoding: */ - char *c_id; /* Content-ID: */ - char *c_descr; /* Content-Description: */ - char *c_dispo; /* Content-Disposition: */ - char *c_partno; /* within multipart content */ - - /* Content-Type info */ - struct CTinfo c_ctinfo; /* parsed elements of Content-Type */ - int c_type; /* internal flag for content type */ - int c_subtype; /* internal flag for content subtype */ - - /* Content-Transfer-Encoding info (decoded contents) */ - CE c_cefile; /* structure holding decoded content */ - int c_encoding; /* internal flag for encoding type */ - - /* Content-MD5 info */ - int c_digested; /* have we seen this header before? */ - unsigned char c_digest[16]; /* decoded MD5 checksum */ - - /* pointers to content-specific structures */ - void *c_ctparams; /* content type specific data */ - struct exbody *c_ctexbody; /* data for type message/external */ - - /* function pointers */ - InitFunc c_ctinitfnx; /* parse content body */ - OpenCEFunc c_ceopenfnx; /* get a stream to decoded contents */ - CloseCEFunc c_ceclosefnx; /* release stream */ - SizeCEFunc c_cesizefnx; /* size of decoded contents */ - - int c_umask; /* associated umask */ - pid_t c_pid; /* process doing display */ - int c_rfc934; /* rfc934 compatibility flag */ - - char *c_showproc; /* default, if not in profile */ - char *c_termproc; /* for charset madness... */ - char *c_storeproc; /* overrides profile entry, if any */ - - char *c_storage; /* write contents (file) */ - char *c_folder; /* write contents (folder) */ + /* source (read) file */ + char *c_file; /* read contents (file) */ + FILE *c_fp; /* read contents (stream) */ + int c_unlink; /* remove file when done? */ + + long c_begin; /* where content body starts in file */ + long c_end; /* where content body ends in file */ + + /* linked list of header fields */ + HF c_first_hf; /* pointer to first header field */ + HF c_last_hf; /* pointer to last header field */ + + /* copies of MIME related header fields */ + char *c_vrsn; /* MIME-Version: */ + char *c_ctline; /* Content-Type: */ + char *c_celine; /* Content-Transfer-Encoding: */ + char *c_id; /* Content-ID: */ + char *c_descr; /* Content-Description: */ + char *c_dispo; /* Content-Disposition: */ + char *c_partno; /* within multipart content */ + + /* Content-Type info */ + struct CTinfo c_ctinfo; /* parsed elements of Content-Type */ + int c_type; /* internal flag for content type */ + int c_subtype; /* internal flag for content subtype */ + char *c_charset; /* charset string */ + + /* Content-Transfer-Encoding info (decoded contents) */ + CE c_cefile; /* structure holding decoded content */ + int c_encoding; /* internal flag for encoding type */ + + /* pointers to content-specific structures */ + void *c_ctparams; /* content type specific data */ + + /* function pointers */ + InitFunc c_ctinitfnx; /* parse content body */ + OpenCEFunc c_ceopenfnx; /* get a stream to decoded contents */ + CloseCEFunc c_ceclosefnx; /* release stream */ + SizeCEFunc c_cesizefnx; /* size of decoded contents */ + + int c_umask; /* associated umask */ + + char *c_showproc; /* default, if not in profile */ + char *c_storeproc; /* overrides profile entry, if any */ + + char *c_storage; /* write contents (file) */ + char *c_folder; /* write contents (folder) */ }; /* - * Flags for Content-Type (Content->c_type) - */ -#define CT_UNKNOWN 0x00 -#define CT_APPLICATION 0x01 -#define CT_AUDIO 0x02 -#define CT_IMAGE 0x03 -#define CT_MESSAGE 0x04 -#define CT_MULTIPART 0x05 -#define CT_TEXT 0x06 -#define CT_VIDEO 0x07 -#define CT_EXTENSION 0x08 +** Flags for Content-Type (Content->c_type) +*/ +#define CT_UNKNOWN 0x00 +#define CT_APPLICATION 0x01 +#define CT_AUDIO 0x02 +#define CT_IMAGE 0x03 +#define CT_MESSAGE 0x04 +#define CT_MULTIPART 0x05 +#define CT_TEXT 0x06 +#define CT_VIDEO 0x07 +#define CT_EXTENSION 0x08 /* - * Flags for Content-Transfer-Encoding (Content->c_encoding) - */ -#define CE_UNKNOWN 0x00 -#define CE_BASE64 0x01 -#define CE_QUOTED 0x02 -#define CE_8BIT 0x03 -#define CE_7BIT 0x04 -#define CE_BINARY 0x05 -#define CE_EXTENSION 0x06 -#define CE_EXTERNAL 0x07 /* for external-body */ +** Flags for Content-Transfer-Encoding (Content->c_encoding) +*/ +#define CE_UNKNOWN 0x00 +#define CE_BASE64 0x01 +#define CE_QUOTED 0x02 +#define CE_8BIT 0x03 +#define CE_7BIT 0x04 +#define CE_BINARY 0x05 +#define CE_EXTENSION 0x06 +#define CE_EXTERNAL 0x07 /* for external-body */ /* - * TEXT content - */ +** TEXT content +*/ /* Flags for subtypes of TEXT */ -#define TEXT_UNKNOWN 0x00 -#define TEXT_PLAIN 0x01 -#define TEXT_RICHTEXT 0x02 -#define TEXT_ENRICHED 0x03 +#define TEXT_UNKNOWN 0x00 +#define TEXT_PLAIN 0x01 +#define TEXT_RICHTEXT 0x02 +#define TEXT_ENRICHED 0x03 /* Flags for character sets */ -#define CHARSET_UNKNOWN 0x00 -#define CHARSET_UNSPECIFIED 0x01 /* only needed when building drafts */ -#define CHARSET_USASCII 0x01 -#define CHARSET_LATIN 0x02 +#define CHARSET_UNKNOWN 0x00 +#define CHARSET_UNSPECIFIED 0x01 /* only needed when building drafts */ +#define CHARSET_USASCII 0x01 +#define CHARSET_LATIN 0x02 /* Structure for text content */ struct text { - int tx_charset; /* flag for character set */ + int tx_charset; /* flag for character set */ }; /* - * MULTIPART content - */ +** MULTIPART content +*/ /* Flags for subtypes of MULTIPART */ -#define MULTI_UNKNOWN 0x00 -#define MULTI_MIXED 0x01 -#define MULTI_ALTERNATE 0x02 -#define MULTI_DIGEST 0x03 -#define MULTI_PARALLEL 0x04 +#define MULTI_UNKNOWN 0x00 +#define MULTI_MIXED 0x01 +#define MULTI_ALTERNATE 0x02 +#define MULTI_DIGEST 0x03 +#define MULTI_PARALLEL 0x04 /* Structure for subparts of a multipart content */ struct part { - CT mp_part; /* Content structure for subpart */ - struct part *mp_next; /* pointer to next subpart structure */ + CT mp_part; /* Content structure for subpart */ + struct part *mp_next; /* pointer to next subpart structure */ }; /* Main structure for multipart content */ struct multipart { - char *mp_start; /* boundary string separating parts */ - char *mp_stop; /* terminating boundary string */ - struct part *mp_parts; /* pointer to first subpart structure */ + char *mp_start; /* boundary string separating parts */ + char *mp_stop; /* terminating boundary string */ + struct part *mp_parts; /* pointer to first subpart structure */ }; /* - * MESSAGE content - */ +** MESSAGE content +*/ /* Flags for subtypes of MESSAGE */ -#define MESSAGE_UNKNOWN 0x00 -#define MESSAGE_RFC822 0x01 -#define MESSAGE_PARTIAL 0x02 -#define MESSAGE_EXTERNAL 0x03 +#define MESSAGE_UNKNOWN 0x00 +#define MESSAGE_RFC822 0x01 +#define MESSAGE_PARTIAL 0x02 +#define MESSAGE_EXTERNAL 0x03 /* Structure for message/partial */ struct partial { - char *pm_partid; - int pm_partno; - int pm_maxno; - int pm_marked; - int pm_stored; -}; - -/* Structure for message/external */ -struct exbody { - CT eb_parent; /* pointer to controlling content structure */ - CT eb_content; /* pointer to internal content structure */ - char *eb_partno; - char *eb_access; - int eb_flags; - char *eb_name; - char *eb_permission; - char *eb_site; - char *eb_dir; - char *eb_mode; - unsigned long eb_size; - char *eb_server; - char *eb_subject; - char *eb_body; + char *pm_partid; + int pm_partno; + int pm_maxno; + int pm_marked; + int pm_stored; }; /* - * APPLICATION content - */ +** APPLICATION content +*/ /* Flags for subtype of APPLICATION */ -#define APPLICATION_UNKNOWN 0x00 -#define APPLICATION_OCTETS 0x01 -#define APPLICATION_POSTSCRIPT 0x02 +#define APPLICATION_UNKNOWN 0x00 +#define APPLICATION_OCTETS 0x01 +#define APPLICATION_POSTSCRIPT 0x02 + +/* +** Structures for mapping types to their internal flags +*/ +struct k2v { + char *kv_key; + int kv_value; +}; +extern struct k2v SubText[]; +extern struct k2v Charset[]; +extern struct k2v SubMultiPart[]; +extern struct k2v SubMessage[]; +extern struct k2v SubApplication[]; + +/* +** Structures for mapping (content) types to +** the functions to handle them. +*/ +struct str2init { + char *si_key; + int si_val; + InitFunc si_init; +}; +extern struct str2init str2cts[]; +extern struct str2init str2ces[]; + +/* +** prototypes +*/ +int pidcheck(int); +CT parse_mime(char *); +int add_header(CT, char *, char *); +int get_ctinfo(unsigned char *, CT, int); +int open7Bit(CT, char **); +void close_encoding(CT);