|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
faxocm.cpp
Abstract:
This file implements the setup wizard code for the FAX server setup.
Environment:
WIN32 User Mode
Author:
Wesley Witt (wesw) 10-Sept-1997
--*/
#include "faxocm.h"
#pragma hdrstop
HINSTANCE hInstance; SETUP_INIT_COMPONENT SetupInitComponent;
BOOL Unattended; BOOL Upgrade; // NT upgrade
BOOL Win9xUpgrade; BOOL NtGuiMode; BOOL NtWorkstation; BOOL UnInstall; BOOL RemoteAdminSetup; BOOL RebootRequired; BOOL SuppressReboot; WORD EnumPlatforms[4]; BOOL PointPrintSetup; DWORD InstallThreadError; BOOL OkToCancel; DWORD CurrentCountryId; LPWSTR CurrentAreaCode; WCHAR ClientSetupServerName[MAX_PATH]; WCHAR ThisPlatformName[MAX_PATH]; DWORD InstalledPlatforms; DWORD InstallType; DWORD Installed; BOOL ComponentInitialized; WIZ_DATA WizData; LPWSTR SourcePath;
PLATFORM_INFO Platforms[] = { { L"Windows NT x86", L"i386", 0, FAX_INSTALLED_PLATFORM_X86, NULL, FALSE }, { L"Windows NT Alpha_AXP", L"alpha", 0, FAX_INSTALLED_PLATFORM_ALPHA, NULL, FALSE }, };
DWORD CountPlatforms = (sizeof(Platforms)/sizeof(PLATFORM_INFO));
UNATTEND_ANSWER UnattendAnswer[] = { { L"FaxPrinterName", DT_STRING, 0, WizData.PrinterName }, { L"FaxNumber", DT_STRING, 0, WizData.PhoneNumber }, { L"RoutePrinterName", DT_STRING, 0, WizData.RoutePrinterName }, { L"RouteProfileName", DT_STRING, 0, WizData.RouteProfile }, { L"RouteFolderName", DT_STRING, 0, WizData.RouteDir }, { L"Csid", DT_STRING, 0, WizData.Csid }, { L"Tsid", DT_STRING, 0, WizData.Tsid }, { L"Rings", DT_LONGINT, 0, &WizData.Rings }, { L"RouteToPrinter", DT_BOOLEAN, LR_PRINT, &WizData.RoutingMask }, { L"RouteToInbox", DT_BOOLEAN, LR_INBOX, &WizData.RoutingMask }, { L"RouteToFolder", DT_BOOLEAN, LR_STORE, &WizData.RoutingMask }, { L"ArchiveOutgoing", DT_BOOLEAN, 0, &WizData.ArchiveOutgoing }, { L"ArchiveFolderName", DT_STRING, 0, WizData.ArchiveDir } };
#define CountUnattendAnswers (sizeof(UnattendAnswer)/sizeof(UNATTEND_ANSWER))
extern "C" INT FaxDebugLevel;
extern "C" DWORD FaxOcmDllInit( HINSTANCE hInst, 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
--*/
{ WCHAR DllName[MAX_PATH];
if (Reason == DLL_PROCESS_ATTACH) { hInstance = hInst; DisableThreadLibraryCalls( hInstance ); HeapInitialize( NULL, NULL, NULL, 0 ); if (!GetModuleFileName(hInstance, DllName, MAX_PATH) || !LoadLibrary(DllName)) { return FALSE; } DebugPrint(( TEXT("faxocm loaded") )); }
if (Reason == DLL_PROCESS_DETACH) { HeapCleanup(); }
return TRUE; }
VOID SetProgress( DWORD StatusString ) { #ifdef NT5FAXINSTALL
return; #else
SetupInitComponent.HelperRoutines.SetProgressText( SetupInitComponent.HelperRoutines.OcManagerContext, GetString( StatusString ) ); for (DWORD i=0; i<10; i++) { SetupInitComponent.HelperRoutines.TickGauge( SetupInitComponent.HelperRoutines.OcManagerContext ); } #endif
}
BOOL SetWizData( VOID ) { HKEY hKey; LPWSTR RegisteredOwner = NULL; INFCONTEXT InfLine; WCHAR Id[128]; WCHAR Value[128]; DWORD i; HINF hInf;
//
// user name
//
hKey = OpenRegistryKey( HKEY_LOCAL_MACHINE, REGKEY_WINDOWSNT_CURRVER, TRUE, KEY_ALL_ACCESS ); RegisteredOwner = GetRegistryString( hKey, REGVAL_REGISTERED_OWNER, EMPTY_STRING ); RegCloseKey( hKey );
if (RegisteredOwner && RegisteredOwner[0]) { wcscpy( WizData.UserName, RegisteredOwner ); MemFree( RegisteredOwner ); }
//
// fax printer name
//
wcscpy( WizData.PrinterName, GetString( IDS_DEFAULT_PRINTER_NAME ) );
//
// csid
//
wcscpy( WizData.Csid, GetString( IDS_DEFAULT_CSID ) );
//
// tsid
//
wcscpy( WizData.Tsid, GetString( IDS_DEFAULT_TSID ) );
//
// ring count
//
WizData.Rings = 2;
//
// routing mask
//
WizData.RoutingMask = LR_STORE;
WizData.ArchiveOutgoing = TRUE; //
// routing dir name
//
if (MyGetSpecialPath( CSIDL_COMMON_DOCUMENTS, WizData.RouteDir)) { ConcatenatePaths( WizData.RouteDir, GetString(IDS_RECEIVE_DIR) ); }
//
// archive dir name
//
if (MyGetSpecialPath( CSIDL_COMMON_DOCUMENTS, WizData.ArchiveDir)) { ConcatenatePaths( WizData.ArchiveDir, GetString(IDS_ARCHIVE_DIR) ); }
//
// process any unattend data
//
if (Unattended) { hInf = SetupInitComponent.HelperRoutines.GetInfHandle( INFINDEX_UNATTENDED, SetupInitComponent.HelperRoutines.OcManagerContext ); if (hInf == INVALID_HANDLE_VALUE) { return FALSE; }
if (SetupFindFirstLine( hInf, L"Fax", NULL, &InfLine )) { DebugPrint((L"Processing fax unattend data")); do { SetupGetStringField( &InfLine, 0, Id, sizeof(Id)/sizeof(WCHAR), NULL ); for (i=0; i<CountUnattendAnswers; i++) { if (_wcsicmp( Id, UnattendAnswer[i].KeyName ) == 0) { if ((SetupGetStringField( &InfLine, 1, Value, sizeof(Value)/sizeof(WCHAR), NULL )) && *Value) { switch (UnattendAnswer[i].DataType) { case DT_STRING: wcscpy( (LPWSTR)UnattendAnswer[i].DataPtr, Value ); break; case DT_LONGINT: *((LPDWORD)UnattendAnswer[i].DataPtr) = wcstoul( Value, NULL, 0 ); break; case DT_BOOLEAN: if (UnattendAnswer[i].UseMaskOnBool) { if (_wcsicmp( Value, L"yes" ) == 0 || _wcsicmp( Value, L"true" ) == 0) { *((LPDWORD)UnattendAnswer[i].DataPtr) |= UnattendAnswer[i].UseMaskOnBool; } } else { if (_wcsicmp( Value, L"yes" ) == 0 || _wcsicmp( Value, L"true" ) == 0) { *((LPDWORD)UnattendAnswer[i].DataPtr) = TRUE; } else { *((LPDWORD)UnattendAnswer[i].DataPtr) = FALSE; } } break; default: break; } } } } } while(SetupFindNextLine( &InfLine, &InfLine )); } }
return TRUE; }
BOOL IsGoodComponent( IN LPWSTR ComponentId, IN LPWSTR SubcomponentId, IN LPWSTR TargetId ) { if (ComponentId == NULL || SubcomponentId == NULL) { return FALSE; } if (_wcsicmp( ComponentId, TargetId ) == 0 && _wcsicmp( SubcomponentId, TargetId ) == 0) { return TRUE; } return FALSE; }
DWORD FaxOcmSetupProc( IN LPWSTR ComponentId, IN LPWSTR SubcomponentId, IN UINT Function, IN UINT Param1, IN OUT PVOID Param2 ) { DebugPrint(( TEXT("FaxOcmSetup proc called with function 0x%08x"), Function ));
switch( Function ) {
case OC_PREINITIALIZE: return OCFLAG_UNICODE;
case OC_SET_LANGUAGE: return TRUE;
case OC_INIT_COMPONENT: if (OCMANAGER_VERSION <= ((PSETUP_INIT_COMPONENT)Param2)->OCManagerVersion) { ((PSETUP_INIT_COMPONENT)Param2)->ComponentVersion = OCMANAGER_VERSION; } else { return ERROR_CALL_NOT_IMPLEMENTED; }
if (SetupInitComponent.SetupData.OperationFlags & SETUPOP_STANDALONE) { return 0; }
//
// eventhough this call happens once for each component that this
// dll installs, we really only need to do our thing once. this is
// because the data that ocm passes is really the same for all calls.
//
if (!ComponentInitialized) { CopyMemory( &SetupInitComponent, (LPVOID)Param2, sizeof(SETUP_INIT_COMPONENT) );
Unattended = (SetupInitComponent.SetupData.OperationFlags & SETUPOP_BATCH) > 0; Upgrade = (SetupInitComponent.SetupData.OperationFlags & SETUPOP_NTUPGRADE) > 0; Win9xUpgrade = (SetupInitComponent.SetupData.OperationFlags & SETUPOP_WIN95UPGRADE) > 0; NtGuiMode = (SetupInitComponent.SetupData.OperationFlags & SETUPOP_STANDALONE) == 0; NtWorkstation = SetupInitComponent.SetupData.ProductType == PRODUCT_WORKSTATION;
SourcePath = (LPWSTR) MemAlloc( StringSize(SetupInitComponent.SetupData.SourcePath) + MAX_PATH ); if (!SourcePath) { return ERROR_NOT_ENOUGH_MEMORY; }
wcscpy( SourcePath, SetupInitComponent.SetupData.SourcePath ); if (SourcePath[wcslen(SourcePath)-1] != L'\\') { wcscat( SourcePath, L"\\" ); }
if (NtGuiMode) { #ifdef _X86_
wcscat( SourcePath, L"i386" ); #endif
#ifdef _ALPHA_
wcscat( SourcePath, L"alpha" ); #endif
} else { SourcePath = VerifyInstallPath(SourcePath); DebugPrint(( TEXT("faxocm Sourcepath = %s\n"),SourcePath)); }
DebugPrint((L"faxocm - SourcePath = %s", SourcePath)); if (NtGuiMode) { Unattended = TRUE; }
//
// make sure our inf file is opened by sysoc correctly
// if it isn't then try to open it ourself
//
if (SetupInitComponent.ComponentInfHandle == NULL) { WCHAR InfPath[MAX_PATH]; LPWSTR p;
GetModuleFileName( hInstance, InfPath, sizeof(InfPath)/sizeof(WCHAR) ); p = wcsrchr( InfPath, L'\\' ); if (p) { wcscpy( p+1, L"faxsetup.inf" ); SetupInitComponent.ComponentInfHandle = SetupOpenInfFile( InfPath, NULL, INF_STYLE_WIN4, NULL ); if (SetupInitComponent.ComponentInfHandle == INVALID_HANDLE_VALUE) { return ERROR_FILE_NOT_FOUND; } } else { return ERROR_FILE_NOT_FOUND; } }
SetupOpenAppendInfFile( NULL, SetupInitComponent.ComponentInfHandle, NULL );
InitializeStringTable();
//
// do minimal mapi initialization for NtGuiMode setup
//
MyInitializeMapi(NtGuiMode);
GetInstallationInfo( &Installed, &InstallType, &InstalledPlatforms );
if (NtGuiMode && (IsNt4or351Upgrade() || Win9xUpgrade)) { //
// in this case, we should treat this as a fresh install of fax
//
Upgrade = FALSE; }
if (!NtGuiMode) { Upgrade = Installed; }
EnumPlatforms[PROCESSOR_ARCHITECTURE_INTEL] = 0; EnumPlatforms[PROCESSOR_ARCHITECTURE_ALPHA] = 1;
ComponentInitialized = TRUE;
SYSTEM_INFO si; GetSystemInfo( &si ); if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) { SetEnvironmentVariable( L"platform", L"i386" ); } else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ALPHA) { SetEnvironmentVariable( L"platform", L"alpha" ); }
SetWizData(); }
return 0;
case OC_QUERY_CHANGE_SEL_STATE: if (NtGuiMode || (!Installed) || UnInstall) { return 0; } UnInstall = Param1 == 0; return 1;
case OC_REQUEST_PAGES: { PSETUP_REQUEST_PAGES SetupRequestPages = (PSETUP_REQUEST_PAGES) Param2;
if (NtGuiMode) { //
// never return pages during gui-mode setup
//
return 0; }
if (_wcsicmp( ComponentId, COMPONENT_FAX ) != 0) { return 0; }
if (Param1 == WizPagesWelcome) { #ifdef NT5FAXINSTALL
return 0; #else
SetupRequestPages->Pages[0] = GetWelcomeWizardPage(); return 1; #endif
}
if (Param1 == WizPagesMode) { #ifdef NT5FAXINSTALL
return 0; #else
SetupRequestPages->Pages[0] = GetEulaWizardPage(); return 1; #endif
}
if (Param1 == WizPagesFinal) { #ifdef NT5FAXINSTALL
return 0; #else
SetupRequestPages->Pages[0] = GetFinalWizardPage(); return 1; #endif
} } break;
case OC_CALC_DISK_SPACE: if (NtGuiMode && !Upgrade) { CalcServerDiskSpace( SetupInitComponent.ComponentInfHandle, (HDSKSPC) Param2, NULL, Param1 ); } break;
case OC_QUEUE_FILE_OPS: if (!SubcomponentId || !*SubcomponentId) { return 0; } if (NtGuiMode && !Upgrade) { AddServerFilesToQueue( SetupInitComponent.ComponentInfHandle, (HSPFILEQ) Param2, NULL ); } break;
case OC_COMPLETE_INSTALLATION: if (!SubcomponentId || !*SubcomponentId) { return 0; } if (NtGuiMode) { ServerInstallation( SetupInitComponent.HelperRoutines.QueryWizardDialogHandle( SetupInitComponent.HelperRoutines.OcManagerContext ), SourcePath ); } break;
case OC_QUERY_STEP_COUNT: if (!SubcomponentId || !*SubcomponentId) { return 0; } return ServerGetStepCount() * 10;
case OC_CLEANUP: break;
default: break; }
return 0; }
|