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