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 char *personal; /* real name of address */
79 char *mailbox; /* mailbox and host address */
80 int group; /* group mailbox? */
81 struct address_t *next;
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 {
101 struct parameter *next;
104 DO_INIT(PARAMETER, parameter);
105 static inline void parameter_wipe(PARAMETER *param) {
106 p_delete(¶m->attribute);
107 p_delete(¶m->value);
110 DO_NEW(PARAMETER, parameter);
111 DO_DELETE(PARAMETER, parameter);
112 DO_SLIST(PARAMETER, parameter, parameter_delete);
114 char *parameter_getval(PARAMETER *, const char *);
116 /****************************************************************************/
117 /* rfc822 envelopes */
118 /****************************************************************************/
120 typedef struct envelope_t {
121 address_t *return_path;
128 address_t *mail_followup_to;
129 char *list_post; /* this stores a mailto URL, or nothing */
131 char *real_subj; /* offset of the real subject */
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 */
151 DO_INIT(ENVELOPE, envelope);
152 void envelope_wipe(ENVELOPE*);
154 DO_NEW(ENVELOPE, envelope);
155 DO_DELETE(ENVELOPE, envelope);
157 /****************************************************************************/
158 /* rfc822 content-* */
159 /****************************************************************************/
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 */
176 /****************************************************************************/
178 /****************************************************************************/
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
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
196 char *d_filename; /* filename to be used for the
197 * content-disposition header.
198 * If NULL, filename is used
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.
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 */
211 struct attachptr *aptr; /* Menu information, used in recvattach.c */
213 signed short attach_count;
215 time_t stamp; /* time stamp of last
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
227 unsigned int tagged:1;
228 unsigned int deleted:1; /* attachment marked for deletion */
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
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) */
247 unsigned int collapsed:1; /* used by recvattach */
248 unsigned int attach_qualifies:1;
252 /****************************************************************************/
254 /****************************************************************************/
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 */
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 */
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
283 /* timezone of the sender of this message */
284 unsigned int zhours:5;
285 unsigned int zminutes:6;
286 unsigned int zoccident:1;
288 /* bits used for caching when searching */
289 unsigned int searched:1;
290 unsigned int matched:1;
292 /* tells whether the attach count is valid */
293 unsigned int attach_valid:1;
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 */
300 short recipient; /* user_is_recipient()'s return value, cached */
302 int pair; /* color-pair to use when displaying in the index */
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 */
312 ENVELOPE *env; /* envelope information */
313 BODY *content; /* list of MIME parts */
319 char *tree; /* character string to print thread tree */
320 struct thread *thread;
325 string_list_t *chain;
328 int refno; /* message number on server */
329 void *data; /* driver-specific data */
331 char *maildir_flags; /* unknown maildir flags */
334 DO_INIT(HEADER, header);
335 void header_wipe(HEADER *);
337 DO_NEW(HEADER, header);
338 DO_DELETE(HEADER, header);
340 #endif /* MUTT_LIB_MIME_MIME_TYPES_H */