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.
338 lines
8.2 KiB
338 lines
8.2 KiB
/******************************* MODULE HEADER ******************************
|
|
* devmode.c
|
|
* This file is involved in validating devmodes and updating them with
|
|
* respect to printer property sheets.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#define PUBLIC
|
|
#include "hp5sipch.h"
|
|
DWORD dwDebugFlag = 0;
|
|
#define WINRT_STRING 6
|
|
|
|
|
|
/***************************** Function Header *******************************
|
|
* bApproveDevMode(JR)
|
|
* Approves a devmode for printing by checking the registry.
|
|
*
|
|
* RETURNS: BOOL TRUE if this devmode is O.K. or was repairable. FALSE otherwise.
|
|
*****************************************************************************/
|
|
|
|
BOOL
|
|
bApproveDevMode(
|
|
POEMPDEV pdev,
|
|
HANDLE hModule,
|
|
HANDLE hPrinter,
|
|
LPWSTR pPrinterModel,
|
|
PDEVMODE pPublicDMIn,
|
|
PMOPIERDM pmdm)
|
|
{
|
|
DWORD result = FALSE;
|
|
DWORD regTimeStamp = 0;
|
|
PMOPIERDM pDefault = 0;
|
|
PRNPROPSHEET* pPrnPropSheet = 0;
|
|
|
|
TRY
|
|
|
|
/* 1) Retrieve default devmode.
|
|
*/
|
|
if (!pPublicDMIn || !pmdm ||
|
|
bGetPrnModel(hModule, pPrinterModel, &pDefault, NULL) != TRUE) {
|
|
LEAVE;
|
|
}
|
|
|
|
if (!pDefault) {
|
|
LEAVE;
|
|
}
|
|
|
|
/* 1) Check versioning information.
|
|
*/
|
|
if((pmdm->dmExtraHdr.dmSize != sizeof(MOPIERDM)) ||
|
|
(pmdm->dmExtraHdr.sVer != MOPIERDMVER) ||
|
|
(pmdm->dmMagic != MOPIERMAGIC)) {
|
|
|
|
LEAVE;
|
|
}
|
|
|
|
/* 2) Make sure printer types match.
|
|
*/
|
|
if(pmdm->dwPrinterType != pDefault->dwPrinterType) {
|
|
pmdm->TimeStamp = 0;
|
|
}
|
|
|
|
/* 3) If this file was already checked under document defaults,
|
|
* and the timestamps match, then there is no reason to continue.
|
|
* Everything is valid.
|
|
*/
|
|
if(pmdm->TimeStamp &&
|
|
(regTimeStamp = GetRegTimeStamp(hPrinter))
|
|
&& (pmdm->TimeStamp == regTimeStamp)) {
|
|
result = TRUE;
|
|
}
|
|
else {
|
|
|
|
pPrnPropSheet = OEMALLOC(pdev, sizeof(PRNPROPSHEET));
|
|
|
|
/* 4) Check to see that Mopier Devmode settings are good.
|
|
*/
|
|
if(pPrnPropSheet == 0 ||
|
|
bGetPrnPropData(hModule, hPrinter, pPrinterModel, pPrnPropSheet) != TRUE) {
|
|
LEAVE;
|
|
}
|
|
|
|
if(dwDevmodeUpdateFromPP(pmdm, pPrnPropSheet, TRUE) != DM_APPROVE_OK) {
|
|
LEAVE;
|
|
}
|
|
|
|
/* 5a) Check to see if public devmode duplex setting matches
|
|
* PrnPropSheet settings.
|
|
*/
|
|
if (pPrnPropSheet->bDuplex == FALSE) {
|
|
pPublicDMIn->dmDuplex = DMDUP_SIMPLEX;
|
|
}
|
|
|
|
result = TRUE;
|
|
}
|
|
|
|
/* 5b) Verify whether the current print job is using the right paper in
|
|
* association with the stapler. Only A4 or Letter is allowed to be
|
|
* sent to the stapler.
|
|
*/
|
|
if (pmdm->dOutputDest == GPCUI_STAPLING) {
|
|
|
|
if(pPublicDMIn->dmPaperSize != DMPAPER_A4 &&
|
|
pPublicDMIn->dmPaperSize != DMPAPER_LETTER) {
|
|
|
|
pmdm->dOutputDest = GPCUI_TOPBIN;
|
|
}
|
|
}
|
|
|
|
ENDTRY
|
|
|
|
FINALLY
|
|
if (pPrnPropSheet) {
|
|
OEMFREE(pdev, pPrnPropSheet);
|
|
pPrnPropSheet = 0;
|
|
}
|
|
ENDFINALLY
|
|
|
|
return result;
|
|
}
|
|
|
|
/***************************** Function Header *******************************
|
|
* bUpdateFromPrevious(JR)
|
|
* Updates the current devmode based on information in the previous
|
|
* devmode.
|
|
* RETURNS: (BOOL) TRUE on success, FALSE otherwise.
|
|
*****************************************************************************/
|
|
|
|
BOOL bUpdateFromPrevious(PMOPIERDM pmdmOut, PMOPIERDM pmdmIn, PMOPIERDM pDefault)
|
|
{
|
|
BOOL result = FALSE;
|
|
|
|
TRY
|
|
|
|
/* Init devmode to defaults if a pmdmOut is given. */
|
|
if(pmdmOut && pDefault) {
|
|
if(pmdmIn) {
|
|
|
|
if(pmdmIn->dmExtraHdr.dmSize == pmdmOut->dmExtraHdr.dmSize)
|
|
/* 1) If same size && version, do a direct copy. */
|
|
*pmdmOut = *pmdmIn;
|
|
else
|
|
{
|
|
/* 1) Start with a default devmode. */
|
|
*pmdmOut = *pDefault;
|
|
|
|
/* 2) Otherwise copy data associated with the smaller
|
|
* of the two devmodes.
|
|
*/
|
|
memcpy(pmdmOut, pmdmIn, min(pmdmOut->dmExtraHdr.dmSize,
|
|
pmdmIn->dmExtraHdr.dmSize));
|
|
}
|
|
}
|
|
|
|
/* Now, to be safe, copy version and size info back. */
|
|
pmdmOut->dmExtraHdr = pDefault->dmExtraHdr;
|
|
|
|
result = TRUE;
|
|
}
|
|
|
|
|
|
ENDTRY
|
|
|
|
FINALLY
|
|
ENDFINALLY
|
|
return result;
|
|
}
|
|
|
|
/***************************** Function Header *******************************
|
|
* OEMDevMode(JS & JR) -- Handles the following directives:
|
|
* OEMDM_SIZE - requires *pDMP->pcbNeeded to be set.
|
|
* OEMDM_DEFAULT - requires settings a default to
|
|
* pDMP->pOEMDMOut.
|
|
* OEMDM_CONVERT - requires pDMP->pOEMDMIn(old devmode) to be
|
|
* converted to pDMP->pOEMDMOut(new devmode).
|
|
* OEMDM_VALIDATE - requires that pDMP->pOEMDMIn be validated.
|
|
* RETURNS: TRUE on successful operation, FALSE otherwise.
|
|
*****************************************************************************/
|
|
|
|
BOOL
|
|
OEMDevMode(
|
|
POEM_DEVMODEPARAM pDMP)
|
|
{
|
|
BOOL bOK = FALSE;
|
|
PMOPIERDM pmdm = 0;
|
|
|
|
#ifdef UI
|
|
HANDLE hModule = g_hModule;
|
|
#elif KM
|
|
HANDLE hModule = 0;
|
|
|
|
if(pDMP)
|
|
hModule = pDMP->hModule;
|
|
#endif
|
|
|
|
TRY
|
|
ASSERT(pDMP && (pDMP->cbSize == sizeof(OEM_DEVMODEPARAM)));
|
|
|
|
if(!pDMP || (pDMP->cbSize != sizeof(OEM_DEVMODEPARAM)))
|
|
LEAVE;
|
|
|
|
switch (pDMP->fMode) {
|
|
|
|
case OEMDM_SIZE:
|
|
|
|
TRACE(1, ("OEMDM_SIZE"));
|
|
|
|
*pDMP->pcbNeeded = sizeof(MOPIERDM);
|
|
bOK = TRUE;
|
|
break;
|
|
|
|
case OEMDM_DEFAULT:
|
|
|
|
TRACE(1, ("OEMDM_DEFAULT"));
|
|
|
|
/* Supplied by rasdd:
|
|
*
|
|
* cbSize sizeof(OEM_DEVMODEPARAM)
|
|
* hPrinter Current printer handle.
|
|
* pPrinterModel Printer model name
|
|
* pPublicDMIn 0
|
|
* pPublicDMOut Pointer to public DEVMODE, may be 0 if RasDD requires only
|
|
* default OEM extra data. -
|
|
* pOEMDMIn 0
|
|
* pOEMDMOut Pointer to OEM extra data -
|
|
* cbBufSize size of OEM extra data buffer (pOEMDMOut) -
|
|
*
|
|
* Returned by us:
|
|
*
|
|
* pcbNeeded count of bytes copied to pOEMDMOut
|
|
*/
|
|
if (pDMP->cbBufSize >= sizeof(MOPIERDM)) {
|
|
PMOPIERDM pDefault = 0;
|
|
PRNPROPSHEET PrnPropSheet;
|
|
|
|
/* 0) Retrieve current devmode.
|
|
*/
|
|
pmdm = (PMOPIERDM) pDMP->pOEMDMOut;
|
|
|
|
/* 1) Retrieve default devmode.
|
|
*/
|
|
|
|
if(bGetPrnModel(hModule, pDMP->pPrinterModel, &pDefault, NULL) &&
|
|
bGetPrnPropData(hModule, pDMP->hPrinter, pDMP->pPrinterModel, &PrnPropSheet))
|
|
{
|
|
*pmdm = *pDefault;
|
|
if(dwDevmodeUpdateFromPP(pmdm, &PrnPropSheet, TRUE) != DM_APPROVE_OK)
|
|
{
|
|
LEAVE;
|
|
}
|
|
|
|
/* Set collation information.
|
|
*/
|
|
if(pDMP->pPublicDMOut)
|
|
{
|
|
if (pmdm->bTopaz == TRUE)
|
|
{
|
|
|
|
TRACE(1, ("OEMDM_DEFAULT: Enabling collation in default devmode."));
|
|
pDMP->pPublicDMOut->dmFields |= DM_COLLATE;
|
|
pDMP->pPublicDMOut->dmCollate =
|
|
(pmdm->bCollation == TRUE) ? DMCOLLATE_TRUE : DMCOLLATE_FALSE;
|
|
}
|
|
else
|
|
{
|
|
pDMP->pPublicDMOut->dmFields &= ~DM_COLLATE;
|
|
}
|
|
}
|
|
bOK = TRUE;
|
|
}
|
|
}
|
|
*pDMP->pcbNeeded = sizeof(MOPIERDM);
|
|
break;
|
|
|
|
case OEMDM_CONVERT: {
|
|
PMOPIERDM pDefault = 0;
|
|
PRNPROPSHEET PrnPropSheet;
|
|
TRACE(1, ("OEMDM_CONVERT"));
|
|
|
|
/* 1) Retrieve default devmode. */
|
|
|
|
if(bGetPrnModel(hModule, pDMP->pPrinterModel, &pDefault, NULL) &&
|
|
bGetPrnPropData(hModule, pDMP->hPrinter, pDMP->pPrinterModel, &PrnPropSheet))
|
|
{
|
|
if(dwDevmodeUpdateFromPP(pDefault, &PrnPropSheet, TRUE) != DM_APPROVE_OK)
|
|
{
|
|
LEAVE;
|
|
}
|
|
|
|
if(bUpdateFromPrevious(pDMP->pOEMDMOut, pDMP->pOEMDMIn, pDefault) == TRUE)
|
|
bOK = TRUE;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case OEMDM_VALIDATE:
|
|
|
|
TRACE(1, ("OEMDM_VALIDATE"));
|
|
|
|
/* Supplied by rasdd:
|
|
*
|
|
* cbSize sizeof(OEM_DEVMODEPARAM)
|
|
* hPrinter Current printer handle.
|
|
* pPrinterModel Printer model name
|
|
* pPublicDMIn 0
|
|
* pPublicDMOut 0
|
|
* pOEMDMIn Pointer to OEM extra data
|
|
* pOEMDMOut 0
|
|
* cbBufSize size of OEM extra data buffer (pOEMDMIn)
|
|
* pcbNeeded 0
|
|
*/
|
|
if (pDMP->cbBufSize >= sizeof(MOPIERDM)) {
|
|
|
|
pmdm = (PMOPIERDM) pDMP->pOEMDMIn;
|
|
|
|
/* Check everything for now.
|
|
*/
|
|
if ((pmdm->dmExtraHdr.dmSize == sizeof(MOPIERDM)) &&
|
|
(pmdm->dmExtraHdr.sVer == MOPIERDMVER) &&
|
|
(pmdm->dmMagic == MOPIERMAGIC)) {
|
|
|
|
bOK = TRUE;
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
ENDTRY
|
|
FINALLY
|
|
|
|
ENDFINALLY
|
|
return(bOK);
|
|
}
|
|
|
|
#undef PUBLIC
|