windows-nt/Source/XPSP1/NT/printscan/ui/printui/docdef.cxx
2020-09-26 16:20:57 +08:00

666 lines
15 KiB
C++

/*++
Copyright (C) Microsoft Corporation, 1995 - 1998
All rights reserved.
Module Name:
docdef.cxx
Abstract:
Document defaults
Author:
Albert Ting (AlbertT) 29-Sept-1995
Revision History:
--*/
#include "precomp.hxx"
#pragma hdrstop
#include "time.hxx"
#include "psetup.hxx"
#include "drvsetup.hxx"
#include "instarch.hxx"
#include "portslv.hxx"
#include "dsinterf.hxx"
#include "prtprop.hxx"
#include "propmgr.hxx"
#include "docdef.hxx"
/********************************************************************
Public interface to this module.
********************************************************************/
VOID
vDocumentDefaultsWOW64(
IN HWND hwnd,
IN LPCTSTR pszPrinterName,
IN INT nCmdShow,
IN LPARAM lParam
)
/*++
Routine Description:
WOW64 version. see vDocumentDefaults below.
Arguments:
see vDocumentDefaults below.
Return Value:
--*/
{
//
// This function potentially may load the driver UI so we call a private API
// exported by winspool.drv, which will RPC the call to a special 64 bit surrogate
// process where the 64 bit driver can be loaded.
//
CDllLoader dll(TEXT("winspool.drv"));
ptr_PrintUIDocumentDefaults pfnPrintUIDocumentDefaults =
(ptr_PrintUIDocumentDefaults )dll.GetProcAddress(ord_PrintUIDocumentDefaults);
if( pfnPrintUIDocumentDefaults )
{
pfnPrintUIDocumentDefaults( hwnd, pszPrinterName, nCmdShow, lParam );
}
}
VOID
vDocumentDefaultsNative(
IN HWND hwnd,
IN LPCTSTR pszPrinterName,
IN INT nCmdShow,
IN LPARAM lParam
)
/*++
Routine Description:
Native version. see vDocumentDefaults below.
Arguments:
see vDocumentDefaults below.
Return Value:
--*/
{
(VOID)dwDocumentDefaultsInternal( hwnd,
pszPrinterName,
nCmdShow,
LOWORD( lParam ),
HIWORD( lParam ),
FALSE );
}
VOID
vDocumentDefaults(
IN HWND hwnd,
IN LPCTSTR pszPrinterName,
IN INT nCmdShow,
IN LPARAM lParam
)
/*++
Routine Description:
Public entrypoint to bring up document defaults.
Arguments:
hwnd - Parent hwnd.
pszPrinterName - Printer name.
nCmdShow - Show command.
lParam - lParam, currently unused.
Return Value:
--*/
{
if( IsRunningWOW64() )
{
vDocumentDefaultsWOW64( hwnd, pszPrinterName, nCmdShow, lParam );
}
else
{
vDocumentDefaultsNative( hwnd, pszPrinterName, nCmdShow, lParam );
}
}
DWORD
dwDocumentDefaultsInternal(
IN HWND hwnd,
IN LPCTSTR pszPrinterName,
IN INT nCmdShow,
IN DWORD dwSheet,
IN BOOL bModal,
IN BOOL bGlobal
)
/*++
Routine Description:
Private internal entry point to bring up document defaults.
Arguments:
hwnd - Parent hwnd.
pszPrinterName - Printer name.
nCmdShow - Show command.
dwSheet - Sheet index of initial sheet to display.
bModal - Display modal version of dialog.
Return Value:
ERROR_SUCCESS if dialog displayed, GetLastError() on error.
--*/
{
//
// Construct the printer data.
//
TPrinterData* pPrinterData = new TPrinterData( pszPrinterName,
nCmdShow,
NULL,
dwSheet,
hwnd,
bModal );
if( !VALID_PTR( pPrinterData )){
goto Fail;
}
//
// Set the Global dev mode flag.
//
pPrinterData->bGlobalDevMode() = bGlobal;
//
// If dialog is modal.
//
if( bModal ){
TDocumentDefaultPropertySheetManager::iDocumentDefaultsProc( pPrinterData );
return ERROR_SUCCESS;
}
//
// Create the thread which handles the UI. vPrinterPropPages adopts
// pPrinterData.
//
DWORD dwIgnore;
HANDLE hThread;
hThread = TSafeThread::Create( NULL,
0,
(LPTHREAD_START_ROUTINE)TDocumentDefaultPropertySheetManager::iDocumentDefaultsProc,
pPrinterData,
0,
&dwIgnore );
if( !hThread ){
goto Fail;
}
CloseHandle( hThread );
return ERROR_SUCCESS;
Fail:
if( !pPrinterData ){
vShowResourceError( hwnd );
} else {
iMessage( hwnd,
IDS_ERR_DOC_PROP_TITLE,
IDS_ERR_DOCUMENT_PROP,
MB_OK|MB_ICONSTOP,
kMsgGetLastError,
NULL );
}
delete pPrinterData;
return ERROR_ACCESS_DENIED;
}
/********************************************************************
Private support routines.
********************************************************************/
INT
TDocumentDefaultPropertySheetManager::
iDocumentDefaultsProc(
IN TPrinterData* pPrinterData ADOPT
)
/*++
Routine Description:
Bring up the document defaults dialog.
Arguments:
pPrinterData - Data about the printer.
Return Value:
--*/
{
DBGMSG( DBG_TRACE, ( "iDocumentDefaultsProc\n") );
//
// Increment our reference count.
//
pPrinterData->vIncRef();
//
// Set the pidl type for the correct dialog type. The
// all users document defaults and the my document defaults
// are the same dialog just started differently.
//
DWORD dwPidlType = pPrinterData->bGlobalDevMode() ? PRINTER_PIDL_TYPE_ALL_USERS_DOCDEF : PRINTER_PIDL_TYPE_DOCUMENTDEFAULTS;
//
// Register this property sheet window.
//
BOOL bStatus = pPrinterData->bRegisterWindow( dwPidlType );
if( bStatus ){
//
// Check if the window is already present. If it is, then
// exit immediately.
//
if( pPrinterData->bIsWindowPresent() ){
DBGMSG( DBG_TRACE, ( "iDocumentDefaultsProc: currently running.\n" ) );
bStatus = FALSE;
}
}
if( bStatus ){
//
// Load the printer data.
//
bStatus = pPrinterData->bLoad();
if( !bStatus ){
iMessage( NULL,
IDS_ERR_DOC_PROP_TITLE,
IDS_ERR_DOCUMENT_PROP,
MB_OK|MB_ICONSTOP|MB_SETFOREGROUND,
kMsgGetLastError,
NULL );
} else {
//
// Create the ducument property sheet windows.
//
TDocumentDefaultPropertySheetManager DocDefPropSheetManger( pPrinterData );
//
// Were the document windows create
//
if( !VALID_OBJ( DocDefPropSheetManger ) ){
vShowResourceError( pPrinterData->hwnd() );
bStatus = FALSE;
}
//
// If we do not have access, don't bring up the
// device sheets with incorrect dev mode data. Just
// inform the use they don't have access.
//
if( pPrinterData->bNoAccess( ) ){
SetLastError( ERROR_ACCESS_DENIED );
iMessage( pPrinterData->hwnd(),
IDS_ERR_DOC_PROP_TITLE,
IDS_ERR_DOCUMENT_PROP,
MB_OK|MB_ICONSTOP|MB_SETFOREGROUND,
kMsgGetLastError,
NULL );
bStatus = FALSE;
}
//
// Display the property pages.
//
if( bStatus ){
if( !DocDefPropSheetManger.bDisplayPages( pPrinterData->hwnd() ) ){
vShowResourceError( pPrinterData->hwnd() );
bStatus = FALSE;
}
}
}
}
//
// Ensure we release the printer data.
//
pPrinterData->cDecRef();
return bStatus;
}
/********************************************************************
Document Default Property Sheet Manager.
********************************************************************/
/*++
Routine Description:
Document default property sheet manager
Arguments:
pPrinterData - PrinterData to display.
Return Value:
TRUE - Success, FALSE - failure.
--*/
TDocumentDefaultPropertySheetManager::
TDocumentDefaultPropertySheetManager(
TPrinterData *pPrinterData
) : _pPrinterData( pPrinterData )
{
DBGMSG( DBG_TRACE, ( "TDocumentDefaultPropertySheetManager ctor\n") );
}
TDocumentDefaultPropertySheetManager::
~TDocumentDefaultPropertySheetManager(
)
{
DBGMSG( DBG_TRACE, ( "TDocumentDefaultPropertySheetManager dtor\n") );
}
BOOL
TDocumentDefaultPropertySheetManager::
bValid(
VOID
)
{
return _pPrinterData != NULL;
}
/*++
Routine Name:
bBuildPages
Routine Description:
Builds the document property windows.
Arguments:
None - class specific.
Return Value:
TRUE pages built ok, FALSE failure building pages.
--*/
BOOL
TDocumentDefaultPropertySheetManager::
bBuildPages(
IN PPROPSHEETUI_INFO pCPSUIInfo
)
{
DBGMSG( DBG_TRACE, ( "TDocumentDefaultPropertySheetManager::bBuildPages\n") );
BOOL bStatus = TRUE;
//
// If we have a null dev mode here, get printer must not have a dev mode
// associated to this printer ( this should not happen ), then get the
// default devmode.
//
if( !_pPrinterData->pDevMode() )
{
bStatus = VDataRefresh::bGetDefaultDevMode( _pPrinterData->hPrinter(),
(LPTSTR)(LPCTSTR)_pPrinterData->strPrinterName(),
&_pPrinterData->_pDevMode,
TRUE );
}
if( bStatus )
{
//
// Set the default activation context to be V6 prior calling into
// compstui to create the pages. This will force V6 context unless
// the callbacks which create the compstui pages specify otherwise
// on a per page basis.
//
bStatus = (BOOL)pCPSUIInfo->pfnComPropSheet(
pCPSUIInfo->hComPropSheet,
CPSFUNC_SET_FUSION_CONTEXT,
reinterpret_cast<LPARAM>(g_hActCtx),
static_cast<LPARAM>(0));
if( bStatus )
{
//
// Set the default dev mode flags.
//
DWORD dwFlag = DM_IN_BUFFER | DM_OUT_BUFFER | DM_PROMPT | DM_USER_DEFAULT;
ZeroMemory( &_dph, sizeof( _dph ) );
_dph.cbSize = sizeof( _dph );
_dph.hPrinter = _pPrinterData->hPrinter();
_dph.pszPrinterName = (LPTSTR)(LPCTSTR)_pPrinterData->strPrinterName();
_dph.pdmOut = _pPrinterData->pDevMode();
_dph.pdmIn = _pPrinterData->pDevMode();
_dph.fMode = dwFlag;
//
// Tell compstui to load the driver and start the ui.
//
if( pCPSUIInfo->pfnComPropSheet( pCPSUIInfo->hComPropSheet,
CPSFUNC_ADD_PFNPROPSHEETUI,
(LPARAM)DocumentPropertySheets,
(LPARAM)&_dph ) <= 0 )
{
DBGMSG( DBG_TRACE, ( "CPSFUNC_ADD_PFNPROPSHEETUI failed.\n") );
bStatus = FALSE;
}
}
}
else
{
DBGMSG( DBG_TRACE, ( "Failed to allocate devmode buffer with %d.\n", GetLastError () ) );
bStatus = FALSE;
}
return bStatus;
}
/*++
Routine Name:
bCreatePropertySheetTitle.
Routine Description:
Creates the property sheet title.
Arguments:
Nothing.
Return Value:
TRUE success, FALSE error occurred.
--*/
BOOL
TDocumentDefaultPropertySheetManager::
bCreateTitle(
VOID
)
{
//
// Create the formatted property sheet title.
//
TStatusB bStatus;
TString strPostFix;
TCHAR szBuffer[kStrMax+kPrinterBufMax];
UINT nSize = COUNTOF( szBuffer );
//
// Create the printer friendly name.
//
bStatus DBGCHK = ConstructPrinterFriendlyName( _pPrinterData->strPrinterName(), szBuffer, &nSize );
//
// Change the title post fix based on whether we are displaying
// the per user or per printer document defaults settings.
//
if( _pPrinterData->bGlobalDevMode() )
{
bStatus DBGCHK = strPostFix.bLoadString( ghInst, IDS_PRINTER_PREFERENCES_DEFAULT );
}
else
{
bStatus DBGCHK = strPostFix.bLoadString( ghInst, IDS_PRINTER_PREFERENCES );
}
//
// Construct the property sheet title.
//
bStatus DBGCHK = bConstructMessageString( ghInst, _strTitle, IDS_DOCUMENT_DEFAULT_TITLE_FORMAT, szBuffer, (LPCTSTR)strPostFix );
return bStatus;
}
BOOL
TDocumentDefaultPropertySheetManager::
bSetHeader(
IN PPROPSHEETUI_INFO pCPSUIInfo,
IN PPROPSHEETUI_INFO_HEADER pPSUIInfoHdr
)
{
DBGMSG( DBG_TRACE, ( "TDocumentDefaultPropertySheetManager::bSetHeader\n") );
UNREFERENCED_PARAMETER( pCPSUIInfo );
bCreateTitle();
pPSUIInfoHdr->cbSize = sizeof( PROPSHEETUI_INFO_HEADER );
pPSUIInfoHdr->Flags = PSUIHDRF_EXACT_PTITLE;
pPSUIInfoHdr->pTitle = (LPTSTR)(LPCTSTR)_strTitle;
pPSUIInfoHdr->hInst = ghInst;
pPSUIInfoHdr->IconID = IDI_PRINTER;
pPSUIInfoHdr->hWndParent = _pPrinterData->hwnd();
return TRUE;
}
/*++
Routine Name:
bSaveResult
Routine Description:
Save the result from the previous handler to our parent.
Arguments:
pCPSUIInfo - Pointer to commonui property sheet info header,
pSetResultInfo - Pointer to result info header
Return Value:
TRUE success, FALSE error occurred.
--*/
BOOL
TDocumentDefaultPropertySheetManager::
bSaveResult(
IN PPROPSHEETUI_INFO pCPSUIInfo,
IN PSETRESULT_INFO pSetResultInfo
)
{
DBGMSG( DBG_TRACE, ( "TDocumentDefaultPropertySheetManager::bSaveResult\n") );
TStatusB bStatus;
bStatus DBGNOCHK = FALSE;
if( pSetResultInfo->Result == CPSUI_OK )
{
//
// Attempt to save the printer data, if an error occurrs
// display a message.
//
bStatus DBGCHK = _pPrinterData->bSave( TRUE );
if( !bStatus )
{
//
// Display the error message.
//
iMessage( _pPrinterData->hwnd(),
IDS_ERR_DOC_PROP_TITLE,
IDS_ERR_SAVE_PRINTER,
MB_OK|MB_ICONSTOP,
kMsgGetLastError,
NULL );
}
else
{
pCPSUIInfo->Result = pSetResultInfo->Result;
}
}
return bStatus;
}