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
205 lines
4.9 KiB
C
205 lines
4.9 KiB
C
/*++
|
||
|
||
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;
|
||
}
|