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