/* $Xorg: Print.h,v 1.3 2000/08/18 04:05:44 coskrey Exp $ */
/******************************************************************************
 ******************************************************************************
 **
 ** File:         Print.h
 **
 ** Description:  Definitions needed by the server, library, and
 **               clients.  Subportion restricted to library and
 **               clients.
 **
 **               Server, Library, Client portion has:
 **                  o All sz_* defines
 **                  o Revision and Name defines
 **                  o Common defines and constants (e.g. Keywords, Masks)
 **                  o Extension version structure
 **               
 **               Library and client subportion has:
 **                  o Convience Marcos
 **                  o Client side data structures
 **                  o Client side event structures (non wire)
 **                  o Library function prototypes
 **                  o some private stuff denoted with _whatever
 **
 **               Printstr.h for server and library, but NOT 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/Print.h,v 1.4 2000/01/25 18:37:31 dawes Exp $ */

#ifndef _XpPrint_H_
#define _XpPrint_H_

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

#include <X11/Xfuncproto.h>

_XFUNCPROTOBEGIN

/******************************************************************************
 *
 * Definitions used by the server, library and client.
 */

/********************************************************************
 *
 * Naming and versioning information.
 */
#define XP_PRINTNAME  "XpExtension"

/*
 * Add a define below for each major extension release.
 */
#define XP_DONT_CHECK		0
#define XP_INITIAL_RELEASE	1

/*
 * For each single entry above, create one major/minor pair.
 */
#define XP_PROTO_MAJOR		1
#define XP_PROTO_MINOR		0

/*
 * Identify current version.
 */
#define XP_MAJOR_VERSION	XP_PROTO_MAJOR
#define XP_MINOR_VERSION	XP_PROTO_MINOR

/*
 * Misc version defines.
 */
#define XP_ABSENT		0	/* Prior to XP Print support */
#define XP_PRESENT		1	/* With XP Print support */

/********************************************************************
 *
 * Xp Print Error codes.
 */
#define XP_ERRORS		3	/* number of error types */

#define XPBadContext		0	/* Print Context invalid or missing */
#define XPBadSequence		1	/* Illegal sequence of XP operations */
#define XPBadResourceID		2	/* X-resource not valid */

/********************************************************************
 *
 * Xp Print Event masks and codes.
 *
 */
#define XP_EVENTS		2	/* number of event types */

#define XPNoEventMask		0	/* not an event - just a null mask */
#define XPPrintMask		(1L<<0)
#define XPAttributeMask		(1L<<1)

#define XPPrintNotify		0	/* contains "detail" - see below */
#define XPAttributeNotify	1	/* contains "detail" - see below */

#define XPStartJobNotify	0	/* value for "detail" in XPPrintNotify*/
#define XPEndJobNotify		1
#define XPStartDocNotify	2
#define XPEndDocNotify		3
#define XPStartPageNotify	4
#define XPEndPageNotify		5

/********************************************************************
 *
 * Xp Print Attribute Object codes (subset of ISO DPA 10175).  The
 * Xp Server can get and set any of the values, while the Xp Library
 * may only be able to set a subset of the attribute objects.
 *
 * note: the codes are also used as "detail" for XPAttributeNotify
 *
 * note: XPPageAttr is not defined in ISO DPA 10175.  It is unique
 * to Xp, and its attributes are a proper subset of XPDocAttr.
 */
typedef unsigned char XPAttributes;	/* type of Xp*Attr codes */

#define XP_ATTRIBUTES		5	/* those attrs currently supported */

#define XPJobAttr		1	/* get/set */
#define XPDocAttr		2	/* get/set */
#define XPPageAttr		3	/* get/set - subset of XPDocAttr */
#define XPPrinterAttr		4	/* get only (library) */
#define XPServerAttr		5	/* get only (library), no
					   context needed */

/*
 * note: ISO DPA 10175 defines a number of "attribute objects", of
 *       which POSIX 1387.4 and the SI Xp will only support a
 *       subset.
 */
#define XPMediumAttr		6	/* DPA-Object Medium */
#define XPFontAttr		7	/* DPA-Object Font */
#define XPResAttr		8	/* DPA-Object Resource */
#define XPTransAttr		9	/* DPA-Object Transfer method */
#define XPDelAttr		10	/* DPA-Object Delivery method */
#define XPAuxSPkg		11	/* DPA-Object Auxiliary sheet package */
#define XPAuxS			12	/* DPA-Object Auxiliary sheet */
#define XPFinishAttr		13	/* DPA-Object Finishing */
#define XPOutputAttr		14	/* DPA-Object Output method */
#define XPImpAttr		15	/* DPA-Object Imposition */
#define XPSchedAttr		16	/* DPA-Object Scheduler */
#define XPIntJobAttr		17	/* DPA-Object Initial value job */
#define XPIntDocAttr		18	/* DPA-Object Initial value document */
#define XPResConAttr		19	/* DPA-Object Resource context */


/*
 * Replacement rules for XpSetAttributes
 */
typedef unsigned char XPAttrReplacement;
#define	XPAttrReplace		1
#define XPAttrMerge		2


/*
 * Return codes for XpGetDocumentData
 */
typedef unsigned char XPGetDocStatus;
#define XPGetDocFinished	0	/* normal termination */
#define XPGetDocSecondConsumer	1	/* setup error */
#define XPGetDocError		2	/* runtime error, see generated error */


/*
 * Save data types for XpStartJob.
 */
typedef unsigned char XPSaveData;
#define XPSpool			1	/* Job data sent to spooler */
#define XPGetData		2	/* Job data via XpGetDocumentData */


/*
 * Document types for XpStartDoc.
 */
typedef unsigned char XPDocumentType;
#define	XPDocNormal		1	/* Doc data handled by Xserver */
#define	XPDocRaw		2	/* Doc data passed through Xserver */


/********************************************************************
 *
 * Xp Print Property Names
 */


#ifndef _XP_PRINT_SERVER_

/******************************************************************************
 *
 * Definitions used by the library and clients only.
 */

/*******************************************************************
 *
 * General API defines and such.
 */

/*
 * Print Context for XpInitContext and related calls.
 */
typedef XID XPContext;

/*
 * Struct for XpGetPrinterList.
 */
typedef struct {
    char	*name;		/* name */
    char	*desc;		/* localized description */
} XPPrinterRec, *XPPrinterList;

/*
 * Typedefs for XpGetDocumentData
 */
typedef void (*XPSaveProc)( Display *display,
                            XPContext context,
                            unsigned char *data,
                            unsigned int data_len,
                            XPointer client_data);

typedef void (*XPFinishProc)( Display *display,
                              XPContext context,
                              XPGetDocStatus status,
                              XPointer client_data);

/*
 * Typedefs for XpSetLocaleHinter and XpGetLocaleHinter
 */
typedef char * (*XPHinterProc)(void);

#if 0
/*******************************************************************
 *
 * Extension version structures.
 *
 **** this structure is now defined localy in the one file that uses it
 **** in order to avoid clashes with its definition in XI.h
 */
typedef struct {
        int     present;
        short   major_version;
        short   minor_version;
} XExtensionVersion;
#endif

/********************************************************************
 *
 * Event structs for clients.
 *
 * note: these events are relative to a print context, and
 * not to a window as in core X.
 */
typedef struct {
    int            type;       /* base + XPPrintNotify */
    unsigned long  serial;     /* # of last request processed by server */
    Bool           send_event; /* true if from a SendEvent request */
    Display        *display;   /* Display the event was read from */
    XPContext      context;    /* print context where operation was requested */
    Bool           cancel;     /* was detailed event canceled */
    int            detail;     /* XPStartJobNotify, XPEndJobNotify,
                                  XPStartDocNotify, XPEndDocNotify,
                                  XPStartPageNotify, XPEndPageNotify */
} XPPrintEvent;

typedef struct {
    int            type;       /* base + XPAttributeNotify */
    unsigned long  serial;     /* # of last request processed by server */
    Bool           send_event; /* true if from a SendEvent request */
    Display        *display;   /* Display the event was read from */
    XPContext      context;    /* print context where operation was requested */
    int            detail;     /* XPJobAttr, XPDocAttr, XPPageAttr,
                                  XPPrinterAttr, XPSpoolerAttr,
                                  XPMediumAttr, XPServerAttr */
} XPAttributeEvent;

typedef struct {
    int            type;       /* base + XPDataReadyNotify */
    unsigned long  serial;     /* # of last request processed by server */
    Bool           send_event; /* true if from a SendEvent request */
    Display        *display;   /* Display the event was read from */
    XPContext      context;    /* print context where operation was requested */
    unsigned long  available;  /* bytes available for retrieval */
} XPDataReadyEvent;


/**********************************************************
 *
 * Function prototypes for library side.
 */

extern XPContext XpCreateContext (
    Display		*display,
    char		*printer_name
);

extern void XpSetContext (
    Display		*display,
    XPContext     	print_context
);

extern XPContext XpGetContext (
    Display		*display
);

extern void XpDestroyContext (
    Display		*display,
    XPContext     	print_context
);

extern Screen *XpGetScreenOfContext (
    Display		*display,
    XPContext     	print_context
);

extern Status XpGetPageDimensions (
    Display		*display,
    XPContext     	print_context,
    unsigned short	*width,			/* return value */
    unsigned short	*height,		/* return value */
    XRectangle		*reproducible_area	/* return value */
);

extern void XpStartJob (
    Display		*display,
    XPSaveData		save_data
);

extern void XpEndJob (
    Display		*display
);

extern void XpCancelJob (
    Display		*display,
    Bool		discard
);

extern void XpStartDoc (
    Display		*display,
    XPDocumentType	type
);

extern void XpEndDoc (
    Display		*display
);

extern void XpCancelDoc (
    Display		*display,
    Bool		discard
);

extern void XpPutDocumentData (
    Display		*display,
    Drawable		drawable,
    unsigned char	*data,
    int			data_len,
    char		*doc_fmt,
    char		*options
);

extern Status XpGetDocumentData (
    Display		*display,
    XPContext		context,
    XPSaveProc		save_proc,
    XPFinishProc	finish_proc,
    XPointer		client_data
);

extern void XpStartPage (
    Display		*display,
    Window		window
);

extern void XpEndPage (
    Display		*display
);

extern void XpCancelPage (
    Display		*display,
    Bool		discard
);

extern void XpSelectInput (
    Display		*display,
    XPContext     	print_context,
    unsigned long	event_mask
);

extern unsigned long XpInputSelected (
    Display		*display,
    XPContext     	print_context,
    unsigned long	*all_events_mask
);

extern Bool XpSetImageResolution (
    Display		*display,
    XPContext     	print_context,
    int			image_res,
    int			*prev_res
);

extern int XpGetImageResolution (
    Display		*display,
    XPContext     	print_context
);

extern char *XpGetAttributes (
    Display		*display,
    XPContext     	print_context,
    XPAttributes	type
);

extern void XpSetAttributes (
    Display		*display,
    XPContext     	print_context,
    XPAttributes	type,
    char		*pool,
    XPAttrReplacement	replacement_rule
);

extern char *XpGetOneAttribute (
    Display		*display,
    XPContext     	print_context,
    XPAttributes	type,
    char		*attribute_name
);

extern XPPrinterList XpGetPrinterList (
    Display		*display,
    char		*printer_name,
    int			*list_count		/* return value */
);

extern void XpFreePrinterList (
    XPPrinterList	printer_list
);

extern void XpRehashPrinterList (
    Display		*display
);

extern Status XpQueryVersion (
    Display		*display,
    short		*major_version,		/* return value */
    short		*minor_version		/* return value */
);

extern Bool XpQueryExtension (
    Display		*display,
    int			*event_base_return,	/* return value */
    int			*error_base_return	/* return value */
);

extern Screen **XpQueryScreens (
    Display		*display,
    int			*list_count		/* return value */
);

extern Status XpGetPdmStartParams (
    Display		*print_display,
    Window		print_window,
    XPContext		print_context,
    Display		*video_display,
    Window		video_window,
    Display		**selection_display,	/* return value */
    Atom		*selection,		/* return value */
    Atom		*type,			/* return value */
    int			*format,		/* return value */
    unsigned char	**data,			/* return value */
    int			*nelements		/* return value */
);

extern Status XpGetAuthParams (
    Display		*print_display,
    Display		*video_display,
    Display		**selection_display,	/* return value */
    Atom		*selection,		/* return value */
    Atom		*target			/* return value */
);

extern Status XpSendAuth (
    Display		*display,
    Window		window
);

extern Status XpSendOneTicket (
    Display		*display,
    Window		window,
    Xauth		*ticket,
    Bool		more
);

extern void XpSetLocaleHinter (
    XPHinterProc hinter_proc,
    char         *hinter_desc
);

extern char *XpGetLocaleHinter (
    XPHinterProc *hinter_proc
);

extern char *XpGetLocaleNetString(void);

extern char *XpNotifyPdm (
    Display		*print_display,
    Window		print_window,
    XPContext     	print_context,
    Display		*video_display,
    Window		video_window,
    Bool		auth_flag
);

#endif /* _XP_PRINT_SERVER_ */

_XFUNCPROTOEND

#endif /* _XpPrint_H_ */
