/* * mhparse.h -- definitions for parsing/building of MIME content * -- (mhparse.c/mhbuildsbr.c) * * $Id: mhparse.h,v 1.1.1.1 1999-02-07 18:14:06 danw Exp $ */ #define NPARTS 50 #define NTYPES 20 #define NPARMS 10 /* * Abstract type for header fields */ typedef struct hfield *HF; /* * 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) */ typedef int (*InitFunc) (CT); /* * 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. */ 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 */ }; /* * 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; }; /* * 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? */ }; /* * 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_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) */ }; /* * 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 */ /* * TEXT content */ /* Flags for subtypes of TEXT */ #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 /* Structure for text content */ struct text { int tx_charset; /* flag for character set */ }; /* * 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 /* 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 */ }; /* 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 */ }; /* * MESSAGE content */ /* Flags for subtypes of MESSAGE */ #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; }; /* * APPLICATION content */ /* Flags for subtype of APPLICATION */ #define APPLICATION_UNKNOWN 0x00 #define APPLICATION_OCTETS 0x01 #define APPLICATION_POSTSCRIPT 0x02