15a971035cf3c472f48acdcc4cfa3b44b3f75bc8
[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   OPTUSEFROM,
334   OPTUSEGPGAGENT,
335 #ifdef HAVE_LIBIDN
336   OPTUSEIDN,
337 #endif
338 #ifdef HAVE_GETADDRINFO
339   OPTUSEIPV6,
340 #endif
341   OPTWAITKEY,
342   OPTWEED,
343   OPTWRAP,
344   OPTWRAPSEARCH,
345   OPTWRITEBCC,                  /* write out a bcc header? */
346   OPTXMAILER,
347   OPTXMAILTO,                   /* 1 if $edit_header is forcebly set */
348   OPTXTERMSETTITLES,
349
350   OPTCRYPTUSEGPGME,
351
352   /* PGP options */
353
354   OPTCRYPTAUTOSIGN,
355   OPTCRYPTAUTOENCRYPT,
356   OPTCRYPTAUTOPGP,
357   OPTCRYPTAUTOSMIME,
358   OPTCRYPTREPLYENCRYPT,
359   OPTCRYPTREPLYSIGN,
360   OPTCRYPTREPLYSIGNENCRYPTED,
361   OPTCRYPTTIMESTAMP,
362   OPTSMIMEISDEFAULT,
363   OPTASKCERTLABEL,
364   OPTSDEFAULTDECRYPTKEY,
365   OPTPGPIGNORESUB,
366   OPTPGPCHECKEXIT,
367   OPTPGPLONGIDS,
368   OPTPGPAUTODEC,
369   OPTPGPRETAINABLESIG,
370   OPTPGPSTRICTENC,
371   OPTFORWDECRYPT,
372   OPTPGPSHOWUNUSABLE,
373   OPTPGPAUTOINLINE,
374   OPTPGPREPLYINLINE,
375
376   /* news options */
377
378 #ifdef USE_NNTP
379   OPTSHOWNEWNEWS,
380   OPTSHOWONLYUNREAD,
381   OPTSAVEUNSUB,
382   OPTLOADDESC,
383   OPTXCOMMENTTO,
384 #endif                          /* USE_NNTP */
385
386   /* pseudo options */
387
388   OPTAUXSORT,                   /* (pseudo) using auxillary sort function */
389   OPTFORCEREFRESH,              /* (pseudo) refresh even during macros */
390   OPTNOCURSES,                  /* (pseudo) when sending in batch mode */
391   OPTNEEDREDRAW,                /* (pseudo) to notify caller of a submenu */
392   OPTSEARCHREVERSE,             /* (pseudo) used by ci_search_command */
393   OPTMSGERR,                    /* (pseudo) used by mutt_error/mutt_message */
394   OPTSEARCHINVALID,             /* (pseudo) used to invalidate the search pat */
395   OPTSIGNALSBLOCKED,            /* (pseudo) using by mutt_block_signals () */
396   OPTSYSSIGNALSBLOCKED,         /* (pseudo) using by mutt_block_signals_system () */
397   OPTNEEDRESORT,                /* (pseudo) used to force a re-sort */
398   OPTRESORTINIT,                /* (pseudo) used to force the next resort to be from scratch */
399   OPTVIEWATTACH,                /* (pseudo) signals that we are viewing attachments */
400   OPTFORCEREDRAWINDEX,          /* (pseudo) used to force a redraw in the main index */
401   OPTFORCEREDRAWPAGER,          /* (pseudo) used to force a redraw in the pager */
402   OPTSORTSUBTHREADS,            /* (pseudo) used when $sort_aux changes */
403   OPTNEEDRESCORE,               /* (pseudo) set when the `score' command is used */
404   OPTATTACHMSG,                 /* (pseudo) used by attach-message */
405   OPTHIDEREAD,                  /* (pseudo) whether or not hide read messages */
406   OPTKEEPQUIET,                 /* (pseudo) shut up the message and refresh
407                                  *          functions while we are executing an
408                                  *          external program.
409                                  */
410   OPTMENUCALLER,                /* (pseudo) tell menu to give caller a take */
411   OPTREDRAWTREE,                /* (pseudo) redraw the thread tree */
412   OPTPGPCHECKTRUST,             /* (pseudo) used by pgp_select_key () */
413   OPTDONTHANDLEPGPKEYS,         /* (pseudo) used to extract PGP keys */
414   OPTUNBUFFEREDINPUT,           /* (pseudo) don't use key buffer */
415
416 #ifdef USE_NNTP
417   OPTNEWS,                      /* (pseudo) used to change reader mode */
418   OPTNEWSSEND,                  /* (pseudo) used to change behavior when posting */
419   OPTNEWSCACHE,                 /* (pseudo) used to indicate if news cache exist */
420 #endif
421   OPTSHORTENHIERARCHY,          /* set when to shorten "hierarchies" in the sidebar */
422   OPTSIDEBARNEWMAILONLY,
423   OPTMAX
424 };
425
426 #define mutt_bit_alloc(n) p_new(char, (n + 7) / 8)
427 #define mutt_bit_set(v,n) v[n/8] |= (1 << (n % 8))
428 #define mutt_bit_unset(v,n) v[n/8] &= ~(1 << (n % 8))
429 #define mutt_bit_toggle(v,n) v[n/8] ^= (1 << (n % 8))
430 #define mutt_bit_isset(v,n) (v[n/8] & (1 << (n % 8)))
431
432 #define set_option(x) mutt_bit_set(Options,x)
433 #define unset_option(x) mutt_bit_unset(Options,x)
434 #define toggle_option(x) mutt_bit_toggle(Options,x)
435 #define option(x) mutt_bit_isset(Options,x)
436
437 void mutt_init (int, string_list_t *);
438
439 typedef struct thread {
440   unsigned int fake_thread:1;
441   unsigned int duplicate_thread:1;
442   unsigned int sort_children:1;
443   unsigned int check_subject:1;
444   unsigned int visible:1;
445   unsigned int deep:1;
446   unsigned int subtree_visible:2;
447   unsigned int next_subtree_visible:1;
448   struct thread *parent;
449   struct thread *child;
450   struct thread *next;
451   struct thread *prev;
452   HEADER *message;
453   HEADER *sort_key;
454 } THREAD;
455
456 typedef struct compress_info compress_info;
457 typedef struct pattern_t pattern_t;
458
459 typedef struct {
460   char *path;
461   FILE *fp;
462   time_t mtime;
463   time_t mtime_cur;             /* used with maildir folders */
464   off_t size;
465   off_t vsize;
466   char *pattern;                /* limit pattern string */
467   pattern_t *limit_pattern;     /* compiled limit pattern */
468   HEADER **hdrs;
469   HEADER *last_tag;             /* last tagged msg. used to link threads */
470   THREAD *tree;                 /* top of thread tree */
471   hash_t *id_hash;                /* hash table by msg id */
472   hash_t *subj_hash;              /* hash table by subject */
473   hash_t *thread_hash;            /* hash table for threading */
474   int *v2r;                     /* mapping from virtual to real msgno */
475   int hdrmax;                   /* number of pointers in hdrs */
476   int msgcount;                 /* number of messages in the mailbox */
477   int vcount;                   /* the number of virtual messages */
478   int tagged;                   /* how many messages are tagged? */
479   int new;                      /* how many new messages? */
480   int unread;                   /* how many unread messages? */
481   int deleted;                  /* how many deleted messages */
482   int appended;                 /* how many saved messages? */
483   int flagged;                  /* how many flagged messages */
484   int msgnotreadyet;            /* which msg "new" in pager, -1 if none */
485   void *data;                   /* driver specific data */
486
487   short magic;                  /* mailbox type */
488
489   compress_info *cinfo;         /* compressed mbox module private data */
490   char *realpath;               /* path to compressed mailbox */
491
492   unsigned int locked:1;        /* is the mailbox locked? */
493   unsigned int changed:1;       /* mailbox has been modified */
494   unsigned int readonly:1;      /* don't allow changes to the mailbox */
495   unsigned int dontwrite:1;     /* dont write the mailbox on close */
496   unsigned int append:1;        /* mailbox is opened in append mode */
497   unsigned int quiet:1;         /* inhibit status messages? */
498   unsigned int collapsed:1;     /* are all threads collapsed? */
499   unsigned int closing:1;       /* mailbox is being closed */
500   unsigned int counting:1;      /* do we just want to cound? */
501 } CONTEXT;
502
503 /* for attachment counter */
504 typedef struct {
505   char *major;
506   int major_int;
507   const char *minor;
508   regex_t minor_rx;
509 } ATTACH_MATCH;
510
511 /* Flags for mutt_count_body_parts() */
512 #define M_PARTS_TOPLEVEL (1<<0) /* is the top-level part */
513 #define M_PARTS_RECOUNT (1<<1) /* force recount */
514
515 #include "protos.h"
516 #include "globals.h"
517
518 #endif /* !_MUTT_H */