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