Rocco Rutte:
[apps/madmutt.git] / mutt.h
1 /*
2  * Copyright notice from original mutt:
3  * Copyright (C) 1996-2002 Michael R. Elkins <me@mutt.org>
4  * Copyright (C) 2004 g10 Code GmbH
5  *
6  * This file is part of mutt-ng, see http://www.muttng.org/.
7  * It's licensed under the GNU General Public License,
8  * please see the file GPL in the top level source directory.
9  */
10
11 #ifndef _MUTT_H
12 #define _MUTT_H
13
14 #include "config.h"
15
16 #include <stdio.h>
17 #include <stdlib.h>
18 #ifdef HAVE_UNISTD_H
19 # include <unistd.h>            /* needed for SEEK_SET */
20 #endif
21 #ifdef HAVE_UNIX_H
22 # include <unix.h>              /* needed for snprintf on QNX. */
23 #endif
24 #include <sys/types.h>
25 #include <sys/stat.h>
26 #include <time.h>
27 #include <limits.h>
28 #include <stdarg.h>
29 #include <signal.h>
30 #ifdef HAVE_WCHAR_H
31 # include <wchar.h>
32 #endif
33 #if defined(HAVE_WCTYPE_H) && defined(HAVE_WC_FUNCS)
34 # include <wctype.h>
35 #endif
36
37 #ifndef _POSIX_PATH_MAX
38 #include <posix1_lim.h>
39 #endif
40
41 #include <pwd.h>
42 #include <grp.h>
43
44 #include "rfc822.h"
45 #include "list.h"
46 #include "hash.h"
47 #include "charset.h"
48 #include "lib/rx.h"
49
50 #ifndef HAVE_WC_FUNCS
51 # ifdef MB_LEN_MAX
52 #  undef MB_LEN_MAX
53 # endif
54 # define MB_LEN_MAX 16
55 #endif
56
57 # define MUTT_VERSION (VERSION)
58
59 /* nifty trick I stole from ELM 2.5alpha. */
60 #ifdef MAIN_C
61 #define WHERE
62 #define INITVAL(x) = x
63 #else
64 #define WHERE extern
65 #define INITVAL(x)
66 #endif
67
68 /* flags for mutt_extract_token() */
69 #define M_TOKEN_EQUAL           1       /* treat '=' as a special */
70 #define M_TOKEN_CONDENSE        (1<<1)  /* ^(char) to control chars (macros) */
71 #define M_TOKEN_SPACE           (1<<2)  /* don't treat whitespace as a term */
72 #define M_TOKEN_QUOTE           (1<<3)  /* don't interpret quotes */
73 #define M_TOKEN_PATTERN         (1<<4)  /* !)|~ are terms (for patterns) */
74 #define M_TOKEN_COMMENT         (1<<5)  /* don't reap comments */
75 #define M_TOKEN_SEMICOLON       (1<<6)  /* don't treat ; as special */
76
77 typedef struct {
78   char *data;                   /* pointer to data */
79   char *dptr;                   /* current read/write position */
80   size_t dsize;                 /* length of data */
81   int destroy;                  /* destroy `data' when done? */
82 } BUFFER;
83
84 typedef struct {
85   int ch;                       /* raw key pressed */
86   int op;                       /* function op */
87 } event_t;
88
89 /* flags for _mutt_system() */
90 #define M_DETACH_PROCESS        1       /* detach subprocess from group */
91
92 /* flags for mutt_FormatString() */
93 typedef enum {
94   M_FORMAT_FORCESUBJ = (1 << 0),        /* print the subject even if unchanged */
95   M_FORMAT_TREE = (1 << 1),     /* draw the thread tree */
96   M_FORMAT_MAKEPRINT = (1 << 2),        /* make sure that all chars are printable */
97   M_FORMAT_OPTIONAL = (1 << 3),
98   M_FORMAT_STAT_FILE = (1 << 4),        /* used by mutt_attach_fmt */
99   M_FORMAT_ARROWCURSOR = (1 << 5),      /* reserve space for arrow_cursor */
100   M_FORMAT_INDEX = (1 << 6)     /* this is a main index entry */
101 } format_flag;
102
103 /* types for mutt_add_hook() */
104 #define M_FOLDERHOOK    1
105 #define M_MBOXHOOK      (1<<1)
106 #define M_SENDHOOK      (1<<2)
107 #define M_FCCHOOK       (1<<3)
108 #define M_SAVEHOOK      (1<<4)
109 #define M_CHARSETHOOK   (1<<5)
110 #define M_ICONVHOOK     (1<<6)
111 #define M_MESSAGEHOOK   (1<<7)
112 #define M_CRYPTHOOK     (1<<8)
113 #define M_ACCOUNTHOOK   (1<<9)
114 #define M_REPLYHOOK     (1<<10)
115 #define M_SEND2HOOK     (1<<11)
116
117 #ifdef USE_COMPRESSED
118 #define M_OPENHOOK      (1<<12)
119 #define M_APPENDHOOK    (1<<13)
120 #define M_CLOSEHOOK     (1<<14)
121 #endif
122
123 /* tree characters for linearize_tree and print_enriched_string */
124 #define M_TREE_LLCORNER         1
125 #define M_TREE_ULCORNER         2
126 #define M_TREE_LTEE             3
127 #define M_TREE_HLINE            4
128 #define M_TREE_VLINE            5
129 #define M_TREE_SPACE            6
130 #define M_TREE_RARROW           7
131 #define M_TREE_STAR             8
132 #define M_TREE_HIDDEN           9
133 #define M_TREE_EQUALS           10
134 #define M_TREE_TTEE             11
135 #define M_TREE_BTEE             12
136 #define M_TREE_MISSING          13
137 #define M_TREE_MAX              14
138
139 #define M_THREAD_COLLAPSE       (1<<0)
140 #define M_THREAD_UNCOLLAPSE     (1<<1)
141 #define M_THREAD_GET_HIDDEN     (1<<2)
142 #define M_THREAD_UNREAD         (1<<3)
143 #define M_THREAD_NEXT_UNREAD    (1<<4)
144
145 enum {
146   /* modes for mutt_view_attachment() */
147   M_REGULAR = 1,
148   M_MAILCAP,
149   M_AS_TEXT,
150
151   /* action codes used by mutt_set_flag() and mutt_pattern_function() */
152   M_ALL,
153   M_NONE,
154   M_NEW,
155   M_OLD,
156   M_REPLIED,
157   M_READ,
158   M_UNREAD,
159   M_DELETE,
160   M_UNDELETE,
161   M_DELETED,
162   M_APPENDED,
163   M_PURGED,
164   M_FLAG,
165   M_TAG,
166   M_UNTAG,
167   M_LIMIT,
168   M_EXPIRED,
169   M_SUPERSEDED,
170   M_REALNAME,
171
172   /* actions for mutt_pattern_comp/mutt_pattern_exec */
173   M_AND,
174   M_OR,
175   M_TO,
176   M_CC,
177   M_COLLAPSED,
178   M_SUBJECT,
179   M_FROM,
180   M_DATE,
181   M_DATE_RECEIVED,
182   M_DUPLICATED,
183   M_UNREFERENCED,
184   M_ID,
185   M_BODY,
186   M_HEADER,
187   M_HORMEL,
188   M_WHOLE_MSG,
189   M_SENDER,
190   M_MESSAGE,
191   M_SCORE,
192   M_SIZE,
193   M_REFERENCE,
194   M_RECIPIENT,
195   M_LIST,
196   M_PERSONAL_RECIP,
197   M_PERSONAL_FROM,
198   M_ADDRESS,
199   M_CRYPT_SIGN,
200   M_CRYPT_VERIFIED,
201   M_CRYPT_ENCRYPT,
202   M_PGP_KEY,
203   M_XLABEL,
204 #ifdef USE_NNTP
205   M_NEWSGROUPS,
206 #endif
207
208   /* Options for Mailcap lookup */
209   M_EDIT,
210   M_COMPOSE,
211   M_PRINT,
212   M_AUTOVIEW,
213
214   /* options for socket code */
215   M_NEW_SOCKET,
216 #ifdef USE_SSL
217   M_NEW_SSL_SOCKET,
218 #endif
219
220   /* Options for mutt_save_attachment */
221   M_SAVE_APPEND,
222   M_SAVE_OVERWRITE
223 };
224
225 /* possible arguments to set_quadoption() */
226 enum {
227   M_NO,
228   M_YES,
229   M_ASKNO,
230   M_ASKYES
231 };
232
233 /* quad-option vars */
234 enum {
235   OPT_ABORT,
236   OPT_BOUNCE,
237   OPT_COPY,
238   OPT_DELETE,
239   OPT_FORWEDIT,
240   OPT_INCLUDE,
241 #ifdef USE_IMAP
242   OPT_IMAPRECONNECT,
243 #endif
244   OPT_MFUPTO,
245   OPT_MIMEFWD,
246   OPT_MIMEFWDREST,
247   OPT_MOVE,
248   OPT_PGPMIMEAUTO,              /* ask to revert to PGP/MIME when inline fails */
249 #ifdef USE_POP
250   OPT_POPDELETE,
251   OPT_POPRECONNECT,
252 #endif
253   OPT_POSTPONE,
254   OPT_PRINT,
255   OPT_QUIT,
256   OPT_REPLYTO,
257   OPT_RECALL,
258 #if defined(USE_SSL) || defined(USE_GNUTLS)
259   OPT_SSLSTARTTLS,
260 #endif
261   OPT_SUBJECT,
262   OPT_VERIFYSIG,                /* verify PGP signatures */
263   OPT_LISTREPLY,
264 #ifdef USE_NNTP
265   OPT_TOMODERATED,
266   OPT_NNTPRECONNECT,
267   OPT_CATCHUP,
268   OPT_FOLLOWUPTOPOSTER,
269 #endif                          /* USE_NNTP */
270
271   /* THIS MUST BE THE LAST VALUE. */
272   OPT_MAX
273 };
274
275 /* flags to ci_send_message() */
276 #define SENDREPLY       (1<<0)
277 #define SENDGROUPREPLY  (1<<1)
278 #define SENDLISTREPLY   (1<<2)
279 #define SENDFORWARD     (1<<3)
280 #define SENDPOSTPONED   (1<<4)
281 #define SENDBATCH       (1<<5)
282 #define SENDMAILX       (1<<6)
283 #define SENDKEY         (1<<7)
284 #define SENDRESEND      (1<<8)
285 #define SENDNEWS        (1<<9)
286
287 /* flags to _mutt_select_file() */
288 #define M_SEL_BUFFY     (1<<0)
289 #define M_SEL_MULTI     (1<<1)
290 #define M_SEL_FOLDER    (1<<2)
291
292 /* flags for parse_spam_list */
293 #define M_SPAM          1
294 #define M_NOSPAM        2
295
296 /* boolean vars */
297 enum {
298   OPTALLOW8BIT,
299   OPTALLOWANSI,
300   OPTARROWCURSOR,
301   OPTASCIICHARS,
302   OPTASKBCC,
303   OPTASKCC,
304   OPTASKFOLLOWUP,
305   OPTASKXCOMMENTTO,
306   OPTATTACHSPLIT,
307   OPTAUTOEDIT,
308   OPTAUTOTAG,
309   OPTBEEP,
310   OPTBEEPNEW,
311   OPTBOUNCEDELIVERED,
312   OPTBRAILLEFRIENDLY,
313   OPTCHECKNEW,
314   OPTCOLLAPSEUNREAD,
315   OPTCONFIRMAPPEND,
316   OPTCONFIRMCREATE,
317   OPTDELETEUNTAG,
318   OPTDELSP,
319   OPTDIGESTCOLLAPSE,
320   OPTDUPTHREADS,
321   OPTEDITHDRS,
322   OPTENCODEFROM,
323   OPTENVFROM,
324   OPTFASTREPLY,
325   OPTFCCATTACH,
326   OPTFCCCLEAR,
327   OPTFOLLOWUPTO,
328   OPTFORCEBUFFYCHECK,
329   OPTFORCENAME,
330   OPTFORWDECODE,
331   OPTFORWQUOTE,
332 #if USE_HCACHE
333   OPTHCACHEVERIFY,
334 #if HAVE_QDBM
335   OPTHCACHECOMPRESS,
336 #endif /* HAVE_QDBM */
337 #endif
338   OPTHDRS,
339   OPTHEADER,
340   OPTHELP,
341   OPTHIDDENHOST,
342   OPTHIDELIMITED,
343   OPTHIDEMISSING,
344   OPTHIDETHREADSUBJECT,
345   OPTHIDETOPLIMITED,
346   OPTHIDETOPMISSING,
347   OPTIGNORELISTREPLYTO,
348 #ifdef USE_IMAP
349   OPTIMAPCHECKSUBSCRIBED,
350   OPTIMAPLSUB,
351   OPTIMAPPASSIVE,
352   OPTIMAPPEEK,
353   OPTIMAPSERVERNOISE,
354 #endif
355 #if defined(USE_SSL) || defined(USE_GNUTLS)
356 # ifndef USE_GNUTLS
357   OPTSSLSYSTEMCERTS,
358   OPTSSLV2,
359 # endif /* !USE_GNUTLS */
360   OPTSSLV3,
361   OPTTLSV1,
362   OPTSSLFORCETLS,
363 #endif /* USE_SSL || USE_GNUTLS */
364   OPTIMPLICITAUTOVIEW,
365   OPTINCLUDEONLYFIRST,
366   OPTKEEPFLAGGED,
367   OPTMAILCAPSANITIZE,
368   OPTMAILDIRTRASH,
369   OPTMARKERS,
370   OPTMARKOLD,
371   OPTMBOXPANE,
372   OPTMENUSCROLL,                /* scroll menu instead of implicit next-page */
373   OPTMENUMOVEOFF,
374   OPTMETAKEY,                   /* interpret ALT-x as ESC-x */
375   OPTMETOO,
376   OPTMHPURGE,
377   OPTMIMEFORWDECODE,
378 #ifdef USE_NNTP
379   OPTMIMESUBJECT,               /* encode subject line with RFC2047 */
380 #endif
381   OPTNARROWTREE,
382   OPTPAGERSTOP,
383   OPTPIPEDECODE,
384   OPTPIPESPLIT,
385 #ifdef USE_POP
386   OPTPOPAUTHTRYALL,
387   OPTPOPLAST,
388 #endif
389   OPTPRINTDECODE,
390   OPTPRINTSPLIT,
391   OPTPROMPTAFTER,
392   OPTQUOTEEMPTY,
393   OPTQUOTEQUOTED,
394   OPTREADONLY,
395   OPTREPLYSELF,
396   OPTRESOLVE,
397   OPTREVALIAS,
398   OPTREVNAME,
399   OPTREVREAL,
400   OPTRFC2047PARAMS,
401   OPTSAVEADDRESS,
402   OPTSAVEEMPTY,
403   OPTSAVENAME,
404   OPTSCORE,
405   OPTSIGDASHES,
406   OPTSIGONTOP,
407   OPTSORTRE,
408   OPTSPAMSEP,
409   OPTSTATUSONTOP,
410   OPTSTRICTMAILTO,
411   OPTSTRICTMIME,
412   OPTSTRICTTHREADS,
413   OPTSTRIPWAS,
414   OPTSTUFFQUOTED,
415   OPTSUSPEND,
416   OPTTEXTFLOWED,
417   OPTTHOROUGHSRC,
418   OPTTHREADRECEIVED,
419   OPTTILDE,
420   OPTUNCOLLAPSEJUMP,
421   OPTUSE8BITMIME,
422   OPTUSEDOMAIN,
423   OPTUSEFROM,
424   OPTUSEGPGAGENT,
425 #ifdef HAVE_LIBIDN
426   OPTUSEIDN,
427 #endif
428 #ifdef HAVE_GETADDRINFO
429   OPTUSEIPV6,
430 #endif
431   OPTWAITKEY,
432   OPTWEED,
433   OPTWRAP,
434   OPTWRAPSEARCH,
435   OPTWRITEBCC,                  /* write out a bcc header? */
436   OPTXMAILER,
437   OPTXTERMSETTITLES,
438
439   OPTCRYPTUSEGPGME,
440
441   /* PGP options */
442
443   OPTCRYPTAUTOSIGN,
444   OPTCRYPTAUTOENCRYPT,
445   OPTCRYPTAUTOPGP,
446   OPTCRYPTAUTOSMIME,
447   OPTCRYPTREPLYENCRYPT,
448   OPTCRYPTREPLYSIGN,
449   OPTCRYPTREPLYSIGNENCRYPTED,
450   OPTCRYPTTIMESTAMP,
451   OPTSMIMEISDEFAULT,
452   OPTASKCERTLABEL,
453   OPTSDEFAULTDECRYPTKEY,
454   OPTPGPIGNORESUB,
455   OPTPGPCHECKEXIT,
456   OPTPGPLONGIDS,
457   OPTPGPAUTODEC,
458 #if 0
459   OPTPGPENCRYPTSELF,
460 #endif
461   OPTPGPRETAINABLESIG,
462   OPTPGPSTRICTENC,
463   OPTFORWDECRYPT,
464   OPTPGPSHOWUNUSABLE,
465   OPTPGPAUTOINLINE,
466   OPTPGPREPLYINLINE,
467
468   /* news options */
469
470 #ifdef USE_NNTP
471   OPTSHOWNEWNEWS,
472   OPTSHOWONLYUNREAD,
473   OPTSAVEUNSUB,
474   OPTLOADDESC,
475   OPTXCOMMENTTO,
476 #endif                          /* USE_NNTP */
477
478   /* pseudo options */
479
480   OPTAUXSORT,                   /* (pseudo) using auxillary sort function */
481   OPTFORCEREFRESH,              /* (pseudo) refresh even during macros */
482   OPTLOCALES,                   /* (pseudo) set if user has valid locale definition */
483   OPTNOCURSES,                  /* (pseudo) when sending in batch mode */
484   OPTNEEDREDRAW,                /* (pseudo) to notify caller of a submenu */
485   OPTSEARCHREVERSE,             /* (pseudo) used by ci_search_command */
486   OPTMSGERR,                    /* (pseudo) used by mutt_error/mutt_message */
487   OPTSEARCHINVALID,             /* (pseudo) used to invalidate the search pat */
488   OPTSIGNALSBLOCKED,            /* (pseudo) using by mutt_block_signals () */
489   OPTSYSSIGNALSBLOCKED,         /* (pseudo) using by mutt_block_signals_system () */
490   OPTNEEDRESORT,                /* (pseudo) used to force a re-sort */
491   OPTRESORTINIT,                /* (pseudo) used to force the next resort to be from scratch */
492   OPTVIEWATTACH,                /* (pseudo) signals that we are viewing attachments */
493   OPTFORCEREDRAWINDEX,          /* (pseudo) used to force a redraw in the main index */
494   OPTFORCEREDRAWPAGER,          /* (pseudo) used to force a redraw in the pager */
495   OPTSORTSUBTHREADS,            /* (pseudo) used when $sort_aux changes */
496   OPTNEEDRESCORE,               /* (pseudo) set when the `score' command is used */
497   OPTATTACHMSG,                 /* (pseudo) used by attach-message */
498   OPTHIDEREAD,                  /* (pseudo) whether or not hide read messages */
499   OPTKEEPQUIET,                 /* (pseudo) shut up the message and refresh
500                                  *          functions while we are executing an
501                                  *          external program.
502                                  */
503   OPTMENUCALLER,                /* (pseudo) tell menu to give caller a take */
504   OPTREDRAWTREE,                /* (pseudo) redraw the thread tree */
505   OPTPGPCHECKTRUST,             /* (pseudo) used by pgp_select_key () */
506   OPTDONTHANDLEPGPKEYS,         /* (pseudo) used to extract PGP keys */
507   OPTUNBUFFEREDINPUT,           /* (pseudo) don't use key buffer */
508
509 #ifdef USE_NNTP
510   OPTNEWS,                      /* (pseudo) used to change reader mode */
511   OPTNEWSSEND,                  /* (pseudo) used to change behavior when posting */
512   OPTNEWSCACHE,                 /* (pseudo) used to indicate if news cache exist */
513 #endif
514   OPTSHORTENHIERARCHY,          /* set when to shorten "hierarchies" in the sidebar */
515   OPTSIDEBARNEWMAILONLY,
516   OPTMAX
517 };
518
519 #define mutt_bit_alloc(n) calloc ((n + 7) / 8, sizeof (char))
520 #define mutt_bit_set(v,n) v[n/8] |= (1 << (n % 8))
521 #define mutt_bit_unset(v,n) v[n/8] &= ~(1 << (n % 8))
522 #define mutt_bit_toggle(v,n) v[n/8] ^= (1 << (n % 8))
523 #define mutt_bit_isset(v,n) (v[n/8] & (1 << (n % 8)))
524
525 #define set_option(x) mutt_bit_set(Options,x)
526 #define unset_option(x) mutt_bit_unset(Options,x)
527 #define toggle_option(x) mutt_bit_toggle(Options,x)
528 #define option(x) mutt_bit_isset(Options,x)
529
530 typedef struct spam_list_t {
531   rx_t *rx;
532   int nmatch;
533   char *template;
534   struct spam_list_t *next;
535 } SPAM_LIST;
536
537
538 #define mutt_new_spam_list() mem_calloc (1, sizeof (SPAM_LIST))
539 void mutt_free_spam_list (SPAM_LIST **);
540
541 int mutt_matches_ignore (const char *, LIST *);
542
543 void mutt_init (int, LIST *);
544
545 typedef struct envelope {
546   ADDRESS *return_path;
547   ADDRESS *from;
548   ADDRESS *to;
549   ADDRESS *cc;
550   ADDRESS *bcc;
551   ADDRESS *sender;
552   ADDRESS *reply_to;
553   ADDRESS *mail_followup_to;
554   char *list_post;              /* this stores a mailto URL, or nothing */
555   char *subject;
556   char *real_subj;              /* offset of the real subject */
557   char *message_id;
558   char *supersedes;
559   char *date;
560   char *x_label;
561   char *organization;
562 #ifdef USE_NNTP
563   char *newsgroups;
564   char *xref;
565   char *followup_to;
566   char *x_comment_to;
567 #endif
568   BUFFER *spam;
569   LIST *references;             /* message references (in reverse order) */
570   LIST *in_reply_to;            /* in-reply-to header content */
571   LIST *userhdrs;               /* user defined headers */
572   unsigned int irt_changed:1;   /* In-Reply-To changed to link/break threads */
573   unsigned int refs_changed:1;  /* References changed to break thread */
574 } ENVELOPE;
575
576 typedef struct parameter {
577   char *attribute;
578   char *value;
579   struct parameter *next;
580 } PARAMETER;
581
582 /* Information that helps in determing the Content-* of an attachment */
583 typedef struct content {
584   long hibin;                   /* 8-bit characters */
585   long lobin;                   /* unprintable 7-bit chars (eg., control chars) */
586   long crlf;                    /* '\r' and '\n' characters */
587   long ascii;                   /* number of ascii chars */
588   long linemax;                 /* length of the longest line in the file */
589   unsigned int space:1;         /* whitespace at the end of lines? */
590   unsigned int binary:1;        /* long lines, or CR not in CRLF pair */
591   unsigned int from:1;          /* has a line beginning with "From "? */
592   unsigned int dot:1;           /* has a line consisting of a single dot? */
593   unsigned int cr:1;            /* has CR, even when in a CRLF pair */
594 } CONTENT;
595
596 typedef struct body {
597   char *xtype;                  /* content-type if x-unknown */
598   char *subtype;                /* content-type subtype */
599   PARAMETER *parameter;         /* parameters of the content-type */
600   char *description;            /* content-description */
601   char *form_name;              /* Content-Disposition form-data name param */
602   long hdr_offset;              /* offset in stream where the headers begin.
603                                  * this info is used when invoking metamail,
604                                  * where we need to send the headers of the
605                                  * attachment
606                                  */
607   long offset;                  /* offset where the actual data begins */
608   long length;                  /* length (in bytes) of attachment */
609   char *filename;               /* when sending a message, this is the file
610                                  * to which this structure refers
611                                  */
612   char *d_filename;             /* filename to be used for the 
613                                  * content-disposition header.
614                                  * If NULL, filename is used 
615                                  * instead.
616                                  */
617   char *file_charset;           /* charset of attached file */
618   CONTENT *content;             /* structure used to store detailed info about
619                                  * the content of the attachment.  this is used
620                                  * to determine what content-transfer-encoding
621                                  * is required when sending mail.
622                                  */
623   struct body *next;            /* next attachment in the list */
624   struct body *parts;           /* parts of a multipart or message/rfc822 */
625   struct header *hdr;           /* header information for message/rfc822 */
626
627   struct attachptr *aptr;       /* Menu information, used in recvattach.c */
628
629   time_t stamp;                 /* time stamp of last
630                                  * encoding update.
631                                  */
632
633   unsigned int type:4;          /* content-type primary type */
634   unsigned int encoding:3;      /* content-transfer-encoding */
635   unsigned int disposition:2;   /* content-disposition */
636   unsigned int use_disp:1;      /* Content-Disposition uses filename= ? */
637   unsigned int unlink:1;        /* flag to indicate the the file named by
638                                  * "filename" should be unlink()ed before
639                                  * free()ing this structure
640                                  */
641   unsigned int tagged:1;
642   unsigned int deleted:1;       /* attachment marked for deletion */
643
644   unsigned int noconv:1;        /* don't do character set conversion */
645   unsigned int force_charset:1;
646   /* send mode: don't adjust the character
647    * set when in send-mode.
648    */
649   unsigned int is_signed_data:1;        /* A lot of MUAs don't indicate
650                                            S/MIME signed-data correctly,
651                                            e.g. they use foo.p7m even for
652                                            the name of signed data.  This
653                                            flag is used to keep track of
654                                            the actual message type.  It
655                                            gets set during the verification
656                                            (which is done if the encryption
657                                            try failed) and check by the
658                                            function to figure the type of
659                                            the message. */
660
661   unsigned int goodsig:1;       /* good cryptographic signature */
662   unsigned int warnsig:1;       /* maybe good signature */
663   unsigned int badsig:1;        /* bad cryptographic signature (needed to check encrypted s/mime-signatures) */
664
665   unsigned int collapsed:1;     /* used by recvattach */
666
667 } BODY;
668
669 typedef struct header {
670   unsigned int security:11;     /* bit 0-6: flags, bit 7,8: application.
671                                    see: crypt.h pgplib.h, smime.h */
672
673   unsigned int mime:1;          /* has a Mime-Version header? */
674   unsigned int flagged:1;       /* marked important? */
675   unsigned int tagged:1;
676   unsigned int appended:1;      /* has been saved */
677   unsigned int purged:1;        /* bypassing the trash folder */
678   unsigned int deleted:1;
679   unsigned int changed:1;
680   unsigned int attach_del:1;    /* has an attachment marked for deletion */
681   unsigned int old:1;
682   unsigned int read:1;
683   unsigned int expired:1;       /* already expired? */
684   unsigned int superseded:1;    /* got superseded? */
685   unsigned int replied:1;
686   unsigned int subject_changed:1;       /* used for threading */
687   unsigned int threaded:1;      /* used for threading */
688   unsigned int display_subject:1;       /* used for threading */
689   unsigned int recip_valid:1;   /* is_recipient is valid */
690   unsigned int active:1;        /* message is not to be removed */
691   unsigned int trash:1;         /* message is marked as trashed on disk.
692                                  * This flag is used by the maildir_trash
693                                  * option.
694                                  */
695
696   /* timezone of the sender of this message */
697   unsigned int zhours:5;
698   unsigned int zminutes:6;
699   unsigned int zoccident:1;
700
701   /* bits used for caching when searching */
702   unsigned int searched:1;
703   unsigned int matched:1;
704
705   /* the following are used to support collapsing threads  */
706   unsigned int collapsed:1;     /* is this message part of a collapsed thread? */
707   unsigned int limited:1;       /* is this message in a limited view?  */
708   size_t num_hidden;            /* number of hidden messages in this view */
709
710   short recipient;              /* user_is_recipient()'s return value, cached */
711
712   int pair;                     /* color-pair to use when displaying in the index */
713
714   time_t date_sent;             /* time when the message was sent (UTC) */
715   time_t received;              /* time when the message was placed in the mailbox */
716   long offset;                  /* where in the stream does this message begin? */
717   int lines;                    /* how many lines in the body of this message? */
718   int index;                    /* the absolute (unsorted) message number */
719   int msgno;                    /* number displayed to the user */
720   int virtual;                  /* virtual message number */
721   int score;
722   ENVELOPE *env;                /* envelope information */
723   BODY *content;                /* list of MIME parts */
724   char *path;
725 #ifdef USE_NNTP
726   int article_num;
727 #endif
728
729   char *tree;                   /* character string to print thread tree */
730   struct thread *thread;
731
732 #ifdef MIXMASTER
733   LIST *chain;
734 #endif
735
736 #ifdef USE_POP
737   int refno;                    /* message number on server */
738 #endif
739
740 #if defined USE_POP || defined USE_IMAP || defined USE_NNTP
741   void *data;                   /* driver-specific data */
742 #endif
743
744   char *maildir_flags;          /* unknown maildir flags */
745 } HEADER;
746
747 typedef struct thread {
748   unsigned int fake_thread:1;
749   unsigned int duplicate_thread:1;
750   unsigned int sort_children:1;
751   unsigned int check_subject:1;
752   unsigned int visible:1;
753   unsigned int deep:1;
754   unsigned int subtree_visible:2;
755   unsigned int next_subtree_visible:1;
756   struct thread *parent;
757   struct thread *child;
758   struct thread *next;
759   struct thread *prev;
760   HEADER *message;
761   HEADER *sort_key;
762 } THREAD;
763
764
765 /* flag to mutt_pattern_comp() */
766 #define M_FULL_MSG      1       /* enable body and header matching */
767
768 typedef enum {
769   M_MATCH_FULL_ADDRESS = 1
770 } pattern_exec_flag;
771
772 typedef struct pattern_t {
773   short op;
774   short not;
775   short alladdr;
776   int min;
777   int max;
778   struct pattern_t *next;
779   struct pattern_t *child;      /* arguments to logical op */
780   regex_t *rx;
781 } pattern_t;
782
783 typedef struct {
784   char *path;
785   FILE *fp;
786   time_t mtime;
787   time_t mtime_cur;             /* used with maildir folders */
788   off_t size;
789   off_t vsize;
790   char *pattern;                /* limit pattern string */
791   pattern_t *limit_pattern;     /* compiled limit pattern */
792   HEADER **hdrs;
793   HEADER *last_tag;             /* last tagged msg. used to link threads */
794   THREAD *tree;                 /* top of thread tree */
795   HASH *id_hash;                /* hash table by msg id */
796   HASH *subj_hash;              /* hash table by subject */
797   HASH *thread_hash;            /* hash table for threading */
798   int *v2r;                     /* mapping from virtual to real msgno */
799   int hdrmax;                   /* number of pointers in hdrs */
800   int msgcount;                 /* number of messages in the mailbox */
801   int vcount;                   /* the number of virtual messages */
802   int tagged;                   /* how many messages are tagged? */
803   int new;                      /* how many new messages? */
804   int unread;                   /* how many unread messages? */
805   int deleted;                  /* how many deleted messages */
806   int appended;                 /* how many saved messages? */
807   int flagged;                  /* how many flagged messages */
808   int msgnotreadyet;            /* which msg "new" in pager, -1 if none */
809 #if defined USE_POP || defined USE_IMAP || defined USE_NNTP
810   void *data;                   /* driver specific data */
811 #endif                          /* USE_IMAP */
812
813   short magic;                  /* mailbox type */
814
815 #ifdef USE_COMPRESSED
816   void *compressinfo;           /* compressed mbox module private data */
817   char *realpath;               /* path to compressed mailbox */
818 #endif                          /* USE_COMPRESSED */
819
820   unsigned int locked:1;        /* is the mailbox locked? */
821   unsigned int changed:1;       /* mailbox has been modified */
822   unsigned int readonly:1;      /* don't allow changes to the mailbox */
823   unsigned int dontwrite:1;     /* dont write the mailbox on close */
824   unsigned int append:1;        /* mailbox is opened in append mode */
825   unsigned int quiet:1;         /* inhibit status messages? */
826   unsigned int collapsed:1;     /* are all threads collapsed? */
827   unsigned int closing:1;       /* mailbox is being closed */
828   unsigned int counting:1;      /* do we just want to cound? */
829 } CONTEXT;
830
831 #include "protos.h"
832 #include "lib.h"
833 #include "globals.h"
834
835 #endif /* !_MUTT_H */