Files
admin
base
com
developer
drivers
ds
enduser
inetcore
inetsrv
loc
mergedcomponents
multimedia
net
printscan
ddk
dload
fax
faxsrv
inc
lib
print
drivers
embedded
spooler
dbglib
exts
idl
inc
inetpp2
inetsrv
localspl
monitors
oleprn
perflib
prtprocs
winprint
emf.c
formfeed.c
genprint.htm
local.c
local.h
makefile
msnull.c
msnull.h
parsparm.c
raw.c
sources
support.c
text.c
util.c
winprint.c
winprint.def
winprint.h
winprint.prf
winprint.rc
dirs
scripts
splexts
spllib
splsetup
spoolss
wpnpinst
dirs
makefil0
dirs
publish
scan
ui
wia
dirs
project.mk
public
published
sdktools
shell
termsrv
tools
windows
dirs
makefil0
2025-04-27 07:49:33 -04:00

205 lines
4.9 KiB
C
Raw Permalink 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;
}