/* $Id: melib.h,v 1.52 2006/06/28 19:21:09 hurtta Exp $ */

/******************************************************************************
 *  The Elm (ME+) Mail System  -  $Revision: 1.52 $   $State: Exp $
 *
 *  Author: Kari Hurtta <hurtta+elm@posti.FMI.FI> (was hurtta+elm@ozone.FMI.FI)
 *****************************************************************************/


/* melib/type_check.c */

/* Return 1 to decode */
typedef int type_mismatch_prompt P_((mime_t *ptr, int displaying));


#ifdef USE_PGP

/* pgp_decode.c */

extern char pgp_passphrase[PGP_NUM][STRING];
extern int pgp_expires;

extern enum pgp_version have_pgp        P_((enum pgp_version v));
extern enum pgp_version decode_pgp_version P_((char * c));
extern int pgp_void_passphrase          P_((void));
extern int pgp_goodPassphrase           P_((enum pgp_version v));
extern int pgp_decrypt_init		P_((FILE **fpin, FILE **fpout, 
					    int opt, enum pgp_version v,
					    struct run_state *rs));


#endif

/* parse_util.c */



typedef int header_filter    P_((header_list_ptr, int));
extern int NULL_header_filter    P_((header_list_ptr, int));

extern void state_write_headers P_((out_state_t      * s,
				    header_list_ptr    hdr,
				    header_filter    * filter,
				    int                flag,
				    int                demime,
				    charset_t          defcharset));

extern void state_write_raw_headers P_((out_state_t      * s,
					header_list_ptr    hdr,
					header_filter    * filter,
					int                flag));

extern void state_write_header P_((out_state_t * s,
				   header_list_ptr next,
				   int                demime,
				   charset_t          defcharset));

extern void state_write_raw_header P_((out_state_t   * s,
				       header_list_ptr next));
			

  
extern header_list_ptr file_read_headers  P_((FILE *, int));

extern long skip_envelope P_((struct header_rec *hdr, FILE *fp));

/* mime.c */

extern void mime_panic          P_((char *,int,char *, char *));
extern int check_encoding       P_((char *));

/* mime_decode.c */

extern int rfc822_header_filter     P_((header_list_ptr, int));

/* Content-transfer-encoding decoders: */
extern void base64_decode	P_((in_state_t *, out_state_t *, int, int));
extern void uudecode            P_((in_state_t  *s_in,
				    out_state_t *s_out,
				    int length,
				    int astext));
extern void quoted_printable_decode  P_((in_state_t *, out_state_t *,
					 int, int));


extern void null_decode		P_((mime_t *, in_state_t *, out_state_t *,
				    charset_t, struct header_rec *));

extern int is_rfc1522 P_((char *));



/* 0: failure, 1: succeed */
extern int run_cte_decoder P_((mime_t *, in_state_t *, out_state_t *)); 


/* mime_parse.c */

extern void mime_t_clear                P_((mime_t *mt));
extern void mime_t_copy                 P_((mime_t *, mime_t *));
extern void mime_t_zero                 P_((mime_t *));
extern void mime_destroy		P_((mime_t *));
extern int mime_get_charset             P_((charset_t *ret, 
					    struct mime_param *buffer,
					    charset_t * display_charset,
					    charset_t default_content_charset
					    ));
extern void mime_warnings		P_((struct header_rec *));
extern int mime_parse_routine		P_((struct folder_info *folder,
					    struct header_rec *hdr,
					    FILE *fp));

extern void parse_mime_headers1 P_((mime_t *ptr,
				    header_list_ptr headers,
				    long part_offset,
				    long body_offset,
				    int opts,
				    charset_t hdr_charset,
				    struct header_errors  ** header_error));

extern int is_pre_mime_content_type P_((mime_t *ptr, char *content_type));

/* mparser.c */

extern int  mime_parser_subparts P_((struct mime_parser_data *P));
extern struct mimeinfo * mime_parser_index P_((struct mime_parser_data *P,
					       int idx));

/* 0 == no parser, 1 == parser found */
extern int mime_parser_parse P_((struct mimeinfo *s,
				 charset_t defcharset,
				 FILE *fp,
				 struct header_errors **header_error));

extern void copy_parser_data P_((struct mime_parser_data **target,
				 struct mime_parser_data *source));				 


/* mailcap.c ----------------------------------------------------------- */

extern void read_mailcaps P_((void)); 

#if ANSI_C
struct mailcap_entry;
#endif


/* Return value must be free()ed */
extern char * mailcap_view_command P_((struct mailcap_entry *f, mime_t *p));



/* mime_selector.c ---------------------------------------------------- */


extern int mime_classify_media P_((mime_t *p,struct header_rec * hdr));

/* Returns -1 on failure otherwise same mask than mime_classify_media() */
typedef int mime_run_selector P_((mime_t *p,struct header_rec * hdr));
typedef mime_run_selector *mime_run_selector_t;

typedef void encrypted_decoder P_((mime_t *init, mime_t *data,
				   in_state_t   *state_in,
				   out_state_t  *state_out,
				   charset_t    defcharset,
				   struct header_rec *mss,
				    type_mismatch_prompt *badtype));

typedef encrypted_decoder * EC_decoder_t;


typedef void signed_decoder P_((mime_t *body, mime_t *sign,
				in_state_t   *state_in,
				out_state_t  *state_out,
				const char *micalg, 
				charset_t defcharset,
				struct header_rec *mss,
				type_mismatch_prompt *badtype));
typedef signed_decoder * SG_decoder_t;



#define MIME_selector_magic     0xFD04

struct mime_selected_handler {
    unsigned short              magic;             /* MIME_selector_magic */

    struct  mt_handle_pager     *handler;          /* Found internal handler */
    struct mailcap_entry        *entry;            /* Found external handler */
  
    EC_decoder_t        EC_decoder;
    SG_decoder_t        SG_decoder;
    mime_t            * selected_alternative;

    unsigned                     use_entry:1;

};

typedef void CT_decoder	        P_((mime_t *part, 
				    in_state_t *instream, 
				    out_state_t *outstream,
				    charset_t defcharset, 
				    struct header_rec *hdr,
				    type_mismatch_prompt *badtype));
typedef CT_decoder *CT_decoder_t;

struct  mt_handle_pager {
    CT_decoder_t        func;
    mime_run_selector_t selector;
};

extern void mime_decode		P_((mime_t *ptr, in_state_t *state_in, 
				    out_state_t *state_out,
				    charset_t defcharset, 
				    struct header_rec *mss,
				    type_mismatch_prompt *badtype
));

/* ----------- */

#define WALKHANDLER_magic       0xFD05

struct walk_handler {
    unsigned short            magic;      /* WALKHANDLER_magic */

    struct handler_type * handler_type;

    union walk_hadler_data {
	struct search_mes  * search_mes;
	
	void               * dummy;
    } u;

};

typedef void mw_init_handler   P_((struct walk_handler *hdl));
typedef void mw_free_handler   P_((struct walk_handler *hdl));
typedef void mw_action_handler P_((struct walk_handler *hdl,mime_t *ptr,
				   in_state_t *state_in, /* May be NULL */
				   FILE *F,
				   out_state_t *state_out  /* May be NULL */ 
				   ));


#define WALKTYPE_magic          0xFD06

struct handler_type {
    unsigned short            magic;      /* WALKTYPE_magic */

    mw_init_handler    *mw_init;
    mw_free_handler    *mw_free;
    mw_action_handler  *mw_action;
};


extern struct walk_handler * malloc_walk_handler P_((struct handler_type *t));
extern void free_walk_handler P_((struct walk_handler **ptr));
extern void simple_mime_walk P_((mime_t *ptr, struct walk_handler *handler,
				 in_state_t *state_in, /* May be NULL */
				 out_state_t *state_out   /* May be NULL */
				 ));

/* partial.c */

struct partial_vector {
    mime_t   * reference;
    char     * id;                   /* Unique identifier field */
    int        number;               /* 1 .. total */
    int        total;                /* -1 if not given */
};

extern void free_partial_vector P_((struct header_rec *mss));
extern struct partial_vector *reg_partial P_((struct header_rec *mss,
					      mime_t   * reference));

/* mime_param.c */

#if ANSI_C
struct mime_param;
#endif

extern CONST char * get_mime_param_compat P_((struct mime_param *P, 
					      char *name));

extern CONST char * get_mime_param_ascii P_((struct mime_param *P, 
					     char *name));

extern CONST struct string * get_mime_param P_((struct mime_param *P, 
						char *name));

extern void free_mime_param P_((struct mime_param **x));

extern struct mime_param * parse_mime_param P_((const char *headername,
						const char *value,
						charset_t def,
						struct header_errors **header_error));

extern struct mime_param * parse_mime_param_string P_((struct string *value,
						       int gen_compat_len,
						       int plain_mode));

extern struct mime_param * copy_mime_param P_((struct mime_param *src));
extern struct string * show_mime_params P_((struct mime_param *P));
extern char * encode_mime_params P_((struct mime_param *P));
extern char ** encode_mime_params_v P_((struct mime_param *P));

extern char ** split_mime_params P_((struct mime_param **P, 
				     struct string *in_buffer,
				     int gen_compat_len,
				     int plain_mode));


extern void mime_params_add_compat P_((struct mime_param **P, 
				       char *name,
				       char *value));
extern void mime_params_add P_((struct mime_param **P, 
				char *name,
				struct string *value));


/* encode.c */

/* 0 == failure
   1 == OK 
   -1 == Ctrl-C */
extern int getkey P_((int send));

extern void get_key_no_prompt P_((void));
extern void encode P_((char *line));
extern void makekey P_((char *rkey));


/* parse_helper.c */

extern void mime_parse_helper P_((struct header_rec *entry,
				  header_list_ptr parsed_headers ));

extern void start_body_helper P_((struct header_rec *current_header,
				  long content_start,
				  header_list_ptr parsed_headers));

/*
 * Local Variables:
 *  mode:c
 *  c-basic-offset:4
 *  buffer-file-coding-system: iso-8859-1
 * End:
 */


syntax highlighted by Code2HTML, v. 0.9.1