move mutt_get_parameter -> parameter_getval into mime.c
[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     char *personal;               /* real name of address */
79     char *mailbox;                /* mailbox and host address */
80     int group;                    /* group mailbox? */
81     struct address_t *next;
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 {
99     char *attribute;
100     char *value;
101     struct parameter *next;
102 } PARAMETER;
103
104 DO_INIT(PARAMETER, parameter);
105 static inline void parameter_wipe(PARAMETER *param) {
106     p_delete(&param->attribute);
107     p_delete(&param->value);
108 }
109
110 DO_NEW(PARAMETER, parameter);
111 DO_DELETE(PARAMETER, parameter);
112 DO_SLIST(PARAMETER, parameter, parameter_delete);
113
114 char *parameter_getval(PARAMETER *, const char *);
115
116 /****************************************************************************/
117 /* rfc822 envelopes                                                         */
118 /****************************************************************************/
119
120 typedef struct envelope_t {
121     address_t *return_path;
122     address_t *from;
123     address_t *to;
124     address_t *cc;
125     address_t *bcc;
126     address_t *sender;
127     address_t *reply_to;
128     address_t *mail_followup_to;
129     char *list_post;              /* this stores a mailto URL, or nothing */
130     char *subject;
131     char *real_subj;              /* offset of the real subject */
132     char *message_id;
133     char *supersedes;
134     char *date;
135     char *x_label;
136     char *organization;
137 #ifdef USE_NNTP
138     char *newsgroups;
139     char *xref;
140     char *followup_to;
141     char *x_comment_to;
142 #endif
143     BUFFER *spam;
144     string_list_t *references;             /* message references (in reverse order) */
145     string_list_t *in_reply_to;            /* in-reply-to header content */
146     string_list_t *userhdrs;               /* user defined headers */
147     unsigned int irt_changed:1;   /* In-Reply-To changed to link/break threads */
148     unsigned int refs_changed:1;  /* References changed to break thread */
149 } ENVELOPE;
150
151 DO_INIT(ENVELOPE, envelope);
152 void envelope_wipe(ENVELOPE*);
153
154 DO_NEW(ENVELOPE, envelope);
155 DO_DELETE(ENVELOPE, envelope);
156
157 /****************************************************************************/
158 /* rfc822 content-*                                                         */
159 /****************************************************************************/
160
161 /* Information that helps in determing the Content-* of an attachment */
162 typedef struct content {
163     long hibin;                   /* 8-bit characters */
164     long lobin;                   /* unprintable 7-bit chars (eg., control chars) */
165     long crlf;                    /* '\r' and '\n' characters */
166     long ascii;                   /* number of ascii chars */
167     long linemax;                 /* length of the longest line in the file */
168     unsigned int space:1;         /* whitespace at the end of lines? */
169     unsigned int binary:1;        /* long lines, or CR not in CRLF pair */
170     unsigned int from:1;          /* has a line beginning with "From "? */
171     unsigned int dot:1;           /* has a line consisting of a single dot? */
172     unsigned int cr:1;            /* has CR, even when in a CRLF pair */
173 } CONTENT;
174
175
176 /****************************************************************************/
177 /* rfc822 Bodies                                                            */
178 /****************************************************************************/
179
180 typedef struct body {
181     char *xtype;                  /* content-type if x-unknown */
182     char *subtype;                /* content-type subtype */
183     PARAMETER *parameter;         /* parameters of the content-type */
184     char *description;            /* content-description */
185     char *form_name;              /* Content-Disposition form-data name param */
186     off_t hdr_offset;             /* offset in stream where the headers begin.
187                                    * this info is used when invoking metamail,
188                                    * where we need to send the headers of the
189                                    * attachment
190                                    */
191     off_t offset;                 /* offset where the actual data begins */
192     off_t length;                 /* length (in bytes) of attachment */
193     char *filename;               /* when sending a message, this is the file
194                                    * to which this structure refers
195                                    */
196     char *d_filename;             /* filename to be used for the 
197                                    * content-disposition header.
198                                    * If NULL, filename is used 
199                                    * instead.
200                                    */
201     char *file_charset;           /* charset of attached file */
202     CONTENT *content;             /* structure used to store detailed info about
203                                    * the content of the attachment.  this is used
204                                    * to determine what content-transfer-encoding
205                                    * is required when sending mail.
206                                    */
207     struct body *next;            /* next attachment in the list */
208     struct body *parts;           /* parts of a multipart or message/rfc822 */
209     struct header *hdr;           /* header information for message/rfc822 */
210
211     struct attachptr *aptr;       /* Menu information, used in recvattach.c */
212
213     signed short attach_count;
214
215     time_t stamp;                 /* time stamp of last
216                                    * encoding update.
217                                    */
218
219     unsigned int type:4;          /* content-type primary type */
220     unsigned int encoding:3;      /* content-transfer-encoding */
221     unsigned int disposition:2;   /* content-disposition */
222     unsigned int use_disp:1;      /* Content-Disposition uses filename= ? */
223     unsigned int unlink:1;        /* flag to indicate the the file named by
224                                    * "filename" should be unlink()ed before
225                                    * free()ing this structure
226                                    */
227     unsigned int tagged:1;
228     unsigned int deleted:1;       /* attachment marked for deletion */
229
230     unsigned int noconv:1;        /* don't do character set conversion */
231     unsigned int force_charset:1; /* send mode: don't adjust the character set
232                                      when in send-mode. */
233     unsigned int is_signed_data:1; /* A lot of MUAs don't indicate S/MIME
234                                       signed-data correctly, e.g. they use
235                                       foo.p7m even for the name of signed
236                                       data.  This flag is used to keep track
237                                       of the actual message type.  It gets set
238                                       during the verification (which is done
239                                       if the encryption try failed) and check
240                                       by the function to figure the type of
241                                       the message. */
242
243     unsigned int goodsig:1;       /* good cryptographic signature */
244     unsigned int warnsig:1;       /* maybe good signature */
245     unsigned int badsig:1;        /* bad cryptographic signature (needed to check encrypted s/mime-signatures) */
246
247     unsigned int collapsed:1;     /* used by recvattach */
248     unsigned int attach_qualifies:1;
249 } BODY;
250
251
252 /****************************************************************************/
253 /* rfc822 Headers                                                           */
254 /****************************************************************************/
255
256 typedef struct header {
257     unsigned int security:11;     /* bit 0-6: flags, bit 7,8: application.
258 see: crypt.h pgplib.h, smime.h */
259
260     unsigned int mime:1;          /* has a MIME-Version header? */
261     unsigned int flagged:1;       /* marked important? */
262     unsigned int tagged:1;
263     unsigned int appended:1;      /* has been saved */
264     unsigned int purged:1;        /* bypassing the trash folder */
265     unsigned int deleted:1;
266     unsigned int changed:1;
267     unsigned int attach_del:1;    /* has an attachment marked for deletion */
268     unsigned int old:1;
269     unsigned int read:1;
270     unsigned int expired:1;       /* already expired? */
271     unsigned int superseded:1;    /* got superseded? */
272     unsigned int replied:1;
273     unsigned int subject_changed:1;       /* used for threading */
274     unsigned int threaded:1;      /* used for threading */
275     unsigned int display_subject:1;       /* used for threading */
276     unsigned int recip_valid:1;   /* is_recipient is valid */
277     unsigned int active:1;        /* message is not to be removed */
278     unsigned int trash:1;         /* message is marked as trashed on disk.
279                                    * This flag is used by the maildir_trash
280                                    * option.
281                                    */
282
283     /* timezone of the sender of this message */
284     unsigned int zhours:5;
285     unsigned int zminutes:6;
286     unsigned int zoccident:1;
287
288     /* bits used for caching when searching */
289     unsigned int searched:1;
290     unsigned int matched:1;
291
292     /* tells whether the attach count is valid */
293     unsigned int attach_valid:1;
294
295     /* the following are used to support collapsing threads  */
296     unsigned int collapsed:1;     /* is this message part of a collapsed thread? */
297     unsigned int limited:1;       /* is this message in a limited view?  */
298     size_t num_hidden;            /* number of hidden messages in this view */
299
300     short recipient;              /* user_is_recipient()'s return value, cached */
301
302     int pair;                     /* color-pair to use when displaying in the index */
303
304     time_t date_sent;             /* time when the message was sent (UTC) */
305     time_t received;              /* time when the message was placed in the mailbox */
306     off_t offset;                 /* where in the stream does this message begin? */
307     int lines;                    /* how many lines in the body of this message? */
308     int index;                    /* the absolute (unsorted) message number */
309     int msgno;                    /* number displayed to the user */
310     int virtual;                  /* virtual message number */
311     int score;
312     ENVELOPE *env;                /* envelope information */
313     BODY *content;                /* list of MIME parts */
314     char *path;
315 #ifdef USE_NNTP
316     int article_num;
317 #endif
318
319     char *tree;                   /* character string to print thread tree */
320     struct thread *thread;
321
322     short attach_total;
323
324 #ifdef MIXMASTER
325     string_list_t *chain;
326 #endif
327
328     int refno;                    /* message number on server */
329     void *data;                   /* driver-specific data */
330
331     char *maildir_flags;          /* unknown maildir flags */
332 } HEADER;
333
334 DO_INIT(HEADER, header);
335 void header_wipe(HEADER *);
336
337 DO_NEW(HEADER, header);
338 DO_DELETE(HEADER, header);
339
340 #endif /* MUTT_LIB_MIME_MIME_TYPES_H */