/*++ 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(g_hActCtx), static_cast(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; }