mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
446 lines
11 KiB
446 lines
11 KiB
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
All rights reserved
|
|
|
|
Module Name:
|
|
|
|
Prop.c
|
|
|
|
Abstract:
|
|
|
|
Handles new entry points to document and device properties.
|
|
|
|
Public Entrypoints:
|
|
|
|
DocumentPropertySheets
|
|
DevicePropertySheets
|
|
|
|
Author:
|
|
|
|
Albert Ting (AlbertT) 25-Sept-1995
|
|
Steve Kiraly (SteveKi) 02-Feb-1996
|
|
|
|
Environment:
|
|
|
|
User Mode -Win32
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "winspl.h"
|
|
#include "client.h"
|
|
#include <windows.h>
|
|
#include <winspool.h>
|
|
|
|
#include "winddiui.h"
|
|
|
|
static CHAR szDrvDevPropSheets[] = "DrvDevicePropertySheets";
|
|
static CHAR szDrvDocPropSheets[] = "DrvDocumentPropertySheets";
|
|
|
|
|
|
|
|
BOOL
|
|
FixUpDEVMODEName(
|
|
PDOCUMENTPROPERTYHEADER pDPHdr
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function fixed up the returned DEVMODE with friendly printer name
|
|
in the dmDeviceName field (cut off at 31 character as CCHDEVICENAME)
|
|
|
|
|
|
Arguments:
|
|
|
|
pDPHdr - Pointer to the DOCUMENTPROPERTYHEADER structure
|
|
|
|
|
|
Return Value:
|
|
|
|
TRUE if frendly name is copied, FALSE otherwise
|
|
|
|
|
|
Author:
|
|
|
|
08-Jul-1996 Mon 13:36:09 created -by- Daniel Chou (danielc)
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
PPRINTER_INFO_2 pPI2 = NULL;
|
|
DWORD cbNeed = 0;
|
|
DWORD cbRet = 0;
|
|
BOOL bCopy = FALSE;
|
|
|
|
|
|
if ((pDPHdr->fMode & (DM_COPY | DM_UPDATE)) &&
|
|
(!(pDPHdr->fMode & DM_NOPERMISSION)) &&
|
|
(pDPHdr->pdmOut) &&
|
|
(!GetPrinter(pDPHdr->hPrinter, 2, NULL, 0, &cbNeed)) &&
|
|
(GetLastError() == ERROR_INSUFFICIENT_BUFFER) &&
|
|
(pPI2 = LocalAlloc(LMEM_FIXED, cbNeed)) &&
|
|
(GetPrinter(pDPHdr->hPrinter, 2, (LPBYTE)pPI2, cbNeed, &cbRet)) &&
|
|
(cbNeed == cbRet)) {
|
|
|
|
wcsncpy(pDPHdr->pdmOut->dmDeviceName,
|
|
pPI2->pPrinterName,
|
|
CCHDEVICENAME - 1);
|
|
|
|
pDPHdr->pdmOut->dmDeviceName[CCHDEVICENAME - 1] = L'\0';
|
|
|
|
bCopy = TRUE;
|
|
}
|
|
|
|
if (pPI2) {
|
|
|
|
LocalFree(pPI2);
|
|
}
|
|
|
|
return(bCopy);
|
|
}
|
|
|
|
|
|
LONG
|
|
DevicePropertySheets(
|
|
PPROPSHEETUI_INFO pCPSUIInfo,
|
|
LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Adds the device specific printer pages. This replaces
|
|
PrinterProperties.
|
|
|
|
Arguments:
|
|
|
|
pCPSUIInfo - pointer to common ui info header.
|
|
lParam - user defined lparam, see compstui for details.
|
|
\nt\public\oak\inc\compstui.h
|
|
|
|
Return Value:
|
|
|
|
Returns > 0 if success
|
|
Returns <= 0 if failure
|
|
|
|
--*/
|
|
|
|
{
|
|
PDEVICEPROPERTYHEADER pDevPropHdr = NULL;
|
|
PPROPSHEETUI_INFO_HEADER pCPSUIInfoHdr = NULL;
|
|
PSETRESULT_INFO pSetResultInfo = NULL;
|
|
LONG lResult = FALSE;
|
|
HANDLE hModule = NULL;
|
|
INT_FARPROC pfn = NULL;
|
|
extern HANDLE hInst;
|
|
|
|
DBGMSG( DBG_TRACE, ("DrvDevicePropertySheets\n") );
|
|
|
|
//
|
|
// Ony compstui requests, are acknowledged.
|
|
//
|
|
if (pCPSUIInfo) {
|
|
|
|
if ((!(pDevPropHdr = (PDEVICEPROPERTYHEADER)pCPSUIInfo->lParamInit)) ||
|
|
(pDevPropHdr->cbSize < sizeof(DEVICEPROPERTYHEADER))) {
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return(FALSE);
|
|
}
|
|
|
|
switch (pCPSUIInfo->Reason) {
|
|
|
|
case PROPSHEETUI_REASON_INIT:
|
|
|
|
DBGMSG( DBG_TRACE, ( "DrvDevicePropertySheets PROPSHEETUI_REASON_INIT\n") );
|
|
|
|
pCPSUIInfo->UserData = (DWORD)NULL;
|
|
|
|
hModule = LoadPrinterDriver( pDevPropHdr->hPrinter );
|
|
|
|
if( hModule ){
|
|
//
|
|
// We check if the driver supports the DevQueryPrintEx, if
|
|
// it does not we fail to load, since it is an older driver.
|
|
//
|
|
if ((pfn = GetProcAddress(hModule, szDrvDevPropSheets))) {
|
|
|
|
//
|
|
// Common ui will call the driver to add it's sheets.
|
|
//
|
|
lResult = pCPSUIInfo->pfnComPropSheet(
|
|
pCPSUIInfo->hComPropSheet,
|
|
CPSFUNC_ADD_PFNPROPSHEETUI,
|
|
(LPARAM)pfn,
|
|
(LPARAM)pCPSUIInfo->lParamInit );
|
|
|
|
if( lResult > 0 ){
|
|
|
|
//
|
|
// Save the dll module handle
|
|
//
|
|
pCPSUIInfo->UserData = (LPARAM)hModule;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// If something failed ensure we free the library
|
|
// if it was loaded.
|
|
//
|
|
if( lResult <= 0 ){
|
|
|
|
DBGMSG( DBG_TRACE, ( "DrvDevicePropertySheets PROPSHEETUI_REASON_INIT failed with %d\n", lResult ) );
|
|
|
|
if( hModule ){
|
|
FreeLibrary( hModule );
|
|
pCPSUIInfo->UserData = (DWORD)NULL;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case PROPSHEETUI_REASON_GET_INFO_HEADER:
|
|
|
|
DBGMSG( DBG_TRACE, ( "DrvDevicePropertySheets PROPSHEETUI_REASON_GET_INFO_HEADER\n") );
|
|
|
|
pCPSUIInfoHdr = (PPROPSHEETUI_INFO_HEADER)lParam;
|
|
|
|
pCPSUIInfoHdr->pTitle = pDevPropHdr->pszPrinterName;
|
|
pCPSUIInfoHdr->Flags = PSUIHDRF_PROPTITLE | PSUIHDRF_NOAPPLYNOW;
|
|
pCPSUIInfoHdr->hInst = hInst;
|
|
pCPSUIInfoHdr->IconID = IDI_CPSUI_DEVICE;
|
|
|
|
lResult = TRUE;
|
|
|
|
break;
|
|
|
|
case PROPSHEETUI_REASON_SET_RESULT:
|
|
|
|
DBGMSG( DBG_TRACE, ( "DrvDevicePropertySheets PROPSHEETUI_REASON_SET_RESULT\n") );
|
|
|
|
pSetResultInfo = (PSETRESULT_INFO)lParam;
|
|
pCPSUIInfo->Result = pSetResultInfo->Result;
|
|
lResult = TRUE;
|
|
|
|
break;
|
|
|
|
case PROPSHEETUI_REASON_DESTROY:
|
|
|
|
DBGMSG( DBG_TRACE, ( "DrvDevicePropertySheets PROPSHEETUI_REASON_DESTROY\n") );
|
|
|
|
if( pCPSUIInfo->UserData ){
|
|
FreeLibrary( (HANDLE)pCPSUIInfo->UserData );
|
|
pCPSUIInfo->UserData = 0;
|
|
}
|
|
|
|
lResult = TRUE;
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
return lResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
LONG
|
|
DocumentPropertySheets(
|
|
PPROPSHEETUI_INFO pCPSUIInfo,
|
|
LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Adds the document property pages. This replaces DocumentProperties
|
|
and Advanced DocumentProperties.
|
|
|
|
Arguments:
|
|
|
|
pCPSUIInfo - pointer to common ui info header.
|
|
lParam - user defined lparam, see compstui for details.
|
|
\nt\public\oak\inc\compstui.h
|
|
|
|
Return Value:
|
|
|
|
Returns > 0 if success
|
|
Returns <= 0 if failure
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
PDOCUMENTPROPERTYHEADER pDocPropHdr = NULL;
|
|
PPROPSHEETUI_INFO_HEADER pCPSUIInfoHdr = NULL;
|
|
PSETRESULT_INFO pSetResultInfo = NULL;
|
|
LONG lResult = FALSE;
|
|
HANDLE hModule = NULL;
|
|
INT_FARPROC pfn = NULL;
|
|
extern HANDLE hInst;
|
|
|
|
DBGMSG( DBG_TRACE, ("DrvDocumentPropertySheets\n") );
|
|
|
|
//
|
|
// Ony compstui requests, are acknowledged.
|
|
//
|
|
if (pCPSUIInfo) {
|
|
|
|
if ((!(pDocPropHdr = (PDOCUMENTPROPERTYHEADER)pCPSUIInfo->lParamInit)) ||
|
|
(pDocPropHdr->cbSize < sizeof(PDOCUMENTPROPERTYHEADER))) {
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return(FALSE);
|
|
}
|
|
|
|
switch (pCPSUIInfo->Reason) {
|
|
|
|
case PROPSHEETUI_REASON_INIT:
|
|
|
|
DBGMSG( DBG_TRACE, ( "DrvDocumentPropertySheets PROPSHEETUI_REASON_INIT\n") );
|
|
|
|
if (!(pDocPropHdr->fMode & DM_PROMPT)) {
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return(FALSE);
|
|
}
|
|
|
|
pCPSUIInfo->UserData = (DWORD)NULL;
|
|
|
|
if (hModule = LoadPrinterDriver(pDocPropHdr->hPrinter)) {
|
|
|
|
if (pfn = GetProcAddress(hModule, szDrvDocPropSheets)) {
|
|
|
|
//
|
|
// Common ui will call the driver to add it's sheets.
|
|
//
|
|
|
|
lResult = pCPSUIInfo->pfnComPropSheet( pCPSUIInfo->hComPropSheet,
|
|
CPSFUNC_ADD_PFNPROPSHEETUI,
|
|
(LPARAM)pfn,
|
|
(LPARAM)pCPSUIInfo->lParamInit );
|
|
|
|
if( lResult > 0 ){
|
|
|
|
//
|
|
// Indicate success and save the dll module handle
|
|
//
|
|
pCPSUIInfo->UserData = (LPARAM)hModule;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// If something failed ensure we free the library
|
|
// if it was loaded.
|
|
//
|
|
if( lResult <= 0 ){
|
|
|
|
DBGMSG( DBG_TRACE, ( "DrvDocumentPropertySheets PROPSHEETUI_REASON_INIT failed with %d\n", lResult ) );
|
|
|
|
if (hModule) {
|
|
|
|
FreeLibrary(hModule);
|
|
pCPSUIInfo->UserData = (DWORD)NULL;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case PROPSHEETUI_REASON_GET_INFO_HEADER:
|
|
|
|
DBGMSG( DBG_TRACE, ( "DrvDocumentPropertySheets PROPSHEETUI_REASON_GET_INFO_HEADER\n") );
|
|
|
|
pCPSUIInfoHdr = (PPROPSHEETUI_INFO_HEADER)lParam;
|
|
|
|
pCPSUIInfoHdr->pTitle = pDocPropHdr->pszPrinterName;
|
|
pCPSUIInfoHdr->Flags = PSUIHDRF_PROPTITLE | PSUIHDRF_NOAPPLYNOW;
|
|
pCPSUIInfoHdr->hInst = hInst;
|
|
pCPSUIInfoHdr->IconID = IDI_CPSUI_DOCUMENT;
|
|
|
|
lResult = TRUE;
|
|
|
|
break;
|
|
|
|
case PROPSHEETUI_REASON_SET_RESULT:
|
|
|
|
DBGMSG( DBG_TRACE, ( "DrvDocumentPropertySheets PROPSHEETUI_REASON_SET_RESULT\n") );
|
|
|
|
pSetResultInfo = (PSETRESULT_INFO)lParam;
|
|
|
|
if ((pCPSUIInfo->Result = pSetResultInfo->Result) > 0) {
|
|
|
|
FixUpDEVMODEName(pDocPropHdr);
|
|
}
|
|
|
|
lResult = TRUE;
|
|
|
|
break;
|
|
|
|
case PROPSHEETUI_REASON_DESTROY:
|
|
|
|
DBGMSG( DBG_TRACE, ( "DrvDocumentPropertySheets PROPSHEETUI_REASON_DESTROY\n") );
|
|
|
|
if( pCPSUIInfo->UserData ){
|
|
FreeLibrary( (HANDLE)pCPSUIInfo->UserData );
|
|
pCPSUIInfo->UserData = 0;
|
|
}
|
|
|
|
lResult = TRUE;
|
|
|
|
break;
|
|
}
|
|
|
|
//
|
|
// If a null pointer to common ui info header then
|
|
// call the driver directly.
|
|
//
|
|
} else {
|
|
|
|
lResult = -1;
|
|
|
|
if ((!(pDocPropHdr = (PDOCUMENTPROPERTYHEADER)lParam)) ||
|
|
(pDocPropHdr->cbSize < sizeof(PDOCUMENTPROPERTYHEADER))) {
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return(lResult);
|
|
}
|
|
|
|
if (pDocPropHdr->fMode & DM_PROMPT) {
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
} else if ((hModule = LoadPrinterDriver(pDocPropHdr->hPrinter)) &&
|
|
(pfn = GetProcAddress(hModule, szDrvDocPropSheets))) {
|
|
|
|
if ((lResult = (*pfn)(NULL, pDocPropHdr)) > 0) {
|
|
|
|
FixUpDEVMODEName(pDocPropHdr);
|
|
}
|
|
|
|
} else {
|
|
|
|
SetLastError(ERROR_INVALID_HANDLE);
|
|
}
|
|
|
|
if (hModule) {
|
|
|
|
FreeLibrary(hModule);
|
|
}
|
|
}
|
|
|
|
return lResult;
|
|
|
|
}
|