/* $Xorg: Printstr.h,v 1.3 2000/08/18 04:05:44 coskrey Exp $ */
/******************************************************************************
 ******************************************************************************
 **
 ** File:         Printstr.h
 **
 ** Description: Definitions needed by the server and library, but
 **              not clients.
 **
 **              Print.h for server, library and clients.
 **
 ******************************************************************************
 **
 ** (c) Copyright 1996 Hewlett-Packard Company
 ** (c) Copyright 1996 International Business Machines Corp.
 ** (c) Copyright 1996 Sun Microsystems, Inc.
 ** (c) Copyright 1996 Novell, Inc.
 ** (c) Copyright 1996 Digital Equipment Corp.
 ** (c) Copyright 1996 Fujitsu Limited
 ** (c) Copyright 1996 Hitachi, Ltd.
 **
 ** Permission is hereby granted, free of charge, to any person obtaining a copy
 ** of this software and associated documentation files (the "Software"), to deal
 ** in the Software without restriction, including without limitation the rights
 ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 ** copies of the Software, and to permit persons to whom the Software is
 ** furnished to do so, subject to the following conditions:
 **
 ** The above copyright notice and this permission notice shall be included in
 ** all copies or substantial portions of the Software.
 **
 ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 ** COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 ** IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 ** CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 **
 ** Except as contained in this notice, the names of the copyright holders shall
 ** not be used in advertising or otherwise to promote the sale, use or other
 ** dealings in this Software without prior written authorization from said
 ** copyright holders.
 **
 ******************************************************************************
 *****************************************************************************/
/* $XFree86: xc/include/extensions/Printstr.h,v 1.5 2001/08/01 00:44:35 tsi Exp $ */


#ifndef _XpPrintstr_H_
#define _XpPrintstr_H_

/*
 * NEED_EVENTS and NEED_REPLIES are hacks to limit the linker symbol-table
 * size.   When function prototypes are needed from Print.h, this sets up
 * a cascading dependency on Printstr.h and eventually Xproto.h to provide
 * the event and reply struct definitions.
 */
#ifndef NEED_EVENTS
#define NEED_EVENTS
#endif /* NEED_EVENTS */

#define NEED_REPLIES

#include <X11/Xproto.h>
#ifndef _XP_PRINT_SERVER_
#include <X11/Xlib.h>
#endif /* _XP_PRINT_SERVER_ */

/*
 * Pull in other definitions.  Print.h will hide some things if we're
 * doing server side work.
 */
#include <X11/extensions/Print.h>

#include <X11/Xfuncproto.h>

_XFUNCPROTOBEGIN

/******************************************************************************
 *
 * Protocol requests constants and alignment values
 *
 * Note: Xlib macro's expect X_ABC where ABC is the name of the
 * protocol request.
 */
#define X_PrintQueryVersion		0
#define X_PrintGetPrinterList		1
#define X_PrintCreateContext		2
#define X_PrintSetContext		3
#define X_PrintGetContext		4
#define X_PrintDestroyContext		5
#define X_PrintGetContextScreen		6
#define X_PrintStartJob			7
#define X_PrintEndJob			8
#define X_PrintStartDoc			9
#define X_PrintEndDoc			10
#define X_PrintPutDocumentData		11
#define X_PrintGetDocumentData		12
#define X_PrintStartPage		13
#define X_PrintEndPage			14
#define X_PrintSelectInput		15
#define X_PrintInputSelected		16
#define X_PrintGetAttributes		17
#define X_PrintSetAttributes		18
#define X_PrintGetOneAttribute		19
#define X_PrintRehashPrinterList	20
#define X_PrintGetPageDimensions	21
#define X_PrintQueryScreens		22
#define X_PrintSetImageResolution	23
#define X_PrintGetImageResolution	24

/********************************************************************
 *
 * Protocol data types
 */
#define PCONTEXT CARD32
#define WINDOW   CARD32
#define DRAWABLE CARD32
#define BITMASK  CARD32

/******************************************************************************
 *
 * Event wire struct definitions
 *
 * Note: Xlib macro's expect xABC struct names and sz_xABC size
 * constants where ABC is the name of the protocol request.
 */


/*********************************************************************
 *
 * Events.
 *
 * See Print.h for the protocol "type" values.
 */
typedef struct _xPrintPrintEvent {
	BYTE type;		/* XPPrintNotify + extEntry->eventBase */
	BYTE detail;		/* XPStartJobNotify, XPEndJobNotify,
				   XPStartDocNotify, XPEndDocNotify,
				   XPStartPageNotify, XPEndPageNotify */
	CARD16 sequenceNumber B16;
	PCONTEXT printContext B32; /* print context */
	BOOL   cancel;		/* canceled flag */
	CARD8  pad1;		/* rest is unused */
	CARD16 pad2 B16;
	CARD32 pad3 B32;
	CARD32 pad4 B32;
	CARD32 pad5 B32;
	CARD32 pad6 B32;
	CARD32 pad7 B32;
} xPrintPrintEvent;
#define sz_xPrintPrintEvent 32;

typedef struct _xPrintAttributeEvent {
	BYTE   type;		/* XPAttributeNotify + extEntry->eventBase */
	BYTE   detail;		/* XPJobAttr, XPDocAttr, XPPageAttr,
				   XPPrinterAttr, XPSpoolerAttr,
				   XPMediumAttr, XPServerAttr */
	CARD16 sequenceNumber B16;
	PCONTEXT printContext B32; /* print context */
	CARD32 pad1 B32;
	CARD32 pad2 B32;
	CARD32 pad3 B32;
	CARD32 pad4 B32;
	CARD32 pad5 B32;
	CARD32 pad6 B32;
} xPrintAttributeEvent;
#define sz_xPrintAttributeEvent 32;


/*********************************************************************
 *
 * Requests
 */
typedef struct _PrintQueryVersion {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintQueryVersion */
	CARD16	length B16;
} xPrintQueryVersionReq;
#define sz_xPrintQueryVersionReq	4

typedef struct {
	BYTE	type;			/* X_Reply */
	CARD8	unused;			/* not used */
	CARD16	sequenceNumber B16;
	CARD32	length B32;
	CARD16	majorVersion B16;	/* major version of Xp protocol */
	CARD16	minorVersion B16;	/* minor version of Xp protocol */
	CARD32	pad1 B32;
	CARD32	pad2 B32;
	CARD32	pad3 B32;
	CARD32	pad4 B32;
	CARD32	pad5 B32;
} xPrintQueryVersionReply;
#define sz_xPrintQueryVersionReply	32


typedef struct _PrintGetPrinterList {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintGetPrinterList */
	CARD16	length B16;
	CARD32	printerNameLen B32;	/* length of printer name */
	CARD32	localeLen B32;		/* length of locale string */

	/* variable portion *****************************************
	STRING8	printerName;		 * printer name *
	BYTE	pad(printerNameLen)	 * unused *
	STRING8	locale;			 * locale *
	BYTE	pad(localeLen)		 * unused *
	************************************************************/
} xPrintGetPrinterListReq;
#define sz_xPrintGetPrinterListReq	12

typedef struct {
	BYTE	type;			/* X_Reply */
	CARD8	unused;			/* not used */
	CARD16	sequenceNumber B16;
	CARD32	length B32;
	CARD32	listCount B32;		/* of PRINTER recs below */
	CARD32	pad1 B32;
	CARD32	pad2 B32;
	CARD32	pad3 B32;
	CARD32	pad4 B32;
	CARD32	pad5 B32;

	/* variable portion *****************************************
	CARD32	nameLen B32;		* length of name in bytes *
	STRING8	name;			* name *
	BYTE	pad(nameLen)		* unused *

	CARD32	descLen B32;		* length of desc in bytes *
	STRING8	desc;			* localized description *
	BYTE	pad(descLen)		* unused *
	************************************************************/
} xPrintGetPrinterListReply;
#define sz_xPrintGetPrinterListReply	32


typedef struct _PrintRehashPrinterList {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintRehashPrinterList */
	CARD16	length B16;
} xPrintRehashPrinterListReq;
#define sz_xPrintRehashPrinterListReq	4


typedef struct _PrintCreateContext {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintInitSetContext */
	CARD16	length B16;
	CARD32	contextID B32;		/* ID for context */
	CARD32	printerNameLen B32;	/* length of printerName in bytes */
	CARD32	localeLen B32;		/* length of locale in bytes */

	/* variable portion *****************************************
	STRING8	printerName		 * printer name *
	BYTE	pad(printerNameLen)	 * unused *
	STRING8	locale			 * locale *
	BYTE	pad(locale)		 * unused *
	************************************************************/
} xPrintCreateContextReq;
#define sz_xPrintCreateContextReq	16


typedef struct _PrintSetContext {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintSetContext */
	CARD16	length B16;
	PCONTEXT printContext B32;	/* print context */
} xPrintSetContextReq;
#define sz_xPrintSetContextReq		8


typedef struct _PrintGetContext {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintGetContext */
	CARD16	length B16;
} xPrintGetContextReq;
#define sz_xPrintGetContextReq		4

typedef struct {
	BYTE	type;			/* X_Reply */
	CARD8	unused;			/* not used */
	CARD16	sequenceNumber B16;
	CARD32	length B32;
	PCONTEXT printContext B32;	/* print context */
	CARD32	pad1 B32;
	CARD32	pad2 B32;
	CARD32	pad3 B32;
	CARD32	pad4 B32;
	CARD32	pad5 B32;
} xPrintGetContextReply;
#define sz_xPrintGetContextReply	32


typedef struct _PrintDestroyContext {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintDestroyContext */
	CARD16	length B16;
	PCONTEXT printContext B32;	/* print context */
} xPrintDestroyContextReq;
#define sz_xPrintDestroyContextReq	8


typedef struct _PrintGetContextScreen {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintGetContextScreen */
	CARD16	length B16;
	PCONTEXT printContext B32;	/* print context */
} xPrintGetContextScreenReq;
#define sz_xPrintGetContextScreenReq	8

typedef struct {
	BYTE	type;			/* X_Reply */
	CARD8	unused;			/* not used */
	CARD16	sequenceNumber B16;
	CARD32	length B32;
	WINDOW  rootWindow;		/* screenPtr represented as rootWin */
	CARD32	pad1 B32;
	CARD32	pad2 B32;
	CARD32	pad3 B32;
	CARD32	pad4 B32;
	CARD32	pad5 B32;
} xPrintGetContextScreenReply;
#define sz_xPrintGetContextScreenReply	32


typedef struct _PrintStartJob {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintStartJob */
	CARD16	length B16;
	CARD8	saveData;		/* save data boolean */
	CARD8	pad1;
	CARD16	pad2 B16;
} xPrintStartJobReq;
#define sz_xPrintStartJobReq		8

typedef struct _PrintEndJob {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintEndJob */
	CARD16	length B16;
	BOOL	cancel;			/* cancel boolean */
	CARD8	pad1;
	CARD16	pad2 B16;
} xPrintEndJobReq;
#define sz_xPrintEndJobReq		8


typedef struct _PrintStartDoc {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintStartDoc */
	CARD16	length B16;
	CARD8	type;			/* type for document */
	CARD8	pad1;
	CARD16	pad2 B16;
} xPrintStartDocReq;
#define sz_xPrintStartDocReq		8

typedef struct _PrintEndDoc {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintEndDoc */
	CARD16	length B16;
	BOOL	cancel;			/* cancel boolean */
	CARD8	pad1;
	CARD16	pad2 B16;
} xPrintEndDocReq;
#define sz_xPrintEndDocReq		8


typedef struct _PrintPutDocumentData {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintPutDocumentData */
	CARD16	length B16;
	DRAWABLE drawable B32;		/* target drawable */
	CARD32	len_data B32;		/* big len in bytes */
	CARD16	len_fmt;		/* len in bytes */
	CARD16	len_options;		/* len in bytes */

	/* variable portion *****************************************
	LISTofBYTE	data;		 * data *
	BYTE		pad(len_data)	 * unused *
	STRING8		doc_fmt;	 * ISO compliant desc of data type *
	BYTE		pad(len_fmt)	 * unused *
	STRING8		options;	 * additional device-dependent desc *
	BYTE		pad(len_options) * unused *
	************************************************************/
} xPrintPutDocumentDataReq;
#define sz_xPrintPutDocumentDataReq	16


typedef struct _PrintGetDocumentData {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintGetDocumentData */
	CARD16	length B16;
	PCONTEXT printContext B32;	/* print context */
	CARD32	maxBufferSize B32;	/* maximum buffer size requested */
} xPrintGetDocumentDataReq;
#define sz_xPrintGetDocumentDataReq	12

typedef struct {
	BYTE	type;			/* X_Reply */
	CARD8	unused;			/* not used */
	CARD16	sequenceNumber B16;
	CARD32	length B32;
	CARD32	statusCode B32;		/* status code for reply */
	CARD32	finishedFlag B32;	/* is this the last reply */
	CARD32	dataLen B32;		/* data length */
	CARD32	pad1 B32;
	CARD32	pad2 B32;
	CARD32	pad3 B32;

	/* variable portion *****************************************
	LISTofBYTE	data;		 * data *
	BYTE		pad(count)	 * unused *
	************************************************************/
} xPrintGetDocumentDataReply;
#define sz_xPrintGetDocumentDataReply	32


typedef struct _PrintStartPage {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintStartPage */
	CARD16	length B16;
	WINDOW	window B32;		/* window */
} xPrintStartPageReq;
#define sz_xPrintStartPageReq		8

typedef struct _PrintEndPage {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintEndPage */
	CARD16	length B16;
	BOOL	cancel;			/* cancel boolean */
	CARD8	pad1;
	CARD16	pad2 B16;
} xPrintEndPageReq;
#define sz_xPrintEndPageReq		8


typedef struct _PrintSelectInput {
        CARD8   reqType;        	/* always PrintReqCode */
	CARD8   printReqType;		/* always X_PrintSelectInput */
	CARD16	length B16;
	PCONTEXT printContext B32;	/* print context */
	BITMASK	eventMask B32;
} xPrintSelectInputReq;
#define sz_xPrintSelectInputReq		12


typedef struct _PrintInputSelected {
        CARD8   reqType;        	/* always PrintReqCode */
	CARD8   printReqType;		/* always X_PrintInputSelected */
	CARD16	length B16;
	PCONTEXT printContext B32;	/* print context */
} xPrintInputSelectedReq;
#define sz_xPrintInputSelectedReq	8

typedef struct {
	BYTE	type;			/* X_Reply */
	CARD8	unused;			/* not used */
	CARD16	sequenceNumber B16;
	CARD32	length B32;
	BITMASK	eventMask B32;		/* your event mask */
	BITMASK	allEventsMask B32;	/* all event mask */
	CARD32	pad1 B32;
	CARD32	pad2 B32;
	CARD32	pad3 B32;
	CARD32	pad4 B32;
} xPrintInputSelectedReply;
#define sz_xPrintInputSelectedReply	32

typedef struct _PrintGetAttributes {
        CARD8   reqType;        	/* always PrintReqCode */
	CARD8   printReqType;		/* always X_PrintGetAttributes */
	CARD16	length B16;
	PCONTEXT printContext B32;	/* print context */
        CARD8   type;			/* type */
        CARD8   pad1;			/* unused */
        CARD16  pad2 B16;		/* unused */
} xPrintGetAttributesReq;
#define sz_xPrintGetAttributesReq	12

typedef struct {
	BYTE	type;			/* X_Reply */
	CARD8	unused;			/* not used */
	CARD16	sequenceNumber B16;
	CARD32	length B32;
	CARD32	stringLen B32;		/* length of xrm db string */
	CARD32	pad1 B32;
	CARD32	pad2 B32;
	CARD32	pad3 B32;
	CARD32	pad4 B32;
	CARD32	pad5 B32;

        /* variable portion *****************************************
	STRING8	string;                  * xrm db as a string *
	BYTE	pad(stringLen)           * unused *
        ************************************************************/
} xPrintGetAttributesReply;
#define sz_xPrintGetAttributesReply	32


typedef struct _PrintSetAttributes {
        CARD8   reqType;        	/* always PrintReqCode */
	CARD8   printReqType;		/* always X_PrintSetAttributes */
	CARD16	length B16;
	PCONTEXT printContext B32;	/* print context */
	CARD32	stringLen B32;		/* length of xrm db string */
        CARD8   type;                   /* type */
	CARD8   rule;			/* replacement rule */
	CARD16  pad1 B16;		/* unused */

        /* variable portion *****************************************
	STRING8	string;                  * xrm db as a string *
	BYTE	pad(stringLen)           * unused *
        ************************************************************/
} xPrintSetAttributesReq;
#define sz_xPrintSetAttributesReq	16


typedef struct _PrintGetOneAttribute {
        CARD8   reqType;        	/* always PrintReqCode */
	CARD8   printReqType;		/* always X_PrintGetOneAttribute */
	CARD16	length B16;
	PCONTEXT printContext B32;	/* print context */
	CARD32	nameLen;		/* length of name string */
        CARD8   type;			/* type */
        CARD8   pad1;			/* unused */
        CARD16  pad2 B16;		/* unused */

        /* variable portion *****************************************
	STRING8	name;			 * name as a string *
	BYTE	pad(name)		 * unused *
        ************************************************************/
} xPrintGetOneAttributeReq;
#define sz_xPrintGetOneAttributeReq	16

typedef struct {
	BYTE	type;			/* X_Reply */
	CARD8	unused;			/* not used */
	CARD16	sequenceNumber B16;
	CARD32	length B32;
	CARD32	valueLen B32;		/* length of value string */
	CARD32	pad1 B32;
	CARD32	pad2 B32;
	CARD32	pad3 B32;
	CARD32	pad4 B32;
	CARD32	pad5 B32;

        /* variable portion *****************************************
	STRING8	value;			 * value as a string *
	BYTE	pad(value)		 * unused *
        ************************************************************/
} xPrintGetOneAttributeReply;
#define sz_xPrintGetOneAttributeReply	32


typedef struct _PrintGetPageDimensions {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintGetPageDimensions */
	CARD16	length B16;
	PCONTEXT printContext B32;	/* print context */
} xPrintGetPageDimensionsReq;
#define sz_xPrintGetPageDimensionsReq	8

typedef struct {
	BYTE	type;			/* X_Reply */
	CARD8	unused;			/* not used */
	CARD16	sequenceNumber B16;
	CARD32	length B32;
	CARD16	width;			/* total pixel width */
	CARD16	height;			/* total pixel height */
	CARD16	rx;			/* reproducable x pixel offset */
	CARD16	ry;			/* reproducable y pixel offset */
	CARD16	rwidth;			/* reproducable x pixel width */
	CARD16	rheight;		/* reproducable y pixel width */
	CARD32	pad1 B32;
	CARD32	pad2 B32;
	CARD32	pad3 B32;
} xPrintGetPageDimensionsReply;
#define sz_xPrintGetPageDimensionsReply	32


typedef struct _PrintQueryScreens {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintQueryScreens */
	CARD16	length B16;
} xPrintQueryScreensReq;
#define sz_xPrintQueryScreensReq	4

typedef struct {
	BYTE	type;			/* X_Reply */
	CARD8	unused;			/* not used */
	CARD16	sequenceNumber B16;
	CARD32	length B32;
	CARD32	listCount;		/* number of screens following */
	CARD32	pad1 B32;
	CARD32	pad2 B32;
	CARD32	pad3 B32;
	CARD32	pad4 B32;
	CARD32	pad5 B32;

        /* variable portion *****************************************
	WINDOW	rootWindow;		 * root window of screen *
        ************************************************************/
} xPrintQueryScreensReply;
#define sz_xPrintQueryScreensReply	32

typedef struct _PrintSetImageResolution {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintSetImageResolution */
	CARD16	length B16;
	PCONTEXT printContext B32;	/* print context */
	CARD16 imageRes B16;		/* image resolution */
	CARD16 pad1 B16;
} xPrintSetImageResolutionReq;
#define sz_xPrintSetImageResolutionReq	12

typedef struct {
	BYTE	type;			/* X_Reply */
	BOOL	status;			/* accepted or not */
	CARD16	sequenceNumber B16;
	CARD32	length B32;
	CARD16	prevRes B16;		/* previous resolution */
	CARD16	pad1 B32;
	CARD32	pad2 B32;
	CARD32	pad3 B32;
	CARD32	pad4 B32;
	CARD32	pad5 B32;
	CARD32	pad6 B32;
} xPrintSetImageResolutionReply;
#define sz_xPrintSetImageResolutionReply 32

typedef struct _PrintGetImageResolution {
	CARD8	reqType;		/* always PrintReqCode */
	CARD8	printReqType;		/* always X_PrintGetImageResolution */
	CARD16	length B16;
	PCONTEXT printContext B32;	/* print context */
} xPrintGetImageResolutionReq;
#define sz_xPrintGetImageResolutionReq	8

typedef struct {
	BYTE	type;			/* X_Reply */
	CARD8	unused;
	CARD16	sequenceNumber B16;
	CARD32	length B32;
	CARD16	imageRes B16;		/* image resolution */
	CARD16	pad1 B32;
	CARD32	pad2 B32;
	CARD32	pad3 B32;
	CARD32	pad4 B32;
	CARD32	pad5 B32;
	CARD32	pad6 B32;
} xPrintGetImageResolutionReply;
#define sz_xPrintGetImageResolutionReply 32

#ifndef _XP_PRINT_SERVER_
/***********************************************************************
 *
 * Library-only definitions.
 */
extern XPHinterProc  _xp_hinter_proc;
extern char         *_xp_hinter_desc;
extern int           _xp_hinter_init;

#else /* _XP_PRINT_SERVER_ */

/***********************************************************************
 *
 * Server-only definitions shared between the extension and DDX layers.
 *
 */

/*
 * Internal return code used to indicate that the requesting
 * client has been suspended.
 */
#define Suspended 84

struct _XpContext;

extern void XpRegisterPrinterScreen(
    ScreenPtr pScreen,
    int (*CreateContext)(struct _XpContext *));

typedef struct _xpprintFuncs {
    int (*StartJob)(
	struct _XpContext *	/* pContext */,
	Bool			/* sendClientData */,
	ClientPtr		/* client */);
    int (*EndJob)(struct _XpContext *, int);
    int (*StartDoc)(
	struct _XpContext *	/* pContext */,
	XPDocumentType		/* type */);
    int (*EndDoc)(struct _XpContext *, int);
    int (*StartPage)(
	struct _XpContext *	/* pContext */,
	WindowPtr		/* pWin */);
    int (*EndPage)(
	struct _XpContext *	/* pContext */,
	WindowPtr		/* pWin */);
    int (*PutDocumentData)(
	struct _XpContext *	/* pContext */,
	DrawablePtr		/* pDraw */,
	char *			/* pData */,
	int			/* len_data */,
	char *			/* pDoc_fmt */,
	int			/* len_fmt */,
	char *			/* pOptions */,
	int			/* len_options */,
	ClientPtr		/* client */);
    int (*GetDocumentData)(
	struct _XpContext *	/* pContext */,
	ClientPtr		/* client */,
	int			/* maxBufferSize */);
    int (*DestroyContext)(
	struct _XpContext *);	/* pContext */
    char *(*GetAttributes)(
	struct _XpContext *,
	XPAttributes 		/* pool */);
    char *(*GetOneAttribute)(
	struct _XpContext *	/* pContext */,
	XPAttributes 		/* pool */,
	char *			/* attrs */);
    int (*SetAttributes)(
	struct _XpContext *	/* pContext */,
	XPAttributes 		/* pool */,
	char *			/* attrs */);
    int (*AugmentAttributes)(
	struct _XpContext *	/* pContext */,
	XPAttributes 		/* pool */,
	char *			/* attrs */);
    int (*GetMediumDimensions)(
	struct _XpContext *	/* pPrintContext */,
	CARD16 *		/* pWidth */,
	CARD16 *		/* pHeight */);
    int (*GetReproducibleArea)(
	struct _XpContext *	/* pPrintContext */,
	xRectangle *		/* pRect */);
    int (*SetImageResolution)(
	struct _XpContext *	/* pPrintContext */,
	int			/* imageRes */,
	Bool *			/* pStatus */);
} XpDriverFuncs, *XpDriverFuncsPtr;

/*
 * Each print context is represented by one of the following structs
 * associated with a resource ID of type RTcontext .  A pointer to
 * the context is placed in the Xp extension's devPrivates
 * element in each client * which establishes a context via
 * either initContext or setContext.
 * The context pointer is also placed in the struct indicated by the
 * RTpage resource associated with each StartPage'd window.
 */
typedef struct _XpContext {
        XID contextID;
        char *printerName;
        int screenNum;          /* screen containing the printer */
        struct _XpClient *clientHead; /* list of clients */
        CARD32 state;
        VisualID pageWin;
        DevUnion *devPrivates;
        XpDriverFuncs funcs;
	ClientPtr clientSlept;
	int imageRes;
} XpContextRec, *XpContextPtr;

#include <X11/fonts/fontstruct.h>	/* FontResolutionPtr */

extern Bool XpAllocateContextPrivate(int, unsigned);
extern FontResolutionPtr XpGetClientResolutions(ClientPtr, int *);
extern XpContextPtr XpContextOfClient(ClientPtr);
extern XpContextPtr XpGetPrintContext(ClientPtr);
extern int XpAllocateContextPrivateIndex(void);
extern int XpRehashPrinterList(void);
extern void XpSetFontResFunc(ClientPtr);
extern void XpUnsetFontResFunc(ClientPtr);
extern void XpRegisterInitFunc(ScreenPtr, char *, int (*)(struct _XpContext *));

#endif /* _XP_PRINT_SERVER_ */

_XFUNCPROTOEND

#endif /* _XpPrintstr_H_ */
