4b53da42bc7e0a25f2f018436902d0b4c9b013bf
[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   OPTBEEP,
229   OPTBEEPNEW,
230   OPTBOUNCEDELIVERED,
231   OPTBRAILLEFRIENDLY,
232   OPTCHECKNEW,
233   OPTCOLLAPSEUNREAD,
234   OPTCONFIRMAPPEND,
235   OPTCONFIRMCREATE,
236   OPTDELETEUNTAG,
237   OPTDELSP,
238   OPTDIGESTCOLLAPSE,
239   OPTDUPTHREADS,
240   OPTEDITHDRS,
241   OPTENCODEFROM,
242   OPTENVFROM,
243   OPTFASTREPLY,
244   OPTFCCATTACH,
245   OPTFCCCLEAR,
246   OPTFOLLOWUPTO,
247   OPTFORCEBUFFYCHECK,
248   OPTFORCENAME,
249   OPTFORWDECODE,
250   OPTFORWQUOTE,
251 #ifdef USE_HCACHE
252   OPTHCACHEVERIFY,
253 #ifdef HAVE_QDBM
254   OPTHCACHECOMPRESS,
255 #endif /* HAVE_QDBM */
256 #endif
257   OPTHDRS,
258   OPTHEADER,
259   OPTHELP,
260   OPTHIDDENHOST,
261   OPTHIDELIMITED,
262   OPTHIDEMISSING,
263   OPTHIDETHREADSUBJECT,
264   OPTHIDETOPLIMITED,
265   OPTHIDETOPMISSING,
266   OPTIGNORELISTREPLYTO,
267   OPTIMAPCHECKSUBSCRIBED,
268   OPTIMAPLSUB,
269   OPTIMAPPASSIVE,
270   OPTIMAPPEEK,
271   OPTIMAPSERVERNOISE,
272 #if defined(USE_SSL) || defined(USE_GNUTLS)
273 # ifndef USE_GNUTLS
274   OPTSSLSYSTEMCERTS,
275   OPTSSLV2,
276 # endif /* !USE_GNUTLS */
277   OPTSSLV3,
278   OPTTLSV1,
279   OPTSSLFORCETLS,
280 #endif /* USE_SSL || USE_GNUTLS */
281   OPTIMPLICITAUTOVIEW,
282   OPTINCLUDEONLYFIRST,
283   OPTKEEPFLAGGED,
284   OPTMAILCAPSANITIZE,
285   OPTMAILDIRTRASH,
286   OPTMARKERS,
287   OPTMARKOLD,
288   OPTMBOXPANE,
289   OPTMENUSCROLL,                /* scroll menu instead of implicit next-page */
290   OPTMENUMOVEOFF,
291   OPTMETAKEY,                   /* interpret ALT-x as ESC-x */
292   OPTMETOO,
293   OPTMHPURGE,
294   OPTMIMEFORWDECODE,
295 #ifdef USE_NNTP
296   OPTMIMESUBJECT,               /* encode subject line with RFC2047 */
297 #endif
298   OPTNARROWTREE,
299   OPTPAGERSTOP,
300   OPTPIPEDECODE,
301   OPTPIPESPLIT,
302   OPTPOPAUTHTRYALL,
303   OPTPOPLAST,
304   OPTPRINTDECODE,
305   OPTPRINTSPLIT,
306   OPTPROMPTAFTER,
307   OPTQUOTEEMPTY,
308   OPTQUOTEQUOTED,
309   OPTREADONLY,
310   OPTREPLYSELF,
311   OPTRESOLVE,
312   OPTREVALIAS,
313   OPTREVNAME,
314   OPTREVREAL,
315   OPTRFC2047PARAMS,
316   OPTSAVEADDRESS,
317   OPTSAVEEMPTY,
318   OPTSAVENAME,
319   OPTSCORE,
320   OPTSIGDASHES,
321   OPTSIGONTOP,
322   OPTSORTRE,
323   OPTSPAMSEP,
324   OPTSTATUSONTOP,
325   OPTSTRICTMAILTO,
326   OPTSTRICTMIME,
327   OPTSTRICTTHREADS,
328   OPTSTRIPWAS,
329   OPTSTUFFQUOTED,
330   OPTSUSPEND,
331   OPTTEXTFLOWED,
332   OPTTHOROUGHSRC,
333   OPTTHREADRECEIVED,
334   OPTTILDE,
335   OPTUNCOLLAPSEJUMP,
336   OPTUSE8BITMIME,
337   OPTUSEDOMAIN,
338   OPTUSEFROM,
339   OPTUSEGPGAGENT,
340 #ifdef HAVE_LIBIDN
341   OPTUSEIDN,
342 #endif
343 #ifdef HAVE_GETADDRINFO
344   OPTUSEIPV6,
345 #endif
346   OPTWAITKEY,
347   OPTWEED,
348   OPTWRAP,
349   OPTWRAPSEARCH,
350   OPTWRITEBCC,                  /* write out a bcc header? */
351   OPTXMAILER,
352   OPTXMAILTO,                   /* 1 if $edit_header is forcebly set */
353   OPTXTERMSETTITLES,
354
355   OPTCRYPTUSEGPGME,
356
357   /* PGP options */
358
359   OPTCRYPTAUTOSIGN,
360   OPTCRYPTAUTOENCRYPT,
361   OPTCRYPTAUTOPGP,
362   OPTCRYPTAUTOSMIME,
363   OPTCRYPTREPLYENCRYPT,
364   OPTCRYPTREPLYSIGN,
365   OPTCRYPTREPLYSIGNENCRYPTED,
366   OPTCRYPTTIMESTAMP,
367   OPTSMIMEISDEFAULT,
368   OPTASKCERTLABEL,
369   OPTSDEFAULTDECRYPTKEY,
370   OPTPGPIGNORESUB,
371   OPTPGPCHECKEXIT,
372   OPTPGPLONGIDS,
373   OPTPGPAUTODEC,
374   OPTPGPRETAINABLESIG,
375   OPTPGPSTRICTENC,
376   OPTFORWDECRYPT,
377   OPTPGPSHOWUNUSABLE,
378   OPTPGPAUTOINLINE,
379   OPTPGPREPLYINLINE,
380
381   /* news options */
382
383 #ifdef USE_NNTP
384   OPTSHOWNEWNEWS,
385   OPTSHOWONLYUNREAD,
386   OPTSAVEUNSUB,
387   OPTLOADDESC,
388   OPTXCOMMENTTO,
389 #endif                          /* USE_NNTP */
390
391   /* pseudo options */
392
393   OPTAUXSORT,                   /* (pseudo) using auxillary sort function */
394   OPTFORCEREFRESH,              /* (pseudo) refresh even during macros */
395   OPTNOCURSES,                  /* (pseudo) when sending in batch mode */
396   OPTNEEDREDRAW,                /* (pseudo) to notify caller of a submenu */
397   OPTSEARCHREVERSE,             /* (pseudo) used by ci_search_command */
398   OPTMSGERR,                    /* (pseudo) used by mutt_error/mutt_message */
399   OPTSEARCHINVALID,             /* (pseudo) used to invalidate the search pat */
400   OPTSIGNALSBLOCKED,            /* (pseudo) using by mutt_block_signals () */
401   OPTSYSSIGNALSBLOCKED,         /* (pseudo) using by mutt_block_signals_system () */
402   OPTNEEDRESORT,                /* (pseudo) used to force a re-sort */
403   OPTRESORTINIT,                /* (pseudo) used to force the next resort to be from scratch */
404   OPTVIEWATTACH,                /* (pseudo) signals that we are viewing attachments */
405   OPTFORCEREDRAWINDEX,          /* (pseudo) used to force a redraw in the main index */
406   OPTFORCEREDRAWPAGER,          /* (pseudo) used to force a redraw in the pager */
407   OPTSORTSUBTHREADS,            /* (pseudo) used when $sort_aux changes */
408   OPTNEEDRESCORE,               /* (pseudo) set when the `score' command is used */
409   OPTATTACHMSG,                 /* (pseudo) used by attach-message */
410   OPTHIDEREAD,                  /* (pseudo) whether or not hide read messages */
411   OPTKEEPQUIET,                 /* (pseudo) shut up the message and refresh
412                                  *          functions while we are executing an
413                                  *          external program.
414                                  */
415   OPTMENUCALLER,                /* (pseudo) tell menu to give caller a take */
416   OPTREDRAWTREE,                /* (pseudo) redraw the thread tree */
417   OPTPGPCHECKTRUST,             /* (pseudo) used by pgp_select_key () */
418   OPTDONTHANDLEPGPKEYS,         /* (pseudo) used to extract PGP keys */
419   OPTUNBUFFEREDINPUT,           /* (pseudo) don't use key buffer */
420
421 #ifdef USE_NNTP
422   OPTNEWS,                      /* (pseudo) used to change reader mode */
423   OPTNEWSSEND,                  /* (pseudo) used to change behavior when posting */
424   OPTNEWSCACHE,                 /* (pseudo) used to indicate if news cache exist */
425 #endif
426   OPTSHORTENHIERARCHY,          /* set when to shorten "hierarchies" in the sidebar */
427   OPTSIDEBARNEWMAILONLY,
428   OPTMAX
429 };
430
431 #define mutt_bit_alloc(n) p_new(char, (n + 7) / 8)
432 #define mutt_bit_set(v,n) v[n/8] |= (1 << (n % 8))
433 #define mutt_bit_unset(v,n) v[n/8] &= ~(1 << (n % 8))
434 #define mutt_bit_toggle(v,n) v[n/8] ^= (1 << (n % 8))
435 #define mutt_bit_isset(v,n) (v[n/8] & (1 << (n % 8)))
436
437 #define set_option(x) mutt_bit_set(Options,x)
438 #define unset_option(x) mutt_bit_unset(Options,x)
439 #define toggle_option(x) mutt_bit_toggle(Options,x)
440 #define option(x) mutt_bit_isset(Options,x)
441
442 void mutt_init (int, string_list_t *);
443
444 typedef struct thread {
445   unsigned int fake_thread:1;
446   unsigned int duplicate_thread:1;
447   unsigned int sort_children:1;
448   unsigned int check_subject:1;
449   unsigned int visible:1;
450   unsigned int deep:1;
451   unsigned int subtree_visible:2;
452   unsigned int next_subtree_visible:1;
453   struct thread *parent;
454   struct thread *child;
455   struct thread *next;
456   struct thread *prev;
457   HEADER *message;
458   HEADER *sort_key;
459 } THREAD;
460
461 typedef struct compress_info compress_info;
462 typedef struct pattern_t pattern_t;
463
464 typedef struct {
465   char *path;
466   FILE *fp;
467   time_t mtime;
468   time_t mtime_cur;             /* used with maildir folders */
469   off_t size;
470   off_t vsize;
471   char *pattern;                /* limit pattern string */
472   pattern_t *limit_pattern;     /* compiled limit pattern */
473   HEADER **hdrs;
474   HEADER *last_tag;             /* last tagged msg. used to link threads */
475   THREAD *tree;                 /* top of thread tree */
476   HASH *id_hash;                /* hash table by msg id */
477   HASH *subj_hash;              /* hash table by subject */
478   HASH *thread_hash;            /* hash table for threading */
479   int *v2r;                     /* mapping from virtual to real msgno */
480   int hdrmax;                   /* number of pointers in hdrs */
481   int msgcount;                 /* number of messages in the mailbox */
482   int vcount;                   /* the number of virtual messages */
483   int tagged;                   /* how many messages are tagged? */
484   int new;                      /* how many new messages? */
485   int unread;                   /* how many unread messages? */
486   int deleted;                  /* how many deleted messages */
487   int appended;                 /* how many saved messages? */
488   int flagged;                  /* how many flagged messages */
489   int msgnotreadyet;            /* which msg "new" in pager, -1 if none */
490   void *data;                   /* driver specific data */
491
492   short magic;                  /* mailbox type */
493
494   compress_info *cinfo;         /* compressed mbox module private data */
495   char *realpath;               /* path to compressed mailbox */
496
497   unsigned int locked:1;        /* is the mailbox locked? */
498   unsigned int changed:1;       /* mailbox has been modified */
499   unsigned int readonly:1;      /* don't allow changes to the mailbox */
500   unsigned int dontwrite:1;     /* dont write the mailbox on close */
501   unsigned int append:1;        /* mailbox is opened in append mode */
502   unsigned int quiet:1;         /* inhibit status messages? */
503   unsigned int collapsed:1;     /* are all threads collapsed? */
504   unsigned int closing:1;       /* mailbox is being closed */
505   unsigned int counting:1;      /* do we just want to cound? */
506 } CONTEXT;
507
508 /* for attachment counter */
509 typedef struct {
510   char *major;
511   int major_int;
512   const char *minor;
513   regex_t minor_rx;
514 } ATTACH_MATCH;
515
516 /* Flags for mutt_count_body_parts() */
517 #define M_PARTS_TOPLEVEL (1<<0) /* is the top-level part */
518 #define M_PARTS_RECOUNT (1<<1) /* force recount */
519
520 #include "protos.h"
521 #include "globals.h"
522
523 #endif /* !_MUTT_H */