242 lines
5.3 KiB
C++
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;
|
||
|
}
|