/* * MAPI.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 #include #include #include #include "apitest.h" #include "instring.h" #include "dbgutil.h" LPMAPIINITIALIZE lpfnMAPIInitialize = NULL; LPMAPILOGONEX lpfnMAPILogonEx = NULL; LPMAPIALLOCATEBUFFER lpfnMAPIAllocateBuffer = NULL; LPMAPIALLOCATEMORE lpfnMAPIAllocateMore = NULL; LPMAPIFREEBUFFER lpfnMAPIFreeBuffer = 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"); 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; } } } exit: if (! lpfnMAPIInitialize || ! lpfnMAPILogonEx || ! lpfnMAPIAllocateMore || ! lpfnMAPIAllocateBuffer || ! lpfnMAPIFreeBuffer) { // 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; } if (hResult == hrSuccess) { hResult = ResultFromScode(MAPI_E_NOT_FOUND); } return(hResult); } return(lpfnMAPIInitialize(lpMapiInit)); } HRESULT MAPILogonEx( ULONG ulUIParam, LPTSTR lpszProfileName, LPTSTR lpszPassword, ULONG ulFlags, LPMAPISESSION FAR * lppSession ) { if (lpfnMAPILogonEx) { return(lpfnMAPILogonEx(ulUIParam, lpszProfileName, lpszPassword, ulFlags, lppSession)); } else { return(ResultFromScode(MAPI_E_NOT_INITIALIZED)); } } SCODE MAPIAllocateBuffer( ULONG cbSize, LPVOID FAR * lppBuffer ) { if (lpfnMAPIAllocateBuffer) { return(lpfnMAPIAllocateBuffer(cbSize, lppBuffer)); } else { return(MAPI_E_NOT_INITIALIZED); } } SCODE MAPIAllocateMore( ULONG cbSize, LPVOID lpObject, LPVOID FAR * lppBuffer ) { if (lpfnMAPIAllocateMore) { return(lpfnMAPIAllocateMore(cbSize, lpObject, lppBuffer)); } else { return(MAPI_E_NOT_INITIALIZED); } } ULONG MAPIFreeBuffer(LPVOID lpBuffer) { if (lpfnMAPIFreeBuffer) { return(lpfnMAPIFreeBuffer(lpBuffer)); } else { return((ULONG)MAPI_E_NOT_INITIALIZED); } }