/* $Id: mbx_imp.h,v 1.74 2006/07/01 07:37:48 hurtta Exp $ */ /****************************************************************************** * The Elm (ME+) Mail System - $Revision: 1.74 $ $State: Exp $ * * Author: Kari Hurtta (was hurtta+elm@ozone.FMI.FI) *****************************************************************************/ #ifdef REMOTE_MBX struct imap_uid_ref { int last_mbx_index; /* Not necessary valid -- just chache */ int uid_number; }; #endif #define RF_magic 0xFA00 struct read_folder_state { unsigned short magic; long fbytes; int linecounter; long fbytes_body; enum prepare_mode mode; int skipping; /* 0 == reading, 1 = skipping, -1 == end of message */ int skip_count; long skip_bytes; union { struct FILE_rs { char * next_line; int next_line_len; } file; #ifdef REMOTE_MBX struct POP_MBX_rs { int msg_num; /* Current msg_num */ int data_idx; char **uidl_vector; int uidl_count; int *rfc822_size_vector; int rfc822_size_count; } pop_mbx; struct IMAP_MBX_rs { struct imap_uid_ref current_message; int data_idx; } imap_mbx; #endif } a; }; typedef void mbx_close_folder P_((struct folder_info *folder, enum close_mode mode)); typedef int mbx_lock_folder P_((int direction,struct folder_info *folder)); typedef int mbx_unlock_folder P_((int interrupt, struct folder_info *folder)); typedef void mbx_flush_folder P_((struct folder_info *folder)); typedef void mbx_init_folder P_((struct folder_info *folder)); typedef void mbx_free_folder P_((struct folder_info *folder)); typedef int mbx_sessionlock_folder P_((struct folder_info *folder, enum sessionlock_mode mode)); typedef int mbx_ferror_folder P_((struct folder_info *folder, int clean)); typedef int mbx_prepare_read_folder P_((struct folder_info *folder, enum prepare_mode mode, READ_STATE read_state_ptr)); typedef int mbx_end_read_folder P_((struct folder_info *folder, READ_STATE read_state_ptr, int silent)); typedef int mbx_copy_envelope_folder P_((struct folder_info *folder, READ_STATE read_state_ptr, struct header_rec *entry, int force)); typedef CONST char * mbx_is_forwarded_folder P_((struct folder_info *folder, READ_STATE read_state_ptr)); typedef int mbx_copy_header_folder P_((struct folder_info *folder, READ_STATE read_state_ptr, char **buffer, int *len)); typedef int mbx_copy_body_folder P_((struct folder_info *folder, READ_STATE read_state_ptr, char **buffer, int *len, long *content_remaining)); typedef int mbx_copy_envelope_end_folder P_((struct folder_info *folder, READ_STATE read_state_ptr)); typedef int mbx_copy_envelope_reset_body P_((struct folder_info *folder, READ_STATE read_state_ptr)); typedef FILE * mbx_folder_to_fd P_((struct folder_info *folder,long offset)); typedef int mbx_new_mail_on_folder P_((struct folder_info *folder,int *bytes)); typedef int mbx_consider_remove_folder P_((struct folder_info *folder)); typedef int mbx_prepare_keep_folder P_((struct folder_info *folder, KEEP_STATE keep_state_ptr)); typedef int mbx_end_keep_folder P_((struct folder_info *folder, KEEP_STATE keep_state_ptr)); typedef void mbx_mark_keep_folder P_((struct folder_info *folder, KEEP_STATE keep_state_ptr, struct header_rec *entry, int keep)); typedef CONST char * mbx_folder_type P_((struct folder_info *folder)); typedef int mbx_start_edit_folder P_((struct folder_info *folder, CONST char **buffer)); typedef int mbx_end_edit_folder P_((struct folder_info *folder)); typedef void mbx_zero_rs_fields_folder P_((struct read_folder_state *rs)); typedef void mbx_free_rs_fields_folder P_((struct read_folder_state *rs)); typedef void mbx_zero_ks_fields_folder P_((struct keep_folder_state *rs)); typedef void mbx_free_ks_fields_folder P_((struct keep_folder_state *rs)); typedef int mbx_get_folder_mode P_((struct folder_info *folder)); struct folder_type { CONST char * type_name; mbx_close_folder * close_it; mbx_lock_folder * lock_it; mbx_init_folder * init_it; mbx_sessionlock_folder * sessionlock_it; mbx_unlock_folder * unlock_it; mbx_flush_folder * flush_it; mbx_ferror_folder * ferror_it; mbx_prepare_read_folder * prepare_read_it; mbx_end_read_folder * end_read_it; mbx_copy_envelope_folder * copy_envelope_it; mbx_is_forwarded_folder * is_forwarded_it; mbx_copy_header_folder * copy_header_it; mbx_copy_body_folder * copy_body_it; mbx_copy_envelope_end_folder * copy_envelope_end_it; mbx_copy_envelope_reset_body * copy_envelope_reset_it; mbx_folder_to_fd * xxx_to_fd; mbx_new_mail_on_folder * new_mail_on_it; mbx_consider_remove_folder * consider_remove_it; mbx_prepare_keep_folder * prepare_keep_it; mbx_end_keep_folder * end_keep_it; mbx_mark_keep_folder * mark_keep_it; mbx_folder_type * type; mbx_start_edit_folder * start_edit_it; mbx_end_edit_folder * end_edit_it; mbx_free_folder * free_it; mbx_zero_rs_fields_folder * zero_rs_fields_it; mbx_free_rs_fields_folder * free_rs_fields_it; mbx_zero_ks_fields_folder * zero_ks_fields_it; mbx_free_ks_fields_folder * free_ks_fields_it; mbx_get_folder_mode * get_it_mode; }; extern int mbx_copy_line_to_temp P_((struct folder_info *folder, char *buffer, int len)); extern void append_buffer P_((char **buffer, int *len, char *buffer1, int len1)); extern void mbx_flush_temp P_((struct folder_info *folder)); #define KS_magic 0xF000 struct keep_folder_state { unsigned short magic; union { struct FILE_ks { char * temp_keep_file; FILE * keep_file; } file; } a; }; int remote_folder_type P_((struct folder_info *fh)); extern struct folder_type read_only, non_spool, spool; #ifdef REMOTE_MBX extern struct folder_type pop_mbx, imap_mbx; typedef enum { POP_error = 0, POP_idle, POP_simple_command, POP_simple_response, POP_multiline_command, POP_multiline_response, POP_multiline_data, POP_command_ready, POP_not_logged } pop_states; extern void set_remote_tempmbox P_((struct folder_info *fh, struct remote_account *X)); struct imap_token { enum token_type { imap_atom, imap_number, imap_continue, imap_notag, imap_status_keyword, imap_other_keyword, imap_list_begin, imap_list_end, imap_code_begin, imap_code_end, imap_string, imap_literal , imap_zero } imap_token; long len_or_value; char * str; }; struct imap_reference { long uid_number; /* used correlate with Elm mailbox structure */ long imap_flags; /* imap \Flag bits */ int rfc822_size; char * internaldate; int header_len; char * header; int body_len; char * body; }; struct Imap_Token_Buffer { struct imap_token * tokens; int token_count; }; extern CONST folder_type_p POP_MBX ; extern CONST folder_type_p IMAP_MBX ; #define IMAP_writable 1 #define IMAP_flusherr 2 #define IMAP_folder_open 4 #define IMAP_can_CLOSE 16 #define POP_disable_skip 1 extern struct connection_type IMAP_connection; extern void set_imap_connection_state P_((struct connection_cache *Ch, imap_states st)); #endif extern CONST folder_type_p NO_NAME; struct private_data { FILE *fh_temp; /* current folder */ FILE *fh_folder; /* current folder */ #define FLAG1_CHECKNEW 0x01 int flags1; /* Set by sessionlock_folder() */ union { struct SPOOL { int lock_state; #ifdef USE_DOTLOCK_LOCKING char *lockfile; #endif /* USE_DOTLOCK_LOCKING */ } spool; #ifdef REMOTE_MBX struct POP_MBX { struct remote_account C; struct Read_Buffer read_buffer; pop_states pop_state; long pop_flags; struct Write_Buffer write_buffer; /* Last command */ char command[4]; /* parsed response */ char *command_status; char *command_data; int data_len; /* size from STAT */ int stat_size; int stat_count; struct uidl_entry * uidl_root; /* Binary tree -- not balanced! */ } pop_mbx; struct IMAP_MBX { struct connection_cache *Ch; char * folder; /* IMAP folder, for example INBOX */ struct string * folder_name_cache; int folder_status; long flag_bits; int num_recent; struct imap_reference *references; /* references[0] not used */ int reference_count; /* actual number of messages +1 */ int last_uid_number; /* uid of last message parsed */ } imap_mbx; #endif /* REMOTE_MBX */ } a; }; struct mbx_hdr_info { struct info_type * type_code; union { int dummy; #ifdef REMOTE_MBX struct POP_MBX_if { int msg_num; char * uidl; } pop_mbx; struct imap_uid_ref imap_mbx; #endif } a; }; typedef void info_zero_routine P_((struct mbx_hdr_info *info)); typedef void info_free_routine P_((struct mbx_hdr_info *info)); typedef void info_status_routine P_((struct mbx_hdr_info *info, char status_buffer[3])); typedef struct info_type { info_zero_routine * zero_it; info_free_routine * free_it; info_status_routine * it_status; } * info_type_t; void change_rec_mbx_info P_((struct header_rec *entry, info_type_t t)); typedef void browser_zero_dir P_((struct folder_browser *dir)); typedef void browser_free_dir P_((struct folder_browser *dir)); /* rel_dirname is relative to type -- not include user@hostname */ typedef int browser_change_dir P_((struct folder_browser *dir, struct string *rel_dirname, struct string **dispname)); typedef int browser_select_dir P_((struct folder_browser *dir, const struct string *rel_itemname, struct string **dispname)); #if ANSI_C struct name_vector; #endif typedef int browser_change_v_dir P_((struct folder_browser *dir, struct name_vector *X, struct string **dispname)); typedef int browser_change_up_dir P_((struct folder_browser *dir, struct string **dispname)); typedef struct string * browser_give_title_dir P_((struct folder_browser *dir)); typedef char browser_separator_dir P_((struct folder_browser *dir)); typedef struct string * browser_name_dir P_((struct folder_browser *dir)); typedef struct string * browser_cat_dir P_((struct folder_browser *dir, struct string * item)); typedef struct folder_info * browser_folder_from_dir P_((struct folder_browser *dir)); typedef int browser_create_selection_dir P_((struct folder_browser *dir)); typedef void zero_ws_fields_browser P_((WRITE_STATE ptr)); typedef void free_ws_fields_browser P_((WRITE_STATE ptr)); typedef int browser_prepare_write_dir P_((struct folder_browser *dir, WRITE_STATE ptr)); typedef int browser_end_write_dir P_((struct folder_browser *dir, WRITE_STATE ptr)); typedef int browser_sync_write_dir P_((struct folder_browser *dir, WRITE_STATE ptr)); typedef long browser_tell_dir_ws P_((struct folder_browser *dir, WRITE_STATE write_state_ptr)); typedef int browser_seek_dir_ws P_((struct folder_browser *dir, WRITE_STATE write_state_ptr, long pos)); typedef int browser_write_dir_ws P_((struct folder_browser *dir, WRITE_STATE write_state_ptr, int l, const char *buffer)); typedef int browser_start_we_dir P_((struct folder_browser *dir, WRITE_STATE write_state_ptr, int write_envelope, struct header_rec *current_header, int *env_flags)); typedef int browser_end_we_dir P_((struct folder_browser *dir, WRITE_STATE write_state_ptr, int write_envelope, struct header_rec *current_header)); typedef int browser_selection_is_folder P_((struct folder_browser *dir, struct folder_info *folder)); typedef int browser_make_ref_folder P_((struct folder_browser *dir, char **refname, int *iscopy, int is_text)); typedef void browser_update_dir P_((struct folder_browser *dir)); /* Call only if BROWSER_NEEDSTAT is set */ typedef void browser_do_stat P_((struct folder_browser *dir, int idx)); typedef void browser_folder_sort_dir P_((struct folder_browser *dir, print_sort_message * print)); #define WS_magic 0xFE00 struct browser_write_state { unsigned short magic; union { struct LOCAL_ws { int save_fd; FILE * save_file; } local; #ifdef REMOTE_MBX struct IMAP_ws { int literal_len; char * literal; } imap; #endif } a; }; struct browser_type { browser_zero_dir * browser_zero_it; browser_free_dir * browser_free_it; browser_change_dir * browser_change_it; browser_give_title_dir * browser_give_title_it; browser_separator_dir * browser_separator_it; browser_name_dir * browser_name_it; browser_cat_dir * browser_cat_it; browser_select_dir * browser_select_it; browser_folder_from_dir * browser_folder_from_it; browser_change_v_dir * browser_change_v_it; browser_change_up_dir * browser_change_up_it; browser_create_selection_dir * browser_create_selection_it; zero_ws_fields_browser * zero_ws_fields_it; free_ws_fields_browser * free_ws_fields_it; browser_prepare_write_dir * browser_prepare_write_it; browser_end_write_dir * browser_end_write_it; browser_tell_dir_ws * browser_tell_it_ws; browser_seek_dir_ws * browser_seek_it_ws; browser_write_dir_ws * browser_write_it_ws; browser_start_we_dir * browser_start_we_it; browser_end_we_dir * browser_end_we_it; browser_selection_is_folder * browser_selection_is_it; browser_make_ref_folder * browser_make_ref_it; browser_update_dir * browser_update_it; browser_do_stat * browser_stat_routine; browser_sync_write_dir * browser_sync_write_it; browser_folder_sort_dir * browser_folder_sort_it; }; #ifdef REMOTE_MBX extern struct browser_type imap_browser; #endif #ifdef DIROPS extern struct browser_type local_browser; #if DIROPS == USE_DIRENT #include #endif /* DIROPS == USE_DIRENT */ #if DIROPS == USE_SYSDIR #include #endif /* DIROPS == USE_SYSDIR */ #endif /* DIROPS */ struct folder_browser { struct browser_type * type; /* NOTE: sys_dir does not include possible user@host * but dirname includes possible user@host ! */ char * sys_dir; /* Unspecified character set! */ struct string * dirname; /* Display name */ enum selection_type sel_type; int vector_len; /* -1 indicates that browser_update_it should be called ... */ struct name_vector { char * sys_name; struct string * disp_name; int flags; time_t mtime; /* modify time for local files */ } * vector, *selection; struct string * filter; /* name filter */ union { struct DUMMY_BROWSER { char *remote; } dummy_browser; #ifdef REMOTE_MBX struct IMAP_BROWSER { struct connection_cache * Ch; struct string * dir_name_cache; /* Assumed that current separator is ASCII here ... */ char cur_sep; struct imap_dir_entry { char * imap_name; struct string * translated_name; char sep; int flags; } * dir_entries; int dir_entry_count; } imap_browser; #endif /* REMOTE_MBX */ #ifdef DIROPS struct LOCAL_BROWSER { DIR * handle; } local_browser; #endif } a; }; extern void clear_dir_vector P_((struct folder_browser *dir)); extern void add_dir_vector P_((struct folder_browser *dir, char *sys_name, struct string * disp_name, int flags)); extern void clear_dir_selection P_((struct folder_browser *dir)); extern void set_dir_selection P_((struct folder_browser *dir, char *sys_name, struct string * disp_name, int flags)); enum folder_place { in_none = 0, in_folders = 1, in_home = 2 }; extern struct folder_info *mbx_new_folder P_((void)); extern folder_type_p get_folder_type P_((CONST char *filename, enum folder_place *in_mail)); extern int in_directory P_((struct stat *buf1, const char *name, const char * dir)); extern int create_as_user P_((const char *name)); extern void zero_ws_fields_local P_((WRITE_STATE ptr)); extern void free_ws_fields_local P_((WRITE_STATE ptr)); extern int real_prepare_write_local P_((struct folder_browser *dir, WRITE_STATE ptr, const char *filename)); extern int real_end_write_local P_((struct folder_browser *dir, WRITE_STATE ptr, const char *filename)); extern int real_sync_write_local P_((struct folder_browser *dir, WRITE_STATE ptr, const char *filename)); extern long real_browser_tell_ws P_((struct folder_browser *dir, WRITE_STATE write_state_ptr)); extern int real_browser_seek_ws P_((struct folder_browser *dir, WRITE_STATE write_state_ptr, long pos)); extern int real_browser_write_ws P_((struct folder_browser *dir, WRITE_STATE ptr, int l, const char *buffer)); extern int real_select_local P_((struct folder_browser *dir, const struct string *rel_itemname, struct string * relative)); extern int real_start_we_local P_((struct folder_browser *dir, WRITE_STATE write_state_ptr, struct header_rec *current_header, int *env_flags)); extern int real_end_we_local P_((struct folder_browser *dir, WRITE_STATE write_state_ptr, struct header_rec *current_header)); extern int browser_select_generic P_((struct folder_browser *dir, struct string * relative_path, const struct string * rel_dirname, struct string * relative, struct string ** Lstr, char ** str, int sep, charset_t default_charset)); extern struct folder_info * real_folder_from_local P_((struct folder_browser *dir)); extern int real_selection_is_local P_((struct folder_browser *dir, struct folder_info *folder)); extern int real_make_ref_local P_((struct folder_browser *dir, char **refname, int *iscopy, int is_text)); extern int browser_vector_len P_((struct folder_browser *dir)); #ifdef REMOTE_MBX extern int make_remote_mbox P_((struct folder_info *fh, struct remote_account *X, struct service_entry *se, char * rest, int rewrite)); typedef uint16 url_default_port_f P_(( const struct browser_url_method *schema)); /* May not be uin16 port because this is promoted to int */ typedef struct connection_cache * url_make_connection_f P_(( const struct browser_url_method *schema, const struct string *user /* May be NULL */, const struct string *password /* May be NULL */, const char *host /* May be NULL */, int port /* May be NULL */)); /* This is always absolute path -- from root as defined for URL */ typedef int url_select_item_from_URL_f P_(( const struct browser_url_method *schema, struct folder_browser *dir, int elems_count, const struct string **elems)); #define BROWSER_URL_method_magic 0xEC09 struct browser_url_method { unsigned short magic; struct browser_type *type; url_default_port_f * url_default_port_it; url_make_connection_f * url_make_it; url_select_item_from_URL_f * url_select_item_from_it_URL; }; #endif /* result MALLOCED */ extern char * return_path_to_env_from_1 P_((const char *value)); /* * Local Variables: * mode:c * c-basic-offset:4 * buffer-file-coding-system: iso-8859-1 * End: */