windows-nt/Source/XPSP1/NT/printscan/print/spooler/spllib/webipp.h
2020-09-26 16:20:57 +08:00

844 lines
24 KiB
C

/*****************************************************************************\
* MODULE: webipp.h
*
* This is the header module for webipp.c. This contains the IPP 1.1 parser
* that encodes/decodes data for transfering across the HTTP wire.
*
*
* Copyright (C) 1996-1998 Microsoft Corporation
* Copyright (C) 1996-1998 Hewlett Packard
*
* history:
* 27-Oct-1997 <chriswil/v-chrisw> created.
*
\*****************************************************************************/
#ifndef _WEBIPP_H
#define _WEBIPP_H
#include <time.h>
#ifdef __cplusplus // Place this here to prevent decorating of symbols
extern "C" { // when doing C++ stuff.
#endif
/***********************************************\
* Common Macros
*
\***********************************************/
#define offs(type, identifier) ((ULONG_PTR)&(((type)0)->identifier))
/***********************************************\
* Constant Values
*
\***********************************************/
#define IPP_BLOCK_SIZE 1024
#define IPP_VERSION ((WORD)0x0100)
#define IPP_GETJOB_ALL ((DWORD)0x7FFFFFFF)
#define IPPOBJ_MASK_SIZE 2
#define IPPTYPE_UNKNOWN 0
#define IPPTYPE_PRT 1
#define IPPTYPE_JOB 2
#define IPPTYPE_AUTH 3
#define IPP_ATR_ABSOLUTE 0
#define IPP_ATR_OFFSET -1
#define IPP_ATR_OFFSETCONV -2
#define IPP_ATR_TAG -4
/***********************************************\
* IPP Element Sizes
*
* These are used to identify the size of
* IPP element values.
*
\***********************************************/
#define IPP_SIZEOFREQ sizeof(WORD) // 2 bytes
#define IPP_SIZEOFVER sizeof(WORD) // 2 bytes
#define IPP_SIZEOFLEN sizeof(WORD) // 2 bytes
#define IPP_SIZEOFTAG sizeof(BYTE) // 1 byte
#define IPP_SIZEOFINT sizeof(DWORD) // 4 bytes
#define IPP_SIZEOFBYTE sizeof(BYTE) // 1 bytes
#define IPP_SIZEOFHDR (IPP_SIZEOFVER + IPP_SIZEOFREQ + IPP_SIZEOFINT)
/***********************************************\
* IPP Attribute Sizes
*
\***********************************************/
#define SIZE_TEXT 1023
#define SIZE_NAME 255
#define SIZE_KEYWORD 255
#define SIZE_KEYWORDNAME 255
#define SIZE_ENUM 4
#define SIZE_URI 1023
#define SIZE_URISCHEME 63
#define SIZE_CHARSET 63
#define SIZE_NATLANG 63
#define SIZE_MIMEMEDIA 63
#define SIZE_OCTSTRING 1023
#define SIZE_BOOLEAN 1
#define SIZE_INTEGER 4
#define SIZE_RANGEINTEGER 8
#define SIZE_DATETIME 11
#define SIZE_RESOLUTION 9
/***********************************************\
* IPP Job-State Codes
*
\***********************************************/
#define IPP_JOBSTATE_UNKNOWN ((BYTE)0)
#define IPP_JOBSTATE_PENDING ((BYTE)3)
#define IPP_JOBSTATE_PENDINGHELD ((BYTE)4)
#define IPP_JOBSTATE_PROCESSING ((BYTE)5)
#define IPP_JOBSTATE_PROCESSEDSTOPPED ((BYTE)6)
#define IPP_JOBSTATE_CANCELLED ((BYTE)7)
#define IPP_JOBSTATE_ABORTED ((BYTE)8)
#define IPP_JOBSTATE_COMPLETED ((BYTE)9)
/***********************************************\
* IPP Printer-State Codes
*
\***********************************************/
#define IPP_PRNSTATE_UNKNOWN ((DWORD)0)
#define IPP_PRNSTATE_IDLE ((DWORD)3)
#define IPP_PRNSTATE_PROCESSING ((DWORD)4)
#define IPP_PRNSTATE_STOPPED ((DWORD)5)
/***********************************************\
* IPP Request/Response Codes
*
\***********************************************/
#define IPP_REQ_GETOPERATION ((WORD)0x0001)
#define IPP_REQ_PRINTJOB ((WORD)0x0002) // Implemented
#define IPP_REQ_PRINTURI ((WORD)0x0003)
#define IPP_REQ_VALIDATEJOB ((WORD)0x0004) // Implemented
#define IPP_REQ_CREATEJOB ((WORD)0x0005)
#define IPP_REQ_SENDDOC ((WORD)0x0006)
#define IPP_REQ_SENDURI ((WORD)0x0007)
#define IPP_REQ_CANCELJOB ((WORD)0x0008) // Implemented
#define IPP_REQ_GETJOB ((WORD)0x0009) // Implemented
#define IPP_REQ_ENUJOB ((WORD)0x000A) // Implemented
#define IPP_REQ_GETPRN ((WORD)0x000B) // Implemented
#define IPP_REQ_PAUSEJOB ((WORD)0x000C) // Implemented
#define IPP_REQ_RESUMEJOB ((WORD)0x000D) // Implemented
#define IPP_REQ_RESTARTJOB ((WORD)0x000E) // Implemented
#define IPP_REQ_REPROCESSJOB ((WORD)0x000F)
#define IPP_REQ_PAUSEPRN ((WORD)0x0010) // Implemented
#define IPP_REQ_RESUMEPRN ((WORD)0x0011) // Implemented
#define IPP_REQ_CANCELPRN ((WORD)0x0012) // Implemented
#define IPP_REQ_FORCEAUTH ((WORD)0x4000)
#define IPP_RESPONSE ((WORD)0x1000)
#define IPP_RET_PRINTJOB (IPP_RESPONSE | IPP_REQ_PRINTJOB)
#define IPP_RET_VALIDATEJOB (IPP_RESPONSE | IPP_REQ_VALIDATEJOB)
#define IPP_RET_CANCELJOB (IPP_RESPONSE | IPP_REQ_CANCELJOB)
#define IPP_RET_GETJOB (IPP_RESPONSE | IPP_REQ_GETJOB)
#define IPP_RET_ENUJOB (IPP_RESPONSE | IPP_REQ_ENUJOB)
#define IPP_RET_GETPRN (IPP_RESPONSE | IPP_REQ_GETPRN)
#define IPP_RET_PAUSEJOB (IPP_RESPONSE | IPP_REQ_PAUSEJOB)
#define IPP_RET_RESUMEJOB (IPP_RESPONSE | IPP_REQ_RESUMEJOB)
#define IPP_RET_RESTARTJOB (IPP_RESPONSE | IPP_REQ_RESTARTJOB)
#define IPP_RET_PAUSEPRN (IPP_RESPONSE | IPP_REQ_PAUSEPRN)
#define IPP_RET_RESUMEPRN (IPP_RESPONSE | IPP_REQ_RESUMEPRN)
#define IPP_RET_CANCELPRN (IPP_RESPONSE | IPP_REQ_CANCELPRN)
#define IPP_RET_FORCEAUTH (IPP_RESPONSE | IPP_REQ_FORCEAUTH)
/***********************************************\
* IPP Response Error Codes
*
\***********************************************/
#define IPPRSP_SUCCESS ((WORD)0x0000) // Standard
#define IPPRSP_SUCCESS1 ((WORD)0x0001) // Standard
#define IPPRSP_SUCCESS2 ((WORD)0x0002) // Standard
#define IPPRSP_ERROR_400 ((WORD)0x0400) // Standard
#define IPPRSP_ERROR_401 ((WORD)0x0401) // Standard
#define IPPRSP_ERROR_402 ((WORD)0x0402) // Standard
#define IPPRSP_ERROR_403 ((WORD)0x0403) // Standard
#define IPPRSP_ERROR_404 ((WORD)0x0404) // Standard
#define IPPRSP_ERROR_405 ((WORD)0x0405) // Standard
#define IPPRSP_ERROR_406 ((WORD)0x0406) // Standard
#define IPPRSP_ERROR_407 ((WORD)0x0407) // Standard
#define IPPRSP_ERROR_408 ((WORD)0x0408) // Standard
#define IPPRSP_ERROR_409 ((WORD)0x0409) // Standard
#define IPPRSP_ERROR_40A ((WORD)0x040A) // Standard
#define IPPRSP_ERROR_40B ((WORD)0x040B) // Standard
#define IPPRSP_ERROR_40C ((WORD)0x040C) // Standard
#define IPPRSP_ERROR_40D ((WORD)0x040D) // Standard
#define IPPRSP_ERROR_40E ((WORD)0x040E) // Standard
#define IPPRSP_ERROR_500 ((WORD)0x0500) // Standard
#define IPPRSP_ERROR_501 ((WORD)0x0501) // Standard
#define IPPRSP_ERROR_502 ((WORD)0x0502) // Standard
#define IPPRSP_ERROR_503 ((WORD)0x0503) // Standard
#define IPPRSP_ERROR_504 ((WORD)0x0504) // Standard
#define IPPRSP_ERROR_505 ((WORD)0x0505) // Standard
#define IPPRSP_ERROR_506 ((WORD)0x0506) // Standard
#define IPPRSP_ERROR_540 ((WORD)0x0540) // Extended
#define SUCCESS_RANGE(wRsp) ((BOOL)((wRsp >= 0x0000) && (wRsp <= 0x00FF)))
#define ERROR_RANGE(wReq) \
(((wReq >= IPPRSP_ERROR_400) && (wReq <= IPPRSP_ERROR_40E)) || \
((wReq >= IPPRSP_ERROR_500) && (wReq <= IPPRSP_ERROR_506)) || \
((wReq == IPPRSP_ERROR_540)))
#define REQID_RANGE(idReq) (((DWORD)idReq >= 1) && ((DWORD)idReq <= 0x7FFFFFFF))
/***********************************************\
* IPP Attribute Delimiter Tags
*
\***********************************************/
#define IPP_TAG_DEL_RESERVED ((BYTE)0x00) //
#define IPP_TAG_DEL_OPERATION ((BYTE)0x01) //
#define IPP_TAG_DEL_JOB ((BYTE)0x02) //
#define IPP_TAG_DEL_DATA ((BYTE)0x03) //
#define IPP_TAG_DEL_PRINTER ((BYTE)0x04) //
#define IPP_TAG_DEL_UNSUPPORTED ((BYTE)0x05) //
#define IPP_TAG_OUT_UNSUPPORTED ((BYTE)0x10) //
#define IPP_TAG_OUT_DEFAULT ((BYTE)0x11) //
#define IPP_TAG_OUT_NONE ((BYTE)0x12) //
#define IPP_TAG_OUT_COMPOUND ((BYTE)0x13) //
#define IPP_TAG_INT_INTEGER ((BYTE)0x21) // sizeof(DWORD)
#define IPP_TAG_INT_BOOLEAN ((BYTE)0x22) // sizeof(BYTE)
#define IPP_TAG_INT_ENUM ((BYTE)0x23) // sizeof(DWORD)
#define IPP_TAG_OCT_STRING ((BYTE)0x30) // UTF-8
#define IPP_TAG_OCT_DATETIME ((BYTE)0x31) // UTF-8
#define IPP_TAG_OCT_RESOLUTION ((BYTE)0x32) // UTF-8
#define IPP_TAG_OCT_RANGEOFINT ((BYTE)0x33) // UTF-8
#define IPP_TAG_OCT_DICTIONARY ((BYTE)0x34) // UTF-8
#define IPP_TAG_OCT_TXTWITHLANG ((BYTE)0x35)
#define IPP_TAG_OCT_NMEWITHLANG ((BYTE)0x36)
#define IPP_TAG_CHR_TEXT ((BYTE)0x41) // CharSet Dependent
#define IPP_TAG_CHR_NAME ((BYTE)0x42) // CharSet Dependent
#define IPP_TAG_CHR_KEYWORD ((BYTE)0x44) // US-ASCII
#define IPP_TAG_CHR_URI ((BYTE)0x45) // US-ASCII
#define IPP_TAG_CHR_URISCHEME ((BYTE)0x46) // US-ASCII
#define IPP_TAG_CHR_CHARSET ((BYTE)0x47) // US-ASCII
#define IPP_TAG_CHR_NATURAL ((BYTE)0x48) // US-ASCII
#define IPP_TAG_CHR_MEDIA ((BYTE)0x49) // US-ASCII
#define IPP_MANDITORY ((BYTE)0x00)
#define IPP_OPTIONAL ((BYTE)0x10)
#define IPP_MULTIPLE ((BYTE)0x20)
#define IPP_HIT ((BYTE)0x80)
/***********************************************\
* IPP Tag-Value Ranges
*
\***********************************************/
#define IS_TAG_DELIMITER(bTag) ((BOOL)((bTag >= 0x00) && (bTag <= 0x0F)))
#define IS_TAG_ATTRIBUTE(bTag) ((BOOL)((bTag >= 0x10) && (bTag <= 0xFF)))
#define IS_TAG_OUTBOUND(bTag) ((BOOL)((bTag >= 0x10) && (bTag <= 0x1F)))
#define IS_TAG_INTEGER(bTag) ((BOOL)((bTag >= 0x20) && (bTag <= 0x2F)))
#define IS_TAG_OCTSTR(bTag) ((BOOL)((bTag >= 0x30) && (bTag <= 0x3F)))
#define IS_TAG_CHRSTR(bTag) ((BOOL)((bTag >= 0x40) && (bTag <= 0x5F)))
#define IS_TAG_CHARSETSTR(bTag) ((BOOL)((bTag == 0x41) || (bTag == 0x42)))
#define IS_RANGE_DELIMITER(bTag) ((BOOL)((bTag >= 0x00) && (bTag <= 0x05)))
#define IS_TAG_COMPOUND(bTag) ((BOOL)((bTag == 0x35) || (bTag == 0x36)))
/***********************************************\
* IPP Request Flags
*
\***********************************************/
#define RA_JOBURI 0x00000001
#define RA_JOBID 0x00000002
#define RA_JOBSTATE 0x00000004
#define RA_JOBNAME 0x00000008
#define RA_JOBSIZE 0x00000010
#define RA_JOBUSER 0x00000020
#define RA_JOBPRIORITY 0x00000040
#define RA_JOBFORMAT 0x00000080
#define RA_JOBSTATE_REASONS 0x00000100
#define RA_JOBSTATE_MESSAGE 0x00000200
#define RA_JOBCOUNT 0x00000400
#define RA_SHEETSTOTAL 0x00000800
#define RA_SHEETSCOMPLETED 0x00001000
#define RA_PRNURI 0x00002000
#define RA_PRNSTATE 0x00004000
#define RA_PRNNAME 0x00008000
#define RA_PRNMAKE 0x00010000
#define RA_URISUPPORTED 0x00020000
#define RA_URISECURITY 0x00040000
#define RA_ACCEPTINGJOBS 0x00080000
#define RA_CHRSETCONFIGURED 0x00100000
#define RA_CHRSETSUPPORTED 0x00200000
#define RA_NATLNGCONFIGURED 0x00400000
#define RA_NATLNGSUPPORTED 0x00800000
#define RA_DOCDEFAULT 0x01000000
#define RA_DOCSUPPORTED 0x02000000
#define RA_PDLOVERRIDE 0x04000000
#define RA_UPTIME 0x08000000
#define RA_OPSSUPPORTED 0x10000001
#define RA_JOBKSUPPORTED 0x10000002
#define RA_JOBSCOMPLETED 0x10000004
#define RA_JOBSUNCOMPLETED 0x10000008
#define RA_TIMEATCREATION 0x10000010
#define IPP_REQALL_IDX 8
#define IPP_REQENU_IDX 9
#define IPP_REQJDSC_IDX 10
#define IPP_REQJTMP_IDX 11
#define IPP_REQPDSC_IDX 12
#define IPP_REQPTMP_IDX 13
#define IPP_REQCLEAR_IDX 14
#define IPP_REQALL ((DWORD)0x80000000)
#define IPP_REQENU ((DWORD)0x90000000)
#define IPP_REQJDSC ((DWORD)0xA0000000)
#define IPP_REQJTMP ((DWORD)0xB0000000)
#define IPP_REQPDSC ((DWORD)0xC0000000)
#define IPP_REQPTMP ((DWORD)0xD0000000)
#define IPP_REQCLEAR ((DWORD)0xE0000000)
/***********************************************\
* WebIppRcvData Return Codes
*
* Receive API codes. These are our internal
* return-codes for the WebIpp routines. They
* have no connection to the IPP spec, but are
* needed to let the caller know status of our
* IPP handler-routines.
*
\***********************************************/
#define WEBIPP_OK 0
#define WEBIPP_FAIL 1
#define WEBIPP_MOREDATA 2
#define WEBIPP_BADHANDLE 3
#define WEBIPP_NOMEMORY 4
/***********************************************\
* IPP Job/Printer Structures
*
* These are meant to provide additional
* information to the standard W32 Spooler
* structures.
*
\***********************************************/
typedef struct _JOB_INFO_IPP {
LPTSTR pPrnUri;
LPTSTR pJobUri;
DWORD cJobs;
} JOB_INFO_IPP;
typedef JOB_INFO_IPP *PJOB_INFO_IPP;
typedef JOB_INFO_IPP *LPJOB_INFO_IPP;
typedef struct _IPPJI2 {
JOB_INFO_2 ji2;
JOB_INFO_IPP ipp;
} IPPJI2;
typedef IPPJI2 *PIPPJI2;
typedef IPPJI2 *LPIPPJI2;
typedef struct _PRINTER_INFO_IPP {
LPTSTR pPrnUri;
LPTSTR pUsrName;
time_t dwPowerUpTime; // This stores the T0 time of the printer in UCT, it is intentionally
// signed so that we can support Printers who's T0 is smaller than
// our T0 (1 Jan 1970)
} PRINTER_INFO_IPP;
typedef PRINTER_INFO_IPP *PPRINTER_INFO_IPP;
typedef PRINTER_INFO_IPP *LPPRINTER_INFO_IPP;
typedef struct _IPPPI2 {
PRINTER_INFO_2 pi2;
PRINTER_INFO_IPP ipp;
} IPPPI2;
typedef IPPPI2 *PIPPPI2;
typedef IPPPI2 *LPIPPPI2;
/***********************************************\
* IPP Return Structures
*
* IPPRET_JOB - Job Information Response.
* IPPRET_PRN - Printer Information Response.
* IPPRET_ENUJOB - Enum-Job.
* IPPRET_AUTH - Authentication.
*
\***********************************************/
typedef struct _IPPRET_ALL {
DWORD cbSize; // Size of entire structure.
DWORD dwLastError; // LastError.
WORD wRsp; // Response Code.
BOOL bRet; // Return Code.
} IPPRET_ALL;
typedef IPPRET_ALL *PIPPRET_ALL;
typedef IPPRET_ALL *LPIPPRET_ALL;
typedef IPPRET_ALL *PIPPRET_AUTH;
typedef IPPRET_ALL *LPIPPRET_AUTH;
typedef struct _IPPRET_JOB {
DWORD cbSize; // Size of entire structure.
DWORD dwLastError; // LastError for failed calls.
WORD wRsp; // Response Code.
BOOL bRet; // Return code for job calls.
BOOL bValidate; // Is this only a validation request.
IPPJI2 ji; // Job-Information.
} IPPRET_JOB;
typedef IPPRET_JOB *PIPPRET_JOB;
typedef IPPRET_JOB *LPIPPRET_JOB;
typedef struct _IPPRET_PRN {
DWORD cbSize; // Size of entire structure.
DWORD dwLastError; // LastError for failed calls.
WORD wRsp; // Response Code.
BOOL bRet; // Return code for printer calls.
IPPPI2 pi; // Printer-Information.
} IPPRET_PRN;
typedef IPPRET_PRN *PIPPRET_PRN;
typedef IPPRET_PRN *LPIPPRET_PRN;
typedef struct _IPPRET_ENUJOB {
DWORD cbSize; // Size of entire structure (including enum-data).
DWORD dwLastError; // LastError for failed calls.
WORD wRsp; // Response Code.
BOOL bRet; // EnumJob/Get Return-Code.
DWORD cItems; // Number of items in enum.
DWORD cbItems; // Size of Enum Data.
LPIPPJI2 pItems; //
} IPPRET_ENUJOB;
typedef IPPRET_ENUJOB *PIPPRET_ENUJOB;
typedef IPPRET_ENUJOB *LPIPPRET_ENUJOB;
/***********************************************\
* IPP Request Structures
*
* IPPREQ_PRTJOB - Print-Job/Validate-Job.
* IPPREQ_ENUJOB - Enum-Job.
* IPPREQ_GETJOB - Get-Job.
* IPPREQ_SETJOB - Set-Job.
* IPPREQ_GETPRN - Get-Printer.
* IPPREQ_SETPRN - Set-Printer.
* IPPREQ_AUTH - Authentication.
*
\***********************************************/
typedef struct _IPPREQ_ALL {
DWORD cbSize; // Size of entire structure.
} IPPREQ_ALL;
typedef IPPREQ_ALL *PIPPREQ_ALL;
typedef IPPREQ_ALL *LPIPPREQ_ALL;
typedef IPPREQ_ALL IPPREQ_AUTH;
typedef IPPREQ_ALL *PIPPREQ_AUTH;
typedef IPPREQ_ALL *LPIPPREQ_AUTH;
typedef struct _IPPREQ_PRTJOB {
DWORD cbSize; // Size of entire structure.
BOOL bValidate; // Indicates whether this is only a validation.
LPTSTR pDocument; // Document name.
LPTSTR pUserName; // Requesting User name.
LPTSTR pPrnUri; // Printer Uri string.
} IPPREQ_PRTJOB;
typedef IPPREQ_PRTJOB *PIPPREQ_PRTJOB;
typedef IPPREQ_PRTJOB *LPIPPREQ_PRTJOB;
typedef struct _IPPREQ_SETJOB {
DWORD cbSize; // Size of entire structure.
DWORD dwCmd; // Job command.
DWORD idJob; // Job ID.
LPTSTR pPrnUri; // Job Uri.
} IPPREQ_SETJOB;
typedef IPPREQ_SETJOB *PIPPREQ_SETJOB;
typedef IPPREQ_SETJOB *LPIPPREQ_SETJOB;
typedef struct _IPPREQ_ENUJOB {
DWORD cbSize;
DWORD cJobs;
LPTSTR pPrnUri;
} IPPREQ_ENUJOB;
typedef IPPREQ_ENUJOB *PIPPREQ_ENUJOB;
typedef IPPREQ_ENUJOB *LPIPPREQ_ENUJOB;
typedef struct _IPPREQ_GETPRN {
DWORD cbSize;
DWORD dwAttr;
LPTSTR pPrnUri;
} IPPREQ_GETPRN;
typedef IPPREQ_GETPRN *PIPPREQ_GETPRN;
typedef IPPREQ_GETPRN *LPIPPREQ_GETPRN;
typedef struct _IPPREQ_GETJOB {
DWORD cbSize;
DWORD idJob;
LPTSTR pPrnUri;
} IPPREQ_GETJOB;
typedef IPPREQ_GETJOB *PIPPREQ_GETJOB;
typedef IPPREQ_GETJOB *LPIPPREQ_GETJOB;
typedef struct _IPPREQ_SETPRN {
DWORD cbSize;
DWORD dwCmd;
LPTSTR pUserName;
LPTSTR pPrnUri;
} IPPREQ_SETPRN;
typedef IPPREQ_SETPRN *PIPPREQ_SETPRN;
typedef IPPREQ_SETPRN *LPIPPREQ_SETPRN;
/***********************************************\
* IPP Attribute Structure.
*
\***********************************************/
typedef struct _IPPATTR {
BYTE bTag;
WORD cbName;
LPTSTR lpszName;
WORD cbValue;
LPVOID lpValue;
} IPPATTR;
typedef IPPATTR *PIPPATTR;
typedef IPPATTR *LPIPPATTR;
/***********************************************\
* IPP Error-Mappings
*
\***********************************************/
typedef struct _IPPERROR {
WORD wRsp;
DWORD dwLE;
PCTSTR pszStr;
} IPPERROR;
typedef IPPERROR *PIPPERROR;
typedef IPPERROR *LPIPPERROR;
/***********************************************\
* IPP Default-Error-Mappings
*
\***********************************************/
typedef struct _IPPDEFERROR {
DWORD dwLE;
WORD wRsp;
} IPPDEFERROR;
typedef IPPDEFERROR *PIPPDEFERROR;
typedef IPPDEFERROR *LPIPPDEFERROR;
#define IPPFLG_VALID 1
#define IPPFLG_CHARSET 2
#define IPPFLG_NATLANG 4
#define IPPFLG_USEFIDELITY 8
/***********************************************\
* IPP Object Structure.
*
\***********************************************/
typedef struct _IPPOBJ {
WORD wReq; // Open Request being processed.
WORD wError; // Used to store ipp errors during receive processing.
DWORD idReq; // Request Id.
UINT uCPRcv; // Codepage translation for receiving IPP Streams.
DWORD fState; //
DWORD cbIppMax; // Maximum size of hdr-Buffer.
DWORD cbIppHdr; // Current size of hdr-buffer data.
LPBYTE lpIppHdr; // Buffer to contain IPP-Stream-Header.
LPBYTE lpRawDta; // Aligned (temporary) data buffer.
LPWEBLST pwlUns; // Unsupported attributes list.
DWORD fReq[IPPOBJ_MASK_SIZE];
} IPPOBJ;
typedef IPPOBJ *PIPPOBJ;
typedef IPPOBJ *LPIPPOBJ;
/***********************************************\
* Request Info
*
\***********************************************/
typedef struct _REQINFO {
DWORD idReq;
UINT cpReq;
PWEBLST pwlUns;
BOOL bFidelity;
DWORD fReq[IPPOBJ_MASK_SIZE];
} REQINFO;
typedef REQINFO *PREQINFO;
typedef REQINFO *LPREQINFO;
/***********************************************\
* TypeDefs
*
\***********************************************/
typedef DWORD (*PFNRET)(LPIPPOBJ lpObj, LPBYTE* lplpRawHdr, LPDWORD lpcbRawHdr);
/***********************************************\
* IPP Attribute Structre (X)
*
\***********************************************/
typedef struct _IPPATTRX {
BYTE bTag;
DWORD fReq;
int nVal;
LPCTSTR pszNam;
LPVOID pvVal;
} IPPATTRX;
typedef IPPATTRX *PIPPATTRX;
typedef IPPATTRX *LPIPPATTRX;
/***********************************************\
* IPP Attribute Structre (Y)
*
\***********************************************/
typedef struct _IPPATTRY {
LPSTR pszNam;
DWORD cbNam;
LPSTR pszVal;
DWORD cbVal;
} IPPATTRY;
typedef IPPATTRY *PIPPATTRY;
typedef IPPATTRY *LPIPPATTRY;
/***********************************************\
* IPP Conversion Structure
*
\***********************************************/
typedef struct _IPPSNDRCV {
WORD wReq;
PBYTE pbReqForm;
PBYTE pbRspForm;
LPIPPATTRX paReq;
DWORD cbReq;
LPIPPATTRX paRsp;
DWORD cbRsp;
PFNRET pfnRcvRet;
} IPPSNDRCV;
typedef IPPSNDRCV *PIPPSNDRCV;
typedef IPPSNDRCV *LPIPPSNDRCV;
/***********************************************\
* Flag/String Structure.
*
\***********************************************/
typedef struct _FLGSTR {
DWORD fFlag;
LPCTSTR pszStr;
} FLGSTR;
typedef FLGSTR *PFLGSTR;
typedef FLGSTR *LPFLGSTR;
/************************************************
** Definition of Allocator (for outside functions)
************************************************/
typedef LPVOID (*ALLOCATORFN)(DWORD cb);
/***********************************************\
* WebIpp Object routines.
*
\***********************************************/
DWORD WebIppSndData(
WORD wReq,
LPREQINFO lpri,
LPBYTE lpDta,
DWORD cbDta,
LPBYTE* lpOut,
LPDWORD lpcbOut);
HANDLE WebIppRcvOpen(
WORD);
DWORD WebIppRcvData(
HANDLE hIpp,
LPBYTE lpData,
DWORD cbData,
LPBYTE *lplpHdr,
LPDWORD lpdwHdr,
LPBYTE *lplpDta,
LPDWORD lpdwDta);
BOOL WebIppRcvClose(
HANDLE hIpp);
WORD WebIppGetError(
HANDLE hIpp);
WORD WebIppLeToRsp(
DWORD dwLastError);
DWORD WebIppRspToLe(
WORD wRsp);
BOOL WebIppGetReqInfo(
HANDLE hIpp,
LPREQINFO lpri);
BOOL WebIppFreeMem(
LPVOID lpMem);
LPIPPJI2 WebIppCvtJI2toIPPJI2(
IN LPCTSTR lpszJobBase,
IN OUT LPDWORD lpcbJobs,
IN DWORD cJobs,
IN LPJOB_INFO_2 lpJI2Src);
LPJOB_INFO_2 WebIppPackJI2(
IN LPJOB_INFO_2 lpji2,
OUT LPDWORD lpcbSize,
IN ALLOCATORFN pfnAlloc
);
/***********************************************\
* Request Creation Routines
*
\***********************************************/
PIPPREQ_PRTJOB WebIppCreatePrtJobReq(
BOOL bValidate,
LPCTSTR lpszUser,
LPCTSTR lpszDoc,
LPCTSTR lpszPrnUri);
PIPPREQ_ENUJOB WebIppCreateEnuJobReq(
DWORD cJobs,
LPCTSTR lpszPrnUri);
PIPPREQ_SETJOB WebIppCreateSetJobReq(
DWORD idJob,
DWORD dwCmd,
LPCTSTR lpszPrnUri);
PIPPREQ_GETJOB WebIppCreateGetJobReq(
DWORD idJob,
LPCTSTR lpszPrnUri);
PIPPREQ_GETPRN WebIppCreateGetPrnReq(
DWORD dwAttr,
LPCTSTR lpszPrnUri);
PIPPREQ_SETPRN WebIppCreateSetPrnReq(
DWORD dwCmd,
LPCTSTR lpszPrnName,
LPCTSTR lpszPrnUri);
PIPPREQ_AUTH WebIppCreateAuthReq(VOID);
/***********************************************\
* Response Creation Routines
*
\***********************************************/
PIPPRET_JOB WebIppCreateJobRet(
WORD wRsp,
BOOL bRet,
BOOL bValidate,
LPJOB_INFO_2 lpji2,
LPJOB_INFO_IPP lpipp);
PIPPRET_PRN WebIppCreatePrnRet(
WORD wRsp,
BOOL bRet,
LPPRINTER_INFO_2 lppi2,
LPPRINTER_INFO_IPP lpipp);
PIPPRET_ENUJOB WebIppCreateEnuJobRet(
WORD wRsp,
BOOL bRet,
DWORD cbJobs,
DWORD cJobs,
LPIPPJI2 lpbJobs);
PIPPRET_ALL WebIppCreateBadRet(
WORD wRsp,
BOOL bRet);
PIPPRET_AUTH WebIppCreateAuthRet(
WORD wRsp,
BOOL bRet);
BOOL WebIppConvertSystemTime(
IN OUT LPSYSTEMTIME pSystemTime,
IN time_t dwPrinterT0);
#ifdef UNICODE
#define WEB_IPP_ASSERT(Expr) ASSERT(Expr)
#else
#define WEB_IPP_ASSERT(Expr) // Need to figure out what to do here
#endif
#ifdef __cplusplus // Place this here to prevent decorating of symbols
} // when doing C++ stuff.
#endif //
#endif