/*++ Copyright (c) 1996 Microsoft Corporation Module Name: mapi.c Abstract: This file implements wrappers for all mapi apis. The wrappers are necessary because mapi does not implement unicode and this code must be non-unicode. Environment: WIN32 User Mode Author: Wesley Witt (wesw) 7-Aug-1996 --*/ #include "faxcpl.h" #include #include static HMODULE MapiMod = NULL; static LPMAPIADMINPROFILES MapiAdminProfiles = NULL; static LPMAPIINITIALIZE MapiInitialize = NULL; static LPMAPIUNINITIALIZE MapiUnInitialize = NULL; static LPMAPIFREEBUFFER pMAPIFreeBuffer = NULL; static LPPROFADMIN lpProfAdmin; BOOL isMapiEnabled = FALSE; static LPWSTR AnsiStringToUnicodeString( LPSTR AnsiString, LPWSTR UnicodeString ) { DWORD Count; // // first see how big the buffer needs to be // Count = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, AnsiString, -1, NULL, 0 ); // // i guess the input string is empty // if (!Count) { return NULL; } // // convert the string // Count = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, AnsiString, -1, UnicodeString, Count ); // // the conversion failed // if (!Count) { return NULL; } return UnicodeString; } static LPSTR UnicodeStringToAnsiString( LPWSTR UnicodeString, LPSTR AnsiString ) { DWORD Count; // // first see how big the buffer needs to be // Count = WideCharToMultiByte( CP_ACP, 0, UnicodeString, -1, NULL, 0, NULL, NULL ); // // i guess the input string is empty // if (!Count) { return NULL; } // // convert the string // Count = WideCharToMultiByte( CP_ACP, 0, UnicodeString, -1, AnsiString, Count, NULL, NULL ); // // the conversion failed // if (!Count) { return NULL; } return AnsiString; } VOID FreeSRowSet( LPSRowSet prws ) { ULONG irw; if (!prws) { return; } for(irw = 0; irw < prws->cRows; irw++) { pMAPIFreeBuffer( prws->aRow[irw].lpProps ); } pMAPIFreeBuffer( prws ); } ULONG MLCRelease( LPUNKNOWN punk ) { return (punk) ? punk->lpVtbl->Release(punk) : 0; } BOOL ValidateProp( LPSPropValue pval, ULONG ulPropTag ) { if (pval->ulPropTag != ulPropTag) { pval->ulPropTag = ulPropTag; pval->Value.lpszA = "???"; return TRUE; } return FALSE; } BOOL GetDefaultMapiProfile( LPWSTR ProfileName ) { BOOL rVal = FALSE; LPMAPITABLE pmt = NULL; LPSRowSet prws = NULL; LPSPropValue pval; DWORD i; // // get the mapi profile table object // if (lpProfAdmin->lpVtbl->GetProfileTable( lpProfAdmin, 0, &pmt )) { goto exit; } // // get the actual profile data, FINALLY // if (pmt->lpVtbl->QueryRows( pmt, 4000, 0, &prws )) { goto exit; } // // enumerate the profiles looking for the default profile // for (i=0; icRows; i++) { pval = prws->aRow[i].lpProps; if (pval[2].Value.b) { // // this is the default profile // AnsiStringToUnicodeString( pval[0].Value.lpszA, ProfileName ); rVal = TRUE; break; } } exit: FreeSRowSet( prws ); MLCRelease( (LPUNKNOWN)pmt ); return rVal; } BOOL InitializeMapi( VOID ) { MAPIINIT_0 MapiInit; // // load the mapi dll // MapiMod = LoadLibrary( TEXT("mapi32.dll") ); if (!MapiMod) { return FALSE; } // // get the addresses of the mapi functions that we need // MapiAdminProfiles = (LPMAPIADMINPROFILES) GetProcAddress( MapiMod, "MAPIAdminProfiles" ); MapiInitialize = (LPMAPIINITIALIZE) GetProcAddress( MapiMod, "MAPIInitialize" ); MapiUnInitialize = (LPMAPIUNINITIALIZE) GetProcAddress( MapiMod, "MAPIUninitialize" ); pMAPIFreeBuffer = (LPMAPIFREEBUFFER) GetProcAddress( MapiMod, "MAPIFreeBuffer" ); if (!MapiAdminProfiles || !MapiInitialize || !MapiUnInitialize || !pMAPIFreeBuffer) { return FALSE; } // // initialize mapi for our calls // MapiInit.ulVersion = 0; MapiInit.ulFlags = 0; if (MapiInitialize( &MapiInit )) { return FALSE; } // // get the admin profile object // if (MapiAdminProfiles( 0, &lpProfAdmin )) { MapiUnInitialize(); FreeLibrary(MapiMod); return FALSE; } return TRUE; } VOID ShutdownMapi( VOID ) { if (isMapiEnabled) { MapiUnInitialize(); FreeLibrary(MapiMod); isMapiEnabled = FALSE; } } BOOL GetMapiProfiles( HWND hwnd ) { BOOL rVal = FALSE; HMODULE MapiMod = NULL; LPMAPITABLE pmt = NULL; LPSRowSet prws = NULL; LPSPropValue pval; DWORD i; // // get the mapi table object // if (lpProfAdmin->lpVtbl->GetProfileTable( lpProfAdmin, 0, &pmt )) { goto exit; } // // get the actual profile data, FINALLY // if (pmt->lpVtbl->QueryRows( pmt, 4000, 0, &prws )) { goto exit; } // // enumerate the profiles and put the name // of each profile in the combo box // for (i=0; icRows; i++) { pval = prws->aRow[i].lpProps; SendMessageA( hwnd, CB_ADDSTRING, 0, (LPARAM) pval[0].Value.lpszA ); } rVal = TRUE; exit: FreeSRowSet( prws ); MLCRelease( (LPUNKNOWN)pmt ); return rVal; }