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