windows-nt/Source/XPSP1/NT/printscan/fax/service/faxmapi/email.cpp
2020-09-26 16:20:57 +08:00

242 lines
5.3 KiB
C++

#include "faxmapip.h"
#pragma hdrstop
LIST_ENTRY ProfileListHead;
CRITICAL_SECTION CsProfile;
DWORD MapiServiceThreadId;
VOID
MapiServiceThread(
LPVOID EventHandle
);
BOOL
MyInitializeMapi(
);
BOOL
InitializeEmail(
VOID
)
{
HANDLE MapiThreadHandle;
HANDLE MapiInitEvent;
InitializeListHead( &ProfileListHead );
InitializeCriticalSection( &CsProfile );
//
// create an event for the service thread to set after it has initialized mapi
//
MapiInitEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
if (!MapiInitEvent) {
DebugPrint(( TEXT("InitializeEmailRouting(): CreateEvent() failed: err = %d\n"), GetLastError ));
return FALSE;
}
MapiThreadHandle = CreateThread(
NULL,
1024*100,
(LPTHREAD_START_ROUTINE) MapiServiceThread,
(LPVOID) MapiInitEvent,
0,
&MapiServiceThreadId
);
if (MapiThreadHandle == NULL) {
DebugPrint(( TEXT("InitializeEmailRouting(): Cannot create MapiServiceThread thread") ));
return FALSE;
}
CloseHandle( MapiThreadHandle );
//
// wait for MAPI to initialize
//
if (WaitForSingleObject( MapiInitEvent, MILLISECONDS_PER_SECOND * 60) != WAIT_OBJECT_0) {
DebugPrint(( TEXT("InitializeEmailRouting(): WaitForSingleObject failed - ec = %d"), GetLastError() ));
return FALSE;
}
CloseHandle( MapiInitEvent);
return TRUE;
}
PPROFILE_INFO
FindProfileByName(
LPCTSTR ProfileName
)
{
PLIST_ENTRY Next;
PPROFILE_INFO ProfileInfo = NULL;
if (ProfileName == NULL) {
return NULL;
}
EnterCriticalSection( &CsProfile );
Next = ProfileListHead.Flink;
if (Next) {
while (Next != &ProfileListHead) {
ProfileInfo = CONTAINING_RECORD( Next, PROFILE_INFO, ListEntry );
Next = ProfileInfo->ListEntry.Flink;
if (_tcscmp( ProfileInfo->ProfileName, ProfileName ) == 0) {
LeaveCriticalSection( &CsProfile );
return ProfileInfo;
}
}
}
LeaveCriticalSection( &CsProfile );
return NULL;
}
extern "C"
LPCWSTR WINAPI
GetProfileName(
IN LPVOID ProfileInfo
)
{
return ((PPROFILE_INFO)ProfileInfo)->ProfileName;
}
extern "C"
LPVOID WINAPI
AddNewMapiProfile(
LPCTSTR ProfileName,
BOOL UseMail,
BOOL ShowPopUp
)
{
PPROFILE_INFO ProfileInfo = NULL;
if (!MapiIsInitialized) {
return NULL;
}
if (ProfileName == NULL) {
return NULL;
}
ProfileInfo = FindProfileByName( ProfileName );
if (ProfileInfo) {
return ProfileInfo;
}
EnterCriticalSection( &CsProfile );
ProfileInfo = (PPROFILE_INFO) MemAlloc( sizeof(PROFILE_INFO) );
if (ProfileInfo) {
// put the profile name into ProfileInfo and create an event for
// DoMapiLogon to set when its call to MapiLogonEx has completed
_tcscpy( ProfileInfo->ProfileName, ProfileName );
ProfileInfo->EventHandle = CreateEvent( NULL, FALSE, FALSE, NULL );
ProfileInfo->UseMail = UseMail;
if(ProfileInfo->EventHandle != NULL) {
// post a message to the mapi service thread
PostThreadMessage( MapiServiceThreadId, WM_MAPILOGON, 0, (LPARAM) ProfileInfo );
// wait for the logon to complete
if (WaitForSingleObject( ProfileInfo->EventHandle, INFINITE) != WAIT_OBJECT_0) {
DebugPrint(( TEXT("AddNewMapiProfile - WaitForSingleObject failed - ec = %d"), GetLastError() ));
ProfileInfo->Session = NULL;
}
CloseHandle( ProfileInfo->EventHandle );
if (!ProfileInfo->Session) {
DebugPrint(( TEXT("DoMapiLogon() failed: [%s] 0x%08x"), ProfileName, GetLastError() ));
MemFree( ProfileInfo );
ProfileInfo = NULL;
if (ShowPopUp) {
ServiceMessageBox(
GetString( IDS_NO_MAPI_LOGON ),
MB_OK | MB_ICONEXCLAMATION | MB_SETFOREGROUND,
TRUE,
NULL,
ProfileName[0] ? ProfileName : GetString( IDS_DEFAULT )
);
}
} else {
InsertTailList( &ProfileListHead, &ProfileInfo->ListEntry );
}
}
}
LeaveCriticalSection( &CsProfile );
return ProfileInfo;
}
VOID
MapiServiceThread(
LPVOID EventHandle
)
/*++
Routine Description:
Initializes MAPI and services messages. MAPI/OLE create windows under the
covers.
Arguments:
EventHandle - Event to set once MAPI is initialized.
Return Value:
NONE
--*/
{
BOOL Result;
Result = MyInitializeMapi();
SetEvent((HANDLE) EventHandle);
if (!Result) {
return;
}
while (TRUE) {
MSG msg;
Result = GetMessage( &msg, NULL, 0, 0 );
if (Result == (BOOL) -1) {
DebugPrint(( TEXT("GetMessage returned an error - ec = %d"), GetLastError() ));
return;
}
if (Result) {
if (msg.message == WM_MAPILOGON) {
DoMapiLogon( (PPROFILE_INFO) msg.lParam );
} else {
DispatchMessage( &msg );
}
}
}
return;
}