356 lines
8.4 KiB
C++
356 lines
8.4 KiB
C++
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
faxxp.cpp
|
|
|
|
Abstract:
|
|
|
|
This module contains routines for the fax transport provider.
|
|
|
|
Author:
|
|
|
|
Wesley Witt (wesw) 13-Aug-1996
|
|
|
|
--*/
|
|
|
|
#include "faxxp.h"
|
|
#pragma hdrstop
|
|
|
|
|
|
//
|
|
// globals
|
|
//
|
|
|
|
LPALLOCATEBUFFER gpfnAllocateBuffer; // MAPIAllocateBuffer function
|
|
LPALLOCATEMORE gpfnAllocateMore; // MAPIAllocateMore function
|
|
LPFREEBUFFER gpfnFreeBuffer; // MAPIFreeBuffer function
|
|
HINSTANCE FaxXphInstance;
|
|
HMODULE hModRichEdit;
|
|
MAPIUID FaxGuid = FAX_XP_GUID;
|
|
|
|
|
|
|
|
extern "C"
|
|
DWORD
|
|
FaxXpDllEntry(
|
|
HINSTANCE hInstance,
|
|
DWORD Reason,
|
|
LPVOID Context
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
DLL initialization function.
|
|
|
|
Arguments:
|
|
|
|
hInstance - Instance handle
|
|
Reason - Reason for the entrypoint being called
|
|
Context - Context record
|
|
|
|
Return Value:
|
|
|
|
TRUE - Initialization succeeded
|
|
FALSE - Initialization failed
|
|
|
|
--*/
|
|
|
|
{
|
|
if (Reason == DLL_PROCESS_ATTACH) {
|
|
FaxXphInstance = hInstance;
|
|
DisableThreadLibraryCalls( hInstance );
|
|
HeapInitialize( NULL, MapiMemAlloc, MapiMemFree, HEAPINIT_NO_VALIDATION | HEAPINIT_NO_STRINGS );
|
|
}
|
|
|
|
if (Reason == DLL_PROCESS_DETACH) {
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
STDINITMETHODIMP
|
|
XPProviderInit(
|
|
HINSTANCE hInstance,
|
|
LPMALLOC lpMalloc,
|
|
LPALLOCATEBUFFER lpAllocateBuffer,
|
|
LPALLOCATEMORE lpAllocateMore,
|
|
LPFREEBUFFER lpFreeBuffer,
|
|
ULONG ulFlags,
|
|
ULONG ulMAPIVer,
|
|
ULONG * lpulProviderVer,
|
|
LPXPPROVIDER * lppXPProvider
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Entry point called by the MAPI spooler when a profile uses this
|
|
transport. The spooler calls this method and expects a pointer to an
|
|
implementation of the IXPProvider interface. MAPI uses the returned
|
|
IXPProvider interface pointer to logon on the transport provider.
|
|
|
|
Arguments:
|
|
|
|
Refer to MAPI Documentation for this method.
|
|
|
|
Return Value:
|
|
|
|
An HRESULT.
|
|
|
|
--*/
|
|
|
|
{
|
|
gpfnAllocateBuffer = lpAllocateBuffer;
|
|
gpfnAllocateMore = lpAllocateMore;
|
|
gpfnFreeBuffer = lpFreeBuffer;
|
|
|
|
if (!hModRichEdit) {
|
|
hModRichEdit = LoadLibrary( "RICHED32.DLL" );
|
|
}
|
|
|
|
CXPProvider * pXPProvider = new CXPProvider( hInstance );
|
|
if (!pXPProvider) {
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
*lppXPProvider = (LPXPPROVIDER)pXPProvider;
|
|
*lpulProviderVer = CURRENT_SPI_VERSION;
|
|
return 0;
|
|
}
|
|
|
|
|
|
HRESULT STDAPICALLTYPE
|
|
CreateDefaultPropertyTags(
|
|
LPPROFSECT pProfileObj
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Creates the default property tags & values.
|
|
|
|
Arguments:
|
|
|
|
pProfileObj - Profile object.
|
|
|
|
Return Value:
|
|
|
|
An HRESULT.
|
|
|
|
--*/
|
|
|
|
{
|
|
HRESULT hResult;
|
|
SPropValue spvProps[NUM_FAX_PROPERTIES] = { 0 };
|
|
PPRINTER_INFO_2 PrinterInfo;
|
|
DWORD CountPrinters;
|
|
LPSTR FaxPrinterName = NULL;
|
|
LOGFONT FontStruct;
|
|
HFONT hFont;
|
|
|
|
|
|
PrinterInfo = (PPRINTER_INFO_2) MyEnumPrinters( NULL, 2, &CountPrinters, PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS );
|
|
if (PrinterInfo) {
|
|
DWORD i;
|
|
for (i=0; i<CountPrinters; i++) {
|
|
if (strcmp( PrinterInfo[i].pDriverName, FAX_DRIVER_NAME ) == 0) {
|
|
FaxPrinterName = StringDup( PrinterInfo[i].pPrinterName );
|
|
break;
|
|
}
|
|
}
|
|
MemFree(PrinterInfo);
|
|
}
|
|
|
|
spvProps[PROP_FAX_PRINTER_NAME].ulPropTag = PR_FAX_PRINTER_NAME;
|
|
spvProps[PROP_FAX_PRINTER_NAME].Value.LPSZ = FaxPrinterName ? FaxPrinterName : "";
|
|
|
|
spvProps[PROP_COVERPAGE_NAME].ulPropTag = PR_COVERPAGE_NAME;
|
|
spvProps[PROP_COVERPAGE_NAME].Value.LPSZ = "";
|
|
|
|
spvProps[PROP_USE_COVERPAGE].ulPropTag = PR_USE_COVERPAGE;
|
|
spvProps[PROP_USE_COVERPAGE].Value.ul = 0;
|
|
|
|
spvProps[PROP_SERVER_COVERPAGE].ulPropTag = PR_SERVER_COVERPAGE;
|
|
spvProps[PROP_SERVER_COVERPAGE].Value.ul = 0;
|
|
|
|
hFont = (HFONT) GetStockObject( SYSTEM_FIXED_FONT );
|
|
GetObject( hFont, sizeof(LOGFONT), &FontStruct );
|
|
|
|
spvProps[PROP_FONT].ulPropTag = PR_FONT;
|
|
spvProps[PROP_FONT].Value.bin.cb = sizeof(LOGFONT);
|
|
spvProps[PROP_FONT].Value.bin.lpb = (LPBYTE) &FontStruct;
|
|
|
|
hResult = pProfileObj->SetProps( sizeof(spvProps)/sizeof(SPropValue), spvProps, NULL);
|
|
|
|
return hResult;
|
|
}
|
|
|
|
|
|
HRESULT STDAPICALLTYPE
|
|
ServiceEntry(
|
|
HINSTANCE hInstance,
|
|
LPMALLOC pMallocObj,
|
|
LPMAPISUP pSupObj,
|
|
ULONG ulUIParam,
|
|
ULONG ulFlags,
|
|
ULONG ulContext,
|
|
ULONG ulCfgPropCount,
|
|
LPSPropValue pCfgProps,
|
|
LPPROVIDERADMIN pAdminProvObj,
|
|
LPMAPIERROR * ppMAPIError
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Called by the profile setup API to display the provider
|
|
configuration properties for this transport provider
|
|
|
|
Arguments:
|
|
|
|
Refer to MAPI Documentation for this method.
|
|
|
|
Return Value:
|
|
|
|
An HRESULT.
|
|
|
|
--*/
|
|
|
|
{
|
|
HRESULT hResult = S_OK;
|
|
LPPROFSECT pProfileObj = NULL;
|
|
ULONG PropCount = 0;
|
|
LPSPropValue pProps = NULL;
|
|
FAXXP_CONFIG FaxConfig;
|
|
|
|
|
|
pSupObj->GetMemAllocRoutines( &gpfnAllocateBuffer, &gpfnAllocateMore, &gpfnFreeBuffer );
|
|
|
|
hResult = pAdminProvObj->OpenProfileSection(
|
|
&FaxGuid,
|
|
NULL,
|
|
MAPI_MODIFY,
|
|
&pProfileObj
|
|
);
|
|
if (hResult) {
|
|
goto exit;
|
|
}
|
|
|
|
if (ulContext == MSG_SERVICE_CREATE) {
|
|
CreateDefaultPropertyTags( pProfileObj );
|
|
goto exit;
|
|
}
|
|
|
|
if (ulContext == MSG_SERVICE_DELETE) {
|
|
goto exit;
|
|
}
|
|
|
|
hResult = pProfileObj->GetProps(
|
|
(LPSPropTagArray) &sptFaxProps,
|
|
0,
|
|
&PropCount,
|
|
&pProps
|
|
);
|
|
if (FAILED(hResult)) {
|
|
goto exit;
|
|
}
|
|
|
|
FaxConfig.PrinterName = GetStringProperty( pProps, PROP_FAX_PRINTER_NAME );
|
|
FaxConfig.CoverPageName = GetStringProperty( pProps, PROP_COVERPAGE_NAME );
|
|
FaxConfig.UseCoverPage = GetDwordProperty( pProps, PROP_USE_COVERPAGE );
|
|
FaxConfig.ServerCoverPage = GetDwordProperty( pProps, PROP_SERVER_COVERPAGE );
|
|
|
|
#ifndef WIN95
|
|
|
|
//
|
|
// get the server name from the printer name
|
|
//
|
|
FaxConfig.ServerName = GetServerName(FaxConfig.PrinterName);
|
|
|
|
//
|
|
// nice idea but we should really defer this until it's needed, ie., if and when the
|
|
// dialog comes up (otherwise we can fire up the fax service when it's not needed)
|
|
//
|
|
#if 0
|
|
HANDLE hFax;
|
|
PFAX_CONFIGURATION pFaxConfiguration;
|
|
|
|
//
|
|
// get the servercp flag
|
|
//
|
|
FaxConfig.ServerCpOnly = FALSE;
|
|
if (FaxConnectFaxServer(FaxConfig.ServerName,&hFax) ) {
|
|
if (FaxGetConfiguration(hFax,&pFaxConfiguration) ) {
|
|
FaxConfig.ServerCpOnly = pFaxConfiguration->ServerCp;
|
|
FaxFreeBuffer(pFaxConfiguration);
|
|
}
|
|
FaxClose(hFax);
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
if (!GetBinaryProperty( pProps, PROP_FONT, &FaxConfig.FontStruct, sizeof(FaxConfig.FontStruct) )) {
|
|
HFONT hFont = (HFONT) GetStockObject( SYSTEM_FIXED_FONT );
|
|
GetObject( hFont, sizeof(LOGFONT), &FaxConfig.FontStruct );
|
|
}
|
|
|
|
|
|
|
|
if (ulContext == MSG_SERVICE_CONFIGURE) {
|
|
DialogBoxParam(
|
|
hInstance,
|
|
MAKEINTRESOURCE(FAX_CONFIG_DIALOG),
|
|
(HWND) ulUIParam,
|
|
ConfigDlgProc,
|
|
(LPARAM) &FaxConfig
|
|
);
|
|
}
|
|
|
|
pProps[PROP_FAX_PRINTER_NAME].ulPropTag = PR_FAX_PRINTER_NAME;
|
|
pProps[PROP_FAX_PRINTER_NAME].Value.LPSZ = FaxConfig.PrinterName;
|
|
|
|
pProps[PROP_COVERPAGE_NAME].ulPropTag = PR_COVERPAGE_NAME;
|
|
pProps[PROP_COVERPAGE_NAME].Value.LPSZ = FaxConfig.CoverPageName;
|
|
|
|
pProps[PROP_USE_COVERPAGE].ulPropTag = PR_USE_COVERPAGE;
|
|
pProps[PROP_USE_COVERPAGE].Value.ul = FaxConfig.UseCoverPage;
|
|
|
|
pProps[PROP_SERVER_COVERPAGE].ulPropTag = PR_SERVER_COVERPAGE;
|
|
pProps[PROP_SERVER_COVERPAGE].Value.ul = FaxConfig.ServerCoverPage;
|
|
|
|
pProps[PROP_FONT].ulPropTag = PR_FONT;
|
|
pProps[PROP_FONT].Value.bin.lpb = (LPBYTE)&FaxConfig.FontStruct;
|
|
pProps[PROP_FONT].Value.bin.cb = sizeof(FaxConfig.FontStruct);
|
|
|
|
hResult = pProfileObj->SetProps( PropCount, pProps, NULL);
|
|
|
|
if (FaxConfig.PrinterName) {
|
|
MemFree( FaxConfig.PrinterName );
|
|
}
|
|
if (FaxConfig.CoverPageName) {
|
|
MemFree( FaxConfig.CoverPageName );
|
|
}
|
|
if (FaxConfig.ServerName) {
|
|
MemFree(FaxConfig.ServerName);
|
|
}
|
|
|
|
exit:
|
|
if (pProfileObj) {
|
|
pProfileObj->Release();
|
|
}
|
|
|
|
if (pProps) {
|
|
MemFree( pProps );
|
|
}
|
|
|
|
return hResult;
|
|
}
|