// // 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 #include #ifndef _MACPS #define _MACPS #include #include // 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