364 lines
5.8 KiB
C
364 lines
5.8 KiB
C
/*++
|
|
|
|
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 <mapiwin.h>
|
|
#include <mapix.h>
|
|
|
|
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; i<prws->cRows; 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; i<prws->cRows; 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;
|
|
}
|
|
|