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

   Copyright (C) 2002, 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 <time.h>

#include "ecurses.h"
#include "address.h"
#include "raddress.h"
#include "rstring.h"
#include "mime.h"

/****************************************************************************
 *    INTERFACE DEFINITIONS
 ****************************************************************************/

#define FLAG_READ       0x0001
#define FLAG_OLD        0x0002
#define FLAG_ANSWERED   0x0004
#define FLAG_TRASHED    0x0008
#define FLAG_DRAFT      0x0010
#define FLAG_FLAGGED    0x0020
#define FLAG_PASSED     0x0040
#define FLAG_LEGITIMATE 0x0080
#define FLAG_NOSPAM     0x0100
#define FLAG_SPAM       0x0200
#define FLAG_DUPLICATE  0x0400
#define FLAG_TO_ME      0x0800
#define FLAG_FETCHED    0x1000

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

typedef enum {
        BOX_INVALID,
        BOX_MBOX,
        BOX_MAILDIR,
        BOX_POP3,
        BOX_SENDER,
} box_type_t;


typedef enum {
        ORDER_NO,
        ORDER_DATE,
        ORDER_DATE_REV,
        ORDER_FROM,
        ORDER_FROM_REV,
        ORDER_SUBJECT,
        ORDER_SUBJECT_REV,
        ORDER_THREAD,
        ORDER_SMTP,
        ORDER_EXTERNAL,
} box_order_t;

typedef unsigned short flag_t;

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

struct mail_array;

/**
 * This simple structure describes a single mail and its connections with
 * other mails grouped in mail_array, and in a tree which is built when
 * grouping messages in threads.
 *
 * parent      -- if this mail is not a reply -1, mail_array index otherwise
 * from        -- From: field as an address
 * reply_to    -- Reply-to: field as an address
 * subject     -- Subject: field
 * date_str    -- Date: field
 * to          -- To: field split into an array of addresses
 * cc          -- Cc: field split into an array of addresses
 * bcc         -- Bcc: field split into an array of addresses
 * recv_for    -- Received: [...] for <user@host>; -- email address as
 *                                                    a string
 * msg_id      -- Message-ID: field
 * in_reply_to -- References: field split into an array of message ids or
 *                one message id taken from In-reply-to: field.
 * tree        -- thread tree without colour
 * tree_len    -- tree length
 * flags       -- bit flags (explained above)
 * date        -- Date: field as 'seconds since the Epoch'
 * child_count -- replies count (this does not include replies to reply)
 * mua         -- Mail User Agent
 * mime        -- mime type
 * headers     -- custom headers
 * smtp        -- smtp account
 *
 * place       -- this *HAS* to be unique for every message (as a pointer)
 *
 */
struct mail_st {

        int            parent;  /* parent index */
        address_t     *from;
        address_t     *reply_to;
        char          *subject;
        char          *date_str;
        raddress_t    *to;
        raddress_t    *cc;
        raddress_t    *bcc;
        address_t     *recv_for;
        char          *msg_id;
        rstring_t     *in_reply_to;
        chtype        *tree;
        short          tree_len;
        flag_t         flags;
        char           child_count;
        char           is_last_child;
        time_t         date;
        char          *mua;
        mime_info_t   *mime;
        rstring_t     *headers;
        char          *smtp;

        box_type_t     type;
  
        union {
                void     *generic;
                unsigned  offset_header;
                char     *file_name;
                int       num;
        } place;

};

typedef struct mail_st mail_t;


/**
 * I decided to hold messages in an array.  It is very convenient because
 * you can easily get any message at any time and sorting is trivial.
 *
 * This structure holds informations about a box.  The mail module is
 * responsible for keeping them consistent.
 *
 * path              -- path to the mailbox
 * array             -- the array itself
 * size              -- how many mails may be held in the array
 * count             -- how many mails is held in the array
 * not_replies_count -- how many messages have no parent
 * old_count         -- how many messages is old
 * read_count        -- how many messages is read
 * type              -- box type
 * order             -- how messages are ordered
 * have_parents      -- is a boolean saying if parents are evaluated
 */
typedef struct mail_array {
        char       *path;
        mail_t     *array;
        int         size;
        int         count;
        int         not_replies_count;
        int         old_count;
        int         read_count;
        box_type_t  type;
        box_order_t order;
        int         have_parents;
} mail_array_t;

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

extern void mail_destroy (mail_t *mail, box_type_t type);
extern void mail_clear (mail_t *mail);

extern mail_array_t *mail_array_create_size (int size, box_type_t type,
                                             const char *path);
extern mail_array_t *mail_array_create (box_type_t type, const char *path);
extern mail_array_t *mail_array_read_from_file (FILE *fp, box_type_t type,
                          const char *path, void (*)(memchunk_t *, mail_t *));
extern void          mail_array_destroy (mail_array_t *marray);
extern void          mail_array_substitute (mail_array_t *marray,
                                            mail_array_t *with);
extern void          mail_array_insert (mail_array_t *marray, mail_t *mail);
extern mail_t       *mail_array_get (mail_array_t *marray, int index);
extern void          mail_array_find_parents (mail_array_t *marray);
extern int           mail_array_not_replies (mail_array_t *marray);
extern int           mail_array_old (mail_array_t *marray);
extern int           mail_array_read (mail_array_t *marray);
extern int           mail_array_first_unread_index (mail_array_t *marray);
extern int           mail_array_dump (mail_array_t *marray, FILE *fp,
                                      void (*fun)(memchunk_t *, mail_t *));
  
extern void mail_array_sort_external (mail_array_t *marray,
                                      int (*cmp)(const void *, const void *));
extern void mail_array_sort_date (mail_array_t *marray);
extern void mail_array_sort_from (mail_array_t *marray);
extern void mail_array_sort_subject (mail_array_t *marray);
extern void mail_array_sort_smtp (mail_array_t *marray);
extern void mail_array_sort_threads (mail_array_t *marray);

extern int mail_array_find_place (mail_array_t *marray, void *ptr);
extern int mail_array_find (mail_array_t *marray, int (*fun)(mail_t *),
                            int start);
extern int mail_array_find_back (mail_array_t *marray, int (*fun)(mail_t *),
                                 int start);
extern int mail_array_find_subject (mail_array_t *marray, const char *sub,
                                    int start);
extern int mail_array_find_from (mail_array_t *marray, const char *from,
                                 int start);
extern int mail_array_find_unread (mail_array_t *marray, int start);
extern int mail_array_find_unread_back (mail_array_t *marray, int start);

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



syntax highlighted by Code2HTML, v. 0.9.1