f04986a8f2d9f35300a7234f26964269b32264f6
[apps/madmutt.git] / lib-mime / mime-types.h
1 /*
2  *  This program is free software; you can redistribute it and/or modify
3  *  it under the terms of the GNU General Public License as published by
4  *  the Free Software Foundation; either version 2 of the License, or (at
5  *  your option) any later version.
6  *
7  *  This program is distributed in the hope that it will be useful, but
8  *  WITHOUT ANY WARRANTY; without even the implied warranty of
9  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
10  *  General Public License for more details.
11  *
12  *  You should have received a copy of the GNU General Public License
13  *  along with this program; if not, write to the Free Software
14  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
15  *  MA 02110-1301, USA.
16  *
17  *  Copyright © 2006 Pierre Habouzit
18  */
19
20 /*
21  * Copyright notice from original mutt:
22  * Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org>
23  * Copyright (C) 1999-2000 Thomas Roessler <roessler@does-not-exist.org>
24  *
25  * This file is part of mutt-ng, see http://www.muttng.org/.
26  * It's licensed under the GNU General Public License,
27  * please see the file GPL in the top level source directory.
28  */
29
30 #ifndef MUTT_LIB_MIME_MIME_TYPES_H
31 #define MUTT_LIB_MIME_MIME_TYPES_H
32
33 #if HAVE_CONFIG_H
34 # include "config.h"
35 #endif
36
37 #include <lib-lib/mem.h>
38 #include <lib-lib/buffer.h>
39 #include <lib-lib/list.h>
40
41 /* Content-Type */
42 enum {
43     TYPEOTHER,
44     TYPEAUDIO,
45     TYPEAPPLICATION,
46     TYPEIMAGE,
47     TYPEMESSAGE,
48     TYPEMODEL,
49     TYPEMULTIPART,
50     TYPETEXT,
51     TYPEVIDEO,
52     TYPEANY
53 };
54
55 /* Content-Transfer-Encoding */
56 enum {
57     ENCOTHER,
58     ENC7BIT,
59     ENC8BIT,
60     ENCQUOTEDPRINTABLE,
61     ENCBASE64,
62     ENCBINARY,
63     ENCUUENCODED,
64 };
65
66 /* Content-Disposition values */
67 enum {
68     DISPINLINE,
69     DISPATTACH,
70     DISPFORMDATA
71 };
72
73 /****************************************************************************/
74 /* rfc822 addresses                                                         */
75 /****************************************************************************/
76
77 typedef struct address_t {
78     struct address_t *next;
79     char *personal;               /* real name of address */
80     char *mailbox;                /* mailbox and host address */
81     int group;                    /* group mailbox? */
82 } address_t;
83
84 DO_INIT(address_t, address);
85 static inline void address_wipe(address_t *addr) {
86     p_delete(&addr->personal);
87     p_delete(&addr->mailbox);
88 }
89
90 DO_NEW(address_t, address);
91 DO_DELETE(address_t, address);
92 DO_SLIST(address_t, address, address_delete);
93
94 /****************************************************************************/
95 /* rfc822 header parameters                                                 */
96 /****************************************************************************/
97
98 typedef struct parameter_t {
99     struct parameter_t *next;
100     char *attribute;
101     char *value;
102 } parameter_t;
103
104 DO_INIT(parameter_t, parameter);
105 static inline void parameter_wipe(parameter_t *param) {
106     p_delete(&param->attribute);
107     p_delete(&param->value);
108 }
109
110 DO_NEW(parameter_t, parameter);
111 DO_DELETE(parameter_t, parameter);
112 DO_SLIST(parameter_t, parameter, parameter_delete);
113
114 char *parameter_getval(parameter_t *, const char *);
115 void parameter_setval(parameter_t **, const char *, const char *);
116 void parameter_delval(parameter_t ** p, const char *);
117 void parameter_set_boundary(parameter_t **);
118
119 int parameter_equal(const parameter_t *, const parameter_t *);
120
121 /****************************************************************************/
122 /* rfc822 envelopes                                                         */
123 /****************************************************************************/
124
125 typedef struct envelope_t {
126     address_t *return_path;
127     address_t *from;
128     address_t *to;
129     address_t *cc;
130     address_t *bcc;
131     address_t *sender;
132     address_t *reply_to;
133     address_t *mail_followup_to;
134     char *list_post;              /* this stores a mailto URL, or nothing */
135     char *subject;
136     char *real_subj;              /* offset of the real subject */
137     char *message_id;
138     char *supersedes;
139     char *date;
140     char *x_label;
141     char *organization;
142 #ifdef USE_NNTP
143     char *newsgroups;
144     char *xref;
145     char *followup_to;
146     char *x_comment_to;
147 #endif
148     BUFFER *spam;
149     string_list_t *references;             /* message references (in reverse order) */
150     string_list_t *in_reply_to;            /* in-reply-to header content */
151     string_list_t *userhdrs;               /* user defined headers */
152     unsigned int irt_changed:1;   /* In-Reply-To changed to link/break threads */
153     unsigned int refs_changed:1;  /* References changed to break thread */
154 } ENVELOPE;
155
156 DO_INIT(ENVELOPE, envelope);
157 void envelope_wipe(ENVELOPE*);
158
159 DO_NEW(ENVELOPE, envelope);
160 DO_DELETE(ENVELOPE, envelope);
161
162 /****************************************************************************/
163 /* rfc822 content-*                                                         */
164 /****************************************************************************/
165
166 /* Information that helps in determing the Content-* of an attachment */
167 typedef struct content {
168     long hibin;                   /* 8-bit characters */
169     long lobin;                   /* unprintable 7-bit chars (eg., control chars) */
170     long crlf;                    /* '\r' and '\n' characters */
171     long ascii;                   /* number of ascii chars */
172     long linemax;                 /* length of the longest line in the file */
173     unsigned int space:1;         /* whitespace at the end of lines? */
174     unsigned int binary:1;        /* long lines, or CR not in CRLF pair */
175     unsigned int from:1;          /* has a line beginning with "From "? */
176     unsigned int dot:1;           /* has a line consisting of a single dot? */
177     unsigned int cr:1;            /* has CR, even when in a CRLF pair */
178 } CONTENT;
179
180
181 /****************************************************************************/
182 /* rfc822 Bodies                                                            */
183 /****************************************************************************/
184
185 typedef struct body {
186     struct body *next;            /* next attachment in the list */
187
188     char *xtype;                  /* content-type if x-unknown */
189     char *subtype;                /* content-type subtype */
190     parameter_t *parameter;         /* parameters of the content-type */
191     char *description;            /* content-description */
192     char *form_name;              /* Content-Disposition form-data name param */
193     off_t hdr_offset;             /* offset in stream where the headers begin.
194                                    * this info is used when invoking metamail,
195                                    * where we need to send the headers of the
196                                    * attachment
197                                    */
198     off_t offset;                 /* offset where the actual data begins */
199     off_t length;                 /* length (in bytes) of attachment */
200     char *filename;               /* when sending a message, this is the file
201                                    * to which this structure refers
202                                    */
203     char *d_filename;             /* filename to be used for the 
204                                    * content-disposition header.
205                                    * If NULL, filename is used 
206                                    * instead.
207                                    */
208     char *file_charset;           /* charset of attached file */
209     CONTENT *content;             /* structure used to store detailed info about
210                                    * the content of the attachment.  this is used
211                                    * to determine what content-transfer-encoding
212                                    * is required when sending mail.
213                                    */
214     struct body *parts;           /* parts of a multipart or message/rfc822 */
215     struct header *hdr;           /* header information for message/rfc822 */
216
217     struct attachptr *aptr;       /* Menu information, used in recvattach.c */
218
219     signed short attach_count;
220
221     time_t stamp;                 /* time stamp of last
222                                    * encoding update.
223                                    */
224
225     unsigned int type:4;          /* content-type primary type */
226     unsigned int encoding:3;      /* content-transfer-encoding */
227     unsigned int disposition:2;   /* content-disposition */
228     unsigned int use_disp:1;      /* Content-Disposition uses filename= ? */
229     unsigned int unlink:1;        /* flag to indicate the the file named by
230                                    * "filename" should be unlink()ed before
231                                    * free()ing this structure
232                                    */
233     unsigned int tagged:1;
234     unsigned int deleted:1;       /* attachment marked for deletion */
235
236     unsigned int noconv:1;        /* don't do character set conversion */
237     unsigned int force_charset:1; /* send mode: don't adjust the character set
238                                      when in send-mode. */
239     unsigned int is_signed_data:1; /* A lot of MUAs don't indicate S/MIME
240                                       signed-data correctly, e.g. they use
241                                       foo.p7m even for the name of signed
242                                       data.  This flag is used to keep track
243                                       of the actual message type.  It gets set
244                                       during the verification (which is done
245                                       if the encryption try failed) and check
246                                       by the function to figure the type of
247                                       the message. */
248
249     unsigned int goodsig:1;       /* good cryptographic signature */
250     unsigned int warnsig:1;       /* maybe good signature */
251     unsigned int badsig:1;        /* bad cryptographic signature (needed to check encrypted s/mime-signatures) */
252
253     unsigned int collapsed:1;     /* used by recvattach */
254     unsigned int attach_qualifies:1;
255 } BODY;
256
257 static inline BODY *body_init(BODY *b) {
258     b->disposition = DISPATTACH;
259     b->use_disp = 1;
260     return b;
261 }
262 void body_wipe(BODY *);
263
264 DO_NEW(BODY, body);
265 DO_DELETE(BODY, body);
266 DO_SLIST(BODY, body, body_delete);
267
268
269 /****************************************************************************/
270 /* rfc822 Headers                                                           */
271 /****************************************************************************/
272
273 typedef struct header {
274     unsigned int security:11;     /* bit 0-6: flags, bit 7,8: application.
275 see: crypt.h pgplib.h, smime.h */
276
277     unsigned int mime:1;          /* has a MIME-Version header? */
278     unsigned int flagged:1;       /* marked important? */
279     unsigned int tagged:1;
280     unsigned int appended:1;      /* has been saved */
281     unsigned int purged:1;        /* bypassing the trash folder */
282     unsigned int deleted:1;
283     unsigned int changed:1;
284     unsigned int attach_del:1;    /* has an attachment marked for deletion */
285     unsigned int old:1;
286     unsigned int read:1;
287     unsigned int expired:1;       /* already expired? */
288     unsigned int superseded:1;    /* got superseded? */
289     unsigned int replied:1;
290     unsigned int subject_changed:1;       /* used for threading */
291     unsigned int threaded:1;      /* used for threading */
292     unsigned int display_subject:1;       /* used for threading */
293     unsigned int recip_valid:1;   /* is_recipient is valid */
294     unsigned int active:1;        /* message is not to be removed */
295     unsigned int trash:1;         /* message is marked as trashed on disk.
296                                    * This flag is used by the maildir_trash
297                                    * option.
298                                    */
299
300     /* timezone of the sender of this message */
301     unsigned int zhours:5;
302     unsigned int zminutes:6;
303     unsigned int zoccident:1;
304
305     /* bits used for caching when searching */
306     unsigned int searched:1;
307     unsigned int matched:1;
308
309     /* tells whether the attach count is valid */
310     unsigned int attach_valid:1;
311
312     /* the following are used to support collapsing threads  */
313     unsigned int collapsed:1;     /* is this message part of a collapsed thread? */
314     unsigned int limited:1;       /* is this message in a limited view?  */
315     size_t num_hidden;            /* number of hidden messages in this view */
316
317     short recipient;              /* user_is_recipient()'s return value, cached */
318
319     int pair;                     /* color-pair to use when displaying in the index */
320
321     time_t date_sent;             /* time when the message was sent (UTC) */
322     time_t received;              /* time when the message was placed in the mailbox */
323     off_t offset;                 /* where in the stream does this message begin? */
324     int lines;                    /* how many lines in the body of this message? */
325     int index;                    /* the absolute (unsorted) message number */
326     int msgno;                    /* number displayed to the user */
327     int virtual;                  /* virtual message number */
328     int score;
329     ENVELOPE *env;                /* envelope information */
330     BODY *content;                /* list of MIME parts */
331     char *path;
332 #ifdef USE_NNTP
333     int article_num;
334 #endif
335
336     char *tree;                   /* character string to print thread tree */
337     struct thread *thread;
338
339     short attach_total;
340
341 #ifdef MIXMASTER
342     string_list_t *chain;
343 #endif
344
345     int refno;                    /* message number on server */
346     void *data;                   /* driver-specific data */
347
348     char *maildir_flags;          /* unknown maildir flags */
349 } HEADER;
350
351 DO_INIT(HEADER, header);
352 void header_wipe(HEADER *);
353
354 DO_NEW(HEADER, header);
355 DO_DELETE(HEADER, header);
356
357 #endif /* MUTT_LIB_MIME_MIME_TYPES_H */