#ifndef __ADDRESS_H__
#define __ADDRESS_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 "memblock.h"
#include "memchunk.h"
#include "rstring.h"

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

/**
 * email_kind describes one of the syntax, that can be used in an email:
 *
 *  KIND_UNKNOWN         -- there was no attempt to guess the type yet
 *  KIND_EMAIL_IN_ANGLES -- the "modern" syntax described in RFC 2822
 *                          example: rzyjontko <rzyj@op.pl>
 *  KIND_NAME_AS_COMMENT -- the obsolete syntax described in RFC 822
 *                          example: rzyj@op.pl (rzyjontko)
 *  KIND_PURE_EMAIL      -- just an email addres
 *                          example: rzyj@op.pl
 *  KIND_NO_EMAIL        -- possibly only user name for local delivery
 *                          example: rzyj
 *  KIND_STRANGE         -- email with something else, possibly syntax error
 *                          example: rzyjontko < rzyj@op.pl >
 */
enum email_kind {
        KIND_UNKNOWN         = 0,
        KIND_EMAIL_IN_ANGLES = 1,
        KIND_NAME_AS_COMMENT = 2,
        KIND_PURE_EMAIL      = 3,
        KIND_NO_EMAIL        = 4,
        KIND_STRANGE         = 5,
};

enum email_sex {
        SEX_UNKNOWN = 0,
        SEX_MALE    = 1,
        SEX_FEMALE  = 2,
};

enum yes_no {
        NO  = 0,
        YES = 1,
};

#define A_SHIFT_SEX 3
#define A_MASK_SEX  (3 << A_SHIFT_SEX)

#define A_SHIFT_OFFICIAL 5
#define A_MASK_OFFICIAL (1 << A_SHIFT_OFFICIAL)

#define A_SHIFT_FOREIGN 6
#define A_MASK_FOREIGN (1 << A_SHIFT_FOREIGN)

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

/**
 * index    -- for use in atable module
 * full     -- when parsing a message, this is the email, as appearing in
 *             a header field (To, From, etc.), otherwise it holds a string
 *             that may be put in a header field
 * email    -- address specifier of a message (see RFC2822)
 * name     -- display name of the address (see RFC2822), but maybe empty,
 *             in which case, there should be used email address
 * first    -- first name of the display name
 * last     -- last name of the display name
 * initials -- first letters of each word in name
 * groups   -- list of groups, that this address belongs to
 *
 *****   user flags   *****
 * kind     -- see type comment above
 * sex      --
 * official --
 * foreign  --
 *****   implementation flags   ****
 * abook          -- true if this address is a part of addressbook
 * own            -- true if this address is defined in one of smtp_acc
 * atomic_name    -- true if display name is an ATOM in sense of RFC2822
 * quotes_in_name -- true if there is a double quote sign inside of name
 */
typedef struct addr {
        int   index;
        char *full;
        char *email;
        char *name;
        char *first;
        char *last;
        char *initials;
        union {
                struct {
                        enum email_kind kind           : 3;
                        enum email_sex  sex            : 2;
                        enum yes_no     official       : 1;
                        enum yes_no     foreign        : 1;
                        enum yes_no     abook          : 1;
                        enum yes_no     own            : 1;
                        enum yes_no     atomic_name    : 1;
                        enum yes_no     quotes_in_name : 1;
                } bits;
                unsigned value;
        } flags;

        rstring_t *groups;
} address_t;

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

extern void address_init (void);
extern void address_free_resources (void);

extern address_t *address_empty (void);
extern address_t *address_from_string (const char *str);
extern address_t *address_complete (address_t *addr);
extern address_t *address_find (const char *str);
extern address_t *address_read (memchunk_t *chunk);
extern void       address_dump (address_t *addr, memchunk_t *chunk);

extern char *address_name (address_t *addr);
extern char *address_wrote_format (address_t *addr);
extern int   address_cmp (const address_t *a, const address_t *b);
extern void  address_for_all (void (*fun)(address_t *));
extern void  address_reset_indexes (void);

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


syntax highlighted by Code2HTML, v. 0.9.1