372 lines
9.2 KiB
C++
372 lines
9.2 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (C) Microsoft Corporation, 1996 - 1999
|
||
|
All rights reserved.
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
Instarch.cxx
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Installs alternate drivers for other architectures.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Steve Kiraly (SteveKi) 18-Jan-1996
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.hxx"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include "psetup.hxx"
|
||
|
#include "drvsetup.hxx"
|
||
|
#include "drvver.hxx"
|
||
|
#include "instarch.hxx"
|
||
|
|
||
|
/********************************************************************
|
||
|
|
||
|
Additional Drivers Dialog.
|
||
|
|
||
|
********************************************************************/
|
||
|
TAdditionalDrivers::
|
||
|
TAdditionalDrivers(
|
||
|
IN HWND hwnd,
|
||
|
IN LPCTSTR pszServerName,
|
||
|
IN LPCTSTR pszPrinterName,
|
||
|
IN LPCTSTR pszDriverName,
|
||
|
IN BOOL bAdministrator
|
||
|
) : _hwnd( hwnd ),
|
||
|
_bValid( FALSE ),
|
||
|
_strServerName( pszServerName ),
|
||
|
_strPrinterName( pszPrinterName ),
|
||
|
_strDriverName( pszDriverName ),
|
||
|
_bAdministrator( bAdministrator )
|
||
|
{
|
||
|
if( VALID_OBJ( _strServerName ) &&
|
||
|
VALID_OBJ( _strPrinterName ) &&
|
||
|
VALID_OBJ( _strDriverName ) &&
|
||
|
VALID_OBJ( _ArchLV ) )
|
||
|
{
|
||
|
_bValid = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TAdditionalDrivers::
|
||
|
~TAdditionalDrivers(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
TAdditionalDrivers::
|
||
|
bValid(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
return _bValid;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
TAdditionalDrivers::
|
||
|
bDoModal(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
return (BOOL)DialogBoxParam( ghInst,
|
||
|
MAKEINTRESOURCE( DLG_ADDITIONAL_DRIVERS ),
|
||
|
_hwnd,
|
||
|
MGenericDialog::SetupDlgProc,
|
||
|
(LPARAM)this );
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
TAdditionalDrivers::
|
||
|
bSetUI(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
TStatusB bStatus;
|
||
|
|
||
|
//
|
||
|
// Set the architecture list view UI.
|
||
|
//
|
||
|
bStatus DBGCHK = _ArchLV.bSetUI( _hDlg, kSingleClick, kDoubleClick );
|
||
|
|
||
|
//
|
||
|
// Refresh the architecture list.
|
||
|
//
|
||
|
bStatus DBGCHK = _ArchLV.bRefreshListView( _strServerName.bEmpty() ? NULL : static_cast<LPCTSTR>(_strServerName), _strDriverName );
|
||
|
|
||
|
//
|
||
|
// Select the first item in the list view.
|
||
|
//
|
||
|
_ArchLV.vSelectItem( 0 );
|
||
|
|
||
|
//
|
||
|
// If we are not an administrator do not allow the user to
|
||
|
// check a driver to install.
|
||
|
//
|
||
|
if( !_bAdministrator )
|
||
|
{
|
||
|
_ArchLV.vNoItemCheck();
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Disable the ok button if we are not an administator.
|
||
|
//
|
||
|
if( !_bAdministrator )
|
||
|
{
|
||
|
vEnableCtl( _hDlg, IDOK, FALSE );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// The install button is initialy disabled.
|
||
|
//
|
||
|
EnableWindow( GetDlgItem( _hDlg, IDOK ), FALSE );
|
||
|
|
||
|
return bStatus;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
TAdditionalDrivers::
|
||
|
bInstallSelectedDrivers(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
TStatusB bStatus;
|
||
|
|
||
|
bStatus DBGNOCHK = TRUE;
|
||
|
|
||
|
if( _bAdministrator )
|
||
|
{
|
||
|
//
|
||
|
// Initialize the driver install count.
|
||
|
//
|
||
|
UINT nInstallCount = 0;
|
||
|
|
||
|
//
|
||
|
// Create the printer driver installation class.
|
||
|
//
|
||
|
TPrinterDriverInstallation Di( _strServerName.bEmpty() ? NULL : static_cast<LPCTSTR>(_strServerName), _hDlg );
|
||
|
|
||
|
if( VALID_OBJ( Di ) && Di.bSetDriverName( _strDriverName ) )
|
||
|
{
|
||
|
//
|
||
|
// Do not copy any INFs during this installation process
|
||
|
//
|
||
|
Di.SetInstallFlags( DRVINST_DONOTCOPY_INF );
|
||
|
|
||
|
//
|
||
|
// Get the selected item count.
|
||
|
//
|
||
|
UINT cSelectedCount = _ArchLV.uGetCheckedItemCount();
|
||
|
|
||
|
//
|
||
|
// Install the selected drivers.
|
||
|
//
|
||
|
for( UINT i = 0; i < cSelectedCount; i++ )
|
||
|
{
|
||
|
BOOL bInstalled;
|
||
|
DWORD dwEncode;
|
||
|
|
||
|
//
|
||
|
// Get the checked items.
|
||
|
//
|
||
|
bStatus DBGCHK = _ArchLV.bGetCheckedItems( i, &bInstalled, &dwEncode );
|
||
|
|
||
|
if( bStatus && !bInstalled )
|
||
|
{
|
||
|
//
|
||
|
// Turn on the wait cursor.
|
||
|
//
|
||
|
TWaitCursor *pCur = new TWaitCursor;
|
||
|
|
||
|
//
|
||
|
// Install the printer driver.
|
||
|
//
|
||
|
BOOL bOfferReplacementDriver = FALSE;
|
||
|
|
||
|
bStatus DBGCHK = Di.bInstallDriver( NULL,
|
||
|
bOfferReplacementDriver,
|
||
|
FALSE,
|
||
|
_hDlg,
|
||
|
dwEncode,
|
||
|
TPrinterDriverInstallation::kDefault,
|
||
|
TPrinterDriverInstallation::kDefault,
|
||
|
TRUE);
|
||
|
//
|
||
|
// Release the wait cursor.
|
||
|
//
|
||
|
delete pCur;
|
||
|
|
||
|
if( bStatus )
|
||
|
{
|
||
|
nInstallCount++;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
switch( GetLastError() )
|
||
|
{
|
||
|
|
||
|
case ERROR_CANCELLED:
|
||
|
break;
|
||
|
|
||
|
case ERROR_UNKNOWN_PRINTER_DRIVER:
|
||
|
{
|
||
|
iMessage( _hDlg,
|
||
|
IDS_ERR_ADD_PRINTER_TITLE,
|
||
|
IDS_ERROR_UNKNOWN_DRIVER,
|
||
|
MB_OK | MB_ICONSTOP,
|
||
|
kMsgNone,
|
||
|
NULL );
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
{
|
||
|
TString strArch;
|
||
|
TString strVersion;
|
||
|
|
||
|
(VOID)_ArchLV.bEncodeToArchAndVersion( dwEncode, strArch, strVersion );
|
||
|
|
||
|
//
|
||
|
// An error occurred installing a printer driver.
|
||
|
//
|
||
|
iMessage( _hDlg,
|
||
|
IDS_ADDITIONAL_DRIVER_TITLE,
|
||
|
IDS_ERR_ALL_DRIVER_NOT_INSTALLED,
|
||
|
MB_OK|MB_ICONHAND,
|
||
|
kMsgGetLastError,
|
||
|
NULL,
|
||
|
static_cast<LPCTSTR>( _strDriverName ),
|
||
|
static_cast<LPCTSTR>( strArch ),
|
||
|
static_cast<LPCTSTR>( strVersion ) );
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// If something failed and more than one driver was installed
|
||
|
// refresh the view to show the newly installed drivers.
|
||
|
//
|
||
|
if( !bStatus && nInstallCount )
|
||
|
{
|
||
|
//
|
||
|
// Refresh the architecture list.
|
||
|
//
|
||
|
(VOID)_ArchLV.bRefreshListView( _strServerName.bEmpty() ? NULL : static_cast<LPCTSTR>(_strServerName), _strDriverName );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return bStatus;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
TAdditionalDrivers::
|
||
|
IsNonInstalledItemSelected(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
BOOL bInstalled = FALSE;
|
||
|
DWORD dwEncode = 0;
|
||
|
|
||
|
//
|
||
|
// Get the selected item count.
|
||
|
//
|
||
|
UINT cSelectedCount = _ArchLV.uGetCheckedItemCount();
|
||
|
|
||
|
//
|
||
|
// Traverse the selected item list.
|
||
|
//
|
||
|
for( UINT i = 0; i < cSelectedCount; i++ )
|
||
|
{
|
||
|
//
|
||
|
// Get the checked items.
|
||
|
//
|
||
|
if( _ArchLV.bGetCheckedItems( i, &bInstalled, &dwEncode ) )
|
||
|
{
|
||
|
if( !bInstalled )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return !bInstalled;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
TAdditionalDrivers::
|
||
|
bHandleMessage(
|
||
|
IN UINT uMsg,
|
||
|
IN WPARAM wParam,
|
||
|
IN LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
BOOL bStatus = TRUE;
|
||
|
|
||
|
switch (uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
bSetUI();
|
||
|
break;
|
||
|
|
||
|
//
|
||
|
// Handle help and context help.
|
||
|
//
|
||
|
case WM_HELP:
|
||
|
case WM_CONTEXTMENU:
|
||
|
bStatus = PrintUIHelp( uMsg, _hDlg, wParam, lParam );
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
switch ( LOWORD( wParam ) )
|
||
|
{
|
||
|
case IDOK:
|
||
|
if( bInstallSelectedDrivers() )
|
||
|
{
|
||
|
EndDialog( _hDlg, LOWORD( wParam ) );
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDCANCEL:
|
||
|
EndDialog( _hDlg, LOWORD( wParam ) );
|
||
|
break;
|
||
|
|
||
|
case kSingleClick:
|
||
|
EnableWindow( GetDlgItem( _hDlg, IDOK ), IsNonInstalledItemSelected() );
|
||
|
break;
|
||
|
|
||
|
case kDoubleClick:
|
||
|
EnableWindow( GetDlgItem( _hDlg, IDOK ), IsNonInstalledItemSelected() );
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
bStatus = FALSE;
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
//
|
||
|
// Handle notify for this dialog.
|
||
|
//
|
||
|
case WM_NOTIFY:
|
||
|
_ArchLV.bHandleNotifyMessage( WM_NOTIFY, wParam, lParam );
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
bStatus = FALSE;
|
||
|
break;
|
||
|
}
|
||
|
return bStatus;
|
||
|
}
|
||
|
|