Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 1994 Microsoft Corporation
Module Name :
address.hxx
Abstract:
This module defines the CAddrList class.
Author:
Rohan Phillips ( Rohanp ) 11-Dec-1995
Project:
SMTP Server DLL
Revision History:
--*/
#ifndef _ADDR_LIST_HXX_
#define _ADDR_LIST_HXX_
/************************************************************
* Include Headers ************************************************************/
/************************************************************
* Symbolic Constants ************************************************************/ #define ADDRESS_SIGNATURE_VALID 0x49414444 // IADD
#define ADDRESS_SIGNATURE_FREE 0x44444149 // DDAI
#define MAX_EMAIL_NAME 64
#define MAX_DOMAIN_NAME 250
#define MAX_INTERNET_NAME (MAX_EMAIL_NAME + MAX_DOMAIN_NAME + 2) // 2 for @ and \0
/************************************************************
* Type Definitions ************************************************************/
#define ADDRESS_LOCAL 0x00000001 // A local address (e.g. MSN.COM)
#define ADDRESS_NO_DOMAIN 0x00000002 // No domain specified
#define ADDRESS_EXPANDED 0x00000004 // Expands (contains % or equiv.)
#define ADDRESS_INTERNET 0x00000008 // Has been processed by munging
#define ADDRESS_SAME_DOMAIN 0x00000010 // Same domain as predecessor
#define ADDRESS_REMOVE_PENDING 0x00000020 // Remove pending
#define ADDRESS_OUTSTANDING 0x00000040 // Address still in use
#define ADDRESS_DONT_SEND 0x00000080 // Don't send this address
#define ADDRESS_HASHED_ENTRY 0x00000100 // Don't send this address
enum ADDRTYPE {FROMADDR, TOADDR, CLEANDOMAIN};
/* struct CAddr
This structure is used for keeping track of addresses that we need to send mail to. m_Flags can take on the values above.
--*/ class CAddr {
private:
DWORD m_Signature; DWORD m_PlainAddrSize;//strlen of m_PlainAddress
DWORD m_Error; //error as to why this address could not receive mail
DWORD m_Flags; //can be any of the following above ORed together
char m_PlainAddress[MAX_INTERNET_NAME + 1]; //address given to us by client
char * m_DomainOffset; //domain offset in m_PlainAddress
void * m_HashInfo; //contains address book info
DWORD m_dwAbInfoId; //intermediate info passing from AbResolveAddress
// to AbResolveAddressEx (Note: the m_dwAbInfoId
// may not correspond to its CAddr)
//hide the comstructors
CAddr(VOID); CAddr(char * Address); BOOL InitializeAddress(char * Address, ADDRTYPE NameType);
public:
//use CPool for better memory management
static CPool Pool;
// override the mem functions to use CPool functions
void *operator new (size_t cSize) { return Pool.Alloc(); } void operator delete (void *pInstance) { Pool.Free(pInstance); }
//LIST_ENTRY object for storing address in a list.
LIST_ENTRY m_listEntry;
~CAddr( VOID);
DWORD GetAddrSize(void) const {return m_PlainAddrSize;} char * GetAddress(void) const {return (char *) m_PlainAddress;} DWORD GetFlags(void) const {return m_Flags;} void SetFlags (DWORD Flag) {m_Flags |= Flag;} void ClearFlag (DWORD Flag) {m_Flags &= ~Flag;} BOOL IsDomainOffset(void) const {return (m_DomainOffset != NULL);}
char * GetDomainOffset(void) const {return (char*) m_DomainOffset;} void SetHashInfo(void * pHashInfo) {m_HashInfo = pHashInfo;} void * GetHashInfo(void) const {return m_HashInfo;} DWORD GetErrorCode(void)const {_ASSERT(IsValid()); return m_Error; } void SetErrorCode(DWORD ErrorCode) {m_Error = ErrorCode;} BOOL IsSameDomainAsPredecessor() const {return ((m_Flags & ADDRESS_SAME_DOMAIN) == ADDRESS_SAME_DOMAIN);} BOOL IsValid( VOID) const{return ( m_Signature == ADDRESS_SIGNATURE_VALID); }
LIST_ENTRY & QueryListEntry(void) {return ( m_listEntry);} static CAddr * CreateAddress (char * Address, ADDRTYPE NameType = TOADDR); static CAddr * CreateKnownAddress (char * Address); BOOL ReplaceAddress(const char * NewAddress); static CAddr * GetFirstAddress(PLIST_ENTRY HeadOfList, PLIST_ENTRY * AddressLink); static CAddr * GetNextAddress(PLIST_ENTRY HeadOfList, PLIST_ENTRY * AddressLink); static void RemoveAllAddrs(PLIST_ENTRY HeadOfList); static void RemoveAddress(IN OUT CAddr * pEntry); static void InsertAddrHeadList(PLIST_ENTRY HeadOfList, IN CAddr *pEntry); static void InsertAddrTailList(PLIST_ENTRY HeadOfList, IN CAddr *pEntry);
//
// Address validation/cleanup methods
//
static BOOL ExtractCleanEmailName(char *lpszCleanEmail, char **ppszDomainOffset, DWORD *lpdwCleanEmailLength, char *lpszSource);
static BOOL ValidateCleanEmailName(char *lpszCleanEmailName, char *lpszDomainOffset);
static BOOL ValidateDomainName(char *lpszDomainName);
static BOOL ValidateEmailName(char *lpszEmailName, BOOL fDomainOptional = FALSE);
static CHAR * FindStartOfDomain(CHAR *lpszCleanEmail);
//Counts the number of addresses in a RFC822 address list
static DWORD GetRFC822AddressCount(char *szAddressList);
static BOOL IsRecipientInRFC822AddressList(char *szAddressList, char *szRecip); };
#endif
|