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