#ifndef __MAPICONTACT_H__
#define __MAPICONTACT_H__

////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// File: MAPIContact.h
// Description: MAPI Contact class wrapper
//
// Copyright (C) 2005-2011, Noel Dillabough
//
// This source code is free to use and modify provided this notice remains intact and that any enhancements
// or bug fixes are posted to the CodeProject page hosting this class for the community to benefit.
//
// Usage: see the CodeProject article at http://www.codeproject.com/internet/CMapiEx.asp
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////

class CMAPIEx;
class CMAPIContact;

#ifdef _WIN32_WCE
#include "POOM.h"
#endif 

/////////////////////////////////////////////////////////////
// CContactAddress

class AFX_EXT_CLASS CContactAddress : public CObject
{
public:
	CContactAddress();

	enum AddressType { HOME, BUSINESS, OTHER, MAX_ADDRESS_TYPES };

// Attributes
public:
	AddressType m_nType;
	CString m_strStreet;
	CString m_strCity;
	CString m_strStateOrProvince;
	CString m_strPostalCode;
	CString m_strCountry;

// Operations
protected:
	BOOL FillAddress(CMAPIContact& contact,AddressType nType);
	BOOL SaveAddress(CMAPIContact& contact,AddressType nType);

	friend CMAPIContact;
};

/////////////////////////////////////////////////////////////
// CMAPIContact

#define CONTACT_PICTURE _T("ContactPicture.jpg")

class AFX_EXT_CLASS CMAPIContact : public CMAPIObject
{
public:
	CMAPIContact();
	~CMAPIContact();

	enum { OUTLOOK_DATA1=0x00062004, OUTLOOK_EMAIL1=0x8083, OUTLOOK_EMAIL2=0x8093, OUTLOOK_EMAIL3=0x80A3,
		OUTLOOK_IM_ADDRESS=0x8062, OUTLOOK_FILE_AS=0x8005, OUTLOOK_POSTAL_ADDRESS=0x8022, OUTLOOK_DISPLAY_ADDRESS_HOME=0x801A,
		OUTLOOK_PICTURE_FLAG=0x8015, OUTLOOK_CATEGORIES=0xF101E
	};

// Attributes
protected:
#ifdef _WIN32_WCE
	CPOOM* m_pPOOM;
	IContact* m_pContact;
#endif

// Operations
public:
	inline LPMAILUSER Contact() { return (LPMAILUSER)m_pItem; }

#ifdef _WIN32_WCE
	BOOL Open(CMAPIEx* pMAPI, CPOOM* pPOOM, IContact* pContact);
	virtual void Close();
	virtual BOOL Save(BOOL bClose=TRUE);

	virtual BOOL GetPropertyString(ULONG ulProperty, CString& strProperty, BOOL bStream=FALSE);
	virtual BOOL SetPropertyString(ULONG ulProperty, LPCTSTR szProperty, BOOL bStream=FALSE);
#endif

	BOOL Create(CMAPIEx* pMAPI, CMAPIFolder* pFolder=NULL);

	BOOL GetName(CString& strName, ULONG ulNameID=PR_DISPLAY_NAME);
	BOOL GetEmail(CString& strEmail, int nIndex=1); // 1, 2 or 3 for outlook email addresses
	BOOL GetEmailDisplayAs(CString& strDisplayAs, int nIndex=1);
	BOOL GetHomePage(CString& strHomePage, BOOL bBuiness=TRUE);
	BOOL GetPhoneNumber(CString& strPhoneNumber, ULONG ulPhoneNumberID);
	BOOL GetAddress(CContactAddress& address, CContactAddress::AddressType nType);
	BOOL GetPostalAddress(CString& strAddress);
	BOOL GetIMAddress(CString& strIMAddress);
	BOOL GetFileAs(CString& strFileAs);
	BOOL GetTitle(CString& strTitle);
	BOOL GetCompany(CString& strCompany);
	BOOL GetProfession(CString& strProfession);
	BOOL GetDisplayNamePrefix(CString& strPrefix);
	BOOL GetGeneration(CString& strGeneration);
	BOOL GetDepartment(CString& strDepartment);
	BOOL GetOffice(CString& strOffice);
	BOOL GetManagerName(CString& strManagerName);
	BOOL GetAssistantName(CString& strAssistantName);
	BOOL GetNickName(CString& strNickName);
	BOOL GetSpouseName(CString& strSpouseName);
	BOOL GetBirthday(SYSTEMTIME& tmBirthday);
	BOOL GetBirthday(CString& strBirthday, LPCTSTR szFormat=NULL); // NULL defaults to "MM/dd/yyyy"
	BOOL GetAnniversary(SYSTEMTIME& tmAnniversary);
	BOOL GetAnniversary(CString& strAnniversary, LPCTSTR szFormat=NULL);
	BOOL GetCategories(CString& strCategories);

	BOOL SetName(LPCTSTR szName, ULONG ulNameID=PR_DISPLAY_NAME);
	BOOL SetEmail(LPCTSTR szEmail, int nIndex=1);
	BOOL SetEmailDisplayAs(LPCTSTR szDisplayAs, int nIndex=1);
	BOOL SetHomePage(LPCTSTR szHomePage, BOOL bBuiness=TRUE);
	BOOL SetPhoneNumber(LPCTSTR szPhoneNumber, ULONG ulPhoneNumberID);
	BOOL SetAddress(CContactAddress& address, CContactAddress::AddressType nType);
	BOOL SetPostalAddress(CContactAddress::AddressType nType);
	BOOL UpdateDisplayAddress(CContactAddress::AddressType nType);
	BOOL SetNotes(LPCTSTR szNotes, BOOL bRTF=FALSE);
	BOOL SetIMAddress(LPCTSTR szIMAddress);
	BOOL SetFileAs(LPCTSTR szFileAs);
	BOOL SetTitle(LPCTSTR szTitle);
	BOOL SetCompany(LPCTSTR szCompany);
	BOOL SetProfession(LPCTSTR szProfession);
	BOOL SetDisplayNamePrefix(LPCTSTR szPrefix);
	BOOL SetGeneration(LPCTSTR szGeneration);
	BOOL UpdateDisplayName();
	BOOL SetDepartment(LPCTSTR szDepartment);
	BOOL SetOffice(LPCTSTR szOffice);
	BOOL SetManagerName(LPCTSTR szManagerName);
	BOOL SetAssistantName(LPCTSTR szAssistantName);
	BOOL SetNickName(LPCTSTR szNickName);
	BOOL SetSpouseName(LPCTSTR szSpouseName);
	BOOL SetBirthday(SYSTEMTIME& tmBirthday);
	BOOL SetAnniversary(SYSTEMTIME& tmAnniversary);
	BOOL SetCategories(LPCTSTR szCategories);
	BOOL HasPicture();
	BOOL SetPicture(LPCTSTR szPath);

protected:
	int GetOutlookEmailID(int nIndex);
};

#endif
