windows-nt/Source/XPSP1/NT/printscan/print/spooler/prtprocs/winprint/raw.c
2020-09-26 16:20:57 +08:00

205 lines
4.7 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1990-1998 Microsoft Corporation
All Rights Reserved
// @@BEGIN_DDKSPLIT
Module Name:
windows\spooler\prtprocs\winprint\raw.c
// @@END_DDKSPLIT
Abstract:
Routines to facilitate printing of raw jobs.
// @@BEGIN_DDKSPLIT
Author:
Tommy Evans (vtommye) 10-22-1993
Revision History:
// @@END_DDKSPLIT
--*/
#include "local.h"
// @@BEGIN_DDKSPLIT
#include <winsplp.h>
// @@END_DDKSPLIT
#include <wchar.h>
// @@BEGIN_DDKSPLIT
#include "msnull.h"
// @@END_DDKSPLIT
BYTE abyFF[1] = { 0xc };
/*++
*******************************************************************
P r i n t R a w J o b
Routine Description:
Prints out a job with RAW data type.
Arguments:
pData => Print Processor data structure
pPrinterName => name of printer to print on
Return Value:
TRUE if successful
FALSE if failed - GetLastError will return reason
*******************************************************************
--*/
BOOL
PrintRawJob(
IN PPRINTPROCESSORDATA pData,
IN LPWSTR pPrinterName,
IN UINT uDataType)
{
DOC_INFO_1 DocInfo;
DWORD Copies;
DWORD NoRead, NoWritten;
DWORD i;
BOOL rc;
HANDLE hPrinter;
BYTE *ReadBuffer = NULL;
BOOL bRet = FALSE;
BOOL bStartDoc = FALSE;
// @@BEGIN_DDKSPLIT
BOOL bAddFF = FALSE;
BOOL bCheckFF;
PBYTE pByte;
DCI DCIData;
// @@END_DDKSPLIT
DocInfo.pDocName = pData->pDocument; /* Document name */
DocInfo.pOutputFile = pData->pOutputFile; /* Output file */
DocInfo.pDatatype = pData->pDatatype; /* Document data type */
/** Let the printer know we are starting a new document **/
if (!StartDocPrinter(pData->hPrinter, 1, (LPBYTE)&DocInfo)) {
goto Done;
}
bStartDoc = TRUE;
// @@BEGIN_DDKSPLIT
bCheckFF = (uDataType == PRINTPROCESSOR_TYPE_RAW_FF ||
uDataType == PRINTPROCESSOR_TYPE_RAW_FF_AUTO);
/** Setup the formfeed stuff **/
if (bCheckFF) {
DCIData.ParserState = prdg_Text;
DCIData.ParserSequence = NULL;
DCIData.FFstate = prdg_FFtext;
DCIData.uType = uDataType;
}
// @@END_DDKSPLIT
/** Allocate the read buffer, dynamically allocated to conserve stack space **/
ReadBuffer = AllocSplMem(READ_BUFFER_SIZE);
if (!ReadBuffer) {
goto Done;
}
/** Print the data pData->Copies times **/
Copies = pData->Copies;
while (Copies--) {
/**
Open the printer. If it fails, return. This also sets up the
pointer for the ReadPrinter calls.
**/
if (!OpenPrinter(pPrinterName, &hPrinter, NULL)) {
goto Done;
}
/**
Loop, getting data and sending it to the printer. This also
takes care of pausing and cancelling print jobs by checking
the processor's status flags while printing.
**/
while ((rc = ReadPrinter(hPrinter, ReadBuffer, READ_BUFFER_SIZE, &NoRead)) &&
NoRead) {
// @@BEGIN_DDKSPLIT
if (bCheckFF) {
for(i=0, pByte = ReadBuffer;
i< NoRead;
i++, pByte++) {
CheckFormFeedStream(&DCIData, *pByte);
}
}
// @@END_DDKSPLIT
/** If the print processor is paused, wait for it to be resumed **/
if (pData->fsStatus & PRINTPROCESSOR_PAUSED) {
WaitForSingleObject(pData->semPaused, INFINITE);
}
/** If the job has been aborted, don't write anymore **/
if (pData->fsStatus & PRINTPROCESSOR_ABORTED) {
break;
}
/** Write the data to the printer **/
WritePrinter(pData->hPrinter, ReadBuffer, NoRead, &NoWritten);
}
// @@BEGIN_DDKSPLIT
/**
If we are type _FF* then we may need to add a form feed.
**/
if (bCheckFF && CheckFormFeed(&DCIData)) {
WritePrinter(pData->hPrinter, abyFF, sizeof(abyFF), &NoWritten);
}
// @@END_DDKSPLIT
/**
Close the printer - we open/close the printer for each
copy so the data pointer will rewind.
**/
ClosePrinter(hPrinter);
} /* While copies to print */
bRet = TRUE;
Done:
/** Close the buffer we allocated **/
if (ReadBuffer) {
FreeSplMem(ReadBuffer);
}
/** Let the printer know that we are done printing **/
if (bStartDoc) {
EndDocPrinter(pData->hPrinter);
}
return bRet;
}