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