root/headers/os/mail/E-mail.h
/*
 * Copyright 2009, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _E_MAIL_H
#define _E_MAIL_H


#include <UTF8.h>


class BList;
struct entry_ref;


// E-Mail attributes
#define B_MAIL_ATTR_NAME                "MAIL:name"                             // indexed string
#define B_MAIL_ATTR_LABEL               "MAIL:label"                    // indexed string
#define B_MAIL_ATTR_STATUS              "MAIL:status"                   // indexed string
#define B_MAIL_ATTR_PRIORITY    "MAIL:priority"                 // indexed string
#define B_MAIL_ATTR_TO                  "MAIL:to"                               // indexed string
#define B_MAIL_ATTR_CC                  "MAIL:cc"                               // indexed string
#define B_MAIL_ATTR_BCC                 "MAIL:bcc"                              // string
#define B_MAIL_ATTR_FROM                "MAIL:from"                             // indexed string
#define B_MAIL_ATTR_SUBJECT             "MAIL:subject"                  // indexed string
#define B_MAIL_ATTR_REPLY               "MAIL:reply"                    // indexed string
#define B_MAIL_ATTR_WHEN                "MAIL:when"                             // indexed time
#define B_MAIL_ATTR_FLAGS               "MAIL:flags"                    // indexed int32
#define B_MAIL_ATTR_RECIPIENTS  "MAIL:recipients"               // string
#define B_MAIL_ATTR_MIME                "MAIL:mime"                             // string
#define B_MAIL_ATTR_HEADER              "MAIL:header_length"    // int32
#define B_MAIL_ATTR_CONTENT             "MAIL:content_length"   // int32
#define B_MAIL_ATTR_READ                "MAIL:read"                             // int32
#define B_MAIL_ATTR_THREAD              "MAIL:thread"                   // string
#define B_MAIL_ATTR_ACCOUNT             "MAIL:account"                  // string
#define B_MAIL_ATTR_ACCOUNT_ID  "MAIL:account_id"               // int32


// read flags
enum read_flags {
        B_UNREAD                                = 0,
        B_SEEN                                  = 1,
        B_READ                                  = 2
        
};


// mail flags
enum mail_flags {
        B_MAIL_PENDING                  = 1,                                            // waiting to be sent

        B_MAIL_SENT                             = 2,                                            // has been sent

        B_MAIL_SAVE                             = 4                                                     // save mail after
                                                                                                                // sending
};

#define B_MAIL_TYPE                             "text/x-email"                  // mime type
#define B_PARTIAL_MAIL_TYPE             "text/x-partial-email"  // mime type


// WARNING: Everything past this point is deprecated. See MailMessage.h,
// mail_encoding.h and MailDaemon.h for alternatives.


// #pragma mark - defines

// schedule days
#define B_CHECK_NEVER                    0
#define B_CHECK_WEEKDAYS                 1
#define B_CHECK_DAILY                    2
#define B_CHECK_CONTINUOUSLY     3
#define B_CHECK_CONTINUOSLY              3

// max. lengths
#define B_MAX_USER_NAME_LENGTH  32
#define B_MAX_HOST_NAME_LENGTH  64

// rfc822 header field types
#define B_MAIL_TO                               "To: "
#define B_MAIL_CC                               "Cc: "
#define B_MAIL_BCC                              "Bcc: "
#define B_MAIL_FROM                             "From: "
#define B_MAIL_DATE                             "Date: "
#define B_MAIL_REPLY                    "Reply-To: "
#define B_MAIL_SUBJECT                  "Subject: "
#define B_MAIL_PRIORITY                 "Priority: "


// #pragma mark - structs


typedef struct {
        char            pop_name[B_MAX_USER_NAME_LENGTH];
        char            pop_password[B_MAX_USER_NAME_LENGTH];
        char            pop_host[B_MAX_HOST_NAME_LENGTH];
        char            real_name[128];
        char            reply_to[128];
        int32           days;                   /* see flags above*/
        int32           interval;               /* in seconds*/
        int32           begin_time;             /* in seconds*/
        int32           end_time;               /* in seconds*/
} mail_pop_account;

typedef struct {
        bool            alert;
        bool            beep;
} mail_notification;


// #pragma mark - global functions

int32 count_pop_accounts(void);
status_t get_pop_account(mail_pop_account*, int32 index = 0);
status_t set_pop_account(mail_pop_account*, int32 index = 0,
        bool save = true);


// #pragma mark - BMailMessage

class BMailMessage {
public:
                                                                BMailMessage();
                                                                ~BMailMessage();

                        status_t                        AddContent(const char* text, int32 length,
                                                                        uint32 encoding = B_ISO1_CONVERSION,
                                                                        bool clobber = false);
                        status_t                        AddContent(const char* text, int32 length,
                                                                        const char* encoding,
                                                                        bool clobber = false);
        
                        status_t                        AddEnclosure(entry_ref* ref,
                                                                        bool clobber = false);
                        status_t                        AddEnclosure(const char* path,
                                                                        bool clobber = false);
                        status_t                        AddEnclosure(const char* MIME_type, void* data,
                                                                        int32 len, bool clobber = false);
        
                        status_t                        AddHeaderField(uint32 encoding,
                                                                        const char* field_name, const char* str, 
                                                                        bool clobber = false);
                        status_t                        AddHeaderField(const char* field_name,
                                                                        const char* str, bool clobber = false);
        
                        status_t                        Send(bool sendNow = false,
                                                                         bool removeAfterSending = false);

private:
                        int32                           concatinate(char**, int32, char*);
                        int32                           count_fields(char* name = NULL);
                        status_t                        find_field(char*, type_code*, char**, void**,
                                                                        int32*, uint32*, char**, bool*, int32);
                        BList*                          find_field(const char*);
                        status_t                        get_field_name(char**, int32);
                        status_t                        set_field(const char*, type_code, const char*,
                                                                        const void*, int32, uint32, const char*,
                                                                        bool);

private:
                        BList*          fFields;
                        bool            fMultiPart;
};

#endif // _MAIL_H