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