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.
399 lines
12 KiB
399 lines
12 KiB
#include "hp5sipch.h"
|
|
#include "modinit.c"
|
|
|
|
DRVFN DrvFunctions[] =
|
|
{
|
|
/* REQUIRED FUNCTIONS */
|
|
|
|
{ INDEX_OEMEnablePDEV, (PFN) OEMEnablePDEV },
|
|
{ INDEX_OEMDisablePDEV, (PFN) OEMDisablePDEV },
|
|
{ INDEX_OEMDisableDriver, (PFN) OEMDisableDriver },
|
|
{ INDEX_OEMResetPDEV, (PFN) OEMResetPDEV },
|
|
{ INDEX_OEMDevMode, (PFN) OEMDevMode },
|
|
|
|
/* OPTIONAL FUNCTIONS */
|
|
|
|
{ INDEX_OEMCommandCallback, (PFN) OEMCommandCallback },
|
|
|
|
#if OPTIONALFNS
|
|
|
|
|
|
{ INDEX_DrvCompletePDEV, (PFN) DrvCompletePDEV },
|
|
{ INDEX_DrvEnableSurface, (PFN) DrvEnableSurface },
|
|
{ INDEX_DrvDisableSurface, (PFN) DrvDisableSurface },
|
|
|
|
{ INDEX_DrvEscape, (PFN)DrvEscape },
|
|
|
|
{ INDEX_DrvGetGlyphMode, (PFN)DrvGetGlyphMode },
|
|
{ INDEX_DrvTextOut, (PFN)DrvTextOut },
|
|
{ INDEX_DrvQueryFont, (PFN)DrvQueryFont },
|
|
{ INDEX_DrvQueryFontTree, (PFN)DrvQueryFontTree },
|
|
{ INDEX_DrvQueryFontData, (PFN)DrvQueryFontData },
|
|
|
|
{ INDEX_DrvQueryAdvanceWidths, (PFN)DrvQueryAdvanceWidths },
|
|
{ INDEX_DrvBitBlt, (PFN)DrvBitBlt },
|
|
{ INDEX_DrvStretchBlt, (PFN)DrvStretchBlt },
|
|
{ INDEX_DrvCopyBits, (PFN)DrvCopyBits },
|
|
{ INDEX_DrvDitherColor, (PFN)DrvDitherColor },
|
|
{ INDEX_DrvStartDoc, (PFN)DrvStartDoc },
|
|
{ INDEX_DrvStartPage, (PFN)DrvStartPage },
|
|
{ INDEX_DrvSendPage, (PFN)DrvSendPage },
|
|
{ INDEX_DrvEndDoc, (PFN)DrvEndDoc },
|
|
{ INDEX_DrvFontManagement, (PFN)DrvFontManagement },
|
|
{ INDEX_DrvStartBanding, (PFN)DrvStartBanding },
|
|
{ INDEX_DrvNextBand, (PFN)DrvNextBand }
|
|
|
|
#endif OPTIONALFNS
|
|
|
|
};
|
|
|
|
#define DRIVER_FUNCTIONS sizeof(DrvFunctions)/sizeof(DRVFN)
|
|
|
|
|
|
/***************************** Function Header *******************************
|
|
* OEMEnableDriver
|
|
*
|
|
* RETURNS:
|
|
*
|
|
* HISTORY:
|
|
*
|
|
*****************************************************************************/
|
|
BOOL OEMEnableDriver(
|
|
OEMDRVENABLEDATA *pOEMDrvEnableData
|
|
)
|
|
{
|
|
DRVENABLEDATA *pded;
|
|
BOOL b = FALSE;
|
|
|
|
TRY
|
|
/*
|
|
* cb is a count of the number of bytes available in pded. It is not
|
|
* clear that there is any significant use of the engine version number.
|
|
* Returns TRUE if successfully enabled, otherwise FALSE.
|
|
*/
|
|
if (pOEMDrvEnableData->dwDriverVersion < DDI_DRIVER_VERSION) {
|
|
|
|
TRACE(1, ("HP5SIM!OEMDrvEnableDriver: Invalid Engine Version=%08lx, Req=%08lx\n",
|
|
pOEMDrvEnableData->dwDriverVersion, DDI_DRIVER_VERSION));
|
|
EngSetLastError(ERROR_BAD_DRIVER_LEVEL);
|
|
LEAVE;
|
|
}
|
|
|
|
if (pOEMDrvEnableData->cbSize < sizeof(DRVENABLEDATA))
|
|
{
|
|
EngSetLastError(ERROR_INVALID_PARAMETER);
|
|
TRACE(1, ("HP5SIM!OEMEnableDriver: cb = %ld, should be %ld\n",
|
|
pOEMDrvEnableData->cbSize, sizeof(DRVENABLEDATA)));
|
|
LEAVE;
|
|
}
|
|
|
|
/*
|
|
* Fill in the driver table returned to the engine. We return
|
|
* the minimum of the number of functions supported OR the number
|
|
* the engine has asked for.
|
|
*/
|
|
pded = pOEMDrvEnableData->pded;
|
|
pded->iDriverVersion = DDI_DRIVER_VERSION;
|
|
pded->c = DRIVER_FUNCTIONS;
|
|
pded->pdrvfn = DrvFunctions;
|
|
b = TRUE;
|
|
|
|
ENDTRY
|
|
|
|
FINALLY
|
|
ENDFINALLY
|
|
|
|
return(b);
|
|
}
|
|
|
|
/***************************** Function Header *******************************
|
|
* OEMDisableDriver
|
|
*
|
|
* RETURNS:
|
|
*
|
|
* HISTORY:
|
|
*
|
|
*****************************************************************************/
|
|
void OEMDisableDriver()
|
|
{
|
|
|
|
}
|
|
|
|
PHP5PDEV
|
|
pBuildDefaultPDEV(PHP5PDEV pOurPdev)
|
|
{
|
|
memset(&(pOurPdev->gpcPJLSettings), '\0', sizeof(pOurPdev->gpcPJLSettings));
|
|
pOurPdev->dOutputDest = GPCUI_TOPBIN;
|
|
pOurPdev->bCollation = TRUE;
|
|
pOurPdev->dMailboxMode = GPCUI_HCI_MAILBOX;
|
|
pOurPdev->Copies = 1; /* Copy count. */
|
|
pOurPdev->currentMBSelection = 0; /* current Mailbox sel. */
|
|
|
|
return pOurPdev;
|
|
}
|
|
|
|
/***************************** Function Header *******************************
|
|
* OEMEnablePDEV
|
|
*
|
|
* RETURNS:
|
|
*
|
|
* HISTORY:
|
|
*
|
|
*****************************************************************************/
|
|
DHPDEV OEMEnablePDEV(
|
|
POEMPDEV pOEMPDEV,
|
|
POEMENABLEPDEVPARAM pOEMEPDParam)
|
|
{
|
|
|
|
PHP5PDEV pOurPdev = 0;
|
|
PMOPIERDM pOEMDMIn = 0;
|
|
PDEVMODE pPublicDMIn = 0;
|
|
|
|
TRY
|
|
|
|
/* Grab devmodes out of param block.
|
|
*/
|
|
pOEMDMIn = (PMOPIERDM) pOEMEPDParam->pOEMDevMode;
|
|
pPublicDMIn = pOEMEPDParam->pdm;
|
|
|
|
/* Allocate and save PDEV.
|
|
*/
|
|
pOurPdev = OEMALLOC(pOEMPDEV, sizeof(HP5PDEV));
|
|
if (!pOurPdev) {
|
|
LEAVE;
|
|
}
|
|
pOurPdev->pdev = pOurPdev;
|
|
|
|
/* Validity Check.
|
|
*
|
|
*
|
|
* 1) Check that pOEMDMIn matches current Registry settings. If there are
|
|
* discrepancies at this point, go with the Document Default sheet created by
|
|
* the query to the registry.
|
|
*
|
|
* NOTE: bApproveDevMode returns FALSE if either pPublicDMIn or pOEMDMIn are == 0.
|
|
*/
|
|
if (bApproveDevMode(pOEMPDEV,
|
|
pOEMEPDParam->hModule,
|
|
pOEMEPDParam->hDriver,
|
|
pOEMEPDParam->pwszDeviceName,
|
|
pPublicDMIn,
|
|
pOEMDMIn) == TRUE) {
|
|
|
|
TRACE(1, ("HP5SIM!OEMEnablePDEV: DM_COLLATE is %s in dmFields\n",
|
|
pPublicDMIn->dmFields & DM_COLLATE ? "SET" : "CLEAR"));
|
|
TRACE(1, ("HP5SIM!OEMEnablePDEV: DM_COPIES is %s in dmFields\n",
|
|
pPublicDMIn->dmFields & DM_COPIES ? "SET" : "CLEAR"));
|
|
TRACE(1, ("HP5SIM!OEMEnablePDEV: OEM collation is %s\n",
|
|
pOEMDMIn->bCollation ? "ON" : "OFF"));
|
|
TRACE(1, ("HP5SIM!OEMEnablePDEV: Copy count is %d\n",
|
|
pPublicDMIn->dmCopies));
|
|
TRACE(1, ("HP5SIM!OEMEnablePDEV: Public dmCollate is %s\n",
|
|
pPublicDMIn->dmCollate == DMCOLLATE_TRUE ? "TRUE" : "FALSE"));
|
|
|
|
/* Initialize current PJL settings to 0. That way, sure to write out
|
|
* the PJL strings the first time.
|
|
*/
|
|
memset(&(pOurPdev->gpcPJLSettings), 0, sizeof(pOurPdev->gpcPJLSettings));
|
|
pOurPdev->dOutputDest = pOEMDMIn->dOutputDest;
|
|
pOurPdev->dMailboxMode = pOEMDMIn->dMailboxMode;
|
|
pOurPdev->bCollation = pOEMDMIn->bCollation || pPublicDMIn->dmCollate == DMCOLLATE_TRUE;
|
|
pOurPdev->currentMBSelection = pOEMDMIn->currentMBSelection;
|
|
pOurPdev->bTopaz = pOEMDMIn->bTopaz;
|
|
pOurPdev->Copies = pPublicDMIn->dmCopies;
|
|
|
|
TRACE(1, ("HP5SIM!OEMEnablePDEV: Driver %s collate this job.\n",
|
|
pOurPdev->bCollation ? "WILL" : "WILL NOT"));
|
|
}
|
|
else {
|
|
|
|
/* Even if devmode is completely unrecognizeable, we'll print something. Try
|
|
* to preserve copy count, if possible.
|
|
*
|
|
* Note that pBuildDefaultPDEV always returns pOurPdev.
|
|
*/
|
|
pOurPdev = pBuildDefaultPDEV(pOurPdev);
|
|
if(pPublicDMIn) {
|
|
pOurPdev->Copies = pPublicDMIn->dmCopies;
|
|
}
|
|
}
|
|
|
|
ENDTRY
|
|
FINALLY
|
|
ENDFINALLY
|
|
|
|
return((DHPDEV) pOurPdev);
|
|
}
|
|
|
|
/***************************** Function Header *******************************
|
|
* OEMDisablePDEV
|
|
*
|
|
* RETURNS: None.
|
|
*
|
|
* HISTORY:
|
|
*
|
|
*****************************************************************************/
|
|
VOID OEMDisablePDEV(
|
|
POEMPDEV pdev
|
|
)
|
|
{
|
|
TRY
|
|
/* Free private PDEV.
|
|
*/
|
|
if (pdev && pdev->OEMPrivatePDev) {
|
|
OEMFREE(pdev, pdev->OEMPrivatePDev);
|
|
pdev->OEMPrivatePDev = 0;
|
|
}
|
|
|
|
ENDTRY
|
|
FINALLY
|
|
ENDFINALLY
|
|
}
|
|
|
|
/***************************** Function Header *******************************
|
|
* OEMResetPDEV
|
|
*
|
|
* RETURNS: (BOOL) TRUE for success.
|
|
*
|
|
* HISTORY:
|
|
*
|
|
*****************************************************************************/
|
|
BOOL OEMResetPDEV(
|
|
POEMPDEV pdevold,
|
|
POEMPDEV pdevnew)
|
|
{
|
|
/*******************************************/
|
|
/* Code to fix diff type printing options. */
|
|
PHP5PDEV pHP5pdevnew = 0;
|
|
PHP5PDEV pHP5pdevold = 0;
|
|
|
|
TRACE(1, ("HP5SIM!OEMResetPDEV\n"));
|
|
if(pdevold)
|
|
pHP5pdevold = (PHP5PDEV) pdevold->OEMPrivatePDev;
|
|
|
|
if(pdevnew)
|
|
pHP5pdevnew = (PHP5PDEV) pdevnew->OEMPrivatePDev;
|
|
|
|
/* Copy PJL state from old to new pdev. */
|
|
if(pHP5pdevold && pHP5pdevnew)
|
|
pHP5pdevnew->gpcPJLSettings = pHP5pdevold->gpcPJLSettings;
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
//---------------------------**OEMCommandCallback*----------------------------//
|
|
// Function: OEMCommandCallback
|
|
//
|
|
// Action: Explicitly examine wCmdCbId returned from TTY's GPC data for
|
|
// CMDID Values. This command will construct a command string
|
|
// for the returned value and send it to the spooler via WriteSpoolBuf.
|
|
//
|
|
// Notes: There can be up to 254 callback id#'s.
|
|
// There can be at most 254 callback id#'s due to the size of
|
|
// this id field in the Command Descriptor structure being BYTE.
|
|
|
|
void OEMCommandCallback(
|
|
POEMPDEV pdev, // Pointer to OEMPDEV
|
|
DWORD dwID, // Command callback id#, placed in minidriver GPC data
|
|
LPDWORD lpdwParams) // Pointer to optional parameters of the command
|
|
{
|
|
PHP5PDEV pHP5pdev = 0;
|
|
PCHAR pDirective = 0;
|
|
PGPCPJLSETTINGS pgpcPJLSettings = 0;
|
|
|
|
TRY
|
|
/* print jonah at upper left of page.
|
|
*/
|
|
if(pdev)
|
|
pHP5pdev = (PHP5PDEV) pdev->OEMPrivatePDev;
|
|
|
|
if(pHP5pdev)
|
|
pgpcPJLSettings = &(pHP5pdev->gpcPJLSettings);
|
|
|
|
TRACE(1, ("HP5SIM!OEMCommandCallback: id = %ld\n", dwID));
|
|
|
|
switch (dwID)
|
|
{
|
|
case CMDID_PAGEPROTECT_ON:
|
|
case CMDID_PAGEPROTECT_OFF:
|
|
/* 0) Set PJLSettings changed flag to FALSE to start with. */
|
|
pgpcPJLSettings->bSettingsChanged = FALSE;
|
|
|
|
TRACE(1, ("HP5SIM!OEMDrvEnableDriver: PAGEPROTECT_ON_OFF\n"));
|
|
if(pgpcPJLSettings->dwPageProtection != dwID) {
|
|
pgpcPJLSettings->dwPageProtection = dwID;
|
|
pgpcPJLSettings->bSettingsChanged = TRUE;
|
|
}
|
|
break;
|
|
case CMDID_BEGINDOC:
|
|
TRACE(1, ("HP5SIM!OEMDrvEnableDriver: STARTJOB\n"));
|
|
/* 1) check to see if # of copies has changed. */
|
|
if(pHP5pdev->Copies != pgpcPJLSettings->Copies) {
|
|
pgpcPJLSettings->Copies = pHP5pdev->Copies;
|
|
pgpcPJLSettings->bSettingsChanged = TRUE;
|
|
}
|
|
|
|
/* 2) check to see if output destination has changed. */
|
|
if(pHP5pdev->dOutputDest != pgpcPJLSettings->dwOutputDest) {
|
|
pgpcPJLSettings->dwOutputDest = pHP5pdev->dOutputDest;
|
|
pgpcPJLSettings->bSettingsChanged = TRUE;
|
|
}
|
|
break;
|
|
case CMDID_RET_DEF: /* TEXTQUALITY */
|
|
case CMDID_RET_OFF:
|
|
case CMDID_RET_ON:
|
|
TRACE(1, ("HP5SIM!OEMDrvEnableDriver: CMDID_RET\n"));
|
|
if(pgpcPJLSettings->dwRet != dwID) {
|
|
pgpcPJLSettings->dwRet = dwID;
|
|
pgpcPJLSettings->bSettingsChanged = TRUE;
|
|
}
|
|
break;
|
|
case CMDID_ECONO_DEF: /* PAPER QUALITY */
|
|
case CMDID_ECONO_OFF:
|
|
case CMDID_ECONO_ON:
|
|
TRACE(1, ("HP5SIM!OEMDrvEnableDriver: ECONO_ON_OFF_DEF\n"));
|
|
if(pgpcPJLSettings->dwEconomode != dwID) {
|
|
pgpcPJLSettings->dwEconomode = dwID;
|
|
pgpcPJLSettings->bSettingsChanged = TRUE;
|
|
}
|
|
break;
|
|
case CMDID_RES_600: /* RESOLUTION */
|
|
case CMDID_RES_300:
|
|
case CMDID_RES_150:
|
|
case CMDID_RES_75:
|
|
TRACE(1, ("HP5SIM!OEMDrvEnableDriver: ECONO_RES_600_300_150_75\n"));
|
|
if(pgpcPJLSettings->dwResolution != dwID) {
|
|
pgpcPJLSettings->dwResolution = dwID;
|
|
pgpcPJLSettings->bSettingsChanged = TRUE;
|
|
}
|
|
|
|
/* Finally, when resolution has been checked, send this off to spooler. */
|
|
if(pgpcPJLSettings->bSettingsChanged == TRUE) {
|
|
bJDStartJob(pdev, pHP5pdev);
|
|
pgpcPJLSettings->bPrinted = TRUE;
|
|
}
|
|
|
|
break;
|
|
case CMDID_FF:
|
|
OEMWRITESPOOLBUF(pdev, "\f", strlen("\f"));
|
|
break;
|
|
case CMDID_COPIES:
|
|
TRACE(1, ("HP5SIM!OEMDrvEnableDriver: COPIES\n"));
|
|
/* Only check on copies if #copies has possibly changed. */
|
|
if(pgpcPJLSettings->bSettingsChanged == TRUE)
|
|
bJDCopyCheck(pdev, lpdwParams[0]);
|
|
break;
|
|
case CMDID_ENDJOB:
|
|
TRACE(1, ("HP5SIM!OEMDrvEnableDriver: ENDJOB\n"));
|
|
JDEndJob(pdev);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
ENDTRY
|
|
|
|
FINALLY
|
|
ENDFINALLY
|
|
|
|
}
|