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