windows-nt/Source/XPSP1/NT/printscan/fax/print/faxprint/faxui/prnevent.c
2020-09-26 16:20:57 +08:00

379 lines
8.6 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
prnevent.c
Abstract:
Implementation of DrvPrinterEvent
Environment:
Fax driver user interface
Revision History:
05/10/96 -davidx-
Created it.
mm/dd/yy -author-
description
--*/
#include "faxui.h"
#include <gdispool.h>
#include <winsprlp.h>
typedef BOOL (WINAPI *PFAXPOINTPRINTINSTALL)(LPWSTR,LPWSTR);
LPTSTR
GetFaxServerDirectory(
LPTSTR ServerName
)
/*++
Routine Description:
Find the directory containing the client setup software
Arguments:
pServerName - Specifies the name of the print/fax server
Return Value:
Pointer to name of the directory containing the client setup software
NULL if there is an error
--*/
#define FAX_SHARE_NAME TEXT("\\Fax$\\")
{
LPTSTR Dir = MemAllocZ( SizeOfString(ServerName) + SizeOfString(FAX_SHARE_NAME) + 16 );
if (Dir) {
_tcscpy( Dir, ServerName );
_tcscat( Dir, FAX_SHARE_NAME );
}
return Dir;
}
LPTSTR
GetClientSetupDir(
LPTSTR pServerName,
LPTSTR pEnvironment
)
/*++
Routine Description:
Find the directory containing the client setup software
Arguments:
pServerName - Specifies the name of the print server
pEnvironment - Specifies the client's machine architecture
Return Value:
Pointer to name of the directory containing the client setup software
NULL if there is an error
--*/
#define DRIVERENV_I386 TEXT("Windows NT x86")
#define DRIVERENV_ALPHA TEXT("Windows NT Alpha_AXP")
#define ARCHSUFFIX_I386 TEXT("Clients\\i386\\")
#define ARCHSUFFIX_ALPHA TEXT("Clients\\alpha\\")
{
LPTSTR pClientDir, pServerDir, pArchSuffix;
//
// Determine the client machine's architecture
//
pClientDir = pServerDir = pArchSuffix = NULL;
if (pEnvironment != NULL) {
if (_tcsicmp(pEnvironment, DRIVERENV_I386) == EQUAL_STRING)
pArchSuffix = ARCHSUFFIX_I386;
else if (_tcsicmp(pEnvironment, DRIVERENV_ALPHA) == EQUAL_STRING)
pArchSuffix = ARCHSUFFIX_ALPHA;
}
if (pArchSuffix == NULL) {
Error(("Bad driver envirnment: %ws\n", pEnvironment));
SetLastError(ERROR_BAD_ENVIRONMENT);
return NULL;
}
//
// Get the server name and the driver directory on the server
//
if ((pServerName != NULL) &&
(pServerDir = GetFaxServerDirectory(pServerName)) &&
(pClientDir = MemAllocZ(SizeOfString(pServerDir) + SizeOfString(pArchSuffix))))
{
//
// Copy the server driver directory string and truncate the last component
//
_tcscpy(pClientDir, pServerDir);
_tcscat(pClientDir, pArchSuffix);
Verbose(("Fax client setup directory: %ws\n", pClientDir));
}
MemFree(pServerDir);
return pClientDir;
}
BOOL
IsMetricCountry(
VOID
)
/*++
Routine Description:
Determine if the current country is using metric system.
Arguments:
NONE
Return Value:
TRUE if the current country uses metric system, FALSE otherwise
--*/
{
INT cch;
PVOID pstr = NULL;
LONG countryCode = CTRY_UNITED_STATES;
//
// Determine the size of the buffer needed to retrieve locale information.
// Allocate the necessary space.
//
//
if ((cch = GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_ICOUNTRY, NULL, 0)) > 0 &&
(pstr = MemAlloc(sizeof(TCHAR) * cch)) &&
(cch == GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_ICOUNTRY, pstr, cch)))
{
countryCode = _ttol(pstr);
}
MemFree(pstr);
Verbose(("Default country code: %d\n", countryCode));
//
// This is the Win31 algorithm based on AT&T international dialing codes.
//
return ((countryCode == CTRY_UNITED_STATES) ||
(countryCode == CTRY_CANADA) ||
(countryCode >= 50 && countryCode < 60) ||
(countryCode >= 500 && countryCode < 600)) ? FALSE : TRUE;
}
BOOL
DrvPrinterEvent(
LPWSTR pPrinterName,
int DriverEvent,
DWORD Flags,
LPARAM lParam
)
/*++
Routine Description:
Implementation of DrvPrinterEvent entrypoint
Arguments:
pPrinterName - Specifies the name of the printer involved
DriverEvent - Specifies what happened
Flags - Specifies misc. flag bits
lParam - Event specific parameters
Return Value:
TRUE if successful, FALSE otherwise
--*/
#define FaxClientSetupError(errMesg) { \
Error(("%s failed: %d\n", errMesg, GetLastError())); \
status = IDS_FAXCLIENT_SETUP_FAILED; \
goto ExitDrvPrinterEvent; \
}
{
HKEY hRegKey = NULL;
HANDLE hPrinter = NULL;
PDRIVER_INFO_2 pDriverInfo2 = NULL;
PPRINTER_INFO_2 pPrinterInfo2 = NULL;
HINSTANCE hInstFaxOcm = NULL;
PFAXPOINTPRINTINSTALL FaxPointPrintInstall = NULL;
LPTSTR pClientSetupDir = NULL;
INT status = 0;
TCHAR FaxOcmPath[MAX_PATH];
TCHAR DestPath[MAX_PATH];
Verbose(("DrvPrinterEvent: %d\n", DriverEvent));
DestPath[0] = 0;
//
// Ignore any event other than Initialize and AddConnection
//
if (DriverEvent == PRINTER_EVENT_INITIALIZE) {
static PRINTER_DEFAULTS printerDefault = {NULL, NULL, PRINTER_ALL_ACCESS};
HANDLE hPrinter;
if (OpenPrinter(pPrinterName, &hPrinter, &printerDefault)) {
SetPrinterDataDWord(hPrinter, PRNDATA_ISMETRIC, IsMetricCountry());
ClosePrinter(hPrinter);
} else
Error(("OpenPrinter failed: %d\n", GetLastError()));
} else if (DriverEvent == PRINTER_EVENT_ADD_CONNECTION) {
if (Flags & PRINTER_EVENT_FLAG_NO_UI)
Error(("PRINTER_EVENT_FLAG_NO_UI set!\n"));
//
// Check if client installation was ever done before
//
if (! (hRegKey = GetUserInfoRegKey(REGKEY_FAX_USERINFO, REG_READWRITE))) {
Error(("GetUserInfoRegKey failed: %d\n", GetLastError()));
status = IDS_FAXCLIENT_SETUP_FAILED;
} else if (! GetRegistryDword(hRegKey, REGVAL_FAXINSTALLED)) {
if (! OpenPrinter(pPrinterName, &hPrinter, NULL) ||
! (pDriverInfo2 = MyGetPrinterDriver(hPrinter, 2)) ||
! (pPrinterInfo2 = MyGetPrinter(hPrinter, 2)))
{
FaxClientSetupError("OpenPrinter");
}
//
// Locate faxocm.dll and load it into memory
//
if (!(pClientSetupDir = GetClientSetupDir(pPrinterInfo2->pServerName,pDriverInfo2->pEnvironment))) {
FaxClientSetupError("GetClientSetupDir");
}
_tcscpy( FaxOcmPath, pClientSetupDir );
_tcscat( FaxOcmPath, TEXT("faxocm.dll") );
GetTempPath( sizeof(DestPath)/sizeof(TCHAR), DestPath );
if (DestPath[_tcslen(DestPath)-1] != TEXT('\\')) {
_tcscat( DestPath, TEXT("\\") );
}
_tcscat( DestPath, TEXT("faxocm.dll") );
if (!CopyFile( FaxOcmPath, DestPath, FALSE )) {
FaxClientSetupError("CopyFile");
}
if (!(hInstFaxOcm = LoadLibrary(DestPath))) {
FaxClientSetupError("LoadLibrary");
}
FaxPointPrintInstall = (PFAXPOINTPRINTINSTALL) GetProcAddress(hInstFaxOcm, "FaxPointPrintInstall");
if (FaxPointPrintInstall == NULL) {
FaxClientSetupError("GetProcAddress");
}
//
// Find the directory containing the client setup software
// and then run the install procedure in faxocm.dll
//
if (!FaxPointPrintInstall(pClientSetupDir, pPrinterName))
{
FaxClientSetupError("GetClientSetupDir");
} else {
//
// Indicate the client setup has been run
//
SetRegistryDword(hRegKey, REGVAL_FAXINSTALLED, 1);
}
}
ExitDrvPrinterEvent:
//
// Cleanup properly before returning
//
if (status != 0) {
DeletePrinterConnection(pPrinterName);
DisplayMessageDialog(NULL, 0, 0, status);
}
MemFree(pClientSetupDir);
MemFree(pDriverInfo2);
MemFree(pPrinterInfo2);
if (hInstFaxOcm)
FreeLibrary(hInstFaxOcm);
if (hPrinter)
ClosePrinter(hPrinter);
if (hRegKey)
RegCloseKey(hRegKey);
if (DestPath[0])
DeleteFile( DestPath );
}
return TRUE;
}