|
|
/*++
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; }
|