move rfc822 related types into lib-mime/mime-types.h out of mutt.h.
[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 <lib-lib/buffer.h>
45 #include <lib-lib/hash.h>
46 #include <lib-lib/list.h>
47
48 #include <lib-mime/mime.h>
49
50 #include "charset.h"
51 #include "lib/rx.h"
52
53 #ifndef HAVE_WC_FUNCS
54 # ifdef MB_LEN_MAX
55 #  undef MB_LEN_MAX
56 # endif
57 # define MB_LEN_MAX 16
58 #endif
59
60 # define MUTT_VERSION (VERSION)
61
62 /* nifty trick I stole from ELM 2.5alpha. */
63 #ifdef MAIN_C
64 #define WHERE
65 #define INITVAL(x) = x
66 #else
67 #define WHERE extern
68 #define INITVAL(x)
69 #endif
70
71 typedef struct {
72   int ch;                       /* raw key pressed */
73   int op;                       /* function op */
74 } event_t;
75
76 /* flags for _mutt_system() */
77 #define M_DETACH_PROCESS        1       /* detach subprocess from group */
78
79 /* flags for mutt_FormatString() */
80 typedef enum {
81   M_FORMAT_FORCESUBJ = (1 << 0),        /* print the subject even if unchanged */
82   M_FORMAT_TREE = (1 << 1),     /* draw the thread tree */
83   M_FORMAT_MAKEPRINT = (1 << 2),        /* make sure that all chars are printable */
84   M_FORMAT_OPTIONAL = (1 << 3),
85   M_FORMAT_STAT_FILE = (1 << 4),        /* used by mutt_attach_fmt */
86   M_FORMAT_ARROWCURSOR = (1 << 5),      /* reserve space for arrow_cursor */
87   M_FORMAT_INDEX = (1 << 6)     /* this is a main index entry */
88 } format_flag;
89
90 /* types for mutt_add_hook() */
91 #define M_FOLDERHOOK    1
92 #define M_MBOXHOOK      (1<<1)
93 #define M_SENDHOOK      (1<<2)
94 #define M_FCCHOOK       (1<<3)
95 #define M_SAVEHOOK      (1<<4)
96 #define M_CHARSETHOOK   (1<<5)
97 #define M_ICONVHOOK     (1<<6)
98 #define M_MESSAGEHOOK   (1<<7)
99 #define M_CRYPTHOOK     (1<<8)
100 #define M_ACCOUNTHOOK   (1<<9)
101 #define M_REPLYHOOK     (1<<10)
102 #define M_SEND2HOOK     (1<<11)
103
104 #define M_OPENHOOK      (1<<12)
105 #define M_APPENDHOOK    (1<<13)
106 #define M_CLOSEHOOK     (1<<14)
107
108 /* tree characters for linearize_tree and print_enriched_string */
109 #define M_TREE_LLCORNER         1
110 #define M_TREE_ULCORNER         2
111 #define M_TREE_LTEE             3
112 #define M_TREE_HLINE            4
113 #define M_TREE_VLINE            5
114 #define M_TREE_SPACE            6
115 #define M_TREE_RARROW           7
116 #define M_TREE_STAR             8
117 #define M_TREE_HIDDEN           9
118 #define M_TREE_EQUALS           10
119 #define M_TREE_TTEE             11
120 #define M_TREE_BTEE             12
121 #define M_TREE_MISSING          13
122 #define M_TREE_MAX              14
123
124 #define M_THREAD_COLLAPSE       (1<<0)
125 #define M_THREAD_UNCOLLAPSE     (1<<1)
126 #define M_THREAD_GET_HIDDEN     (1<<2)
127 #define M_THREAD_UNREAD         (1<<3)
128 #define M_THREAD_NEXT_UNREAD    (1<<4)
129
130 enum {
131   /* modes for mutt_view_attachment() */
132   M_REGULAR = 1,
133   M_MAILCAP,
134   M_AS_TEXT,
135
136   /* action codes used by mutt_set_flag() and mutt_pattern_function() */
137   M_ALL,
138   M_NONE,
139   M_NEW,
140   M_OLD,
141   M_REPLIED,
142   M_READ,
143   M_UNREAD,
144   M_DELETE,
145   M_UNDELETE,
146   M_DELETED,
147   M_APPENDED,
148   M_PURGED,
149   M_FLAG,
150   M_TAG,
151   M_UNTAG,
152   M_LIMIT,
153   M_EXPIRED,
154   M_SUPERSEDED,
155
156   /* actions for mutt_pattern_comp/mutt_pattern_exec */
157   M_AND,
158   M_OR,
159   M_TO,
160   M_CC,
161   M_COLLAPSED,
162   M_SUBJECT,
163   M_FROM,
164   M_DATE,
165   M_DATE_RECEIVED,
166   M_DUPLICATED,
167   M_UNREFERENCED,
168   M_ID,
169   M_BODY,
170   M_HEADER,
171   M_HORMEL,
172   M_WHOLE_MSG,
173   M_SENDER,
174   M_MESSAGE,
175   M_SCORE,
176   M_SIZE,
177   M_REFERENCE,
178   M_RECIPIENT,
179   M_LIST,
180   M_SUBSCRIBED_LIST,
181   M_PERSONAL_RECIP,
182   M_PERSONAL_FROM,
183   M_ADDRESS,
184   M_CRYPT_SIGN,
185   M_CRYPT_VERIFIED,
186   M_CRYPT_ENCRYPT,
187   M_PGP_KEY,
188   M_XLABEL,
189   M_MIMEATTACH,
190 #ifdef USE_NNTP
191   M_NEWSGROUPS,
192 #endif
193   M_REALNAME,
194   M_MULTIPART,
195
196   /* Options for Mailcap lookup */
197   M_EDIT,
198   M_COMPOSE,
199   M_PRINT,
200   M_AUTOVIEW,
201
202   /* options for socket code */
203   M_NEW_SOCKET,
204 #ifdef USE_SSL
205   M_NEW_SSL_SOCKET,
206 #endif
207
208   /* Options for mutt_save_attachment */
209   M_SAVE_APPEND,
210   M_SAVE_OVERWRITE
211 };
212
213 /* possible arguments to set_quadoption() */
214 enum {
215   M_NO,
216   M_YES,
217   M_ASKNO,
218   M_ASKYES
219 };
220
221 /* quad-option vars */
222 enum {
223   OPT_ABORT,
224   OPT_ATTACH,
225   OPT_BOUNCE,
226   OPT_COPY,
227   OPT_DELETE,
228   OPT_FORWEDIT,
229   OPT_INCLUDE,
230   OPT_IMAPRECONNECT,
231   OPT_MFUPTO,
232   OPT_MIMEFWD,
233   OPT_MIMEFWDREST,
234   OPT_MOVE,
235   OPT_PGPMIMEAUTO,              /* ask to revert to PGP/MIME when inline fails */
236   OPT_POPDELETE,
237   OPT_POPRECONNECT,
238   OPT_POSTPONE,
239   OPT_PRINT,
240   OPT_QUIT,
241   OPT_REPLYTO,
242   OPT_RECALL,
243 #if defined(USE_SSL) || defined(USE_GNUTLS)
244   OPT_SSLSTARTTLS,
245 #endif
246   OPT_SUBJECT,
247   OPT_VERIFYSIG,                /* verify PGP signatures */
248   OPT_LISTREPLY,
249 #ifdef USE_NNTP
250   OPT_TOMODERATED,
251   OPT_NNTPRECONNECT,
252   OPT_CATCHUP,
253   OPT_FOLLOWUPTOPOSTER,
254 #endif                          /* USE_NNTP */
255
256   /* THIS MUST BE THE LAST VALUE. */
257   OPT_MAX
258 };
259
260 /* flags to ci_send_message() */
261 #define SENDREPLY       (1<<0)
262 #define SENDGROUPREPLY  (1<<1)
263 #define SENDLISTREPLY   (1<<2)
264 #define SENDFORWARD     (1<<3)
265 #define SENDPOSTPONED   (1<<4)
266 #define SENDBATCH       (1<<5)
267 #define SENDKEY         (1<<6)
268 #define SENDRESEND      (1<<7)
269 #define SENDNEWS        (1<<8)
270
271 /* flags to _mutt_select_file() */
272 #define M_SEL_BUFFY     (1<<0)
273 #define M_SEL_MULTI     (1<<1)
274 #define M_SEL_FOLDER    (1<<2)
275
276 /* flags for parse_spam_list */
277 #define M_SPAM          1
278 #define M_NOSPAM        2
279
280 /* boolean vars */
281 enum {
282   OPTALLOW8BIT,
283   OPTALLOWANSI,
284   OPTARROWCURSOR,
285   OPTASCIICHARS,
286   OPTASKBCC,
287   OPTASKCC,
288   OPTASKFOLLOWUP,
289   OPTASKXCOMMENTTO,
290   OPTATTACHSPLIT,
291   OPTAUTOEDIT,
292   OPTAUTOTAG,
293   OPTBEEP,
294   OPTBEEPNEW,
295   OPTBOUNCEDELIVERED,
296   OPTBRAILLEFRIENDLY,
297   OPTCHECKNEW,
298   OPTCOLLAPSEUNREAD,
299   OPTCONFIRMAPPEND,
300   OPTCONFIRMCREATE,
301   OPTCOUNTATTACH,
302   OPTDELETEUNTAG,
303   OPTDELSP,
304   OPTDIGESTCOLLAPSE,
305   OPTDUPTHREADS,
306   OPTEDITHDRS,
307   OPTENCODEFROM,
308   OPTENVFROM,
309   OPTFASTREPLY,
310   OPTFCCATTACH,
311   OPTFCCCLEAR,
312   OPTFOLLOWUPTO,
313   OPTFORCEBUFFYCHECK,
314   OPTFORCENAME,
315   OPTFORWDECODE,
316   OPTFORWQUOTE,
317 #ifdef USE_HCACHE
318   OPTHCACHEVERIFY,
319 #if HAVE_QDBM
320   OPTHCACHECOMPRESS,
321 #endif /* HAVE_QDBM */
322 #endif
323   OPTHDRS,
324   OPTHEADER,
325   OPTHELP,
326   OPTHIDDENHOST,
327   OPTHIDELIMITED,
328   OPTHIDEMISSING,
329   OPTHIDETHREADSUBJECT,
330   OPTHIDETOPLIMITED,
331   OPTHIDETOPMISSING,
332   OPTIGNORELISTREPLYTO,
333   OPTIMAPCHECKSUBSCRIBED,
334   OPTIMAPLSUB,
335   OPTIMAPPASSIVE,
336   OPTIMAPPEEK,
337   OPTIMAPSERVERNOISE,
338 #if defined(USE_SSL) || defined(USE_GNUTLS)
339 # ifndef USE_GNUTLS
340   OPTSSLSYSTEMCERTS,
341   OPTSSLV2,
342 # endif /* !USE_GNUTLS */
343   OPTSSLV3,
344   OPTTLSV1,
345   OPTSSLFORCETLS,
346 #endif /* USE_SSL || USE_GNUTLS */
347   OPTIMPLICITAUTOVIEW,
348   OPTINCLUDEONLYFIRST,
349   OPTKEEPFLAGGED,
350   OPTMAILCAPSANITIZE,
351   OPTMAILDIRTRASH,
352   OPTMARKERS,
353   OPTMARKOLD,
354   OPTMBOXPANE,
355   OPTMENUSCROLL,                /* scroll menu instead of implicit next-page */
356   OPTMENUMOVEOFF,
357   OPTMETAKEY,                   /* interpret ALT-x as ESC-x */
358   OPTMETOO,
359   OPTMHPURGE,
360   OPTMIMEFORWDECODE,
361 #ifdef USE_NNTP
362   OPTMIMESUBJECT,               /* encode subject line with RFC2047 */
363 #endif
364   OPTNARROWTREE,
365   OPTPAGERSTOP,
366   OPTPIPEDECODE,
367   OPTPIPESPLIT,
368   OPTPOPAUTHTRYALL,
369   OPTPOPLAST,
370   OPTPRINTDECODE,
371   OPTPRINTSPLIT,
372   OPTPROMPTAFTER,
373   OPTQUOTEEMPTY,
374   OPTQUOTEQUOTED,
375   OPTREADONLY,
376   OPTREPLYSELF,
377   OPTRESOLVE,
378   OPTREVALIAS,
379   OPTREVNAME,
380   OPTREVREAL,
381   OPTRFC2047PARAMS,
382   OPTSAVEADDRESS,
383   OPTSAVEEMPTY,
384   OPTSAVENAME,
385   OPTSCORE,
386   OPTSIGDASHES,
387   OPTSIGONTOP,
388   OPTSORTRE,
389   OPTSPAMSEP,
390   OPTSTATUSONTOP,
391   OPTSTRICTMAILTO,
392   OPTSTRICTMIME,
393   OPTSTRICTTHREADS,
394   OPTSTRIPWAS,
395   OPTSTUFFQUOTED,
396   OPTSUSPEND,
397   OPTTEXTFLOWED,
398   OPTTHOROUGHSRC,
399   OPTTHREADRECEIVED,
400   OPTTILDE,
401   OPTUNCOLLAPSEJUMP,
402   OPTUSE8BITMIME,
403   OPTUSEDOMAIN,
404   OPTUSEFROM,
405   OPTUSEGPGAGENT,
406 #ifdef HAVE_LIBIDN
407   OPTUSEIDN,
408 #endif
409 #ifdef HAVE_GETADDRINFO
410   OPTUSEIPV6,
411 #endif
412   OPTWAITKEY,
413   OPTWEED,
414   OPTWRAP,
415   OPTWRAPSEARCH,
416   OPTWRITEBCC,                  /* write out a bcc header? */
417   OPTXMAILER,
418   OPTXMAILTO,                   /* 1 if $edit_header is forcebly set */
419   OPTXTERMSETTITLES,
420
421   OPTCRYPTUSEGPGME,
422
423   /* PGP options */
424
425   OPTCRYPTAUTOSIGN,
426   OPTCRYPTAUTOENCRYPT,
427   OPTCRYPTAUTOPGP,
428   OPTCRYPTAUTOSMIME,
429   OPTCRYPTREPLYENCRYPT,
430   OPTCRYPTREPLYSIGN,
431   OPTCRYPTREPLYSIGNENCRYPTED,
432   OPTCRYPTTIMESTAMP,
433   OPTSMIMEISDEFAULT,
434   OPTASKCERTLABEL,
435   OPTSDEFAULTDECRYPTKEY,
436   OPTPGPIGNORESUB,
437   OPTPGPCHECKEXIT,
438   OPTPGPLONGIDS,
439   OPTPGPAUTODEC,
440 #if 0
441   OPTPGPENCRYPTSELF,
442 #endif
443   OPTPGPRETAINABLESIG,
444   OPTPGPSTRICTENC,
445   OPTFORWDECRYPT,
446   OPTPGPSHOWUNUSABLE,
447   OPTPGPAUTOINLINE,
448   OPTPGPREPLYINLINE,
449
450   /* news options */
451
452 #ifdef USE_NNTP
453   OPTSHOWNEWNEWS,
454   OPTSHOWONLYUNREAD,
455   OPTSAVEUNSUB,
456   OPTLOADDESC,
457   OPTXCOMMENTTO,
458 #endif                          /* USE_NNTP */
459
460   /* pseudo options */
461
462   OPTAUXSORT,                   /* (pseudo) using auxillary sort function */
463   OPTFORCEREFRESH,              /* (pseudo) refresh even during macros */
464   OPTLOCALES,                   /* (pseudo) set if user has valid locale definition */
465   OPTNOCURSES,                  /* (pseudo) when sending in batch mode */
466   OPTNEEDREDRAW,                /* (pseudo) to notify caller of a submenu */
467   OPTSEARCHREVERSE,             /* (pseudo) used by ci_search_command */
468   OPTMSGERR,                    /* (pseudo) used by mutt_error/mutt_message */
469   OPTSEARCHINVALID,             /* (pseudo) used to invalidate the search pat */
470   OPTSIGNALSBLOCKED,            /* (pseudo) using by mutt_block_signals () */
471   OPTSYSSIGNALSBLOCKED,         /* (pseudo) using by mutt_block_signals_system () */
472   OPTNEEDRESORT,                /* (pseudo) used to force a re-sort */
473   OPTRESORTINIT,                /* (pseudo) used to force the next resort to be from scratch */
474   OPTVIEWATTACH,                /* (pseudo) signals that we are viewing attachments */
475   OPTFORCEREDRAWINDEX,          /* (pseudo) used to force a redraw in the main index */
476   OPTFORCEREDRAWPAGER,          /* (pseudo) used to force a redraw in the pager */
477   OPTSORTSUBTHREADS,            /* (pseudo) used when $sort_aux changes */
478   OPTNEEDRESCORE,               /* (pseudo) set when the `score' command is used */
479   OPTATTACHMSG,                 /* (pseudo) used by attach-message */
480   OPTHIDEREAD,                  /* (pseudo) whether or not hide read messages */
481   OPTKEEPQUIET,                 /* (pseudo) shut up the message and refresh
482                                  *          functions while we are executing an
483                                  *          external program.
484                                  */
485   OPTMENUCALLER,                /* (pseudo) tell menu to give caller a take */
486   OPTREDRAWTREE,                /* (pseudo) redraw the thread tree */
487   OPTPGPCHECKTRUST,             /* (pseudo) used by pgp_select_key () */
488   OPTDONTHANDLEPGPKEYS,         /* (pseudo) used to extract PGP keys */
489   OPTUNBUFFEREDINPUT,           /* (pseudo) don't use key buffer */
490
491 #ifdef USE_NNTP
492   OPTNEWS,                      /* (pseudo) used to change reader mode */
493   OPTNEWSSEND,                  /* (pseudo) used to change behavior when posting */
494   OPTNEWSCACHE,                 /* (pseudo) used to indicate if news cache exist */
495 #endif
496   OPTSHORTENHIERARCHY,          /* set when to shorten "hierarchies" in the sidebar */
497   OPTSIDEBARNEWMAILONLY,
498   OPTMAX
499 };
500
501 #define mutt_bit_alloc(n) calloc ((n + 7) / 8, sizeof (char))
502 #define mutt_bit_set(v,n) v[n/8] |= (1 << (n % 8))
503 #define mutt_bit_unset(v,n) v[n/8] &= ~(1 << (n % 8))
504 #define mutt_bit_toggle(v,n) v[n/8] ^= (1 << (n % 8))
505 #define mutt_bit_isset(v,n) (v[n/8] & (1 << (n % 8)))
506
507 #define set_option(x) mutt_bit_set(Options,x)
508 #define unset_option(x) mutt_bit_unset(Options,x)
509 #define toggle_option(x) mutt_bit_toggle(Options,x)
510 #define option(x) mutt_bit_isset(Options,x)
511
512 typedef struct spam_list_t {
513   rx_t *rx;
514   int nmatch;
515   char *template;
516   struct spam_list_t *next;
517 } SPAM_LIST;
518
519
520 #define mutt_new_spam_list() p_new(SPAM_LIST, 1)
521 void mutt_free_spam_list (SPAM_LIST **);
522
523 int mutt_matches_ignore (const char *, LIST *);
524
525 void mutt_init (int, LIST *);
526
527 typedef struct thread {
528   unsigned int fake_thread:1;
529   unsigned int duplicate_thread:1;
530   unsigned int sort_children:1;
531   unsigned int check_subject:1;
532   unsigned int visible:1;
533   unsigned int deep:1;
534   unsigned int subtree_visible:2;
535   unsigned int next_subtree_visible:1;
536   struct thread *parent;
537   struct thread *child;
538   struct thread *next;
539   struct thread *prev;
540   HEADER *message;
541   HEADER *sort_key;
542 } THREAD;
543
544
545 /* flag to mutt_pattern_comp() */
546 #define M_FULL_MSG      (1<<0)       /* enable body and header matching */
547
548 typedef enum {
549   M_MATCH_FULL_ADDRESS = 1
550 } pattern_exec_flag;
551
552 typedef struct pattern_t {
553   short op;
554   unsigned int not : 1;
555   unsigned int alladdr : 1;
556   unsigned int stringmatch : 1;
557   int min;
558   int max;
559   struct pattern_t *next;
560   struct pattern_t *child;      /* arguments to logical op */
561   char* str;
562   regex_t *rx;
563 } pattern_t;
564
565 typedef struct {
566   char *path;
567   FILE *fp;
568   time_t mtime;
569   time_t mtime_cur;             /* used with maildir folders */
570   off_t size;
571   off_t vsize;
572   char *pattern;                /* limit pattern string */
573   pattern_t *limit_pattern;     /* compiled limit pattern */
574   HEADER **hdrs;
575   HEADER *last_tag;             /* last tagged msg. used to link threads */
576   THREAD *tree;                 /* top of thread tree */
577   HASH *id_hash;                /* hash table by msg id */
578   HASH *subj_hash;              /* hash table by subject */
579   HASH *thread_hash;            /* hash table for threading */
580   int *v2r;                     /* mapping from virtual to real msgno */
581   int hdrmax;                   /* number of pointers in hdrs */
582   int msgcount;                 /* number of messages in the mailbox */
583   int vcount;                   /* the number of virtual messages */
584   int tagged;                   /* how many messages are tagged? */
585   int new;                      /* how many new messages? */
586   int unread;                   /* how many unread messages? */
587   int deleted;                  /* how many deleted messages */
588   int appended;                 /* how many saved messages? */
589   int flagged;                  /* how many flagged messages */
590   int msgnotreadyet;            /* which msg "new" in pager, -1 if none */
591   void *data;                   /* driver specific data */
592
593   short magic;                  /* mailbox type */
594
595   void *compressinfo;           /* compressed mbox module private data */
596   char *realpath;               /* path to compressed mailbox */
597
598   unsigned int locked:1;        /* is the mailbox locked? */
599   unsigned int changed:1;       /* mailbox has been modified */
600   unsigned int readonly:1;      /* don't allow changes to the mailbox */
601   unsigned int dontwrite:1;     /* dont write the mailbox on close */
602   unsigned int append:1;        /* mailbox is opened in append mode */
603   unsigned int quiet:1;         /* inhibit status messages? */
604   unsigned int collapsed:1;     /* are all threads collapsed? */
605   unsigned int closing:1;       /* mailbox is being closed */
606   unsigned int counting:1;      /* do we just want to cound? */
607 } CONTEXT;
608
609 /* for attachment counter */
610 typedef struct {
611   char *major;
612   int major_int;
613   const char *minor;
614   regex_t minor_rx;
615 } ATTACH_MATCH;
616
617 /* Flags for mutt_count_body_parts() */
618 #define M_PARTS_TOPLEVEL (1<<0) /* is the top-level part */
619 #define M_PARTS_RECOUNT (1<<1) /* force recount */
620
621 #include "protos.h"
622 #include "lib.h"
623 #include "globals.h"
624
625 #endif /* !_MUTT_H */