mhshow/mhstore: Removed support for retrieving message/external-body parts.
[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
105         /* function pointers */
106         InitFunc    c_ctinitfnx;     /* parse content body                */
107         OpenCEFunc  c_ceopenfnx;     /* get a stream to decoded contents  */
108         CloseCEFunc c_ceclosefnx;    /* release stream                    */
109         SizeCEFunc  c_cesizefnx;     /* size of decoded contents          */
110
111         int c_umask;                 /* associated umask                  */
112         pid_t c_pid;                 /* process doing display             */
113         int c_rfc934;                /* rfc934 compatibility flag         */
114
115         char *c_showproc;            /* default, if not in profile        */
116         char *c_termproc;            /* for charset madness...            */
117         char *c_storeproc;           /* overrides profile entry, if any   */
118
119         char *c_storage;             /* write contents (file)             */
120         char *c_folder;              /* write contents (folder)           */
121 };
122
123 /*
124 ** Flags for Content-Type (Content->c_type)
125 */
126 #define CT_UNKNOWN      0x00
127 #define CT_APPLICATION  0x01
128 #define CT_AUDIO        0x02
129 #define CT_IMAGE        0x03
130 #define CT_MESSAGE      0x04
131 #define CT_MULTIPART    0x05
132 #define CT_TEXT         0x06
133 #define CT_VIDEO        0x07
134 #define CT_EXTENSION    0x08
135
136 /*
137 ** Flags for Content-Transfer-Encoding (Content->c_encoding)
138 */
139 #define CE_UNKNOWN      0x00
140 #define CE_BASE64       0x01
141 #define CE_QUOTED       0x02
142 #define CE_8BIT         0x03
143 #define CE_7BIT         0x04
144 #define CE_BINARY       0x05
145 #define CE_EXTENSION    0x06
146 #define CE_EXTERNAL     0x07    /* for external-body */
147
148 /*
149 ** TEXT content
150 */
151
152 /* Flags for subtypes of TEXT */
153 #define TEXT_UNKNOWN    0x00
154 #define TEXT_PLAIN      0x01
155 #define TEXT_RICHTEXT   0x02
156 #define TEXT_ENRICHED   0x03
157
158 /* Flags for character sets */
159 #define CHARSET_UNKNOWN      0x00
160 #define CHARSET_UNSPECIFIED  0x01  /* only needed when building drafts */
161 #define CHARSET_USASCII      0x01
162 #define CHARSET_LATIN        0x02
163
164 /* Structure for text content */
165 struct text {
166         int tx_charset;    /* flag for character set */
167 };
168
169 /*
170 ** MULTIPART content
171 */
172
173 /* Flags for subtypes of MULTIPART */
174 #define MULTI_UNKNOWN    0x00
175 #define MULTI_MIXED      0x01
176 #define MULTI_ALTERNATE  0x02
177 #define MULTI_DIGEST     0x03
178 #define MULTI_PARALLEL   0x04
179
180 /* Structure for subparts of a multipart content */
181 struct part {
182         CT mp_part;             /* Content structure for subpart     */
183         struct part *mp_next;   /* pointer to next subpart structure */
184 };
185
186 /* Main structure for multipart content */
187 struct multipart {
188         char *mp_start;         /* boundary string separating parts   */
189         char *mp_stop;          /* terminating boundary string        */
190         struct part *mp_parts;  /* pointer to first subpart structure */
191 };
192
193 /*
194 ** MESSAGE content
195 */
196
197 /* Flags for subtypes of MESSAGE */
198 #define MESSAGE_UNKNOWN   0x00
199 #define MESSAGE_RFC822    0x01
200 #define MESSAGE_PARTIAL   0x02
201 #define MESSAGE_EXTERNAL  0x03
202
203 /* Structure for message/partial */
204 struct partial {
205         char *pm_partid;
206         int pm_partno;
207         int pm_maxno;
208         int pm_marked;
209         int pm_stored;
210 };
211
212 /*
213 ** APPLICATION content
214 */
215
216 /* Flags for subtype of APPLICATION */
217 #define APPLICATION_UNKNOWN     0x00
218 #define APPLICATION_OCTETS      0x01
219 #define APPLICATION_POSTSCRIPT  0x02
220
221
222 /*
223 ** Structures for mapping types to their internal flags
224 */
225 struct k2v {
226         char *kv_key;
227         int kv_value;
228 };
229 extern struct k2v SubText[];
230 extern struct k2v Charset[];
231 extern struct k2v SubMultiPart[];
232 extern struct k2v SubMessage[];
233 extern struct k2v SubApplication[];
234
235 /*
236 ** Structures for mapping (content) types to
237 ** the functions to handle them.
238 */
239 struct str2init {
240         char *si_key;
241         int si_val;
242         InitFunc si_init;
243 };
244 extern struct str2init str2cts[];
245 extern struct str2init str2ces[];
246
247 /*
248 ** prototypes
249 */
250 int pidcheck(int);
251 CT parse_mime(char *);
252 int add_header(CT, char *, char *);
253 int get_ctinfo(unsigned char *, CT, int);
254 int open7Bit(CT, char **);
255 void close_encoding(CT);