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