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 "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   OPTCHECKNEW,
346   OPTCOLLAPSEUNREAD,
347   OPTCONFIRMAPPEND,
348   OPTCONFIRMCREATE,
349   OPTDELETEUNTAG,
350   OPTDIGESTCOLLAPSE,
351   OPTDUPTHREADS,
352   OPTEDITHDRS,
353   OPTENCODEFROM,
354   OPTENVFROM,
355   OPTFASTREPLY,
356   OPTFCCATTACH,
357   OPTFCCCLEAR,
358   OPTFOLLOWUPTO,
359   OPTFORCEBUFFYCHECK,
360   OPTFORCENAME,
361   OPTFORWDECODE,
362   OPTFORWQUOTE,
363 #if USE_HCACHE
364   OPTHCACHEVERIFY,
365 #if HAVE_QDBM
366   OPTHCACHECOMPRESS,
367 #endif /* HAVE_QDBM */
368 #endif
369   OPTHDRS,
370   OPTHEADER,
371   OPTHELP,
372   OPTHIDDENHOST,
373   OPTHIDELIMITED,
374   OPTHIDEMISSING,
375   OPTHIDETHREADSUBJECT,
376   OPTHIDETOPLIMITED,
377   OPTHIDETOPMISSING,
378   OPTIGNORELISTREPLYTO,
379 #ifdef USE_IMAP
380   OPTIMAPLSUB,
381   OPTIMAPPASSIVE,
382   OPTIMAPPEEK,
383   OPTIMAPSERVERNOISE,
384 # if defined(USE_SSL) || defined(USE_GNUTLS)
385   OPTIMAPFORCESSL,
386 # endif
387 #endif
388 #if defined(USE_SSL) || defined(USE_NSS) || defined(USE_GNUTLS)
389 # ifndef USE_GNUTLS
390   OPTSSLV2,
391 # endif
392   OPTSSLV3,
393   OPTTLSV1,
394 # ifndef USE_GNUTLS
395   OPTSSLSYSTEMCERTS,
396 # endif
397 #endif
398   OPTIMPLICITAUTOVIEW,
399   OPTINCLUDEONLYFIRST,
400   OPTKEEPFLAGGED,
401   OPTMAILCAPSANITIZE,
402   OPTMAILDIRTRASH,
403   OPTMARKERS,
404   OPTMARKOLD,
405   OPTMBOXPANE,
406   OPTMENUSCROLL,                /* scroll menu instead of implicit next-page */
407   OPTMENUMOVEOFF,
408   OPTMETAKEY,                   /* interpret ALT-x as ESC-x */
409   OPTMETOO,
410   OPTMHPURGE,
411   OPTMIMEFORWDECODE,
412 #ifdef USE_NNTP
413   OPTMIMESUBJECT,               /* encode subject line with RFC2047 */
414 #endif
415   OPTNARROWTREE,
416   OPTPAGERSTOP,
417   OPTPIPEDECODE,
418   OPTPIPESPLIT,
419 #ifdef USE_POP
420   OPTPOPAUTHTRYALL,
421   OPTPOPLAST,
422 #endif
423   OPTPRINTDECODE,
424   OPTPRINTSPLIT,
425   OPTPROMPTAFTER,
426   OPTQUOTEEMPTY,
427   OPTQUOTEQUOTED,
428   OPTREADONLY,
429   OPTREPLYSELF,
430   OPTRESOLVE,
431   OPTREVALIAS,
432   OPTREVNAME,
433   OPTREVREAL,
434   OPTRFC2047PARAMS,
435   OPTSAVEADDRESS,
436   OPTSAVEEMPTY,
437   OPTSAVENAME,
438   OPTSCORE,
439   OPTSIGDASHES,
440   OPTSIGONTOP,
441   OPTSORTRE,
442   OPTSPAMSEP,
443   OPTSTATUSONTOP,
444   OPTSTRICTMIME,
445   OPTSTRICTTHREADS,
446   OPTSTRIPWAS,
447   OPTSTUFFQUOTED,
448   OPTSUSPEND,
449   OPTTEXTFLOWED,
450   OPTTHOROUGHSRC,
451   OPTTHREADRECEIVED,
452   OPTTILDE,
453   OPTUNCOLLAPSEJUMP,
454   OPTUSE8BITMIME,
455   OPTUSEDOMAIN,
456   OPTUSEFROM,
457   OPTUSEGPGAGENT,
458 #ifdef HAVE_LIBIDN
459   OPTUSEIDN,
460 #endif
461 #ifdef HAVE_GETADDRINFO
462   OPTUSEIPV6,
463 #endif
464   OPTWAITKEY,
465   OPTWEED,
466   OPTWRAP,
467   OPTWRAPSEARCH,
468   OPTWRITEBCC,                  /* write out a bcc header? */
469   OPTXMAILER,
470   OPTXTERMSETTITLES,
471
472   OPTCRYPTUSEGPGME,
473
474   /* PGP options */
475
476   OPTCRYPTAUTOSIGN,
477   OPTCRYPTAUTOENCRYPT,
478   OPTCRYPTAUTOPGP,
479   OPTCRYPTAUTOSMIME,
480   OPTCRYPTREPLYENCRYPT,
481   OPTCRYPTREPLYSIGN,
482   OPTCRYPTREPLYSIGNENCRYPTED,
483   OPTCRYPTTIMESTAMP,
484   OPTSMIMEISDEFAULT,
485   OPTASKCERTLABEL,
486   OPTSDEFAULTDECRYPTKEY,
487   OPTPGPIGNORESUB,
488   OPTPGPCHECKEXIT,
489   OPTPGPLONGIDS,
490   OPTPGPAUTODEC,
491 #if 0
492   OPTPGPENCRYPTSELF,
493 #endif
494   OPTPGPRETAINABLESIG,
495   OPTPGPSTRICTENC,
496   OPTFORWDECRYPT,
497   OPTPGPSHOWUNUSABLE,
498   OPTPGPAUTOINLINE,
499   OPTPGPREPLYINLINE,
500
501   /* news options */
502
503 #ifdef USE_NNTP
504   OPTSHOWNEWNEWS,
505   OPTSHOWONLYUNREAD,
506   OPTSAVEUNSUB,
507   OPTLOADDESC,
508   OPTXCOMMENTTO,
509 #endif                          /* USE_NNTP */
510
511   /* pseudo options */
512
513   OPTAUXSORT,                   /* (pseudo) using auxillary sort function */
514   OPTFORCEREFRESH,              /* (pseudo) refresh even during macros */
515   OPTLOCALES,                   /* (pseudo) set if user has valid locale definition */
516   OPTNOCURSES,                  /* (pseudo) when sending in batch mode */
517   OPTNEEDREDRAW,                /* (pseudo) to notify caller of a submenu */
518   OPTSEARCHREVERSE,             /* (pseudo) used by ci_search_command */
519   OPTMSGERR,                    /* (pseudo) used by mutt_error/mutt_message */
520   OPTSEARCHINVALID,             /* (pseudo) used to invalidate the search pat */
521   OPTSIGNALSBLOCKED,            /* (pseudo) using by mutt_block_signals () */
522   OPTSYSSIGNALSBLOCKED,         /* (pseudo) using by mutt_block_signals_system () */
523   OPTNEEDRESORT,                /* (pseudo) used to force a re-sort */
524   OPTRESORTINIT,                /* (pseudo) used to force the next resort to be from scratch */
525   OPTVIEWATTACH,                /* (pseudo) signals that we are viewing attachments */
526   OPTFORCEREDRAWINDEX,          /* (pseudo) used to force a redraw in the main index */
527   OPTFORCEREDRAWPAGER,          /* (pseudo) used to force a redraw in the pager */
528   OPTSORTSUBTHREADS,            /* (pseudo) used when $sort_aux changes */
529   OPTNEEDRESCORE,               /* (pseudo) set when the `score' command is used */
530   OPTATTACHMSG,                 /* (pseudo) used by attach-message */
531   OPTHIDEREAD,                  /* (pseudo) whether or not hide read messages */
532   OPTKEEPQUIET,                 /* (pseudo) shut up the message and refresh
533                                  *          functions while we are executing an
534                                  *          external program.
535                                  */
536   OPTMENUCALLER,                /* (pseudo) tell menu to give caller a take */
537   OPTREDRAWTREE,                /* (pseudo) redraw the thread tree */
538   OPTPGPCHECKTRUST,             /* (pseudo) used by pgp_select_key () */
539   OPTDONTHANDLEPGPKEYS,         /* (pseudo) used to extract PGP keys */
540   OPTUNBUFFEREDINPUT,           /* (pseudo) don't use key buffer */
541
542 #ifdef USE_NNTP
543   OPTNEWS,                      /* (pseudo) used to change reader mode */
544   OPTNEWSSEND,                  /* (pseudo) used to change behavior when posting */
545   OPTNEWSCACHE,                 /* (pseudo) used to indicate if news cache exist */
546 #endif
547   OPTSHORTENHIERARCHY,          /* set when to shorten "hierarchies" in the sidebar */
548   OPTSIDEBARNEWMAILONLY,
549   OPTMAX
550 };
551
552 #define mutt_bit_alloc(n) calloc ((n + 7) / 8, sizeof (char))
553 #define mutt_bit_set(v,n) v[n/8] |= (1 << (n % 8))
554 #define mutt_bit_unset(v,n) v[n/8] &= ~(1 << (n % 8))
555 #define mutt_bit_toggle(v,n) v[n/8] ^= (1 << (n % 8))
556 #define mutt_bit_isset(v,n) (v[n/8] & (1 << (n % 8)))
557
558 #define set_option(x) mutt_bit_set(Options,x)
559 #define unset_option(x) mutt_bit_unset(Options,x)
560 #define toggle_option(x) mutt_bit_toggle(Options,x)
561 #define option(x) mutt_bit_isset(Options,x)
562
563 /* Exit values used in send_msg() */
564 #define S_ERR 127
565 #define S_BKG 126
566
567 typedef struct list_t {
568   char *data;
569   struct list_t *next;
570 } LIST;
571
572 typedef struct spam_list_t {
573   rx_t *rx;
574   int nmatch;
575   char *template;
576   struct spam_list_t *next;
577 } SPAM_LIST;
578
579
580 #define mutt_new_list() safe_calloc (1, sizeof (LIST))
581 #define mutt_new_spam_list() safe_calloc (1, sizeof (SPAM_LIST))
582 void mutt_free_list (LIST **);
583 void mutt_free_spam_list (SPAM_LIST **);
584 LIST *mutt_copy_list (LIST *);
585 int mutt_matches_ignore (const char *, LIST *);
586
587 /* add an element to a list */
588 LIST *mutt_add_list (LIST *, const char *);
589
590 void mutt_init (int, LIST *);
591
592 typedef struct alias {
593   struct alias *self;           /* XXX - ugly hack */
594   char *name;
595   ADDRESS *addr;
596   struct alias *next;
597   short tagged;
598   short del;
599   short num;
600 } ALIAS;
601
602 typedef struct envelope {
603   ADDRESS *return_path;
604   ADDRESS *from;
605   ADDRESS *to;
606   ADDRESS *cc;
607   ADDRESS *bcc;
608   ADDRESS *sender;
609   ADDRESS *reply_to;
610   ADDRESS *mail_followup_to;
611   char *list_post;              /* this stores a mailto URL, or nothing */
612   char *subject;
613   char *real_subj;              /* offset of the real subject */
614   char *message_id;
615   char *supersedes;
616   char *date;
617   char *x_label;
618   char *organization;
619 #ifdef USE_NNTP
620   char *newsgroups;
621   char *xref;
622   char *followup_to;
623   char *x_comment_to;
624 #endif
625   BUFFER *spam;
626   LIST *references;             /* message references (in reverse order) */
627   LIST *in_reply_to;            /* in-reply-to header content */
628   LIST *userhdrs;               /* user defined headers */
629 } ENVELOPE;
630
631 typedef struct parameter {
632   char *attribute;
633   char *value;
634   struct parameter *next;
635 } PARAMETER;
636
637 /* Information that helps in determing the Content-* of an attachment */
638 typedef struct content {
639   long hibin;                   /* 8-bit characters */
640   long lobin;                   /* unprintable 7-bit chars (eg., control chars) */
641   long crlf;                    /* '\r' and '\n' characters */
642   long ascii;                   /* number of ascii chars */
643   long linemax;                 /* length of the longest line in the file */
644   unsigned int space:1;         /* whitespace at the end of lines? */
645   unsigned int binary:1;        /* long lines, or CR not in CRLF pair */
646   unsigned int from:1;          /* has a line beginning with "From "? */
647   unsigned int dot:1;           /* has a line consisting of a single dot? */
648   unsigned int cr:1;            /* has CR, even when in a CRLF pair */
649 } CONTENT;
650
651 typedef struct body {
652   char *xtype;                  /* content-type if x-unknown */
653   char *subtype;                /* content-type subtype */
654   PARAMETER *parameter;         /* parameters of the content-type */
655   char *description;            /* content-description */
656   char *form_name;              /* Content-Disposition form-data name param */
657   long hdr_offset;              /* offset in stream where the headers begin.
658                                  * this info is used when invoking metamail,
659                                  * where we need to send the headers of the
660                                  * attachment
661                                  */
662   long offset;                  /* offset where the actual data begins */
663   long length;                  /* length (in bytes) of attachment */
664   char *filename;               /* when sending a message, this is the file
665                                  * to which this structure refers
666                                  */
667   char *d_filename;             /* filename to be used for the 
668                                  * content-disposition header.
669                                  * If NULL, filename is used 
670                                  * instead.
671                                  */
672   char *file_charset;           /* charset of attached file */
673   CONTENT *content;             /* structure used to store detailed info about
674                                  * the content of the attachment.  this is used
675                                  * to determine what content-transfer-encoding
676                                  * is required when sending mail.
677                                  */
678   struct body *next;            /* next attachment in the list */
679   struct body *parts;           /* parts of a multipart or message/rfc822 */
680   struct header *hdr;           /* header information for message/rfc822 */
681
682   struct attachptr *aptr;       /* Menu information, used in recvattach.c */
683
684   time_t stamp;                 /* time stamp of last
685                                  * encoding update.
686                                  */
687
688   unsigned int type:4;          /* content-type primary type */
689   unsigned int encoding:3;      /* content-transfer-encoding */
690   unsigned int disposition:2;   /* content-disposition */
691   unsigned int use_disp:1;      /* Content-Disposition uses filename= ? */
692   unsigned int unlink:1;        /* flag to indicate the the file named by
693                                  * "filename" should be unlink()ed before
694                                  * free()ing this structure
695                                  */
696   unsigned int tagged:1;
697   unsigned int deleted:1;       /* attachment marked for deletion */
698
699   unsigned int noconv:1;        /* don't do character set conversion */
700   unsigned int force_charset:1;
701   /* send mode: don't adjust the character
702    * set when in send-mode.
703    */
704   unsigned int is_signed_data:1;        /* A lot of MUAs don't indicate
705                                            S/MIME signed-data correctly,
706                                            e.g. they use foo.p7m even for
707                                            the name of signed data.  This
708                                            flag is used to keep track of
709                                            the actual message type.  It
710                                            gets set during the verification
711                                            (which is done if the encryption
712                                            try failed) and check by the
713                                            function to figure the type of
714                                            the message. */
715
716   unsigned int goodsig:1;       /* good cryptographic signature */
717   unsigned int warnsig:1;       /* maybe good signature */
718   unsigned int badsig:1;        /* bad cryptographic signature (needed to check encrypted s/mime-signatures) */
719
720   unsigned int collapsed:1;     /* used by recvattach */
721
722 } BODY;
723
724 typedef struct header {
725   unsigned int security:11;     /* bit 0-6: flags, bit 7,8: application.
726                                    see: crypt.h pgplib.h, smime.h */
727
728   unsigned int mime:1;          /* has a Mime-Version header? */
729   unsigned int flagged:1;       /* marked important? */
730   unsigned int tagged:1;
731   unsigned int appended:1;      /* has been saved */
732   unsigned int purged:1;        /* bypassing the trash folder */
733   unsigned int deleted:1;
734   unsigned int changed:1;
735   unsigned int attach_del:1;    /* has an attachment marked for deletion */
736   unsigned int old:1;
737   unsigned int read:1;
738   unsigned int expired:1;       /* already expired? */
739   unsigned int superseded:1;    /* got superseded? */
740   unsigned int replied:1;
741   unsigned int subject_changed:1;       /* used for threading */
742   unsigned int threaded:1;      /* used for threading */
743   unsigned int display_subject:1;       /* used for threading */
744   unsigned int irt_changed:1;   /* In-Reply-To changed to link/break threads */
745   unsigned int refs_changed:1;  /* References changed to break thread */
746   unsigned int recip_valid:1;   /* is_recipient is valid */
747   unsigned int active:1;        /* message is not to be removed */
748   unsigned int trash:1;         /* message is marked as trashed on disk.
749                                  * This flag is used by the maildir_trash
750                                  * option.
751                                  */
752
753   /* timezone of the sender of this message */
754   unsigned int zhours:5;
755   unsigned int zminutes:6;
756   unsigned int zoccident:1;
757
758   /* bits used for caching when searching */
759   unsigned int searched:1;
760   unsigned int matched:1;
761
762   /* the following are used to support collapsing threads  */
763   unsigned int collapsed:1;     /* is this message part of a collapsed thread? */
764   unsigned int limited:1;       /* is this message in a limited view?  */
765   size_t num_hidden;            /* number of hidden messages in this view */
766
767   short recipient;              /* user_is_recipient()'s return value, cached */
768
769   int pair;                     /* color-pair to use when displaying in the index */
770
771   time_t date_sent;             /* time when the message was sent (UTC) */
772   time_t received;              /* time when the message was placed in the mailbox */
773   long offset;                  /* where in the stream does this message begin? */
774   int lines;                    /* how many lines in the body of this message? */
775   int index;                    /* the absolute (unsorted) message number */
776   int msgno;                    /* number displayed to the user */
777   int virtual;                  /* virtual message number */
778   int score;
779   ENVELOPE *env;                /* envelope information */
780   BODY *content;                /* list of MIME parts */
781   char *path;
782 #ifdef USE_NNTP
783   int article_num;
784 #endif
785
786   char *tree;                   /* character string to print thread tree */
787   struct thread *thread;
788
789   ENVELOPE *new_env;            /* envelope information for rethreading */
790
791 #ifdef MIXMASTER
792   LIST *chain;
793 #endif
794
795 #ifdef USE_POP
796   int refno;                    /* message number on server */
797 #endif
798
799 #if defined USE_POP || defined USE_IMAP || defined USE_NNTP
800   void *data;                   /* driver-specific data */
801 #endif
802
803   char *maildir_flags;          /* unknown maildir flags */
804 } HEADER;
805
806 typedef struct thread {
807   unsigned int fake_thread:1;
808   unsigned int duplicate_thread:1;
809   unsigned int sort_children:1;
810   unsigned int check_subject:1;
811   unsigned int visible:1;
812   unsigned int deep:1;
813   unsigned int subtree_visible:2;
814   unsigned int next_subtree_visible:1;
815   struct thread *parent;
816   struct thread *child;
817   struct thread *next;
818   struct thread *prev;
819   HEADER *message;
820   HEADER *sort_key;
821 } THREAD;
822
823
824 /* flag to mutt_pattern_comp() */
825 #define M_FULL_MSG      1       /* enable body and header matching */
826
827 typedef enum {
828   M_MATCH_FULL_ADDRESS = 1
829 } pattern_exec_flag;
830
831 typedef struct pattern_t {
832   short op;
833   short not;
834   short alladdr;
835   int min;
836   int max;
837   struct pattern_t *next;
838   struct pattern_t *child;      /* arguments to logical op */
839   regex_t *rx;
840 } pattern_t;
841
842 typedef struct {
843   char *path;
844   FILE *fp;
845   time_t mtime;
846   time_t mtime_cur;             /* used with maildir folders */
847   off_t size;
848   off_t vsize;
849   char *pattern;                /* limit pattern string */
850   pattern_t *limit_pattern;     /* compiled limit pattern */
851   HEADER **hdrs;
852   HEADER *last_tag;             /* last tagged msg. used to link threads */
853   THREAD *tree;                 /* top of thread tree */
854   HASH *id_hash;                /* hash table by msg id */
855   HASH *subj_hash;              /* hash table by subject */
856   HASH *thread_hash;            /* hash table for threading */
857   int *v2r;                     /* mapping from virtual to real msgno */
858   int hdrmax;                   /* number of pointers in hdrs */
859   int msgcount;                 /* number of messages in the mailbox */
860   int vcount;                   /* the number of virtual messages */
861   int tagged;                   /* how many messages are tagged? */
862   int new;                      /* how many new messages? */
863   int unread;                   /* how many unread messages? */
864   int deleted;                  /* how many deleted messages */
865   int appended;                 /* how many saved messages? */
866   int flagged;                  /* how many flagged messages */
867   int msgnotreadyet;            /* which msg "new" in pager, -1 if none */
868 #if defined USE_POP || defined USE_IMAP || defined USE_NNTP
869   void *data;                   /* driver specific data */
870 #endif                          /* USE_IMAP */
871
872   short magic;                  /* mailbox type */
873
874 #ifdef USE_COMPRESSED
875   void *compressinfo;           /* compressed mbox module private data */
876   char *realpath;               /* path to compressed mailbox */
877 #endif                          /* USE_COMPRESSED */
878
879   unsigned int locked:1;        /* is the mailbox locked? */
880   unsigned int changed:1;       /* mailbox has been modified */
881   unsigned int readonly:1;      /* don't allow changes to the mailbox */
882   unsigned int dontwrite:1;     /* dont write the mailbox on close */
883   unsigned int append:1;        /* mailbox is opened in append mode */
884   unsigned int quiet:1;         /* inhibit status messages? */
885   unsigned int collapsed:1;     /* are all threads collapsed? */
886   unsigned int closing:1;       /* mailbox is being closed */
887   unsigned int counting:1;      /* do we just want to cound? */
888 } CONTEXT;
889
890 typedef struct attachptr {
891   BODY *content;
892   int parent_type;
893   char *tree;
894   int level;
895   int num;
896 } ATTACHPTR;
897
898 typedef struct {
899   FILE *fpin;
900   FILE *fpout;
901   char *prefix;
902   int flags;
903 } STATE;
904
905 /* used by enter.c */
906
907 typedef struct {
908   wchar_t *wbuf;
909   size_t wbuflen;
910   size_t lastchar;
911   size_t curpos;
912   size_t begin;
913   int tabs;
914 } ENTER_STATE;
915
916 /* flags for the STATE struct */
917 #define M_DISPLAY       (1<<0)  /* output is displayed to the user */
918 #define M_VERIFY        (1<<1)  /* perform signature verification */
919 #define M_PENDINGPREFIX (1<<2)  /* prefix to write, but character must follow */
920 #define M_WEED          (1<<3)  /* weed headers even when not in display mode */
921 #define M_CHARCONV      (1<<4)  /* Do character set conversions */
922 #define M_PRINTING      (1<<5)  /* are we printing? - M_DISPLAY "light" */
923 #define M_REPLYING      (1<<6)  /* are we replying? */
924 #define M_FIRSTDONE     (1<<7)  /* the first attachment has been done */
925
926 #define state_set_prefix(s) ((s)->flags |= M_PENDINGPREFIX)
927 #define state_reset_prefix(s) ((s)->flags &= ~M_PENDINGPREFIX)
928 #define state_puts(x,y) fputs(x,(y)->fpout)
929 #define state_putc(x,y) fputc(x,(y)->fpout)
930
931 void state_mark_attach (STATE *);
932 void state_attach_puts (const char *, STATE *);
933 void state_prefix_putc (char, STATE *);
934 int state_printf (STATE *, const char *, ...);
935
936 #include "ascii.h"
937 #include "protos.h"
938 #include "lib.h"
939 #include "globals.h"
940
941 #endif /* !_MUTT_H */