Removed RFC 1864 (Content-MD5) support. I.e. -check switches.
[mmh] / h / mhparse.h
1 /*
2 ** mhparse.h -- definitions for parsing/building of MIME content
3 **           -- (mhparse.c/mhbuild.c)
4 */
5
6 #define NPARTS  50
7 #define NTYPES  20
8 #define NPARMS  10
9
10 /*
11 ** Abstract type for header fields
12 */
13 typedef struct hfield *HF;
14
15 /*
16 ** Abstract types for MIME parsing/building
17 */
18 typedef struct cefile  *CE;
19 typedef struct CTinfo  *CI;
20 typedef struct Content *CT;
21
22 /*
23 ** type for Init function (both type and transfer encoding)
24 */
25 typedef int (*InitFunc) (CT);
26
27 /*
28 ** types for various transfer encoding access functions
29 */
30 typedef int (*OpenCEFunc) (CT, char **);
31 typedef void (*CloseCEFunc) (CT);
32 typedef unsigned long (*SizeCEFunc) (CT);
33
34 /*
35 ** Structure for storing/encoding/decoding
36 ** a header field and its value.
37 */
38 struct hfield {
39         char *name;       /* field name */
40         char *value;      /* field body */
41         int hf_encoding;  /* internal flag for transfer encoding to use */
42         HF next;          /* link to next header field */
43 };
44
45 /*
46 ** Structure for storing parsed elements
47 ** of the Content-Type component.
48 */
49 struct CTinfo {
50         char *ci_type;               /* content type     */
51         char *ci_subtype;            /* content subtype  */
52         char *ci_attrs[NPARMS + 2];  /* attribute names  */
53         char *ci_values[NPARMS];     /* attribute values */
54         char *ci_comment;            /* RFC-822 comments */
55         char *ci_magic;
56 };
57
58 /*
59 ** Structure for storing decoded contents after
60 ** removing Content-Transfer-Encoding.
61 */
62 struct cefile {
63         char *ce_file;   /* decoded content (file)   */
64         FILE *ce_fp;     /* decoded content (stream) */
65         int ce_unlink;   /* remove file when done?   */
66 };
67
68 /*
69 ** Primary structure for handling Content (Entity)
70 */
71 struct Content {
72         /* source (read) file */
73         char *c_file;                /* read contents (file)              */
74         FILE *c_fp;                  /* read contents (stream)            */
75         int c_unlink;                /* remove file when done?            */
76
77         long c_begin;                /* where content body starts in file */
78         long c_end;                  /* where content body ends in file   */
79
80         /* linked list of header fields */
81         HF c_first_hf;               /* pointer to first header field     */
82         HF c_last_hf;                /* pointer to last header field      */
83
84         /* copies of MIME related header fields */
85         char *c_vrsn;                /* MIME-Version:                     */
86         char *c_ctline;              /* Content-Type:                     */
87         char *c_celine;              /* Content-Transfer-Encoding:        */
88         char *c_id;                  /* Content-ID:                       */
89         char *c_descr;               /* Content-Description:              */
90         char *c_dispo;               /* Content-Disposition:              */
91         char *c_partno;              /* within multipart content          */
92
93         /* Content-Type info */
94         struct CTinfo c_ctinfo;      /* parsed elements of Content-Type   */
95         int c_type;                  /* internal flag for content type    */
96         int c_subtype;               /* internal flag for content subtype */
97
98         /* Content-Transfer-Encoding info (decoded contents) */
99         CE c_cefile;                 /* structure holding decoded content */
100         int c_encoding;              /* internal flag for encoding type   */
101
102         /* pointers to content-specific structures */
103         void *c_ctparams;            /* content type specific data        */
104         struct exbody *c_ctexbody;   /* data for type message/external    */
105
106         /* function pointers */
107         InitFunc    c_ctinitfnx;     /* parse content body                */
108         OpenCEFunc  c_ceopenfnx;     /* get a stream to decoded contents  */
109         CloseCEFunc c_ceclosefnx;    /* release stream                    */
110         SizeCEFunc  c_cesizefnx;     /* size of decoded contents          */
111
112         int c_umask;                 /* associated umask                  */
113         pid_t c_pid;                 /* process doing display             */
114         int c_rfc934;                /* rfc934 compatibility flag         */
115
116         char *c_showproc;            /* default, if not in profile        */
117         char *c_termproc;            /* for charset madness...            */
118         char *c_storeproc;           /* overrides profile entry, if any   */
119
120         char *c_storage;             /* write contents (file)             */
121         char *c_folder;              /* write contents (folder)           */
122 };
123
124 /*
125 ** Flags for Content-Type (Content->c_type)
126 */
127 #define CT_UNKNOWN      0x00
128 #define CT_APPLICATION  0x01
129 #define CT_AUDIO        0x02
130 #define CT_IMAGE        0x03
131 #define CT_MESSAGE      0x04
132 #define CT_MULTIPART    0x05
133 #define CT_TEXT         0x06
134 #define CT_VIDEO        0x07
135 #define CT_EXTENSION    0x08
136
137 /*
138 ** Flags for Content-Transfer-Encoding (Content->c_encoding)
139 */
140 #define CE_UNKNOWN      0x00
141 #define CE_BASE64       0x01
142 #define CE_QUOTED       0x02
143 #define CE_8BIT         0x03
144 #define CE_7BIT         0x04
145 #define CE_BINARY       0x05
146 #define CE_EXTENSION    0x06
147 #define CE_EXTERNAL     0x07    /* for external-body */
148
149 /*
150 ** TEXT content
151 */
152
153 /* Flags for subtypes of TEXT */
154 #define TEXT_UNKNOWN    0x00
155 #define TEXT_PLAIN      0x01
156 #define TEXT_RICHTEXT   0x02
157 #define TEXT_ENRICHED   0x03
158
159 /* Flags for character sets */
160 #define CHARSET_UNKNOWN      0x00
161 #define CHARSET_UNSPECIFIED  0x01  /* only needed when building drafts */
162 #define CHARSET_USASCII      0x01
163 #define CHARSET_LATIN        0x02
164
165 /* Structure for text content */
166 struct text {
167         int tx_charset;    /* flag for character set */
168 };
169
170 /*
171 ** MULTIPART content
172 */
173
174 /* Flags for subtypes of MULTIPART */
175 #define MULTI_UNKNOWN    0x00
176 #define MULTI_MIXED      0x01
177 #define MULTI_ALTERNATE  0x02
178 #define MULTI_DIGEST     0x03
179 #define MULTI_PARALLEL   0x04
180
181 /* Structure for subparts of a multipart content */
182 struct part {
183         CT mp_part;             /* Content structure for subpart     */
184         struct part *mp_next;   /* pointer to next subpart structure */
185 };
186
187 /* Main structure for multipart content */
188 struct multipart {
189         char *mp_start;         /* boundary string separating parts   */
190         char *mp_stop;          /* terminating boundary string        */
191         struct part *mp_parts;  /* pointer to first subpart structure */
192 };
193
194 /*
195 ** MESSAGE content
196 */
197
198 /* Flags for subtypes of MESSAGE */
199 #define MESSAGE_UNKNOWN   0x00
200 #define MESSAGE_RFC822    0x01
201 #define MESSAGE_PARTIAL   0x02
202 #define MESSAGE_EXTERNAL  0x03
203
204 /* Structure for message/partial */
205 struct partial {
206         char *pm_partid;
207         int pm_partno;
208         int pm_maxno;
209         int pm_marked;
210         int pm_stored;
211 };
212
213 /* Structure for message/external */
214 struct exbody {
215         CT eb_parent;        /* pointer to controlling content structure */
216         CT eb_content;       /* pointer to internal content structure    */
217         char *eb_partno;
218         char *eb_access;
219         int eb_flags;
220         char *eb_name;
221         char *eb_permission;
222         char *eb_site;
223         char *eb_dir;
224         char *eb_mode;
225         unsigned long eb_size;
226         char *eb_server;
227         char *eb_subject;
228         char *eb_body;
229 };
230
231 /*
232 ** APPLICATION content
233 */
234
235 /* Flags for subtype of APPLICATION */
236 #define APPLICATION_UNKNOWN     0x00
237 #define APPLICATION_OCTETS      0x01
238 #define APPLICATION_POSTSCRIPT  0x02
239
240
241 /*
242 ** Structures for mapping types to their internal flags
243 */
244 struct k2v {
245         char *kv_key;
246         int kv_value;
247 };
248 extern struct k2v SubText[];
249 extern struct k2v Charset[];
250 extern struct k2v SubMultiPart[];
251 extern struct k2v SubMessage[];
252 extern struct k2v SubApplication[];
253
254 /*
255 ** Structures for mapping (content) types to
256 ** the functions to handle them.
257 */
258 struct str2init {
259         char *si_key;
260         int si_val;
261         InitFunc si_init;
262 };
263 extern struct str2init str2cts[];
264 extern struct str2init str2ces[];
265 extern struct str2init str2methods[];
266
267 /*
268 ** prototypes
269 */
270 int pidcheck(int);
271 CT parse_mime(char *);
272 int add_header(CT, char *, char *);
273 int get_ctinfo(unsigned char *, CT, int);
274 int params_external(CT, int);
275 int open7Bit(CT, char **);
276 void close_encoding(CT);