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