/* $Id: mailer_imp.h,v 1.10 2006/04/09 07:37:05 hurtta Exp $ */

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

#if ANSI_C
struct mailer_config;
struct mailer_option_list;
struct mailer_info;
#endif


typedef int mailer_set_option  P_((struct mailer_config *M,
				   struct mailer_option_list *X,
				   char *value));
typedef int mailer_init_hook P_((struct mailer_config *M,
				 struct mail_send_state *C,
				 struct mailer_info *I));
typedef void mailer_close_hook P_((struct mailer_config *M,
				   struct mail_send_state *C));
typedef int mailer_backend_hook P_((struct mailer_config *M,
				    struct mail_send_state **C,
				    int encoding_top,
				    char * title,
				    sending_message_func *sm));

typedef int mailer_info_init_hook P_((struct mailer_config *M,
				      struct mailer_info *I));

typedef void mailer_info_close_hook P_((struct mailer_config *M,
					struct mailer_info *I));

typedef int mailer_info_query_hook P_((struct mailer_config *M,
				       struct mailer_info *I,
				       enum MI_query query));

/* Return
   1 == mailer restarted, reconnect succeed -- reask info
   0 == mailer not disconnected
  -1 == mailer disconnected, reconnect failed 
*/
typedef int mailer_info_restart_hook P_((struct mailer_config *M,
					 struct mailer_info *I));


/* Return 
   -1 if caller should result with default data (return 1)
   -2 if caller should just test passwd
   0  if failure
   1  is succees
*/
typedef int mailer_info_verify_addr P_((struct mailer_config *M,
					struct mailer_info  *I, 
					CONST char *text,
					struct addr_item *result));

					
typedef void mailer_info_gen_def_ef P_((struct mailer_config *M,
					struct mailer_info *I,
					struct mailer_env_from *X)); 
typedef void mailer_info_set_ef     P_((struct mailer_config *M,
					struct mailer_info *I,
					struct mailer_env_from *X,
					const char *value));

typedef int MO_value_hook P_((struct mailer_config      * M,
			      struct mailer_option_list * L,
			      char **value,int set));

struct mailer_option_list {
    CONST char              * field;
    char                   ** value;
    MO_value_hook           * value_func;
    int malloced;
};

/* mailer_bits mask */
#define MB_DONT_ADD_FROM       1
#define MB_USE_DOMAIN          2
#define MB_ALLOW_SET_SENDER    4
#define MB_REQ_DEFAULT_SENDER  8

struct mailer_config {
    CONST char *mailer_type;
    struct mailer_option_list   *list;    /* {NULL, NULL} terminated */ 
    mailer_set_option         * m_set_option;
    mailer_init_hook          * m_init_hook;
    mailer_close_hook         * m_close_hook;
    mailer_backend_hook       * m_backend_hook;
    char                     ** mailer_path;
    mailer_info_init_hook     * mi_init_hook;
    mailer_info_close_hook    * mi_close_hook;
    mailer_info_query_hook    * mi_query_hook;
    mailer_info_verify_addr   * mi_verify_addr;
    mailer_info_gen_def_ef    * mi_def_env_from;  
    mailer_info_set_ef        * mi_set_env_from;
    mailer_info_restart_hook  * mi_restart_hook;

    int                         mailer_bits;
    /* TODO: Add to this mailer specific data
       (if any)
    */
};


#define MAILER_magic		0xF200

struct mail_send_state {
    unsigned short          magic;
    struct mailer_config   *mailer_type;
    char **addrs;
    int   addr_count;
    int   dsn;
    int   verbose;

    char      * fname;
    out_state_t   OUT;
    end_handler *orig_func;

    char      *  mail_from;              /* From struct mailer_env_from */
    /* TODO: Add mailer specific state to here ... */

    struct mailer_info     *head;
    struct mail_send_state *next;
};

#define MAILER_INFO_magic	0xF201


struct mailer_info  {
    unsigned short          magic;
    struct mailer_config   *mailer_type;
    
    int                    delete_pending;

    union any_mailer_info {
        void                  * ptr;
        struct mailer_info_1  * p1;
        struct mailer_info_2  * p2;
    } p;

    struct mail_send_state *first;
    struct mailer_env_from *first_e;
};

int MO_default_value P_((struct mailer_config      * M,
			 struct mailer_option_list * L,
			 char **value,int set));
int MO_allow_set_sender P_((struct mailer_config      * M,
			    struct mailer_option_list * L,
			    char **value,int set));

#define MAILER_ef_magic	        0xF202

#define MAILER_ef_can_set       1
#define MAILER_ef_need_default  2
#define MAILER_ef_changed       4

struct mailer_env_from {
    unsigned short          magic;   /* MAILER_ef_magic */
    struct mailer_config   *mailer_type;

    char                  * mail_from;
    unsigned int            flags;

    struct mailer_info     *head;
    struct mailer_env_from *next;
};

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


syntax highlighted by Code2HTML, v. 0.9.1