The logic of the WinprintPrintDocumentOnPrintProcessor function is shown in the following pseudo code. Notice that the ReadPrinter function is used to read the spool file, rather than reading status data from the printer. When the WinprintPrintDocumentOnPrintProcessor function is called, the print processor already has a printer associated with it (has a handle to a printer). However, this handle, which was established in a prior OpenPrintProcessor function call, is used to write to printer.
if not called with a handle this print processor has open then
set last error to ERROR_INVALID_HANDLE
return FALSE
endif
if capable of using document datatype passed in
move datatype into PRINTPROCESSORDATA structure
endif
if capable of using separator file type passed in
print out the banner that separates this job from previous job
endif
move information about the document from PPRINTPROCESSORDATA structure to local DOC_INFO_2 structure, specifically:
(1) document name
(2) spool file filename
(3) spool file data type
(4) print job ID
call local print provider OpenPrinter function to open the printer that is already associated with the print processor for reading (the spool file).
call local print provider StartDocPrinter function with DI_READ_SPOOL_JOB flag set in JOB_INFO_2 structure to initiate reading of spool file.
if the spool file datatype is raw then
call the local print processor StartDocPrinter with DI_CHANNEL_WRITE
flag set in JOB_INFO_2 structure to enable sending spool file
contents directly to printer through the local print provider.
(If the spool file datatype is EMF, the print processor will send
the spool file data through GDI32.)
endif
/* start of loop:
while there is still data to be read in the spool file, call the local print provider ReadPrinter function to read a block of data from the spool file. if the spool file data type is raw, the block of data is then sent directly to the printer by this print processor code; if the spool file data type is EMF, then this print processor code will use the gdiPlaySpoolStream function call to get GDI32 to manage the rendering and sending of the print data to the printer. */
while there is still data to be read in the spool file, call the
local print provider ReadPrinter function to read a block of data from
the spool file.
trap special case of Print Processor paused between print out of
pages (one page = one EMF file) and wait until unpaused
trap special case of Print Processor aborted and document datatype is
EMF and call GDI32 gdiPlaySpoolStream function to delete metafiles
and DC
/* Note the parameter list for this gdiPlaySpoolStream function call.
This parameter list structure instructs gdiPlaySpoolStream to
delete the spool file(s) and close the printer DC, etc.
gdiPlaySpoolStream(
NULL,
NULL,
lpDoc->pSpoolFileName,
0,
0,
hDC);
break;
*/
if document datatype is raw, call the print provider WritePrinter
function to send the spool file data directly to the printer.
if document datatype is EMF then call GDI32 gdiPlaySpoolStream
function to playback the EMF file.
/* Note the structure of the parameter list in the gdiPlaySpoolStream
function call used to actually render and send data to the printer
from the EMF spool file. The hDC parameter is NULL the first
time this function is called.
hDC = gdiPlaySpoolStream(
pData->pPrinterName,
lpDoc->pOutputFile,
Buffer,
lpDoc->JobId,
&NoRead,
hDC
);
*/
if gdiPlaySpoolStream does not return a DC handle and process the
first block of spool file data OK, then call the GDI32
gdiPlaySpoolStream function to delete metafiles.
/* end of loop */
if spool file data type is raw, call the local print provider EndDocPrinter function to end the document printing session.