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