#ifndef __MIME_H__
#define __MIME_H__ 1
/* 
   elmo - ELectronic Mail Operator

   Copyright (C) 2003, 2004 rzyjontko

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; version 2.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software Foundation,
   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

*/
/****************************************************************************
 *    INTERFACE REQUIRED HEADERS
 ****************************************************************************/

#include "memchunk.h"
#include "str.h"

/****************************************************************************
 *    INTERFACE DEFINITIONS / ENUMERATIONS / SIMPLE TYPEDEFS
 ****************************************************************************/

typedef enum {MENC_NONE,
              MENC_7BIT,
              MENC_8BIT,
              MENC_QP,
              MENC_BASE64,
              MENC_UUENCODE,
} mime_enc_t;

typedef enum {
        SIG_NOT_SIGNED,
        SIG_OK,
        SIG_WARN,
        SIG_FAIL,
} mime_sig_t;

/****************************************************************************
 *    INTERFACE CLASS PROTOTYPES / EXTERNAL CLASS REFERENCES
 ****************************************************************************/
/****************************************************************************
 *    INTERFACE STRUCTURES / UTILITY CLASSES
 ****************************************************************************/

typedef struct rmime rmime_t;

typedef struct {
        mime_enc_t   encoding;  /* Content-Transfer-Encoding */
        char        *type;      /* Content-Type */
        char        *charset;   /* charset taken from Content-Type */

        int          off_header; /* offset of the header */
        int          off_start; /* offset of the body */
        int          off_end;   /* offset of the end of the body */
        int          off_bound; /* offset of the end of the part */

        char        *file_name; /* file name, when disposition is */
                                /* attachment, null when inline */

        rmime_t     *parts;     /* valid for multipart mime types */
} mime_t;

struct rmime {
        mime_t   **array;
        size_t     size;
        size_t     count;
        unsigned   flags;
};

typedef struct mime_info {
        char       *file;
        mime_t     *mime;

        char       *d_file;
        mime_t     *decrypted;

        mime_sig_t  sig;
        char       *sig_text;
        char       *sig_by;
} mime_info_t;

/****************************************************************************
 *    INTERFACE DATA DECLARATIONS
 ****************************************************************************/
/****************************************************************************
 *    INTERFACE FUNCTION PROTOTYPES
 ****************************************************************************/

extern void mime_init (void);
extern void mime_post_setup (void);
extern void mime_free_resources (void);

extern char  *mime_decode_header (char *str, int len, int free_s);
extern char  *mime_decode_utf8 (char *str);
extern str_t *mime_decode (mime_t *mime, char *str, int free_s);
extern str_t *mime_encode (mime_t *mime, char *bytes, int len);

extern void  mime_add_charset (char *str);
extern void  mime_register_handler (char *type, char *handler);
extern void  mime_register_type (char *type, char *re);
extern char *mime_get_handler (mime_t *mime);
extern void  mime_decrypt (mime_info_t *mime_info);

extern mime_info_t *mime_info_create (void);
extern mime_info_t *mime_info_read (memchunk_t *memchunk);

extern mime_t *mime_create (void);
extern mime_t *mime_from_file_name (const char *fname);
extern void    mime_destroy (mime_t *mime);
extern void    mime_info_destroy (mime_info_t *mime_info);
extern void    mime_set_from_header (mime_t *mime, char *str);
extern void    mime_complete_file_name (mime_t *mime, char *str);
extern char   *mime_encoding_str (mime_t *mime);

extern void mime_dump (memchunk_t *memchunk, mime_t *mime);
extern void mime_read (memchunk_t *memchunk, mime_t *mime);

extern mime_t *mime_last (mime_info_t *mime_info);
extern mime_t *mime_first (mime_info_t *mime_info);
extern mime_t *mime_nth_leaf (mime_info_t *mime_info, int index);
extern int     mime_leaf_count (mime_info_t *mime_info);
extern mime_t *mime_first_text (mime_info_t *mime_info);
extern char    mime_attachment_indicator (mime_info_t *mime_info);

/****************************************************************************
 *    INTERFACE OBJECT CLASS DEFINITIONS
 ****************************************************************************/
/****************************************************************************
 *    INTERFACE TRAILING HEADERS
 ****************************************************************************/
/****************************************************************************
 *
 *    END HEADER mime.h
 *
 ****************************************************************************/
#endif


syntax highlighted by Code2HTML, v. 0.9.1