/* * MAPILAYR.C * * Layer on top of MAPI calls * * Copyright 1996 Microsoft Corporation. All Rights Reserved. * * History: * 11/14/96 BruceK First version to allow wab migration without mapi32.dll */ #include "_comctl.h" #include #include #include #include #include #include #include #include "wabimp.h" #include "..\..\wab32res\resrc2.h" #include "dbgutil.h" typedef SCODE (STDMETHODCALLTYPE FREEPROWS)( LPSRowSet lpRows ); typedef FREEPROWS *LPFREEPROWS; typedef SCODE (STDMETHODCALLTYPE FREEPADRLIST)( LPADRLIST lpAdrList ); typedef FREEPADRLIST *LPFREEPADRLIST; typedef SCODE (STDMETHODCALLTYPE SCCOPYPROPS)( int cValues, LPSPropValue lpPropArray, LPVOID lpvDst, ULONG FAR *lpcb ); typedef SCCOPYPROPS *LPSCCOPYPROPS; typedef SCODE (STDMETHODCALLTYPE SCCOUNTPROPS)( int cValues, LPSPropValue lpPropArray, ULONG FAR *lpcb ); typedef SCCOUNTPROPS *LPSCCOUNTPROPS; static LPMAPIINITIALIZE lpfnMAPIInitialize = NULL; static LPMAPILOGONEX lpfnMAPILogonEx = NULL; static LPMAPIALLOCATEBUFFER lpfnMAPIAllocateBuffer = NULL; static LPMAPIALLOCATEMORE lpfnMAPIAllocateMore = NULL; static LPMAPIFREEBUFFER lpfnMAPIFreeBuffer = NULL; static LPFREEPROWS lpfnFreeProws = NULL; static LPFREEPADRLIST lpfnFreePadrlist = NULL; static LPSCCOPYPROPS lpfnScCopyProps = NULL; static LPSCCOUNTPROPS lpfnScCountProps = NULL; static HINSTANCE hinstMAPIDll = NULL; // Constant strings const TCHAR szMapiDll[] = TEXT("MAPI32.DLL"); const TCHAR szMAPIAllocateBuffer[] = TEXT("MAPIAllocateBuffer"); const TCHAR szMAPIAllocateMore[] = TEXT("MAPIAllocateMore"); const TCHAR szMAPIFreeBuffer[] = TEXT("MAPIFreeBuffer"); const TCHAR szMAPIInitialize[] = TEXT("MAPIInitialize"); const TCHAR szMAPILogonEx[] = TEXT("MAPILogonEx"); #if defined (_ALPHA_) || defined (ALPHA) // Bug:63053 const TCHAR szFreeProws[] = TEXT("FreeProws"); const TCHAR szFreePadrlist[] = TEXT("FreePadrlist"); const TCHAR szScCopyProps[] = TEXT("ScCopyProps"); const TCHAR szScCountProps[] = TEXT("ScCountProps"); #else const TCHAR szFreeProws[] = TEXT("FreeProws@4"); const TCHAR szFreePadrlist[] = TEXT("FreePadrlist@4"); const TCHAR szScCopyProps[] = TEXT("ScCopyProps@16"); const TCHAR szScCountProps[] = TEXT("ScCountProps@12"); #endif HRESULT MAPIInitialize(LPVOID lpMapiInit) { HRESULT hResult = hrSuccess; // If MAPI DLL is not loaded, do so now. if (! hinstMAPIDll) { if (! (hinstMAPIDll = LoadLibrary(szMapiDll))) { DWORD dwErr = GetLastError(); DebugTrace("Couldn't load MAPI dll [%s] -> %u\n", szMapiDll, dwErr); switch (dwErr) { case ERROR_NOT_ENOUGH_MEMORY: case ERROR_OUTOFMEMORY: hResult = ResultFromScode(MAPI_E_NOT_ENOUGH_MEMORY); break; case ERROR_HANDLE_DISK_FULL: case ERROR_DISK_FULL: hResult = ResultFromScode(MAPI_E_NOT_ENOUGH_DISK); break; default: case ERROR_FILE_NOT_FOUND: case ERROR_PATH_NOT_FOUND: hResult = ResultFromScode(MAPI_E_NOT_FOUND); break; } goto exit; } else { // Get the function pointers if (! (lpfnMAPIInitialize = (LPMAPIINITIALIZE)GetProcAddress(hinstMAPIDll, szMAPIInitialize))) { DebugTrace("Couldn't get Fn addr %s from %s -> %u\n", szMAPIInitialize, szMapiDll, GetLastError()); goto exit; } if (! (lpfnMAPILogonEx = (LPMAPILOGONEX)GetProcAddress(hinstMAPIDll, szMAPILogonEx))) { DebugTrace("Couldn't get Fn addr %s from %s -> %u\n", szMAPILogonEx, szMapiDll, GetLastError()); goto exit; } if (! (lpfnMAPIAllocateBuffer = (LPMAPIALLOCATEBUFFER)GetProcAddress(hinstMAPIDll, szMAPIAllocateBuffer))) { DebugTrace("Couldn't get Fn addr %s from %s -> %u\n", szMAPIAllocateBuffer, szMapiDll, GetLastError()); goto exit; } if (! (lpfnMAPIAllocateMore= (LPMAPIALLOCATEMORE)GetProcAddress(hinstMAPIDll, szMAPIAllocateMore))) { DebugTrace("Couldn't get Fn addr %s from %s -> %u\n", szMAPIAllocateMore, szMapiDll, GetLastError()); goto exit; } if (! (lpfnMAPIFreeBuffer = (LPMAPIFREEBUFFER)GetProcAddress(hinstMAPIDll, szMAPIFreeBuffer))) { DebugTrace("Couldn't get Fn addr %s from %s -> %u\n", szMAPIFreeBuffer, szMapiDll, GetLastError()); goto exit; } if (! (lpfnFreeProws= (LPFREEPROWS)GetProcAddress(hinstMAPIDll, szFreeProws))) { DebugTrace("Couldn't get Fn addr %s from %s -> %u\n", szFreeProws, szMapiDll, GetLastError()); goto exit; } if (! (lpfnFreePadrlist= (LPFREEPADRLIST)GetProcAddress(hinstMAPIDll, szFreePadrlist))) { DebugTrace("Couldn't get Fn addr %s from %s -> %u\n", szFreePadrlist, szMapiDll, GetLastError()); goto exit; } if (! (lpfnScCopyProps= (LPSCCOPYPROPS)GetProcAddress(hinstMAPIDll, szScCopyProps))) { DebugTrace("Couldn't get Fn addr %s from %s -> %u\n", szScCopyProps, szMapiDll, GetLastError()); goto exit; } if (! (lpfnScCountProps = (LPSCCOUNTPROPS)GetProcAddress(hinstMAPIDll, szScCountProps))) { DebugTrace("Couldn't get Fn addr %s from %s -> %u\n", szScCountProps, szMapiDll, GetLastError()); goto exit; } } } exit: if (! lpfnMAPIInitialize || ! lpfnMAPILogonEx || ! lpfnMAPIAllocateMore || ! lpfnMAPIAllocateBuffer || ! lpfnMAPIFreeBuffer || ! lpfnFreeProws || ! lpfnFreePadrlist || ! lpfnScCopyProps || ! lpfnScCountProps) { // Bad news. Clean up and fail. if (hinstMAPIDll) { // unload the dll FreeLibrary(hinstMAPIDll); hinstMAPIDll = NULL; lpfnMAPIInitialize = NULL; lpfnMAPILogonEx = NULL; lpfnMAPIAllocateMore = NULL; lpfnMAPIAllocateBuffer = NULL; lpfnMAPIFreeBuffer = NULL; lpfnFreeProws = NULL; lpfnFreePadrlist = NULL; lpfnScCopyProps = NULL; lpfnScCountProps = NULL; } if (hResult == hrSuccess) { hResult = ResultFromScode(MAPI_E_NOT_FOUND); } return(hResult); } return(lpfnMAPIInitialize(lpMapiInit)); } HRESULT MAPILogonEx( ULONG_PTR ulUIParam, LPTSTR lpszProfileName, LPTSTR lpszPassword, ULONG ulFlags, LPMAPISESSION FAR * lppSession ) { Assert(lpfnMAPILogonEx); if (lpfnMAPILogonEx) { return(lpfnMAPILogonEx(ulUIParam, lpszProfileName, lpszPassword, ulFlags, lppSession)); } else { return(ResultFromScode(MAPI_E_NOT_INITIALIZED)); } } SCODE MAPIAllocateBuffer( ULONG cbSize, LPVOID FAR * lppBuffer ) { Assert(lpfnMAPIAllocateBuffer); if (lpfnMAPIAllocateBuffer) { return(lpfnMAPIAllocateBuffer(cbSize, lppBuffer)); } else { return(MAPI_E_NOT_INITIALIZED); } } SCODE MAPIAllocateMore( ULONG cbSize, LPVOID lpObject, LPVOID FAR * lppBuffer ) { Assert(lpfnMAPIAllocateMore); if (lpfnMAPIAllocateMore) { return(lpfnMAPIAllocateMore(cbSize, lpObject, lppBuffer)); } else { return(MAPI_E_NOT_INITIALIZED); } } ULONG MAPIFreeBuffer(LPVOID lpBuffer) { Assert(lpfnMAPIFreeBuffer); if (lpfnMAPIFreeBuffer) { return(lpfnMAPIFreeBuffer(lpBuffer)); } else { return((ULONG)MAPI_E_NOT_INITIALIZED); } } STDAPI_(SCODE)ScCountProps(int cValues, LPSPropValue lpPropArray, ULONG FAR *lpcb) { Assert(lpfnScCountProps); if (lpfnScCountProps) { return(lpfnScCountProps(cValues, lpPropArray, lpcb)); } else { return((ULONG)MAPI_E_NOT_INITIALIZED); } } STDAPI_(SCODE)ScCopyProps(int cValues, LPSPropValue lpPropArray, LPVOID lpvDst, ULONG FAR *lpcb) { Assert(lpfnScCopyProps); if (lpfnScCopyProps) { return(lpfnScCopyProps(cValues, lpPropArray, lpvDst, lpcb)); } else { return((ULONG)MAPI_E_NOT_INITIALIZED); } } STDAPI_(void)FreeProws(LPSRowSet lpRows) { Assert(lpfnFreeProws); if (lpfnFreeProws) { lpfnFreeProws(lpRows); } } STDAPI_(void)FreePadrlist(LPADRLIST lpadrlist) { Assert(lpfnFreePadrlist); if (lpfnFreePadrlist) { lpfnFreePadrlist(lpadrlist); } }