⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mapicontact.cpp

📁 A (hopefully) complete extended MAPI wrapper for WinXP, WinCE, and .NET.
💻 CPP
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// File: MAPIContact.cpp
// Description: MAPI Contact class wrapper
//
// Copyright (C) 2005-2006, 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
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "MAPIExPCH.h"
#include "MAPIEx.h"

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

CContactAddress::CContactAddress()
{

}

void CContactAddress::FillAddress(CMAPIContact& contact,AddressType nType)
{
	if(nType<BUSINESS || nType>OTHER) return;

	int nAddressTag[][5]={
		{ PR_BUSINESS_ADDRESS_CITY, PR_BUSINESS_ADDRESS_COUNTRY, PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE,
			PR_BUSINESS_ADDRESS_STREET, PR_BUSINESS_ADDRESS_POSTAL_CODE },
		{ PR_HOME_ADDRESS_CITY, PR_HOME_ADDRESS_COUNTRY, PR_HOME_ADDRESS_STATE_OR_PROVINCE,
			PR_HOME_ADDRESS_STREET, PR_HOME_ADDRESS_POSTAL_CODE },
		{ PR_OTHER_ADDRESS_CITY, PR_OTHER_ADDRESS_COUNTRY, PR_OTHER_ADDRESS_STATE_OR_PROVINCE, 
			PR_OTHER_ADDRESS_STREET, PR_OTHER_ADDRESS_POSTAL_CODE },
	};

	LPSPropValue pProp;
	if(contact.GetProperty(nAddressTag[nType][0],pProp)==S_OK) {
		m_strCity=CMAPIEx::GetValidString(*pProp);
		MAPIFreeBuffer(pProp);
	} else {
		m_strCity=_T("");
	}
	if(contact.GetProperty(nAddressTag[nType][1],pProp)==S_OK) {
		m_strCountry=CMAPIEx::GetValidString(*pProp);
		MAPIFreeBuffer(pProp);
	} else {
		m_strCountry=_T("");
	}
	if(contact.GetProperty(nAddressTag[nType][2],pProp)==S_OK) {
		m_strStateOrProvince=CMAPIEx::GetValidString(*pProp);
		MAPIFreeBuffer(pProp);
	} else {
		m_strStateOrProvince=_T("");
	}
	if(contact.GetProperty(nAddressTag[nType][3],pProp)==S_OK) {
		m_strStreet=CMAPIEx::GetValidString(*pProp);
		MAPIFreeBuffer(pProp);
	} else {
		m_strStreet=_T("");
	}
	if(contact.GetProperty(nAddressTag[nType][4],pProp)==S_OK) {
		m_strPostalCode=CMAPIEx::GetValidString(*pProp);
		MAPIFreeBuffer(pProp);
	} else {
		m_strPostalCode=_T("");
	}
}

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

CMAPIContact::CMAPIContact()
{
	m_pUser=NULL;
	m_pMAPI=NULL;
	m_entry.cb=0;
	SetEntryID(NULL);
}

CMAPIContact::~CMAPIContact()
{
	Close();
}

void CMAPIContact::SetEntryID(SBinary* pEntry)
{
	if(m_entry.cb) delete [] m_entry.lpb;
	m_entry.lpb=NULL;

	if(pEntry) {
		m_entry.cb=pEntry->cb;
		if(m_entry.cb) {
			m_entry.lpb=new BYTE[m_entry.cb];
			memcpy(m_entry.lpb,pEntry->lpb,m_entry.cb);
		}
	} else {
		m_entry.cb=0;
	}
}

BOOL CMAPIContact::Open(CMAPIEx* pMAPI,SBinary entry)
{
	Close();
	m_pMAPI=pMAPI;
	ULONG ulObjType;
	if(m_pMAPI->GetSession()->OpenEntry(entry.cb,(LPENTRYID)entry.lpb,NULL,MAPI_BEST_ACCESS,&ulObjType,(LPUNKNOWN*)&m_pUser)!=S_OK) return FALSE;

	SetEntryID(&entry);
	return TRUE;
}

void CMAPIContact::Close()
{
	SetEntryID(NULL);
	RELEASE(m_pUser);
	m_pMAPI=NULL;
}

HRESULT CMAPIContact::GetProperty(ULONG ulProperty,LPSPropValue &prop)
{
	ULONG ulPropCount;
	ULONG p[2]={ 1,ulProperty };
	return m_pUser->GetProps((LPSPropTagArray)p, CMAPIEx::cm_nMAPICode, &ulPropCount, &prop);
}

void CMAPIContact::GetPropertyString(CString& strProperty,ULONG ulProperty)
{
	LPSPropValue pProp;
	if(GetProperty(ulProperty,pProp)==S_OK) {
		strProperty=CMAPIEx::GetValidString(*pProp);
		MAPIFreeBuffer(pProp);
	}
	else m_strSubject=_T("");
}

void CMAPIContact::GetName(CString& strName,int nNameID)
{
	int i=0,nNameIDs[]={
		PR_DISPLAY_NAME, PR_GIVEN_NAME, PR_MIDDLE_NAME, PR_SURNAME, PR_INITIALS
		-1
	};

	while(nNameIDs[i]!=nNameID && nNameIDs[i]>0) i++;
	if(nNameIDs[i]<0) strName=_T("");
	else GetPropertyString(strName,nNameID);
}

void CMAPIContact::GetEmail(CString& strEmail)
{
	const GUID guidOutlookEmail1={0x00062004, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 };
	
	MAPINAMEID nameID;
	nameID.lpguid=(GUID*)&guidOutlookEmail1;
	nameID.ulKind=MNID_ID;
	nameID.Kind.lID=0x8083;

	LPMAPINAMEID lpNameID[1]={ &nameID };
	LPSPropTagArray lppPropTags; 

	if(m_pUser->GetIDsFromNames(1,lpNameID,0,&lppPropTags)==S_OK) {
		LPSPropValue pProp;
		ULONG ulPropCount;
		if(m_pUser->GetProps(lppPropTags, CMAPIEx::cm_nMAPICode, &ulPropCount, &pProp)==S_OK) {
			strEmail=CMAPIEx::GetValidString(*pProp);
			MAPIFreeBuffer(pProp);
		} else {
			strEmail=_T("");
		}
		MAPIFreeBuffer(lppPropTags);
	}
}

void CMAPIContact::GetPhoneNumber(CString& strPhoneNumber,int nPhoneNumberID)
{
	int i=0,nPhoneNumberIDs[]={
		PR_PRIMARY_TELEPHONE_NUMBER, PR_BUSINESS_TELEPHONE_NUMBER, PR_HOME_TELEPHONE_NUMBER, 
		PR_CALLBACK_TELEPHONE_NUMBER, PR_BUSINESS2_TELEPHONE_NUMBER, PR_MOBILE_TELEPHONE_NUMBER,
		PR_RADIO_TELEPHONE_NUMBER, PR_CAR_TELEPHONE_NUMBER, PR_OTHER_TELEPHONE_NUMBER,
		PR_PAGER_TELEPHONE_NUMBER, PR_PRIMARY_FAX_NUMBER, PR_BUSINESS_FAX_NUMBER,
		PR_HOME_FAX_NUMBER, PR_TELEX_NUMBER, PR_ISDN_NUMBER, PR_ASSISTANT_TELEPHONE_NUMBER,
		PR_HOME2_TELEPHONE_NUMBER, PR_TTYTDD_PHONE_NUMBER, PR_COMPANY_MAIN_PHONE_NUMBER,
		-1
	};

	while(nPhoneNumberIDs[i]!=nPhoneNumberID && nPhoneNumberIDs[i]>0) i++;
	if(nPhoneNumberIDs[i]<0) strPhoneNumber=_T("");
	else GetPropertyString(strPhoneNumber,nPhoneNumberID);
}

void CMAPIContact::GetAddress(CContactAddress& address,CContactAddress::AddressType nType)
{
	address.FillAddress(*this,nType);
}

void CMAPIContact::GetAddress(CString& strAddress)
{
	GetPropertyString(strAddress,PR_POSTAL_ADDRESS);
}

void CMAPIContact::GetNotes(CString& strNotes,BOOL bRTF)
{
	strNotes=_T("");
	IStream* pStream;

#ifdef _WIN32_WCE
	const int BUF_SIZE=1024;
#else
	const int BUF_SIZE=16384;
#endif
	char szBuf[BUF_SIZE+1];
	ULONG ulNumChars;

	if(bRTF) {
		if(m_pUser->OpenProperty(PR_RTF_COMPRESSED,&IID_IStream,STGM_READ,0,(LPUNKNOWN*)&pStream)!=S_OK) return;

		IStream *pUncompressed;
		if(WrapCompressedRTFStream(pStream,0,&pUncompressed)==S_OK) {
			do {
				pUncompressed->Read(szBuf,BUF_SIZE,&ulNumChars);
				szBuf[min(BUF_SIZE,ulNumChars)]=0;
				strNotes+=szBuf;
			} while(ulNumChars>=BUF_SIZE);
			RELEASE(pUncompressed);
		}
	} else {
		if(m_pUser->OpenProperty(PR_BODY,&IID_IStream,STGM_READ,NULL,(LPUNKNOWN*)&pStream)!=S_OK) return;

		do {
			pStream->Read(szBuf,BUF_SIZE*sizeof(TCHAR),&ulNumChars);
			ulNumChars/=sizeof(TCHAR);
			szBuf[min(BUF_SIZE,ulNumChars)]=0;
			strNotes+=szBuf;
		} while(ulNumChars>=BUF_SIZE);
	}
	RELEASE(pStream);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -