windows-nt/Source/XPSP1/NT/printscan/fax/service/client/install.c
2020-09-26 16:20:57 +08:00

367 lines
8.2 KiB
C

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
install.c
Abstract:
This module contains installation functions.
Author:
Andrew Ritz (andrewr) 9-Dec-1997
Revision History:
--*/
#include "faxapi.h"
#pragma hdrstop
extern HINSTANCE MyhInstance;
BOOL CreatePrinterandGroups();
BOOL CreateLocalFaxPrinter(LPWSTR FaxPrinterName,LPWSTR SourceRoot);
VOID CreateGroupItems(LPWSTR ServerName);
BOOL AddMethodKey(
HKEY hKey,
LPCWSTR MethodName,
LPCWSTR FriendlyName,
LPCWSTR FunctionName,
LPCWSTR Guid,
DWORD Priority
) ;
WINFAXAPI
BOOL
WINAPI
FaxRegisterServiceProviderW(
IN LPCWSTR DeviceProvider,
IN LPCWSTR FriendlyName,
IN LPCWSTR ImageName,
IN LPCWSTR TspName
)
{
HKEY hKey;
BOOL RetVal = TRUE;
WCHAR KeyName[256];
if (!DeviceProvider || !FriendlyName || !ImageName ||!TspName) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
wsprintf(KeyName,L"%s\\%s\\%s",REGKEY_SOFTWARE,REGKEY_DEVICE_PROVIDERS,DeviceProvider);
hKey = OpenRegistryKey(HKEY_LOCAL_MACHINE,
KeyName,
TRUE,
0);
if (!hKey) {
return FALSE;
}
//
// add values
//
if (! (SetRegistryString(hKey,REGVAL_FRIENDLY_NAME,FriendlyName) &&
SetRegistryStringExpand(hKey,REGVAL_IMAGE_NAME,ImageName) &&
SetRegistryString(hKey,REGVAL_PROVIDER_NAME,TspName) )) {
goto error_exit;
}
RegCloseKey(hKey);
//
// create printer, program group, etc.
//
if (!CreatePrinterandGroups()) {
return FALSE;
}
return TRUE;
error_exit:
//
// delete the subkey on failure
//
wsprintf(KeyName,L"%s\\%s",REGKEY_SOFTWARE,REGKEY_DEVICE_PROVIDERS);
hKey = OpenRegistryKey(HKEY_LOCAL_MACHINE,KeyName,FALSE,0);
RegDeleteKey(hKey, DeviceProvider );
RegCloseKey(hKey);
return FALSE;
}
WINFAXAPI
BOOL
WINAPI
FaxRegisterRoutingExtensionW(
IN HANDLE FaxHandle,
IN LPCWSTR ExtensionName,
IN LPCWSTR FriendlyName,
IN LPCWSTR ImageName,
IN PFAX_ROUTING_INSTALLATION_CALLBACKW CallBack,
IN LPVOID Context
)
{
HKEY hKey = NULL;
BOOL RetVal = FALSE;
WCHAR KeyName[256];
PFAX_GLOBAL_ROUTING_INFO RoutingInfo;
DWORD dwMethods;
WCHAR MethodName[64];
WCHAR MethodFriendlyName[64];
WCHAR MethodFunctionName[64];
WCHAR MethodGuid[64];
if (!ValidateFaxHandle(FaxHandle, FHT_SERVICE)) {
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
if (!ExtensionName || !FriendlyName || !ImageName ||!CallBack) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
//
// local installation only
//
if (!IsLocalFaxConnection(FaxHandle) ) {
SetLastError(ERROR_INVALID_FUNCTION);
return FALSE;
}
//
// get the number of current methods for priority
//
if (!FaxEnumGlobalRoutingInfo(FaxHandle,&RoutingInfo,&dwMethods) ){
DebugPrint((TEXT("FaxEnumGlobalRoutingInfo() failed, ec = %d\n"),GetLastError() ));
return FALSE;
}
FaxFreeBuffer(RoutingInfo);
wsprintf(KeyName,L"%s\\%s\\%s",REGKEY_SOFTWARE,REGKEY_ROUTING_EXTENSIONS,ExtensionName);
hKey = OpenRegistryKey(HKEY_LOCAL_MACHINE,
KeyName,
TRUE,
0);
if (!hKey) {
return FALSE;
}
//
// add values
//
if (! (SetRegistryString(hKey,REGVAL_FRIENDLY_NAME,FriendlyName) &&
SetRegistryStringExpand(hKey,REGVAL_IMAGE_NAME,ImageName) )) {
RetVal = FALSE;
goto error_exit;
}
RegCloseKey (hKey);
wcscat(KeyName, L"\\");
wcscat(KeyName, REGKEY_ROUTING_METHODS);
hKey = OpenRegistryKey(HKEY_LOCAL_MACHINE,
KeyName,
TRUE,
0);
if (!hKey) {
goto error_exit;
}
while (TRUE) {
ZeroMemory( MethodName, sizeof(MethodName) );
ZeroMemory( MethodFriendlyName, sizeof(MethodFriendlyName) );
ZeroMemory( MethodFunctionName, sizeof(MethodFunctionName) );
ZeroMemory( MethodGuid, sizeof(MethodGuid) );
__try {
RetVal = CallBack(FaxHandle,
Context,
MethodName,
MethodFriendlyName,
MethodFunctionName,
MethodGuid
);
if (!RetVal) {
break;
}
dwMethods++;
if (!AddMethodKey(hKey,MethodName,MethodFriendlyName,MethodFunctionName,MethodGuid,dwMethods) ) {
goto error_exit;
}
} __except (EXCEPTION_EXECUTE_HANDLER) {
goto error_exit;
}
}
RegCloseKey( hKey );
return TRUE;
error_exit:
if (hKey) {
RegCloseKey( hKey );
}
//
// delete the subkey on failure
//
wsprintf(KeyName,L"%s\\%s",REGKEY_SOFTWARE,REGKEY_ROUTING_METHODS);
hKey = OpenRegistryKey(HKEY_LOCAL_MACHINE,KeyName,FALSE,0);
RegDeleteKey(hKey, ExtensionName );
RegCloseKey(hKey);
return FALSE;
}
BOOL AddMethodKey(
HKEY hKey,
LPCWSTR MethodName,
LPCWSTR FriendlyName,
LPCWSTR FunctionName,
LPCWSTR Guid,
DWORD Priority
)
{
HKEY hKeyNew;
hKeyNew = OpenRegistryKey(hKey,
MethodName,
TRUE,
0);
if (!hKeyNew) {
return FALSE;
}
//
// add values
//
if (! (SetRegistryString(hKeyNew, REGVAL_FRIENDLY_NAME,FriendlyName) &&
SetRegistryString(hKeyNew, REGVAL_FUNCTION_NAME,FunctionName) &&
SetRegistryString(hKeyNew, REGVAL_GUID,Guid) &&
SetRegistryDword(hKeyNew, REGVAL_PRIORITY,Priority) )) {
goto error_exit;
}
RegCloseKey(hKeyNew);
return TRUE;
error_exit:
RegCloseKey(hKeyNew);
RegDeleteKey(hKey, MethodName);
return FALSE;
}
BOOL CreatePrinterandGroups()
{
WCHAR PrinterName[64];
HKEY hKeySource;
LPWSTR SourcePath;
HMODULE hModSetup;
LPWSTR FaxPrinter;
FARPROC CreateLocalFaxPrinter;
FARPROC CreateGroupItems;
//
// check if we have a fax printer installed, add one if we don't have one.
//
if ((FaxPrinter = GetFaxPrinterName())) {
MemFree(FaxPrinter);
//return EnsureFaxServiceIsStarted(NULL);
return TRUE;
}
else {
//
// printer installation routines in faxocm.dll module.
//
hModSetup = LoadLibrary(L"faxocm.dll");
if (!hModSetup) {
return FALSE;
}
CreateLocalFaxPrinter = GetProcAddress(hModSetup, "CreateLocalFaxPrinter");
CreateGroupItems = GetProcAddress(hModSetup, "CreateGroupItems");
if (!CreateLocalFaxPrinter || !CreateGroupItems) {
FreeLibrary(hModSetup);
return FALSE;
}
//
// create a fax printer
//
LoadString( MyhInstance, IDS_DEFAULT_PRINTER_NAME, PrinterName, sizeof(PrinterName)/sizeof(WCHAR) );
hKeySource = OpenRegistryKey( HKEY_LOCAL_MACHINE, REGKEY_WINDOWSNT_CURRVER, FALSE, KEY_READ );
if (hKeySource) {
SourcePath = GetRegistryString( hKeySource, REGVAL_SOURCE_PATH, EMPTY_STRING );
RegCloseKey( hKeySource );
} else {
SourcePath = StringDup( EMPTY_STRING );
}
if (SourcePath) {
if (!CreateLocalFaxPrinter( PrinterName, SourcePath )) {
DebugPrint(( L"CreateLocalFaxPrinter() failed" ));
}
MemFree( SourcePath );
}
//
// add program group items
//
CreateGroupItems( NULL );
FreeLibrary(hModSetup);
//
// start the fax service, which should add new devices
//
//return EnsureFaxServiceIsStarted(NULL);
return TRUE;
}
}