mirror of https://github.com/tongzx/nt5src
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.
323 lines
10 KiB
323 lines
10 KiB
//
|
|
// Copyright(c) Microsoft Corp., 1991, 1993
|
|
//
|
|
//
|
|
// Macps.h - Defines, type definitions, and function prototypes for the
|
|
// MacPrint service of Windows NT Advanced Server
|
|
//
|
|
// History:
|
|
// Created for LAN Manager 2.1 Jameel Hyder @ Microsoft
|
|
// modified for Windows NT Frank Byrum @ Microsoft
|
|
// Cleaned up Jameel Hyder @ Microsoft
|
|
//
|
|
|
|
#include <winsock2.h>
|
|
#include <atalkwsh.h>
|
|
|
|
#ifndef _MACPS
|
|
#define _MACPS
|
|
|
|
#include <winspool.h>
|
|
#include <prtdefs.h>
|
|
|
|
// default string if string table not available - no need to localize
|
|
|
|
#define STATUS_MSG_ACTIVE "Spooling to print server \"%s\" ..."
|
|
#define CLIENTNAME "MAC_Client"
|
|
|
|
|
|
#define GENERIC_BUFFER_SIZE 1024
|
|
#define STACKSIZE 8192
|
|
#define PRINT_SHARE_CHECK_DEF 60000L
|
|
#define PS_EOF 4
|
|
#define FONTNAMELEN 49
|
|
#define FONTVERSIONLEN 7
|
|
#define FONTENCODINGLEN 9
|
|
|
|
// these strings are not localized - they are used for NBP browsing
|
|
#define LW_TYPE "LaserWriter"
|
|
#define DEF_ZONE "*"
|
|
#define NULL_STR ""
|
|
#define MACPRINT_NAME L"MacPrint"
|
|
#define TOKLEN 255
|
|
#define PPDLEN 49
|
|
#define PSLEN 259
|
|
#define PENDLEN PSLEN+1 // This needs to be 4*N
|
|
|
|
// ProcSet states
|
|
#define PROCSETMISSING 0
|
|
#define PROCSETPRESENT 1
|
|
#define PROCSETALMOSTPRESENT 2
|
|
|
|
// Registry Parameters - registry key names are not localized
|
|
#define HKEY_MACPRINT L"SYSTEM\\CurrentControlSet\\Services\\MacPrint"
|
|
#define HKEY_PARAMETERS L"Parameters"
|
|
#define HVAL_SHARECHECKINTERVAL L"ShareCheckInterval"
|
|
#define HVAL_LOGFILE L"LogFilePath"
|
|
#define HVAL_DUMPFILE L"DumpFilePath"
|
|
|
|
|
|
#define MACSPOOL_MAX_EVENTS 2
|
|
#define MACSPOOL_EVENT_SERVICE_STOP 0
|
|
#define MACSPOOL_EVENT_PNP 1
|
|
|
|
typedef SOCKET * PSOCKET;
|
|
|
|
// A FONT_RECORD structure will contain the information describing a font.
|
|
// A list of these stuctures will be associated with each shared PostScript
|
|
// printer.
|
|
|
|
typedef struct
|
|
{
|
|
char name[FONTNAMELEN+1];
|
|
char encoding[FONTENCODINGLEN+1];
|
|
char version[FONTVERSIONLEN+1];
|
|
} FONT_RECORD, *PFR;
|
|
|
|
|
|
|
|
// A DICT_RECORD structure contains information describing a PostScript
|
|
// dictionary. It is used to determine what version of the Macintosh
|
|
// LaserWriter driver was used to submit a job, as this structure is
|
|
// filled in from information provided by ADSC comments in the print job.
|
|
|
|
#define DICTNAMELEN 17
|
|
#define DICTVERSIONLEN 7
|
|
#define DICTREVISIONLEN 7
|
|
|
|
typedef struct dict_record
|
|
{
|
|
char name[DICTNAMELEN+1];
|
|
char version[DICTVERSIONLEN+1];
|
|
char revision[DICTREVISIONLEN+1];
|
|
} DICT_RECORD, *PDR;
|
|
|
|
// A BUF_READ structure exists for each print job. All data that is read from
|
|
// a client is read here. PendingBuffer field is used to copy partial lines
|
|
// from previous I/O. A pointer to this structure can be found in the job
|
|
// record
|
|
|
|
#define PAP_QUANTUM_SIZE 512
|
|
#define PAP_DEFAULT_QUANTUM 8
|
|
#define PAP_DEFAULT_BUFFER (PAP_DEFAULT_QUANTUM*PAP_QUANTUM_SIZE)
|
|
|
|
typedef struct
|
|
{
|
|
BYTE PendingBuffer[PENDLEN]; // Keep commands that span buffers here.
|
|
BYTE Buffer[PAP_DEFAULT_BUFFER]; // buffer for data Xfers
|
|
} BUF_READ, *PBR;
|
|
|
|
|
|
// A JOB_RECORD structure will exist for each job to be service by the
|
|
// queue service routine. All job specific data can be found through
|
|
// this structure
|
|
typedef struct job_record
|
|
{
|
|
struct queue_record * job_pQr; // owning print queue structure
|
|
struct job_record * NextJob; // next job for this printer
|
|
DWORD dwFlags; // Flags, what else ?
|
|
HANDLE hPrinter; // NT Printer Handle for this job
|
|
DWORD dwJobId; // NT Print Manager Job ID.
|
|
SOCKET sJob; // socket for this job
|
|
HDC hicFontFamily; // used for querying PostScript fonts
|
|
HDC hicFontFace; // used for querying PostScript fonts
|
|
DWORD dwFlowQuantum; // negotiated flow quantum
|
|
DWORD XferLen; // Number of bytes in DataBuffer
|
|
PBYTE DataBuffer; // Data buffer for xfer's
|
|
PBR bufPool; // pool of two buffers
|
|
DWORD bufIndx; // index into Buffer Pool
|
|
int cbRead; // Bytes read in last read
|
|
DWORD PendingLen; // Length of partial command stored in PendingBuffer
|
|
USHORT psJobState; // Current state of the PostScript job.
|
|
USHORT JSState; // Current PostScript Data Stream state.
|
|
USHORT SavedJSState; // Saved PostScript Data Stream state.
|
|
USHORT InProgress; // Flags for query state
|
|
DWORD EOFRecvdAt; // Time when we recvd EOF from client
|
|
BOOL InBinaryOp; // We are accepting Binary information.
|
|
BOOL FirstWrite; // Set to True initially. Set to False after header is written
|
|
BOOL EOFRecvd; // True, if EOF received, False otherwise
|
|
#if DBG
|
|
DWORD PapEventCount; // Count of events
|
|
#endif
|
|
BYTE buffer[2*sizeof(BUF_READ)];
|
|
// read data buffer
|
|
WCHAR pszUser[TOKLEN + 1];// username from DSC comment
|
|
BYTE JSKeyWord[TOKLEN+1];// Keyword being scanned for.
|
|
} JOB_RECORD, *PJR;
|
|
|
|
|
|
// once we get EOF, if we don't hear from the client for 60 seconds, assume done! (oti hack!)
|
|
#define OTI_EOF_LIMIT 60000
|
|
#define EXECUTE_OTI_HACK(_StartTime) ( ((GetTickCount() - (_StartTime)) > OTI_EOF_LIMIT) ? \
|
|
TRUE : FALSE )
|
|
|
|
//
|
|
// Job Record Defines
|
|
//
|
|
|
|
// dwFlags
|
|
#define JOB_FLAG_NULL 0x00000000
|
|
#define JOB_FLAG_TITLESET 0x00000001
|
|
#define JOB_FLAG_OWNERSET 0x00000002
|
|
|
|
// psJobState
|
|
#define psNullJob 0 // Not in a PostScript Job Structure (S0)
|
|
#define psQueryJob 1 // In a Query Job (S1)
|
|
#define psExitServerJob 2 // In an Exit Server Job (S2)
|
|
#define psStandardJob 3 // In a Standard Job (S3)
|
|
|
|
|
|
// JSState
|
|
#define JSStrip 0 // Write nothing, scan for Structuring Comment
|
|
#define JSStripEOL 1 // Write nothing, scan for end of line, then restore state
|
|
#define JSStripKW 2 // Write nothing, scan for JSKeyword, then restore state
|
|
#define JSStripTok 3 // Write nothing, scan for next token, then restore state
|
|
#define JSWrite 4 // Write everything, scan for Structuring Comment
|
|
#define JSWriteEOL 5 // Write everything, scan for end of line, then restore state
|
|
#define JSWriteKW 6 // Write everything, scan for JSKeyword, then restore state
|
|
#define JSWriteTok 7 // Write everything, scan for next token, then restore state
|
|
|
|
|
|
// InProgress
|
|
#define NOTHING 0 // A scan is not currently in progress
|
|
#define QUERYDEFAULT 1 // Currently scanning for the default response to a query
|
|
|
|
#define RESOLUTIONBUFFLEN 9 // room for "xxxxxdpi"
|
|
#define COLORDEVICEBUFFLEN 6 // room for "False"
|
|
|
|
// A QUEUE_RECORD structure exists for each shared Windows NT local printer
|
|
// defined by the Windows NT Print Manager. All relevant data specific to
|
|
// a Windows NT Printer is accessed through this data structure. This
|
|
// structure also serves as the head of the list of jobs to service that
|
|
// are being spooled to this printer.
|
|
typedef struct queue_record
|
|
{
|
|
struct queue_record * pNext; // Next queue in the list
|
|
BOOL bFound; // TRUE if found in EnumPrinters list
|
|
BOOL SupportsBinary; // True, if printer supports binary mode
|
|
LPWSTR pPrinterName; // Print Manager printer name
|
|
LPSTR pMacPrinterName; // Macintosh ANSI printer name
|
|
LPWSTR pDriverName; // NT Printer driver
|
|
LPWSTR pPortName; // NT Port name
|
|
LPWSTR pDataType; // datatype used for jobs
|
|
LPSTR IdleStatus; // "status: idle"
|
|
LPSTR SpoolingStatus; // "status: Spooling to ......"
|
|
PJR PendingJobs; // Pointer to the list of pending jobs.
|
|
BOOL ExitThread; // Flag to Exit thread.
|
|
HANDLE hThread; // handle to queue service thread
|
|
PFR fonts; // array of fonts on this printer (PostScript only)
|
|
DWORD MaxFontIndex; // max # fonts in fonts array
|
|
SOCKET sListener; // listener socket for this printer
|
|
DWORD JobCount; // Number of Jobs Outstanding.
|
|
DWORD FreeVM; // Virtual memory available on printer
|
|
CHAR LanguageVersion[PPDLEN+1];// PPD LangaugeVersion, default: English
|
|
CHAR Product[PPDLEN+1]; // PPD Product name
|
|
CHAR Version[PPDLEN+1]; // PPD PostScript Version, Null = Unknown
|
|
CHAR Revision[PPDLEN+1]; // PPD Revision
|
|
CHAR DeviceNickName[PPDLEN+1];// Human readable device name
|
|
CHAR pszColorDevice[COLORDEVICEBUFFLEN];
|
|
CHAR pszResolution[RESOLUTIONBUFFLEN];
|
|
CHAR pszLanguageLevel[PPDLEN+1];
|
|
} QUEUE_RECORD, *PQR;
|
|
|
|
|
|
// pDataType
|
|
#define MACPS_DATATYPE_RAW L"RAW"
|
|
#define MACPS_DATATYPE_PS2DIB L"PSCRIPT1"
|
|
|
|
typedef struct _failed_cache
|
|
{
|
|
struct _failed_cache *Next;
|
|
WCHAR PrinterName[1];
|
|
} FAIL_CACHE, *PFAIL_CACHE;
|
|
|
|
// Action codes for CheckFailCache
|
|
#define PSP_ADD 1
|
|
#define PSP_DELETE 2
|
|
|
|
// Return codes from CheckFailCache
|
|
#define PSP_OPERATION_SUCCESSFUL 0
|
|
#define PSP_OPERATION_FAILED 12
|
|
#define PSP_ALREADY_THERE 10
|
|
#define PSP_NOT_FOUND 11
|
|
|
|
|
|
BOOLEAN
|
|
PostPnpWatchEvent(
|
|
VOID
|
|
);
|
|
|
|
BOOLEAN
|
|
HandlePnPEvent(
|
|
VOID
|
|
);
|
|
|
|
// Function Prototypes for macpsq.c
|
|
void ReportWin32Error (DWORD dwError);
|
|
void QueueServiceThread(PQR pqr);
|
|
DWORD HandleNewJob(PQR pqr);
|
|
DWORD HandleRead(PJR pjr);
|
|
DWORD CreateNewJob(PQR pqr);
|
|
void RemoveJob(PJR pjr);
|
|
void HandleNextPAPEvent(PQR pqr);
|
|
void MoveJobAtEnd(PQR pqr, PJR pjr);
|
|
DWORD CreateListenerSocket(PQR pqr);
|
|
|
|
|
|
// Function Prototypes for psp.c
|
|
BOOLEAN SetDefaultPPDInfo(PQR pqr);
|
|
BOOLEAN SetDefaultFonts(PQR pqr);
|
|
BOOLEAN GetPPDInfo (PQR pqr);
|
|
int LineLength(PBYTE pBuf, int cbBuf);
|
|
DWORD WriteToSpool(PJR pjr, PBYTE pchbuf, int cchlen);
|
|
DWORD MoveToPending(PJR pjr, PBYTE pchbuf, int cchlen);
|
|
|
|
DWORD TellClient (PJR, BOOL, PBYTE, int);
|
|
DWORD PSParse(PJR, PBYTE, int);
|
|
|
|
#define PopJSState(Job) Job->JSState = Job->SavedJSState
|
|
#define PushJSState(Job, NewState) \
|
|
{ \
|
|
Job->SavedJSState = Job->JSState; \
|
|
Job->JSState = NewState; \
|
|
}
|
|
|
|
// Function prototype for pspquery.c
|
|
DWORD HandleEndFontListQuery(PJR);
|
|
DWORD HandleEndQuery (PJR, PBYTE);
|
|
DWORD FinishDefaultQuery (PJR, PBYTE);
|
|
void FindDictVer(PDR DictQuery);
|
|
DWORD HandleBQComment(PJR, PBYTE);
|
|
DWORD HandleBeginProcSetQuery(PJR, PSZ);
|
|
DWORD HandleBeginFontQuery(PJR, PSZ);
|
|
DWORD HandleEndPrinterQuery(PJR);
|
|
void HandleBeginXQuery(PJR, PSZ);
|
|
void EnumeratePostScriptFonts(PJR pjr);
|
|
DWORD CheckFailedCache(LPWSTR pPrinterName, DWORD dwAction);
|
|
|
|
int CALLBACK FamilyEnumCallback(
|
|
LPENUMLOGFONT lpelf,
|
|
LPNEWTEXTMETRIC pntm,
|
|
int iFontType,
|
|
LPARAM lParam);
|
|
int CALLBACK FontEnumCallback(
|
|
LPENUMLOGFONT lpelf,
|
|
LPNEWTEXTMETRIC pntm,
|
|
int iFontType,
|
|
LPARAM lParam);
|
|
|
|
//
|
|
// global data
|
|
//
|
|
|
|
extern HANDLE mutexQueueList;
|
|
extern HANDLE hevStopRequested;
|
|
#if DBG
|
|
extern HANDLE hDumpFile;
|
|
#endif
|
|
extern HANDLE hEventLog;
|
|
extern SERVICE_STATUS MacPrintStatus;
|
|
|
|
#endif
|
|
|
|
|