f0cf711e544107c2430beae46e77e87647dd298f
[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   OPT_POPDELETE,
239   OPT_POPRECONNECT,
240   OPT_POSTPONE,
241   OPT_PRINT,
242   OPT_QUIT,
243   OPT_REPLYTO,
244   OPT_RECALL,
245 #if defined(USE_SSL) || defined(USE_GNUTLS)
246   OPT_SSLSTARTTLS,
247 #endif
248   OPT_SUBJECT,
249   OPT_VERIFYSIG,                /* verify PGP signatures */
250   OPT_LISTREPLY,
251 #ifdef USE_NNTP
252   OPT_TOMODERATED,
253   OPT_NNTPRECONNECT,
254   OPT_CATCHUP,
255   OPT_FOLLOWUPTOPOSTER,
256 #endif                          /* USE_NNTP */
257
258   /* THIS MUST BE THE LAST VALUE. */
259   OPT_MAX
260 };
261
262 /* flags to ci_send_message() */
263 #define SENDREPLY       (1<<0)
264 #define SENDGROUPREPLY  (1<<1)
265 #define SENDLISTREPLY   (1<<2)
266 #define SENDFORWARD     (1<<3)
267 #define SENDPOSTPONED   (1<<4)
268 #define SENDBATCH       (1<<5)
269 #define SENDMAILX       (1<<6)
270 #define SENDKEY         (1<<7)
271 #define SENDRESEND      (1<<8)
272 #define SENDNEWS        (1<<9)
273
274 /* flags to _mutt_select_file() */
275 #define M_SEL_BUFFY     (1<<0)
276 #define M_SEL_MULTI     (1<<1)
277 #define M_SEL_FOLDER    (1<<2)
278
279 /* flags for parse_spam_list */
280 #define M_SPAM          1
281 #define M_NOSPAM        2
282
283 /* boolean vars */
284 enum {
285   OPTALLOW8BIT,
286   OPTALLOWANSI,
287   OPTARROWCURSOR,
288   OPTASCIICHARS,
289   OPTASKBCC,
290   OPTASKCC,
291   OPTASKFOLLOWUP,
292   OPTASKXCOMMENTTO,
293   OPTATTACHSPLIT,
294   OPTAUTOEDIT,
295   OPTAUTOTAG,
296   OPTBEEP,
297   OPTBEEPNEW,
298   OPTBOUNCEDELIVERED,
299   OPTBRAILLEFRIENDLY,
300   OPTCHECKNEW,
301   OPTCOLLAPSEUNREAD,
302   OPTCONFIRMAPPEND,
303   OPTCONFIRMCREATE,
304   OPTCOUNTATTACH,
305   OPTDELETEUNTAG,
306   OPTDELSP,
307   OPTDIGESTCOLLAPSE,
308   OPTDUPTHREADS,
309   OPTEDITHDRS,
310   OPTENCODEFROM,
311   OPTENVFROM,
312   OPTFASTREPLY,
313   OPTFCCATTACH,
314   OPTFCCCLEAR,
315   OPTFOLLOWUPTO,
316   OPTFORCEBUFFYCHECK,
317   OPTFORCENAME,
318   OPTFORWDECODE,
319   OPTFORWQUOTE,
320 #ifdef USE_HCACHE
321   OPTHCACHEVERIFY,
322 #if HAVE_QDBM
323   OPTHCACHECOMPRESS,
324 #endif /* HAVE_QDBM */
325 #endif
326   OPTHDRS,
327   OPTHEADER,
328   OPTHELP,
329   OPTHIDDENHOST,
330   OPTHIDELIMITED,
331   OPTHIDEMISSING,
332   OPTHIDETHREADSUBJECT,
333   OPTHIDETOPLIMITED,
334   OPTHIDETOPMISSING,
335   OPTIGNORELISTREPLYTO,
336 #ifdef USE_IMAP
337   OPTIMAPCHECKSUBSCRIBED,
338   OPTIMAPLSUB,
339   OPTIMAPPASSIVE,
340   OPTIMAPPEEK,
341   OPTIMAPSERVERNOISE,
342 #endif
343 #if defined(USE_SSL) || defined(USE_GNUTLS)
344 # ifndef USE_GNUTLS
345   OPTSSLSYSTEMCERTS,
346   OPTSSLV2,
347 # endif /* !USE_GNUTLS */
348   OPTSSLV3,
349   OPTTLSV1,
350   OPTSSLFORCETLS,
351 #endif /* USE_SSL || USE_GNUTLS */
352   OPTIMPLICITAUTOVIEW,
353   OPTINCLUDEONLYFIRST,
354   OPTKEEPFLAGGED,
355   OPTMAILCAPSANITIZE,
356   OPTMAILDIRTRASH,
357   OPTMARKERS,
358   OPTMARKOLD,
359   OPTMBOXPANE,
360   OPTMENUSCROLL,                /* scroll menu instead of implicit next-page */
361   OPTMENUMOVEOFF,
362   OPTMETAKEY,                   /* interpret ALT-x as ESC-x */
363   OPTMETOO,
364   OPTMHPURGE,
365   OPTMIMEFORWDECODE,
366 #ifdef USE_NNTP
367   OPTMIMESUBJECT,               /* encode subject line with RFC2047 */
368 #endif
369   OPTNARROWTREE,
370   OPTPAGERSTOP,
371   OPTPIPEDECODE,
372   OPTPIPESPLIT,
373   OPTPOPAUTHTRYALL,
374   OPTPOPLAST,
375   OPTPRINTDECODE,
376   OPTPRINTSPLIT,
377   OPTPROMPTAFTER,
378   OPTQUOTEEMPTY,
379   OPTQUOTEQUOTED,
380   OPTREADONLY,
381   OPTREPLYSELF,
382   OPTRESOLVE,
383   OPTREVALIAS,
384   OPTREVNAME,
385   OPTREVREAL,
386   OPTRFC2047PARAMS,
387   OPTSAVEADDRESS,
388   OPTSAVEEMPTY,
389   OPTSAVENAME,
390   OPTSCORE,
391   OPTSIGDASHES,
392   OPTSIGONTOP,
393   OPTSORTRE,
394   OPTSPAMSEP,
395   OPTSTATUSONTOP,
396   OPTSTRICTMAILTO,
397   OPTSTRICTMIME,
398   OPTSTRICTTHREADS,
399   OPTSTRIPWAS,
400   OPTSTUFFQUOTED,
401   OPTSUSPEND,
402   OPTTEXTFLOWED,
403   OPTTHOROUGHSRC,
404   OPTTHREADRECEIVED,
405   OPTTILDE,
406   OPTUNCOLLAPSEJUMP,
407   OPTUSE8BITMIME,
408   OPTUSEDOMAIN,
409   OPTUSEFROM,
410   OPTUSEGPGAGENT,
411 #ifdef HAVE_LIBIDN
412   OPTUSEIDN,
413 #endif
414 #ifdef HAVE_GETADDRINFO
415   OPTUSEIPV6,
416 #endif
417   OPTWAITKEY,
418   OPTWEED,
419   OPTWRAP,
420   OPTWRAPSEARCH,
421   OPTWRITEBCC,                  /* write out a bcc header? */
422   OPTXMAILER,
423   OPTXMAILTO,                   /* 1 if $edit_header is forcebly set */
424   OPTXTERMSETTITLES,
425
426   OPTCRYPTUSEGPGME,
427
428   /* PGP options */
429
430   OPTCRYPTAUTOSIGN,
431   OPTCRYPTAUTOENCRYPT,
432   OPTCRYPTAUTOPGP,
433   OPTCRYPTAUTOSMIME,
434   OPTCRYPTREPLYENCRYPT,
435   OPTCRYPTREPLYSIGN,
436   OPTCRYPTREPLYSIGNENCRYPTED,
437   OPTCRYPTTIMESTAMP,
438   OPTSMIMEISDEFAULT,
439   OPTASKCERTLABEL,
440   OPTSDEFAULTDECRYPTKEY,
441   OPTPGPIGNORESUB,
442   OPTPGPCHECKEXIT,
443   OPTPGPLONGIDS,
444   OPTPGPAUTODEC,
445 #if 0
446   OPTPGPENCRYPTSELF,
447 #endif
448   OPTPGPRETAINABLESIG,
449   OPTPGPSTRICTENC,
450   OPTFORWDECRYPT,
451   OPTPGPSHOWUNUSABLE,
452   OPTPGPAUTOINLINE,
453   OPTPGPREPLYINLINE,
454
455   /* news options */
456
457 #ifdef USE_NNTP
458   OPTSHOWNEWNEWS,
459   OPTSHOWONLYUNREAD,
460   OPTSAVEUNSUB,
461   OPTLOADDESC,
462   OPTXCOMMENTTO,
463 #endif                          /* USE_NNTP */
464
465   /* pseudo options */
466
467   OPTAUXSORT,                   /* (pseudo) using auxillary sort function */
468   OPTFORCEREFRESH,              /* (pseudo) refresh even during macros */
469   OPTLOCALES,                   /* (pseudo) set if user has valid locale definition */
470   OPTNOCURSES,                  /* (pseudo) when sending in batch mode */
471   OPTNEEDREDRAW,                /* (pseudo) to notify caller of a submenu */
472   OPTSEARCHREVERSE,             /* (pseudo) used by ci_search_command */
473   OPTMSGERR,                    /* (pseudo) used by mutt_error/mutt_message */
474   OPTSEARCHINVALID,             /* (pseudo) used to invalidate the search pat */
475   OPTSIGNALSBLOCKED,            /* (pseudo) using by mutt_block_signals () */
476   OPTSYSSIGNALSBLOCKED,         /* (pseudo) using by mutt_block_signals_system () */
477   OPTNEEDRESORT,                /* (pseudo) used to force a re-sort */
478   OPTRESORTINIT,                /* (pseudo) used to force the next resort to be from scratch */
479   OPTVIEWATTACH,                /* (pseudo) signals that we are viewing attachments */
480   OPTFORCEREDRAWINDEX,          /* (pseudo) used to force a redraw in the main index */
481   OPTFORCEREDRAWPAGER,          /* (pseudo) used to force a redraw in the pager */
482   OPTSORTSUBTHREADS,            /* (pseudo) used when $sort_aux changes */
483   OPTNEEDRESCORE,               /* (pseudo) set when the `score' command is used */
484   OPTATTACHMSG,                 /* (pseudo) used by attach-message */
485   OPTHIDEREAD,                  /* (pseudo) whether or not hide read messages */
486   OPTKEEPQUIET,                 /* (pseudo) shut up the message and refresh
487                                  *          functions while we are executing an
488                                  *          external program.
489                                  */
490   OPTMENUCALLER,                /* (pseudo) tell menu to give caller a take */
491   OPTREDRAWTREE,                /* (pseudo) redraw the thread tree */
492   OPTPGPCHECKTRUST,             /* (pseudo) used by pgp_select_key () */
493   OPTDONTHANDLEPGPKEYS,         /* (pseudo) used to extract PGP keys */
494   OPTUNBUFFEREDINPUT,           /* (pseudo) don't use key buffer */
495
496 #ifdef USE_NNTP
497   OPTNEWS,                      /* (pseudo) used to change reader mode */
498   OPTNEWSSEND,                  /* (pseudo) used to change behavior when posting */
499   OPTNEWSCACHE,                 /* (pseudo) used to indicate if news cache exist */
500 #endif
501   OPTSHORTENHIERARCHY,          /* set when to shorten "hierarchies" in the sidebar */
502   OPTSIDEBARNEWMAILONLY,
503   OPTMAX
504 };
505
506 #define mutt_bit_alloc(n) calloc ((n + 7) / 8, sizeof (char))
507 #define mutt_bit_set(v,n) v[n/8] |= (1 << (n % 8))
508 #define mutt_bit_unset(v,n) v[n/8] &= ~(1 << (n % 8))
509 #define mutt_bit_toggle(v,n) v[n/8] ^= (1 << (n % 8))
510 #define mutt_bit_isset(v,n) (v[n/8] & (1 << (n % 8)))
511
512 #define set_option(x) mutt_bit_set(Options,x)
513 #define unset_option(x) mutt_bit_unset(Options,x)
514 #define toggle_option(x) mutt_bit_toggle(Options,x)
515 #define option(x) mutt_bit_isset(Options,x)
516
517 typedef struct spam_list_t {
518   rx_t *rx;
519   int nmatch;
520   char *template;
521   struct spam_list_t *next;
522 } SPAM_LIST;
523
524
525 #define mutt_new_spam_list() p_new(SPAM_LIST, 1)
526 void mutt_free_spam_list (SPAM_LIST **);
527
528 int mutt_matches_ignore (const char *, LIST *);
529
530 void mutt_init (int, LIST *);
531
532 /* Information that helps in determing the Content-* of an attachment */
533 typedef struct content {
534   long hibin;                   /* 8-bit characters */
535   long lobin;                   /* unprintable 7-bit chars (eg., control chars) */
536   long crlf;                    /* '\r' and '\n' characters */
537   long ascii;                   /* number of ascii chars */
538   long linemax;                 /* length of the longest line in the file */
539   unsigned int space:1;         /* whitespace at the end of lines? */
540   unsigned int binary:1;        /* long lines, or CR not in CRLF pair */
541   unsigned int from:1;          /* has a line beginning with "From "? */
542   unsigned int dot:1;           /* has a line consisting of a single dot? */
543   unsigned int cr:1;            /* has CR, even when in a CRLF pair */
544 } CONTENT;
545
546 typedef struct body {
547   char *xtype;                  /* content-type if x-unknown */
548   char *subtype;                /* content-type subtype */
549   PARAMETER *parameter;         /* parameters of the content-type */
550   char *description;            /* content-description */
551   char *form_name;              /* Content-Disposition form-data name param */
552   off_t hdr_offset;             /* offset in stream where the headers begin.
553                                  * this info is used when invoking metamail,
554                                  * where we need to send the headers of the
555                                  * attachment
556                                  */
557   off_t offset;                 /* offset where the actual data begins */
558   off_t length;                 /* length (in bytes) of attachment */
559   char *filename;               /* when sending a message, this is the file
560                                  * to which this structure refers
561                                  */
562   char *d_filename;             /* filename to be used for the 
563                                  * content-disposition header.
564                                  * If NULL, filename is used 
565                                  * instead.
566                                  */
567   char *file_charset;           /* charset of attached file */
568   CONTENT *content;             /* structure used to store detailed info about
569                                  * the content of the attachment.  this is used
570                                  * to determine what content-transfer-encoding
571                                  * is required when sending mail.
572                                  */
573   struct body *next;            /* next attachment in the list */
574   struct body *parts;           /* parts of a multipart or message/rfc822 */
575   struct header *hdr;           /* header information for message/rfc822 */
576
577   struct attachptr *aptr;       /* Menu information, used in recvattach.c */
578
579   signed short attach_count;
580
581   time_t stamp;                 /* time stamp of last
582                                  * encoding update.
583                                  */
584
585   unsigned int type:4;          /* content-type primary type */
586   unsigned int encoding:3;      /* content-transfer-encoding */
587   unsigned int disposition:2;   /* content-disposition */
588   unsigned int use_disp:1;      /* Content-Disposition uses filename= ? */
589   unsigned int unlink:1;        /* flag to indicate the the file named by
590                                  * "filename" should be unlink()ed before
591                                  * free()ing this structure
592                                  */
593   unsigned int tagged:1;
594   unsigned int deleted:1;       /* attachment marked for deletion */
595
596   unsigned int noconv:1;        /* don't do character set conversion */
597   unsigned int force_charset:1;
598   /* send mode: don't adjust the character
599    * set when in send-mode.
600    */
601   unsigned int is_signed_data:1;        /* A lot of MUAs don't indicate
602                                            S/MIME signed-data correctly,
603                                            e.g. they use foo.p7m even for
604                                            the name of signed data.  This
605                                            flag is used to keep track of
606                                            the actual message type.  It
607                                            gets set during the verification
608                                            (which is done if the encryption
609                                            try failed) and check by the
610                                            function to figure the type of
611                                            the message. */
612
613   unsigned int goodsig:1;       /* good cryptographic signature */
614   unsigned int warnsig:1;       /* maybe good signature */
615   unsigned int badsig:1;        /* bad cryptographic signature (needed to check encrypted s/mime-signatures) */
616
617   unsigned int collapsed:1;     /* used by recvattach */
618   unsigned int attach_qualifies:1;
619
620 } BODY;
621
622 typedef struct header {
623   unsigned int security:11;     /* bit 0-6: flags, bit 7,8: application.
624                                    see: crypt.h pgplib.h, smime.h */
625
626   unsigned int mime:1;          /* has a MIME-Version header? */
627   unsigned int flagged:1;       /* marked important? */
628   unsigned int tagged:1;
629   unsigned int appended:1;      /* has been saved */
630   unsigned int purged:1;        /* bypassing the trash folder */
631   unsigned int deleted:1;
632   unsigned int changed:1;
633   unsigned int attach_del:1;    /* has an attachment marked for deletion */
634   unsigned int old:1;
635   unsigned int read:1;
636   unsigned int expired:1;       /* already expired? */
637   unsigned int superseded:1;    /* got superseded? */
638   unsigned int replied:1;
639   unsigned int subject_changed:1;       /* used for threading */
640   unsigned int threaded:1;      /* used for threading */
641   unsigned int display_subject:1;       /* used for threading */
642   unsigned int recip_valid:1;   /* is_recipient is valid */
643   unsigned int active:1;        /* message is not to be removed */
644   unsigned int trash:1;         /* message is marked as trashed on disk.
645                                  * This flag is used by the maildir_trash
646                                  * option.
647                                  */
648
649   /* timezone of the sender of this message */
650   unsigned int zhours:5;
651   unsigned int zminutes:6;
652   unsigned int zoccident:1;
653
654   /* bits used for caching when searching */
655   unsigned int searched:1;
656   unsigned int matched:1;
657
658   /* tells whether the attach count is valid */
659   unsigned int attach_valid:1;
660
661   /* the following are used to support collapsing threads  */
662   unsigned int collapsed:1;     /* is this message part of a collapsed thread? */
663   unsigned int limited:1;       /* is this message in a limited view?  */
664   size_t num_hidden;            /* number of hidden messages in this view */
665
666   short recipient;              /* user_is_recipient()'s return value, cached */
667
668   int pair;                     /* color-pair to use when displaying in the index */
669
670   time_t date_sent;             /* time when the message was sent (UTC) */
671   time_t received;              /* time when the message was placed in the mailbox */
672   off_t offset;                 /* where in the stream does this message begin? */
673   int lines;                    /* how many lines in the body of this message? */
674   int index;                    /* the absolute (unsorted) message number */
675   int msgno;                    /* number displayed to the user */
676   int virtual;                  /* virtual message number */
677   int score;
678   ENVELOPE *env;                /* envelope information */
679   BODY *content;                /* list of MIME parts */
680   char *path;
681 #ifdef USE_NNTP
682   int article_num;
683 #endif
684
685   char *tree;                   /* character string to print thread tree */
686   struct thread *thread;
687
688   short attach_total;
689
690 #ifdef MIXMASTER
691   LIST *chain;
692 #endif
693
694   int refno;                    /* message number on server */
695   void *data;                   /* driver-specific data */
696
697   char *maildir_flags;          /* unknown maildir flags */
698 } HEADER;
699
700 typedef struct thread {
701   unsigned int fake_thread:1;
702   unsigned int duplicate_thread:1;
703   unsigned int sort_children:1;
704   unsigned int check_subject:1;
705   unsigned int visible:1;
706   unsigned int deep:1;
707   unsigned int subtree_visible:2;
708   unsigned int next_subtree_visible:1;
709   struct thread *parent;
710   struct thread *child;
711   struct thread *next;
712   struct thread *prev;
713   HEADER *message;
714   HEADER *sort_key;
715 } THREAD;
716
717
718 /* flag to mutt_pattern_comp() */
719 #define M_FULL_MSG      (1<<0)       /* enable body and header matching */
720
721 typedef enum {
722   M_MATCH_FULL_ADDRESS = 1
723 } pattern_exec_flag;
724
725 typedef struct pattern_t {
726   short op;
727   unsigned int not : 1;
728   unsigned int alladdr : 1;
729   unsigned int stringmatch : 1;
730   int min;
731   int max;
732   struct pattern_t *next;
733   struct pattern_t *child;      /* arguments to logical op */
734   char* str;
735   regex_t *rx;
736 } pattern_t;
737
738 typedef struct {
739   char *path;
740   FILE *fp;
741   time_t mtime;
742   time_t mtime_cur;             /* used with maildir folders */
743   off_t size;
744   off_t vsize;
745   char *pattern;                /* limit pattern string */
746   pattern_t *limit_pattern;     /* compiled limit pattern */
747   HEADER **hdrs;
748   HEADER *last_tag;             /* last tagged msg. used to link threads */
749   THREAD *tree;                 /* top of thread tree */
750   HASH *id_hash;                /* hash table by msg id */
751   HASH *subj_hash;              /* hash table by subject */
752   HASH *thread_hash;            /* hash table for threading */
753   int *v2r;                     /* mapping from virtual to real msgno */
754   int hdrmax;                   /* number of pointers in hdrs */
755   int msgcount;                 /* number of messages in the mailbox */
756   int vcount;                   /* the number of virtual messages */
757   int tagged;                   /* how many messages are tagged? */
758   int new;                      /* how many new messages? */
759   int unread;                   /* how many unread messages? */
760   int deleted;                  /* how many deleted messages */
761   int appended;                 /* how many saved messages? */
762   int flagged;                  /* how many flagged messages */
763   int msgnotreadyet;            /* which msg "new" in pager, -1 if none */
764   void *data;                   /* driver specific data */
765
766   short magic;                  /* mailbox type */
767
768   void *compressinfo;           /* compressed mbox module private data */
769   char *realpath;               /* path to compressed mailbox */
770
771   unsigned int locked:1;        /* is the mailbox locked? */
772   unsigned int changed:1;       /* mailbox has been modified */
773   unsigned int readonly:1;      /* don't allow changes to the mailbox */
774   unsigned int dontwrite:1;     /* dont write the mailbox on close */
775   unsigned int append:1;        /* mailbox is opened in append mode */
776   unsigned int quiet:1;         /* inhibit status messages? */
777   unsigned int collapsed:1;     /* are all threads collapsed? */
778   unsigned int closing:1;       /* mailbox is being closed */
779   unsigned int counting:1;      /* do we just want to cound? */
780 } CONTEXT;
781
782 /* for attachment counter */
783 typedef struct {
784   char *major;
785   int major_int;
786   const char *minor;
787   regex_t minor_rx;
788 } ATTACH_MATCH;
789
790 /* Flags for mutt_count_body_parts() */
791 #define M_PARTS_TOPLEVEL (1<<0) /* is the top-level part */
792 #define M_PARTS_RECOUNT (1<<1) /* force recount */
793
794 #include "protos.h"
795 #include "lib.h"
796 #include "globals.h"
797
798 #endif /* !_MUTT_H */