1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
|
/*
* mhparse.h -- definitions for parsing/building of MIME content
* -- (mhparse.c/mhbuildsbr.c)
*
* $Id: mhparse.h,v 1.2 2006/02/18 16:26:37 levine 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_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) */
};
/*
* 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
|