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