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