]> git.llucax.com Git - software/mutt-debian.git/blob - mutt.h
Imported Upstream version 1.5.18
[software/mutt-debian.git] / mutt.h
1
2 /*
3  * Copyright (C) 1996-2002 Michael R. Elkins <me@mutt.org>
4  * Copyright (C) 2004 g10 Code GmbH
5  * 
6  *     This program is free software; you can redistribute it and/or modify
7  *     it under the terms of the GNU General Public License as published by
8  *     the Free Software Foundation; either version 2 of the License, or
9  *     (at your option) any later version.
10  * 
11  *     This program is distributed in the hope that it will be useful,
12  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *     GNU General Public License for more details.
15  * 
16  *     You should have received a copy of the GNU General Public License
17  *     along with this program; if not, write to the Free Software
18  *     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */ 
20
21 #ifndef MUTT_H
22 #define MUTT_H 
23
24 #include <stdio.h>
25 #include <stdlib.h>
26 #ifdef HAVE_UNISTD_H
27 # include <unistd.h> /* needed for SEEK_SET */
28 #endif
29 #ifdef HAVE_UNIX_H
30 # include <unix.h>   /* needed for snprintf on QNX. */
31 #endif
32 #include <sys/types.h>
33 #include <sys/stat.h>
34 #include <time.h>
35 #include <limits.h>
36 #include <stdarg.h>
37 #include <signal.h>
38 #ifdef HAVE_WCHAR_H
39 # include <wchar.h>
40 #endif
41 #if defined(HAVE_WCTYPE_H) && defined(HAVE_WC_FUNCS)
42 # include <wctype.h>
43 #endif
44
45 #ifndef _POSIX_PATH_MAX
46 #include <limits.h>
47 #endif
48
49 #include <pwd.h>
50 #include <grp.h>
51
52 #include "rfc822.h"
53 #include "hash.h"
54 #include "charset.h"
55
56 #ifndef HAVE_WC_FUNCS
57 # ifdef MB_LEN_MAX
58 #  undef MB_LEN_MAX
59 # endif
60 # define MB_LEN_MAX 16
61 #endif
62
63 #define MUTT_VERSION (VERSION)
64
65 /* nifty trick I stole from ELM 2.5alpha. */
66 #ifdef MAIN_C
67 #define WHERE 
68 #define INITVAL(x) = x
69 #else
70 #define WHERE extern
71 #define INITVAL(x) 
72 #endif
73
74 #define WHERE_DEFINED 1
75
76 #include "mutt_regex.h"
77
78 /* flags for mutt_copy_header() */
79 #define CH_UPDATE       1      /* update the status and x-status fields? */
80 #define CH_WEED         (1<<1) /* weed the headers? */
81 #define CH_DECODE       (1<<2) /* do RFC1522 decoding? */
82 #define CH_XMIT         (1<<3) /* transmitting this message? */
83 #define CH_FROM         (1<<4) /* retain the "From " message separator? */
84 #define CH_PREFIX       (1<<5) /* use Prefix string? */
85 #define CH_NOSTATUS     (1<<6) /* supress the status and x-status fields */
86 #define CH_REORDER      (1<<7) /* Re-order output of headers */
87 #define CH_NONEWLINE    (1<<8) /* don't output terminating newline */
88 #define CH_MIME         (1<<9) /* ignore MIME fields */
89 #define CH_UPDATE_LEN   (1<<10) /* update Lines: and Content-Length: */
90 #define CH_TXTPLAIN     (1<<11) /* generate text/plain MIME headers */
91 #define CH_NOLEN        (1<<12) /* don't write Content-Length: and Lines: */
92 #define CH_WEED_DELIVERED (1<<13) /* weed eventual Delivered-To headers */
93 #define CH_FORCE_FROM   (1<<14) /* give CH_FROM precedence over CH_WEED? */
94 #define CH_NOQFROM      (1<<15) /* give CH_FROM precedence over CH_WEED? */
95 #define CH_UPDATE_IRT   (1<<16) /* update In-Reply-To: */
96 #define CH_UPDATE_REFS  (1<<17) /* update References: */
97
98 /* flags for mutt_enter_string() */
99 #define  M_ALIAS   1      /* do alias "completion" by calling up the alias-menu */
100 #define  M_FILE    (1<<1) /* do file completion */
101 #define  M_EFILE   (1<<2) /* do file completion, plus incoming folders */
102 #define  M_CMD     (1<<3) /* do completion on previous word */
103 #define  M_PASS    (1<<4) /* password mode (no echo) */
104 #define  M_CLEAR   (1<<5) /* clear input if printable character is pressed */
105 #define  M_COMMAND (1<<6) /* do command completion */
106 #define  M_PATTERN (1<<7) /* pattern mode - only used for history classes */
107
108 /* flags for mutt_get_token() */
109 #define M_TOKEN_EQUAL           1       /* treat '=' as a special */
110 #define M_TOKEN_CONDENSE        (1<<1)  /* ^(char) to control chars (macros) */
111 #define M_TOKEN_SPACE           (1<<2)  /* don't treat whitespace as a term */
112 #define M_TOKEN_QUOTE           (1<<3)  /* don't interpret quotes */
113 #define M_TOKEN_PATTERN         (1<<4)  /* !)|~ are terms (for patterns) */
114 #define M_TOKEN_COMMENT         (1<<5)  /* don't reap comments */
115 #define M_TOKEN_SEMICOLON       (1<<6)  /* don't treat ; as special */
116
117 /* flags for km_dokey() */
118 #define M_KM_UNBUFFERED 1 /* don't read from the key buffer */
119
120 typedef struct
121 {
122   char *data;   /* pointer to data */
123   char *dptr;   /* current read/write position */
124   size_t dsize; /* length of data */
125   int destroy;  /* destroy `data' when done? */
126 } BUFFER;
127
128 typedef struct
129 {
130   int ch; /* raw key pressed */
131   int op; /* function op */
132 } event_t;
133
134 /* flags for _mutt_system() */
135 #define M_DETACH_PROCESS        1       /* detach subprocess from group */
136
137 /* flags for mutt_FormatString() */
138 typedef enum
139 {
140   M_FORMAT_FORCESUBJ    = (1<<0), /* print the subject even if unchanged */
141   M_FORMAT_TREE         = (1<<1), /* draw the thread tree */
142   M_FORMAT_MAKEPRINT    = (1<<2), /* make sure that all chars are printable */
143   M_FORMAT_OPTIONAL     = (1<<3),
144   M_FORMAT_STAT_FILE    = (1<<4), /* used by mutt_attach_fmt */
145   M_FORMAT_ARROWCURSOR  = (1<<5), /* reserve space for arrow_cursor */
146   M_FORMAT_INDEX        = (1<<6), /* this is a main index entry */
147   M_FORMAT_NOFILTER     = (1<<7)  /* do not allow filtering on this pass */
148 } format_flag;
149
150 /* types for mutt_add_hook() */
151 #define M_FOLDERHOOK    1
152 #define M_MBOXHOOK      (1<<1)
153 #define M_SENDHOOK      (1<<2)
154 #define M_FCCHOOK       (1<<3)
155 #define M_SAVEHOOK      (1<<4)
156 #define M_CHARSETHOOK   (1<<5)
157 #define M_ICONVHOOK     (1<<6)
158 #define M_MESSAGEHOOK   (1<<7)
159 #define M_CRYPTHOOK     (1<<8)
160 #define M_ACCOUNTHOOK   (1<<9)
161 #define M_REPLYHOOK     (1<<10)
162 #define M_SEND2HOOK     (1<<11)
163
164 /* tree characters for linearize_tree and print_enriched_string */
165 #define M_TREE_LLCORNER         1
166 #define M_TREE_ULCORNER         2
167 #define M_TREE_LTEE             3
168 #define M_TREE_HLINE            4
169 #define M_TREE_VLINE            5
170 #define M_TREE_SPACE            6
171 #define M_TREE_RARROW           7
172 #define M_TREE_STAR             8
173 #define M_TREE_HIDDEN           9
174 #define M_TREE_EQUALS           10
175 #define M_TREE_TTEE             11
176 #define M_TREE_BTEE             12
177 #define M_TREE_MISSING          13
178 #define M_TREE_MAX              14
179
180 #define M_THREAD_COLLAPSE       (1<<0)
181 #define M_THREAD_UNCOLLAPSE     (1<<1)
182 #define M_THREAD_GET_HIDDEN     (1<<2)
183 #define M_THREAD_UNREAD         (1<<3)
184 #define M_THREAD_NEXT_UNREAD    (1<<4)
185
186 enum
187 {
188   /* modes for mutt_view_attachment() */
189   M_REGULAR = 1,
190   M_MAILCAP,
191   M_AS_TEXT,
192
193   /* action codes used by mutt_set_flag() and mutt_pattern_function() */
194   M_ALL,
195   M_NONE,
196   M_NEW,
197   M_OLD,
198   M_REPLIED,
199   M_READ,
200   M_UNREAD,
201   M_DELETE,
202   M_UNDELETE,
203   M_DELETED,
204   M_FLAG,
205   M_TAG,
206   M_UNTAG,
207   M_LIMIT,
208   M_EXPIRED,
209   M_SUPERSEDED,
210
211   /* actions for mutt_pattern_comp/mutt_pattern_exec */
212   M_AND,
213   M_OR,
214   M_THREAD,
215   M_TO,
216   M_CC,
217   M_COLLAPSED,
218   M_SUBJECT,
219   M_FROM,
220   M_DATE,
221   M_DATE_RECEIVED,
222   M_DUPLICATED,
223   M_UNREFERENCED,
224   M_ID,
225   M_BODY,
226   M_HEADER,
227   M_HORMEL,
228   M_WHOLE_MSG,
229   M_SENDER,
230   M_MESSAGE,
231   M_SCORE,
232   M_SIZE,
233   M_REFERENCE,
234   M_RECIPIENT,
235   M_LIST,
236   M_SUBSCRIBED_LIST,
237   M_PERSONAL_RECIP,
238   M_PERSONAL_FROM,
239   M_ADDRESS,
240   M_CRYPT_SIGN,
241   M_CRYPT_VERIFIED,
242   M_CRYPT_ENCRYPT,
243   M_PGP_KEY,
244   M_XLABEL,
245   M_MIMEATTACH,
246   
247   /* Options for Mailcap lookup */
248   M_EDIT,
249   M_COMPOSE,
250   M_PRINT,
251   M_AUTOVIEW,
252
253   /* options for socket code */
254   M_NEW_SOCKET,
255 #ifdef USE_SSL_OPENSSL
256   M_NEW_SSL_SOCKET,
257 #endif
258
259   /* Options for mutt_save_attachment */
260   M_SAVE_APPEND,
261   M_SAVE_OVERWRITE
262 };
263
264 /* possible arguments to set_quadoption() */
265 enum
266 {
267   M_NO,
268   M_YES,
269   M_ASKNO,
270   M_ASKYES
271 };
272
273 /* quad-option vars */
274 enum
275 {
276   OPT_ABORT,
277   OPT_BOUNCE,
278   OPT_COPY,
279   OPT_DELETE,
280   OPT_FORWEDIT,
281   OPT_INCLUDE,
282   OPT_MFUPTO,
283   OPT_MIMEFWD,
284   OPT_MIMEFWDREST,
285   OPT_MOVE,
286   OPT_PGPMIMEAUTO,     /* ask to revert to PGP/MIME when inline fails */
287 #ifdef USE_POP
288   OPT_POPDELETE,
289   OPT_POPRECONNECT,
290 #endif
291   OPT_POSTPONE,
292   OPT_PRINT,
293   OPT_QUIT,
294   OPT_REPLYTO,
295   OPT_RECALL,
296 #if defined(USE_SSL)
297   OPT_SSLSTARTTLS,
298 #endif
299   OPT_SUBJECT,
300   OPT_VERIFYSIG,      /* verify PGP signatures */
301     
302   /* THIS MUST BE THE LAST VALUE. */
303   OPT_MAX
304 };
305
306 /* flags to ci_send_message() */
307 #define SENDREPLY       (1<<0)
308 #define SENDGROUPREPLY  (1<<1)
309 #define SENDLISTREPLY   (1<<2)
310 #define SENDFORWARD     (1<<3)
311 #define SENDPOSTPONED   (1<<4)
312 #define SENDBATCH       (1<<5)
313 #define SENDMAILX       (1<<6)
314 #define SENDKEY         (1<<7)
315 #define SENDRESEND      (1<<8)
316
317 /* flags to _mutt_select_file() */
318 #define M_SEL_BUFFY     (1<<0)
319 #define M_SEL_MULTI     (1<<1)
320 #define M_SEL_FOLDER    (1<<2)
321
322 /* flags for parse_spam_list */
323 #define M_SPAM          1
324 #define M_NOSPAM        2
325
326 /* boolean vars */
327 enum
328 {
329   OPTALLOW8BIT,
330   OPTALLOWANSI,
331   OPTARROWCURSOR,
332   OPTASCIICHARS,
333   OPTASKBCC,
334   OPTASKCC,
335   OPTATTACHSPLIT,
336   OPTAUTOEDIT,
337   OPTAUTOTAG,
338   OPTBEEP,
339   OPTBEEPNEW,
340   OPTBOUNCEDELIVERED,
341   OPTBRAILLEFRIENDLY,
342   OPTCHECKMBOXSIZE,
343   OPTCHECKNEW,
344   OPTCOLLAPSEUNREAD,
345   OPTCONFIRMAPPEND,
346   OPTCONFIRMCREATE,
347   OPTDELETEUNTAG,
348   OPTDIGESTCOLLAPSE,
349   OPTDUPTHREADS,
350   OPTEDITHDRS,
351   OPTENCODEFROM,
352   OPTENVFROM,
353   OPTFASTREPLY,
354   OPTFCCATTACH,
355   OPTFCCCLEAR,
356   OPTFOLLOWUPTO,
357   OPTFORCENAME,
358   OPTFORWDECODE,
359   OPTFORWQUOTE,
360 #ifdef USE_HCACHE
361   OPTHCACHEVERIFY,
362 #ifdef HAVE_QDBM
363   OPTHCACHECOMPRESS,
364 #endif /* HAVE_QDBM */
365 #endif
366   OPTHDRS,
367   OPTHEADER,
368   OPTHELP,
369   OPTHIDDENHOST,
370   OPTHIDELIMITED,
371   OPTHIDEMISSING,
372   OPTHIDETHREADSUBJECT,
373   OPTHIDETOPLIMITED,
374   OPTHIDETOPMISSING,
375   OPTIGNORELWS,
376   OPTIGNORELISTREPLYTO,
377 #ifdef USE_IMAP
378   OPTIMAPCHECKSUBSCRIBED,
379   OPTIMAPIDLE,
380   OPTIMAPLSUB,
381   OPTIMAPPASSIVE,
382   OPTIMAPPEEK,
383   OPTIMAPSERVERNOISE,
384 #endif
385 #if defined(USE_SSL)
386 # ifndef USE_SSL_GNUTLS
387   OPTSSLSYSTEMCERTS,
388   OPTSSLV2,
389 # endif /* USE_SSL_GNUTLS */
390   OPTSSLV3,
391   OPTTLSV1,
392   OPTSSLFORCETLS,
393 #endif /* defined(USE_SSL) */
394   OPTIMPLICITAUTOVIEW,
395   OPTINCLUDEONLYFIRST,
396   OPTKEEPFLAGGED,
397   OPTMAILCAPSANITIZE,
398   OPTMAILDIRTRASH,
399   OPTMARKERS,
400   OPTMARKOLD,
401   OPTMENUSCROLL,        /* scroll menu instead of implicit next-page */
402   OPTMENUMOVEOFF,       /* allow menu to scroll past last entry */
403 #if defined(USE_IMAP) || defined(USE_POP)
404   OPTMESSAGECACHECLEAN,
405 #endif
406   OPTMETAKEY,           /* interpret ALT-x as ESC-x */
407   OPTMETOO,
408   OPTMHPURGE,
409   OPTMIMEFORWDECODE,
410   OPTNARROWTREE,
411   OPTPAGERSTOP,
412   OPTPIPEDECODE,
413   OPTPIPESPLIT,
414 #ifdef USE_POP
415   OPTPOPAUTHTRYALL,
416   OPTPOPLAST,
417 #endif
418   OPTPRINTDECODE,
419   OPTPRINTSPLIT,
420   OPTPROMPTAFTER,
421   OPTREADONLY,
422   OPTREPLYSELF,
423   OPTRESOLVE,
424   OPTREVALIAS,
425   OPTREVNAME,
426   OPTREVREAL,
427   OPTRFC2047PARAMS,
428   OPTSAVEADDRESS,
429   OPTSAVEEMPTY,
430   OPTSAVENAME,
431   OPTSCORE,
432   OPTSIGDASHES,
433   OPTSIGONTOP,
434   OPTSORTRE,
435   OPTSPAMSEP,
436   OPTSTATUSONTOP,
437   OPTSTRICTTHREADS,
438   OPTSUSPEND,
439   OPTTEXTFLOWED,
440   OPTTHOROUGHSRC,
441   OPTTHREADRECEIVED,
442   OPTTILDE,
443   OPTUNCOLLAPSEJUMP,
444   OPTUSE8BITMIME,
445   OPTUSEDOMAIN,
446   OPTUSEFROM,
447   OPTUSEGPGAGENT,
448 #ifdef HAVE_LIBIDN
449   OPTUSEIDN,
450 #endif
451 #ifdef HAVE_GETADDRINFO
452   OPTUSEIPV6,
453 #endif
454   OPTWAITKEY,
455   OPTWEED,
456   OPTWRAP,
457   OPTWRAPSEARCH,
458   OPTWRITEBCC,          /* write out a bcc header? */
459   OPTXMAILER,
460
461   OPTCRYPTUSEGPGME,
462   OPTCRYPTUSEPKA,
463
464   /* PGP options */
465   
466   OPTCRYPTAUTOSIGN,
467   OPTCRYPTAUTOENCRYPT,
468   OPTCRYPTAUTOPGP,
469   OPTCRYPTAUTOSMIME,
470   OPTCRYPTREPLYENCRYPT,
471   OPTCRYPTREPLYSIGN,
472   OPTCRYPTREPLYSIGNENCRYPTED,
473   OPTCRYPTTIMESTAMP,
474   OPTSMIMEISDEFAULT,
475   OPTASKCERTLABEL,
476   OPTSDEFAULTDECRYPTKEY,
477   OPTPGPIGNORESUB,
478   OPTPGPCHECKEXIT,
479   OPTPGPLONGIDS,
480   OPTPGPAUTODEC,
481 #if 0
482   OPTPGPENCRYPTSELF,
483 #endif
484   OPTPGPRETAINABLESIG,
485   OPTPGPSTRICTENC,
486   OPTFORWDECRYPT,
487   OPTPGPSHOWUNUSABLE,
488   OPTPGPAUTOINLINE,
489   OPTPGPREPLYINLINE,
490
491   /* pseudo options */
492
493   OPTAUXSORT,           /* (pseudo) using auxillary sort function */
494   OPTFORCEREFRESH,      /* (pseudo) refresh even during macros */
495   OPTLOCALES,           /* (pseudo) set if user has valid locale definition */
496   OPTNOCURSES,          /* (pseudo) when sending in batch mode */
497   OPTNEEDREDRAW,        /* (pseudo) to notify caller of a submenu */
498   OPTSEARCHREVERSE,     /* (pseudo) used by ci_search_command */
499   OPTMSGERR,            /* (pseudo) used by mutt_error/mutt_message */
500   OPTSEARCHINVALID,     /* (pseudo) used to invalidate the search pat */
501   OPTSIGNALSBLOCKED,    /* (pseudo) using by mutt_block_signals () */
502   OPTSYSSIGNALSBLOCKED, /* (pseudo) using by mutt_block_signals_system () */
503   OPTNEEDRESORT,        /* (pseudo) used to force a re-sort */
504   OPTRESORTINIT,        /* (pseudo) used to force the next resort to be from scratch */
505   OPTVIEWATTACH,        /* (pseudo) signals that we are viewing attachments */
506   OPTFORCEREDRAWINDEX,  /* (pseudo) used to force a redraw in the main index */
507   OPTFORCEREDRAWPAGER,  /* (pseudo) used to force a redraw in the pager */
508   OPTSORTSUBTHREADS,    /* (pseudo) used when $sort_aux changes */
509   OPTNEEDRESCORE,       /* (pseudo) set when the `score' command is used */
510   OPTATTACHMSG,         /* (pseudo) used by attach-message */
511   OPTKEEPQUIET,         /* (pseudo) shut up the message and refresh
512                          *          functions while we are executing an
513                          *          external program.
514                          */
515   OPTMENUCALLER,        /* (pseudo) tell menu to give caller a take */
516   OPTREDRAWTREE,        /* (pseudo) redraw the thread tree */
517   OPTPGPCHECKTRUST,     /* (pseudo) used by pgp_select_key () */
518   OPTDONTHANDLEPGPKEYS, /* (pseudo) used to extract PGP keys */
519   OPTUNBUFFEREDINPUT,   /* (pseudo) don't use key buffer */
520
521   OPTMAX
522 };
523
524 #define mutt_bit_alloc(n) calloc ((n + 7) / 8, sizeof (char))
525 #define mutt_bit_set(v,n) v[n/8] |= (1 << (n % 8))
526 #define mutt_bit_unset(v,n) v[n/8] &= ~(1 << (n % 8))
527 #define mutt_bit_toggle(v,n) v[n/8] ^= (1 << (n % 8))
528 #define mutt_bit_isset(v,n) (v[n/8] & (1 << (n % 8)))
529
530 #define set_option(x) mutt_bit_set(Options,x)
531 #define unset_option(x) mutt_bit_unset(Options,x)
532 #define toggle_option(x) mutt_bit_toggle(Options,x)
533 #define option(x) mutt_bit_isset(Options,x)
534
535 typedef struct list_t
536 {
537   char *data;
538   struct list_t *next;
539 } LIST;
540
541 typedef struct rx_list_t
542 {
543   REGEXP *rx;
544   struct rx_list_t *next;
545 } RX_LIST;
546
547 typedef struct spam_list_t
548 {
549   REGEXP *rx;
550   int     nmatch;
551   char   *template;
552   struct spam_list_t *next;
553 } SPAM_LIST;
554
555 #define mutt_new_list() safe_calloc (1, sizeof (LIST))
556 #define mutt_new_rx_list() safe_calloc (1, sizeof (RX_LIST))
557 #define mutt_new_spam_list() safe_calloc (1, sizeof (SPAM_LIST))
558 void mutt_free_list (LIST **);
559 void mutt_free_rx_list (RX_LIST **);
560 void mutt_free_spam_list (SPAM_LIST **);
561 LIST *mutt_copy_list (LIST *);
562 int mutt_matches_ignore (const char *, LIST *);
563
564 /* add an element to a list */
565 LIST *mutt_add_list (LIST *, const char *);
566 LIST *mutt_add_list_n (LIST*, const void *, size_t);
567
568 void mutt_init (int, LIST *);
569
570 typedef struct alias
571 {
572   struct alias *self;           /* XXX - ugly hack */
573   char *name;
574   ADDRESS *addr;
575   struct alias *next;
576   short tagged;
577   short del;
578   short num;
579 } ALIAS;
580
581 typedef struct envelope
582 {
583   ADDRESS *return_path;
584   ADDRESS *from;
585   ADDRESS *to;
586   ADDRESS *cc;
587   ADDRESS *bcc;
588   ADDRESS *sender;
589   ADDRESS *reply_to;
590   ADDRESS *mail_followup_to;
591   char *list_post;              /* this stores a mailto URL, or nothing */
592   char *subject;
593   char *real_subj;              /* offset of the real subject */
594   char *message_id;
595   char *supersedes;
596   char *date;
597   char *x_label;
598   BUFFER *spam;
599   LIST *references;             /* message references (in reverse order) */
600   LIST *in_reply_to;            /* in-reply-to header content */
601   LIST *userhdrs;               /* user defined headers */
602
603   unsigned int irt_changed : 1; /* In-Reply-To changed to link/break threads */
604   unsigned int refs_changed : 1; /* References changed to break thread */
605 } ENVELOPE;
606
607 typedef struct parameter
608 {
609   char *attribute;
610   char *value;
611   struct parameter *next;
612 } PARAMETER;
613
614 /* Information that helps in determing the Content-* of an attachment */
615 typedef struct content
616 {
617   long hibin;              /* 8-bit characters */
618   long lobin;              /* unprintable 7-bit chars (eg., control chars) */
619   long crlf;               /* '\r' and '\n' characters */
620   long ascii;              /* number of ascii chars */
621   long linemax;            /* length of the longest line in the file */
622   unsigned int space : 1;  /* whitespace at the end of lines? */
623   unsigned int binary : 1; /* long lines, or CR not in CRLF pair */
624   unsigned int from : 1;   /* has a line beginning with "From "? */
625   unsigned int dot : 1;    /* has a line consisting of a single dot? */
626   unsigned int cr : 1;     /* has CR, even when in a CRLF pair */
627 } CONTENT;
628
629 typedef struct body
630 {
631   char *xtype;                  /* content-type if x-unknown */
632   char *subtype;                /* content-type subtype */
633   PARAMETER *parameter;         /* parameters of the content-type */
634   char *description;            /* content-description */
635   char *form_name;              /* Content-Disposition form-data name param */
636   long hdr_offset;              /* offset in stream where the headers begin.
637                                  * this info is used when invoking metamail,
638                                  * where we need to send the headers of the
639                                  * attachment
640                                  */
641   LOFF_T offset;                /* offset where the actual data begins */
642   LOFF_T length;                /* length (in bytes) of attachment */
643   char *filename;               /* when sending a message, this is the file
644                                  * to which this structure refers
645                                  */
646   char *d_filename;             /* filename to be used for the 
647                                  * content-disposition header.
648                                  * If NULL, filename is used 
649                                  * instead.
650                                  */
651   char *charset;                /* charset of attached file */
652   CONTENT *content;             /* structure used to store detailed info about
653                                  * the content of the attachment.  this is used
654                                  * to determine what content-transfer-encoding
655                                  * is required when sending mail.
656                                  */
657   struct body *next;            /* next attachment in the list */
658   struct body *parts;           /* parts of a multipart or message/rfc822 */
659   struct header *hdr;           /* header information for message/rfc822 */
660
661   struct attachptr *aptr;       /* Menu information, used in recvattach.c */
662
663   signed short attach_count;
664
665   time_t stamp;                 /* time stamp of last
666                                  * encoding update.
667                                  */
668   
669   unsigned int type : 4;        /* content-type primary type */
670   unsigned int encoding : 3;    /* content-transfer-encoding */
671   unsigned int disposition : 2; /* content-disposition */
672   unsigned int use_disp : 1;    /* Content-Disposition uses filename= ? */
673   unsigned int unlink : 1;      /* flag to indicate the the file named by
674                                  * "filename" should be unlink()ed before
675                                  * free()ing this structure
676                                  */
677   unsigned int tagged : 1;
678   unsigned int deleted : 1;     /* attachment marked for deletion */
679
680   unsigned int noconv : 1;      /* don't do character set conversion */
681   unsigned int force_charset : 1; 
682                                 /* send mode: don't adjust the character
683                                  * set when in send-mode.
684                                  */
685   unsigned int is_signed_data : 1; /* A lot of MUAs don't indicate
686                                       S/MIME signed-data correctly,
687                                       e.g. they use foo.p7m even for
688                                       the name of signed data.  This
689                                       flag is used to keep track of
690                                       the actual message type.  It
691                                       gets set during the verification
692                                       (which is done if the encryption
693                                       try failed) and check by the
694                                       function to figure the type of
695                                       the message. */
696
697   unsigned int goodsig : 1;     /* good cryptographic signature */
698   unsigned int warnsig : 1;     /* maybe good signature */
699   unsigned int badsig : 1;      /* bad cryptographic signature (needed to check encrypted s/mime-signatures) */
700
701   unsigned int collapsed : 1;   /* used by recvattach */
702   unsigned int attach_qualifies : 1;
703
704 } BODY;
705
706 typedef struct header
707 {
708   unsigned int security : 11;  /* bit 0-6: flags, bit 7,8: application.
709                                  see: crypt.h pgplib.h, smime.h */
710
711   unsigned int mime : 1;                /* has a MIME-Version header? */
712   unsigned int flagged : 1;             /* marked important? */
713   unsigned int tagged : 1;
714   unsigned int deleted : 1;
715   unsigned int changed : 1;
716   unsigned int attach_del : 1;          /* has an attachment marked for deletion */
717   unsigned int old : 1;
718   unsigned int read : 1;
719   unsigned int expired : 1;             /* already expired? */
720   unsigned int superseded : 1;          /* got superseded? */
721   unsigned int replied : 1;
722   unsigned int subject_changed : 1;     /* used for threading */
723   unsigned int threaded : 1;            /* used for threading */
724   unsigned int display_subject : 1;     /* used for threading */
725   unsigned int recip_valid : 1;         /* is_recipient is valid */
726   unsigned int active : 1;              /* message is not to be removed */
727   unsigned int trash : 1;               /* message is marked as trashed on disk.
728                                          * This flag is used by the maildir_trash
729                                          * option.
730                                          */
731   
732   /* timezone of the sender of this message */
733   unsigned int zhours : 5;
734   unsigned int zminutes : 6;
735   unsigned int zoccident : 1;
736
737   /* bits used for caching when searching */
738   unsigned int searched : 1;
739   unsigned int matched : 1;
740
741   /* tells whether the attachment count is valid */
742   unsigned int attach_valid : 1;
743
744   /* the following are used to support collapsing threads  */
745   unsigned int collapsed : 1;   /* is this message part of a collapsed thread? */
746   unsigned int limited : 1;     /* is this message in a limited view?  */
747   size_t num_hidden;            /* number of hidden messages in this view */
748
749   short recipient;              /* user_is_recipient()'s return value, cached */
750   
751   int pair;                     /* color-pair to use when displaying in the index */
752
753   time_t date_sent;             /* time when the message was sent (UTC) */
754   time_t received;              /* time when the message was placed in the mailbox */
755   LOFF_T offset;                /* where in the stream does this message begin? */
756   int lines;                    /* how many lines in the body of this message? */
757   int index;                    /* the absolute (unsorted) message number */
758   int msgno;                    /* number displayed to the user */
759   int virtual;                  /* virtual message number */
760   int score;
761   ENVELOPE *env;                /* envelope information */
762   BODY *content;                /* list of MIME parts */
763   char *path;
764   
765   char *tree;                   /* character string to print thread tree */
766   struct thread *thread;
767
768   /* Number of qualifying attachments in message, if attach_valid */
769   short attach_total;
770
771 #ifdef MIXMASTER
772   LIST *chain;
773 #endif
774
775 #ifdef USE_POP
776   int refno;                    /* message number on server */
777 #endif
778
779 #if defined USE_POP || defined USE_IMAP
780   void *data;                   /* driver-specific data */
781 #endif
782   
783   char *maildir_flags;          /* unknown maildir flags */
784 } HEADER;
785
786 typedef struct thread
787 {
788   unsigned int fake_thread : 1;
789   unsigned int duplicate_thread : 1;
790   unsigned int sort_children : 1;
791   unsigned int check_subject : 1;
792   unsigned int visible : 1;
793   unsigned int deep : 1;
794   unsigned int subtree_visible : 2;
795   unsigned int next_subtree_visible : 1;
796   struct thread *parent;
797   struct thread *child;
798   struct thread *next;
799   struct thread *prev;
800   HEADER *message;
801   HEADER *sort_key;
802 } THREAD;
803
804
805 /* flag to mutt_pattern_comp() */
806 #define M_FULL_MSG      (1<<0)  /* enable body and header matching */
807
808 typedef enum {
809   M_MATCH_FULL_ADDRESS = 1
810 } pattern_exec_flag;
811
812 typedef struct group_t
813 {
814   ADDRESS *as;
815   RX_LIST *rs;
816   char *name;
817 } group_t;
818
819 typedef struct group_context_t
820 {
821   group_t *g;
822   struct group_context_t *next;
823 } group_context_t;
824
825 typedef struct pattern_t
826 {
827   short op;
828   unsigned int not : 1;
829   unsigned int alladdr : 1;
830   unsigned int stringmatch : 1;
831   unsigned int groupmatch : 1;
832   int min;
833   int max;
834   struct pattern_t *next;
835   struct pattern_t *child;              /* arguments to logical op */
836   union 
837   {
838     regex_t *rx;
839     group_t *g;
840     char *str;
841   } p;
842 } pattern_t;
843
844 /* ACL Rights */
845 enum
846 {
847   M_ACL_LOOKUP = 0,
848   M_ACL_READ,
849   M_ACL_SEEN,
850   M_ACL_WRITE,
851   M_ACL_INSERT,
852   M_ACL_POST,
853   M_ACL_CREATE,
854   M_ACL_DELMX,
855   M_ACL_DELETE,
856   M_ACL_EXPUNGE,
857   M_ACL_ADMIN,
858
859   RIGHTSMAX
860 };
861
862 typedef struct _context
863 {
864   char *path;
865   FILE *fp;
866   time_t mtime;
867   off_t size;
868   off_t vsize;
869   char *pattern;                /* limit pattern string */
870   pattern_t *limit_pattern;     /* compiled limit pattern */
871   HEADER **hdrs;
872   HEADER *last_tag;             /* last tagged msg. used to link threads */
873   THREAD *tree;                 /* top of thread tree */
874   HASH *id_hash;                /* hash table by msg id */
875   HASH *subj_hash;              /* hash table by subject */
876   HASH *thread_hash;            /* hash table for threading */
877   int *v2r;                     /* mapping from virtual to real msgno */
878   int hdrmax;                   /* number of pointers in hdrs */
879   int msgcount;                 /* number of messages in the mailbox */
880   int vcount;                   /* the number of virtual messages */
881   int tagged;                   /* how many messages are tagged? */
882   int new;                      /* how many new messages? */
883   int unread;                   /* how many unread messages? */
884   int deleted;                  /* how many deleted messages */
885   int flagged;                  /* how many flagged messages */
886   int msgnotreadyet;            /* which msg "new" in pager, -1 if none */
887
888   short magic;                  /* mailbox type */
889
890   unsigned char rights[(RIGHTSMAX + 7)/8];      /* ACL bits */
891
892   unsigned int locked : 1;      /* is the mailbox locked? */
893   unsigned int changed : 1;     /* mailbox has been modified */
894   unsigned int readonly : 1;    /* don't allow changes to the mailbox */
895   unsigned int dontwrite : 1;   /* dont write the mailbox on close */
896   unsigned int append : 1;      /* mailbox is opened in append mode */
897   unsigned int quiet : 1;       /* inhibit status messages? */
898   unsigned int collapsed : 1;   /* are all threads collapsed? */
899   unsigned int closing : 1;     /* mailbox is being closed */
900
901   /* driver hooks */
902   void *data;                   /* driver specific data */
903   int (*mx_close)(struct _context *);
904 } CONTEXT;
905
906 typedef struct
907 {
908   FILE *fpin;
909   FILE *fpout;
910   char *prefix;
911   int flags;
912 } STATE;
913
914 /* used by enter.c */
915
916 typedef struct
917 {
918   wchar_t *wbuf;
919   size_t wbuflen;
920   size_t lastchar;
921   size_t curpos;
922   size_t begin;
923   int    tabs;
924 } ENTER_STATE;
925
926 /* flags for the STATE struct */
927 #define M_DISPLAY       (1<<0) /* output is displayed to the user */
928 #define M_VERIFY        (1<<1) /* perform signature verification */
929 #define M_PENDINGPREFIX (1<<2) /* prefix to write, but character must follow */
930 #define M_WEED          (1<<3) /* weed headers even when not in display mode */
931 #define M_CHARCONV      (1<<4) /* Do character set conversions */
932 #define M_PRINTING      (1<<5) /* are we printing? - M_DISPLAY "light" */
933 #define M_REPLYING      (1<<6) /* are we replying? */
934 #define M_FIRSTDONE     (1<<7) /* the first attachment has been done */
935
936 #define state_set_prefix(s) ((s)->flags |= M_PENDINGPREFIX)
937 #define state_reset_prefix(s) ((s)->flags &= ~M_PENDINGPREFIX)
938 #define state_puts(x,y) fputs(x,(y)->fpout)
939 #define state_putc(x,y) fputc(x,(y)->fpout)
940
941 void state_mark_attach (STATE *);
942 void state_attach_puts (const char *, STATE *);
943 void state_prefix_putc (char, STATE *);
944 int  state_printf(STATE *, const char *, ...);
945
946 /* for attachment counter */
947 typedef struct
948 {
949   char   *major;
950   int     major_int;
951   char   *minor;
952   regex_t minor_rx;
953 } ATTACH_MATCH;
954
955 #define M_PARTS_TOPLEVEL        (1<<0)  /* is the top-level part */
956
957 #include "ascii.h"
958 #include "protos.h"
959 #include "lib.h"
960 #include "globals.h"
961
962 #endif /*MUTT_H*/