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