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