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