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.
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.
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,
17 * Copyright © 2006 Pierre Habouzit
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>
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.
30 #ifndef MUTT_LIB_MIME_MIME_TYPES_H
31 #define MUTT_LIB_MIME_MIME_TYPES_H
37 #include <lib-lib/mem.h>
38 #include <lib-lib/buffer.h>
39 #include <lib-lib/list.h>
55 /* Content-Transfer-Encoding */
66 /* Content-Disposition values */
73 /****************************************************************************/
74 /* rfc822 addresses */
75 /****************************************************************************/
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? */
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);
90 DO_NEW(address_t, address);
91 DO_DELETE(address_t, address);
92 DO_SLIST(address_t, address, address_delete);
94 /****************************************************************************/
95 /* rfc822 header parameters */
96 /****************************************************************************/
98 typedef struct parameter_t {
99 struct parameter_t *next;
104 DO_INIT(parameter_t, parameter);
105 static inline void parameter_wipe(parameter_t *param) {
106 p_delete(¶m->attribute);
107 p_delete(¶m->value);
110 DO_NEW(parameter_t, parameter);
111 DO_DELETE(parameter_t, parameter);
112 DO_SLIST(parameter_t, parameter, parameter_delete);
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 **);
119 int parameter_equal(const parameter_t *, const parameter_t *);
121 /****************************************************************************/
122 /* rfc822 envelopes */
123 /****************************************************************************/
125 typedef struct envelope_t {
126 address_t *return_path;
133 address_t *mail_followup_to;
134 char *list_post; /* this stores a mailto URL, or nothing */
136 char *real_subj; /* offset of the real subject */
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 */
156 DO_INIT(ENVELOPE, envelope);
157 void envelope_wipe(ENVELOPE*);
159 DO_NEW(ENVELOPE, envelope);
160 DO_DELETE(ENVELOPE, envelope);
162 /****************************************************************************/
163 /* rfc822 content-* */
164 /****************************************************************************/
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 */
181 /****************************************************************************/
183 /****************************************************************************/
185 typedef struct body {
186 struct body *next; /* next attachment in the list */
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
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
203 char *d_filename; /* filename to be used for the
204 * content-disposition header.
205 * If NULL, filename is used
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.
214 struct body *parts; /* parts of a multipart or message/rfc822 */
215 struct header *hdr; /* header information for message/rfc822 */
217 struct attachptr *aptr; /* Menu information, used in recvattach.c */
219 signed short attach_count;
221 time_t stamp; /* time stamp of last
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
233 unsigned int tagged:1;
234 unsigned int deleted:1; /* attachment marked for deletion */
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
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) */
253 unsigned int collapsed:1; /* used by recvattach */
254 unsigned int attach_qualifies:1;
257 static inline BODY *body_init(BODY *b) {
258 b->disposition = DISPATTACH;
262 void body_wipe(BODY *);
265 DO_DELETE(BODY, body);
266 DO_SLIST(BODY, body, body_delete);
269 /****************************************************************************/
271 /****************************************************************************/
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 */
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 */
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
300 /* timezone of the sender of this message */
301 unsigned int zhours:5;
302 unsigned int zminutes:6;
303 unsigned int zoccident:1;
305 /* bits used for caching when searching */
306 unsigned int searched:1;
307 unsigned int matched:1;
309 /* tells whether the attach count is valid */
310 unsigned int attach_valid:1;
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 */
317 short recipient; /* user_is_recipient()'s return value, cached */
319 int pair; /* color-pair to use when displaying in the index */
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 */
329 ENVELOPE *env; /* envelope information */
330 BODY *content; /* list of MIME parts */
336 char *tree; /* character string to print thread tree */
337 struct thread *thread;
342 string_list_t *chain;
345 int refno; /* message number on server */
346 void *data; /* driver-specific data */
348 char *maildir_flags; /* unknown maildir flags */
351 DO_INIT(HEADER, header);
352 void header_wipe(HEADER *);
354 DO_NEW(HEADER, header);
355 DO_DELETE(HEADER, header);
357 #endif /* MUTT_LIB_MIME_MIME_TYPES_H */