// XTPCalendarMAPIWrapper.cpp: implementation of the CXTPCalendarMAPIWrapper class.
//
// This file is a part of the XTREME CALENDAR MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "XTPCalendarMAPIWrapper.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define new DEBUG_NEW
#endif

#pragma warning(disable: 4571) // warning C4571: catch(...) blocks compiled with /EHs do not catch or re-throw Structured Exceptions


#define TRY_POINTER_CALL(proc)\
	try\
	{\
		if (m_hMapiDll != NULL && m_ptrWrappers[xtpWrapper##proc] == NULL)\
		{\
			m_ptrWrappers[xtpWrapper##proc] = ::GetProcAddress(\
				m_hMapiDll, xtpWrapperProc##proc);\
		}\
		PFN##proc ptr = (PFN##proc)m_ptrWrappers[xtpWrapper##proc];\
		if (ptr)\
		{
#define POINTER_CALL (*ptr)
#define CATCH_POINTER_CALL()\
		}\
	}\
	catch (...)\
	{\
	}


//===========================================================================
// CXTPCalendarMAPIWrapper class
//===========================================================================

CXTPCalendarMAPIWrapper::CXTPCalendarMAPIWrapper()
{
	ZeroMemory(&m_ptrWrappers, sizeof(m_ptrWrappers));
	m_hMapiDll = ::LoadLibrary(_T("mapi32.dll"));
}

CXTPCalendarMAPIWrapper::~CXTPCalendarMAPIWrapper()
{
	if (m_hMapiDll)
	{
		FreeLibrary(m_hMapiDll);
	}
}

/////////////////////////////////////////////////////////////////////////////
// Wrapped methods
//

HRESULT CXTPCalendarMAPIWrapper::MAPIInitialize(LPVOID lpMapiInit)
{
	TRY_POINTER_CALL(MAPIInitialize)
		return POINTER_CALL(lpMapiInit);
	CATCH_POINTER_CALL()

	return E_FAIL;
}

void CXTPCalendarMAPIWrapper::MAPIUninitialize()
{
	TRY_POINTER_CALL(MAPIUninitialize)
		POINTER_CALL();
	CATCH_POINTER_CALL()
}

HRESULT CXTPCalendarMAPIWrapper::MAPILogonEx(ULONG ulUIParam, LPTSTR lpszProfileName, LPTSTR lpszPassword, FLAGS flFlags, LPMAPISESSION FAR * lppSession)
{
	TRY_POINTER_CALL(MAPILogonEx)
		return POINTER_CALL(ulUIParam, lpszProfileName, lpszPassword, flFlags, lppSession);
	CATCH_POINTER_CALL()

	return E_FAIL;
}

ULONG CXTPCalendarMAPIWrapper::MAPIFreeBuffer(LPVOID lpBuffer)
{
	TRY_POINTER_CALL(MAPIFreeBuffer)
		return POINTER_CALL(lpBuffer);
	CATCH_POINTER_CALL()

	return 1;
}

ULONG CXTPCalendarMAPIWrapper::UlRelease(LPVOID punk)
{
	TRY_POINTER_CALL(UlRelease)
		return POINTER_CALL(punk);
	CATCH_POINTER_CALL()

	return 1;
}

void CXTPCalendarMAPIWrapper::FreeProws(LPSRowSet prows)
{
	TRY_POINTER_CALL(FreeProws)
		POINTER_CALL(prows);
	CATCH_POINTER_CALL()
}

HRESULT CXTPCalendarMAPIWrapper::HrQueryAllRows(LPMAPITABLE ptable, LPSPropTagArray ptaga, LPSRestriction pres, LPSSortOrderSet psos, LONG crowsMax, LPSRowSet FAR * pprows)
{
	TRY_POINTER_CALL(HrQueryAllRows)
		return POINTER_CALL(ptable, ptaga, pres, psos, crowsMax, pprows);
	CATCH_POINTER_CALL()

	return E_FAIL;
}

HRESULT CXTPCalendarMAPIWrapper::HrGetOneProp(LPMAPIPROP pmp, ULONG ulPropTag, LPSPropValue FAR * ppprop)
{
	TRY_POINTER_CALL(HrGetOneProp)
		return POINTER_CALL(pmp, ulPropTag, ppprop);
	CATCH_POINTER_CALL()

	return E_FAIL;
}

HRESULT CXTPCalendarMAPIWrapper::HrSetOneProp(LPMAPIPROP pmp, LPSPropValue pprop)
{
	TRY_POINTER_CALL(HrSetOneProp)
		return POINTER_CALL(pmp, pprop);
	CATCH_POINTER_CALL()

	return E_FAIL;
}

SCODE CXTPCalendarMAPIWrapper::MAPIAllocateBuffer(ULONG cbSize, LPVOID FAR * lppBuffer)
{
	TRY_POINTER_CALL(MAPIAllocateBuffer)
		return POINTER_CALL(cbSize,lppBuffer);
	CATCH_POINTER_CALL()

	return E_FAIL;
}

HRESULT CXTPCalendarMAPIWrapper::HrThisThreadAdviseSink(LPMAPIADVISESINK lpAdviseSink, LPMAPIADVISESINK FAR * lppAdviseSink)
{
	TRY_POINTER_CALL(HrThisThreadAdviseSink)
		return POINTER_CALL(lpAdviseSink, lppAdviseSink);
	CATCH_POINTER_CALL()

	return E_FAIL;
}

HRESULT CXTPCalendarMAPIWrapper::HrAllocAdviseSink(LPNOTIFCALLBACK lpfnCallback, LPVOID lpvContext, LPMAPIADVISESINK FAR * lppAdviseSink)
{
	TRY_POINTER_CALL(HrAllocAdviseSink)
		return POINTER_CALL(lpfnCallback, lpvContext, lppAdviseSink);
	CATCH_POINTER_CALL()

	return E_FAIL;
}