666 lines
15 KiB
C++
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;
|
|
}
|
|
|