1/*
2 * Internet Printing Protocol definitions for CUPS.
3 *
4 * Copyright 2007-2014 by Apple Inc.
5 * Copyright 1997-2006 by Easy Software Products.
6 *
7 * These coded instructions, statements, and computer programs are the
8 * property of Apple Inc. and are protected by Federal copyright
9 * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
10 * which should have been included with this file.  If this file is
11 * missing or damaged, see the license at "http://www.cups.org/".
12 *
13 * This file is subject to the Apple OS-Developed Software exception.
14 */
15
16#ifndef _CUPS_IPP_H_
17#  define _CUPS_IPP_H_
18
19/*
20 * Include necessary headers...
21 */
22
23#  include "http.h"
24#  include <stdarg.h>
25
26
27/*
28 * C++ magic...
29 */
30
31#  ifdef __cplusplus
32extern "C" {
33#  endif /* __cplusplus */
34
35
36/*
37 * IPP version string...
38 */
39
40#  define IPP_VERSION		"\002\001"
41
42/*
43 * IPP registered port number...
44 *
45 * Note: Applications should never use IPP_PORT, but instead use the
46 * ippPort() function to allow overrides via the IPP_PORT environment
47 * variable and services file if needed!
48 */
49
50#  define IPP_PORT		631
51
52/*
53 * Common limits...
54 */
55
56#  define IPP_MAX_CHARSET	64	/* Maximum length of charset values w/nul */
57#  define IPP_MAX_KEYWORD	256	/* Maximum length of keyword values w/nul */
58#  define IPP_MAX_LANGUAGE	64	/* Maximum length of naturalLanguage values w/nul */
59#  define IPP_MAX_LENGTH	32767	/* Maximum size of any single value */
60#  define IPP_MAX_MIMETYPE	256	/* Maximum length of mimeMediaType values w/nul */
61#  define IPP_MAX_NAME		256	/* Maximum length of common name values w/nul */
62#  define IPP_MAX_OCTETSTRING	1023	/* Maximum length of octetString values w/o nul */
63#  define IPP_MAX_TEXT		1024	/* Maximum length of text values w/nul */
64#  define IPP_MAX_URI		1024	/* Maximum length of uri values w/nul */
65#  define IPP_MAX_URISCHEME	64	/* Maximum length of uriScheme values w/nul */
66#  define IPP_MAX_VALUES	8	/* Power-of-2 allocation increment */
67
68/*
69 * Macro to flag a text string attribute as "const" (static storage) vs.
70 * allocated.
71 */
72
73#  define IPP_CONST_TAG(x) (ipp_tag_t)(IPP_TAG_CUPS_CONST | (x))
74
75
76/*
77 * Types and structures...
78 */
79
80typedef enum ipp_dstate_e		/**** Document states ****/
81{
82  IPP_DOCUMENT_PENDING = 3,		/* Document is pending */
83  IPP_DOCUMENT_PROCESSING = 5,		/* Document is processing */
84  IPP_DOCUMENT_CANCELED = 7,		/* Document is canceled */
85  IPP_DOCUMENT_ABORTED,			/* Document is aborted */
86  IPP_DOCUMENT_COMPLETED		/* Document is completed */
87
88#  ifndef _CUPS_NO_DEPRECATED
89#    define IPP_DOCUMENT_PENDING	IPP_DSTATE_PENDING
90#    define IPP_DOCUMENT_PROCESSING	IPP_DSTATE_PROCESSING
91#    define IPP_DOCUMENT_CANCELED	IPP_DSTATE_CANCELED
92#    define IPP_DOCUMENT_ABORTED	IPP_DSTATE_ABORTED
93#    define IPP_DOCUMENT_COMPLETED	IPP_DSTATE_COMPLETED
94#  endif /* !_CUPS_NO_DEPRECATED */
95} ipp_dstate_t;
96
97typedef enum ipp_finishings_e		/**** Finishings ****/
98{
99  IPP_FINISHINGS_NONE = 3,		/* No finishing */
100  IPP_FINISHINGS_STAPLE,		/* Staple (any location) */
101  IPP_FINISHINGS_PUNCH,			/* Punch (any location/count) */
102  IPP_FINISHINGS_COVER,			/* Add cover */
103  IPP_FINISHINGS_BIND,			/* Bind */
104  IPP_FINISHINGS_SADDLE_STITCH,		/* Staple interior */
105  IPP_FINISHINGS_EDGE_STITCH,		/* Stitch along any side */
106  IPP_FINISHINGS_FOLD,			/* Fold (any type) */
107  IPP_FINISHINGS_TRIM,			/* Trim (any type) */
108  IPP_FINISHINGS_BALE,			/* Bale (any type) */
109  IPP_FINISHINGS_BOOKLET_MAKER,		/* Fold to make booklet */
110  IPP_FINISHINGS_JOG_OFFSET,		/* Offset for binding (any type) */
111  IPP_FINISHINGS_COAT,			/* Apply protective liquid or powder coating */
112  IPP_FINISHINGS_LAMINATE,		/* Apply protective (solid) material */
113  IPP_FINISHINGS_STAPLE_TOP_LEFT = 20,	/* Staple top left corner */
114  IPP_FINISHINGS_STAPLE_BOTTOM_LEFT,	/* Staple bottom left corner */
115  IPP_FINISHINGS_STAPLE_TOP_RIGHT,	/* Staple top right corner */
116  IPP_FINISHINGS_STAPLE_BOTTOM_RIGHT,	/* Staple bottom right corner */
117  IPP_FINISHINGS_EDGE_STITCH_LEFT,	/* Stitch along left side */
118  IPP_FINISHINGS_EDGE_STITCH_TOP,	/* Stitch along top edge */
119  IPP_FINISHINGS_EDGE_STITCH_RIGHT,	/* Stitch along right side */
120  IPP_FINISHINGS_EDGE_STITCH_BOTTOM,	/* Stitch along bottom edge */
121  IPP_FINISHINGS_STAPLE_DUAL_LEFT,	/* Two staples on left */
122  IPP_FINISHINGS_STAPLE_DUAL_TOP,	/* Two staples on top */
123  IPP_FINISHINGS_STAPLE_DUAL_RIGHT,	/* Two staples on right */
124  IPP_FINISHINGS_STAPLE_DUAL_BOTTOM,	/* Two staples on bottom */
125  IPP_FINISHINGS_STAPLE_TRIPLE_LEFT,	/* Three staples on left */
126  IPP_FINISHINGS_STAPLE_TRIPLE_TOP,	/* Three staples on top */
127  IPP_FINISHINGS_STAPLE_TRIPLE_RIGHT,	/* Three staples on right */
128  IPP_FINISHINGS_STAPLE_TRIPLE_BOTTOM,	/* Three staples on bottom */
129  IPP_FINISHINGS_BIND_LEFT = 50,	/* Bind on left */
130  IPP_FINISHINGS_BIND_TOP,		/* Bind on top */
131  IPP_FINISHINGS_BIND_RIGHT,		/* Bind on right */
132  IPP_FINISHINGS_BIND_BOTTOM,		/* Bind on bottom */
133  IPP_FINISHINGS_TRIM_AFTER_PAGES = 60,	/* Trim output after each page */
134  IPP_FINISHINGS_TRIM_AFTER_DOCUMENTS,	/* Trim output after each document */
135  IPP_FINISHINGS_TRIM_AFTER_COPIES,	/* Trim output after each copy */
136  IPP_FINISHINGS_TRIM_AFTER_JOB,	/* Trim output after job */
137  IPP_FINISHINGS_PUNCH_TOP_LEFT = 70,	/* Punch 1 hole top left */
138  IPP_FINISHINGS_PUNCH_BOTTOM_LEFT,	/* Punch 1 hole bottom left */
139  IPP_FINISHINGS_PUNCH_TOP_RIGHT,	/* Punch 1 hole top right */
140  IPP_FINISHINGS_PUNCH_BOTTOM_RIGHT,	/* Punch 1 hole bottom right */
141  IPP_FINISHINGS_PUNCH_DUAL_LEFT,	/* Punch 2 holes left side */
142  IPP_FINISHINGS_PUNCH_DUAL_TOP,	/* Punch 2 holes top edge */
143  IPP_FINISHINGS_PUNCH_DUAL_RIGHT,	/* Punch 2 holes right side */
144  IPP_FINISHINGS_PUNCH_DUAL_BOTTOM,	/* Punch 2 holes bottom edge */
145  IPP_FINISHINGS_PUNCH_TRIPLE_LEFT,	/* Punch 3 holes left side */
146  IPP_FINISHINGS_PUNCH_TRIPLE_TOP,	/* Punch 3 holes top edge */
147  IPP_FINISHINGS_PUNCH_TRIPLE_RIGHT,	/* Punch 3 holes right side */
148  IPP_FINISHINGS_PUNCH_TRIPLE_BOTTOM,	/* Punch 3 holes bottom edge */
149  IPP_FINISHINGS_PUNCH_QUAD_LEFT,	/* Punch 4 holes left side */
150  IPP_FINISHINGS_PUNCH_QUAD_TOP,	/* Punch 4 holes top edge */
151  IPP_FINISHINGS_PUNCH_QUAD_RIGHT,	/* Punch 4 holes right side */
152  IPP_FINISHINGS_PUNCH_QUAD_BOTTOM,	/* Punch 4 holes bottom edge */
153  IPP_FINISHINGS_PUNCH_MULTIPLE_LEFT,	/* Pucnh multiple holes left side */
154  IPP_FINISHINGS_PUNCH_MULTIPLE_TOP,	/* Pucnh multiple holes top edge */
155  IPP_FINISHINGS_PUNCH_MULTIPLE_RIGHT,	/* Pucnh multiple holes right side */
156  IPP_FINISHINGS_PUNCH_MULTIPLE_BOTTOM,	/* Pucnh multiple holes bottom edge */
157  IPP_FINISHINGS_FOLD_ACCORDIAN = 90,	/* Accordian-fold the paper vertically into four sections */
158  IPP_FINISHINGS_FOLD_DOUBLE_GATE,	/* Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically */
159  IPP_FINISHINGS_FOLD_GATE,		/* Fold the top and bottom quarters of the paper towards the midline */
160  IPP_FINISHINGS_FOLD_HALF,		/* Fold the paper in half vertically */
161  IPP_FINISHINGS_FOLD_HALF_Z,		/* Fold the paper in half horizontally, then Z-fold the paper vertically */
162  IPP_FINISHINGS_FOLD_LEFT_GATE,	/* Fold the top quarter of the paper towards the midline */
163  IPP_FINISHINGS_FOLD_LETTER,		/* Fold the paper into three sections vertically; sometimes also known as a C fold*/
164  IPP_FINISHINGS_FOLD_PARALLEL,		/* Fold the paper in half vertically two times, yielding four sections */
165  IPP_FINISHINGS_FOLD_POSTER,		/* Fold the paper in half horizontally and vertically; sometimes also called a cross fold */
166  IPP_FINISHINGS_FOLD_RIGHT_GATE,	/* Fold the bottom quarter of the paper towards the midline */
167  IPP_FINISHINGS_FOLD_Z,		/* Fold the paper vertically into three sections, forming a Z */
168  IPP_FINISHINGS_FOLD_ENGINEERING_Z,	/* Fold the paper vertically into two small sections and one larger, forming an elongated Z */
169
170  /* CUPS extensions for finishings (pre-standard versions of values above) */
171  IPP_FINISHINGS_CUPS_PUNCH_TOP_LEFT = 0x40000046,
172					/* Punch 1 hole top left */
173  IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_LEFT,/* Punch 1 hole bottom left */
174  IPP_FINISHINGS_CUPS_PUNCH_TOP_RIGHT,	/* Punch 1 hole top right */
175  IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_RIGHT,
176					/* Punch 1 hole bottom right */
177  IPP_FINISHINGS_CUPS_PUNCH_DUAL_LEFT,	/* Punch 2 holes left side */
178  IPP_FINISHINGS_CUPS_PUNCH_DUAL_TOP,	/* Punch 2 holes top edge */
179  IPP_FINISHINGS_CUPS_PUNCH_DUAL_RIGHT,	/* Punch 2 holes right side */
180  IPP_FINISHINGS_CUPS_PUNCH_DUAL_BOTTOM,/* Punch 2 holes bottom edge */
181  IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_LEFT,/* Punch 3 holes left side */
182  IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_TOP,	/* Punch 3 holes top edge */
183  IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_RIGHT,
184					/* Punch 3 holes right side */
185  IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_BOTTOM,
186					/* Punch 3 holes bottom edge */
187  IPP_FINISHINGS_CUPS_PUNCH_QUAD_LEFT,	/* Punch 4 holes left side */
188  IPP_FINISHINGS_CUPS_PUNCH_QUAD_TOP,	/* Punch 4 holes top edge */
189  IPP_FINISHINGS_CUPS_PUNCH_QUAD_RIGHT,	/* Punch 4 holes right side */
190  IPP_FINISHINGS_CUPS_PUNCH_QUAD_BOTTOM,/* Punch 4 holes bottom edge */
191
192  IPP_FINISHINGS_CUPS_FOLD_ACCORDIAN = 0x4000005A,
193					/* Accordian-fold the paper vertically into four sections */
194  IPP_FINISHINGS_CUPS_FOLD_DOUBLE_GATE,	/* Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically */
195  IPP_FINISHINGS_CUPS_FOLD_GATE,	/* Fold the top and bottom quarters of the paper towards the midline */
196  IPP_FINISHINGS_CUPS_FOLD_HALF,	/* Fold the paper in half vertically */
197  IPP_FINISHINGS_CUPS_FOLD_HALF_Z,	/* Fold the paper in half horizontally, then Z-fold the paper vertically */
198  IPP_FINISHINGS_CUPS_FOLD_LEFT_GATE,	/* Fold the top quarter of the paper towards the midline */
199  IPP_FINISHINGS_CUPS_FOLD_LETTER,	/* Fold the paper into three sections vertically; sometimes also known as a C fold*/
200  IPP_FINISHINGS_CUPS_FOLD_PARALLEL,	/* Fold the paper in half vertically two times, yielding four sections */
201  IPP_FINISHINGS_CUPS_FOLD_POSTER,	/* Fold the paper in half horizontally and vertically; sometimes also called a cross fold */
202  IPP_FINISHINGS_CUPS_FOLD_RIGHT_GATE,	/* Fold the bottom quarter of the paper towards the midline */
203  IPP_FINISHINGS_CUPS_FOLD_Z		/* Fold the paper vertically into three sections, forming a Z */
204} ipp_finishings_t;
205#  ifndef _CUPS_NO_DEPRECATED
206#    define IPP_FINISHINGS_JOB_OFFSET	IPP_FINISHINGS_JOG_OFFSET
207					/* Long-time misspelling... */
208typedef enum ipp_finishings_e ipp_finish_t;
209#  endif /* !_CUPS_NO_DEPRECATED */
210
211typedef enum ipp_jcollate_e		/**** Job collation types ****/
212{
213  IPP_JCOLLATE_UNCOLLATED_SHEETS = 3,
214  IPP_JCOLLATE_COLLATED_DOCUMENTS,
215  IPP_JCOLLATE_UNCOLLATED_DOCUMENTS
216
217#  ifndef _CUPS_NO_DEPRECATED
218#    define IPP_JOB_UNCOLLATED_SHEETS		IPP_JCOLLATE_UNCOLLATED_SHEETS
219#    define IPP_JOB_COLLATED_DOCUMENTS		IPP_JCOLLATE_COLLATED_DOCUMENTS
220#    define IPP_JOB_UNCOLLATED_DOCUMENTS	IPP_JCOLLATE_UNCOLLATED_DOCUMENTS
221#  endif /* !_CUPS_NO_DEPRECATED */
222} ipp_jcollate_t;
223
224typedef enum ipp_jstate_e		/**** Job states ****/
225{
226  IPP_JSTATE_PENDING = 3,		/* Job is waiting to be printed */
227  IPP_JSTATE_HELD,			/* Job is held for printing */
228  IPP_JSTATE_PROCESSING,		/* Job is currently printing */
229  IPP_JSTATE_STOPPED,			/* Job has been stopped */
230  IPP_JSTATE_CANCELED,			/* Job has been canceled */
231  IPP_JSTATE_ABORTED,			/* Job has aborted due to error */
232  IPP_JSTATE_COMPLETED			/* Job has completed successfully */
233
234#  ifndef _CUPS_NO_DEPRECATED
235#    define IPP_JOB_PENDING	IPP_JSTATE_PENDING
236#    define IPP_JOB_HELD	IPP_JSTATE_HELD
237#    define IPP_JOB_PROCESSING	IPP_JSTATE_PROCESSING
238#    define IPP_JOB_STOPPED	IPP_JSTATE_STOPPED
239#    define IPP_JOB_CANCELED	IPP_JSTATE_CANCELED
240#    define IPP_JOB_ABORTED	IPP_JSTATE_ABORTED
241#    define IPP_JOB_COMPLETED	IPP_JSTATE_COMPLETED
242  /* Legacy name for canceled state */
243#    define IPP_JOB_CANCELLED	IPP_JSTATE_CANCELED
244#  endif /* !_CUPS_NO_DEPRECATED */
245} ipp_jstate_t;
246
247typedef enum ipp_op_e			/**** IPP operations ****/
248{
249  IPP_OP_CUPS_INVALID = -1,		/* Invalid operation name for @link ippOpValue@ */
250  IPP_OP_CUPS_NONE = 0,			/* No operation @private@ */
251  IPP_OP_PRINT_JOB = 0x0002,		/* Print a single file */
252  IPP_OP_PRINT_URI,			/* Print a single URL */
253  IPP_OP_VALIDATE_JOB,			/* Validate job options */
254  IPP_OP_CREATE_JOB,			/* Create an empty print job */
255  IPP_OP_SEND_DOCUMENT,			/* Add a file to a job */
256  IPP_OP_SEND_URI,			/* Add a URL to a job */
257  IPP_OP_CANCEL_JOB,			/* Cancel a job */
258  IPP_OP_GET_JOB_ATTRIBUTES,		/* Get job attributes */
259  IPP_OP_GET_JOBS,			/* Get a list of jobs */
260  IPP_OP_GET_PRINTER_ATTRIBUTES,	/* Get printer attributes */
261  IPP_OP_HOLD_JOB,			/* Hold a job for printing */
262  IPP_OP_RELEASE_JOB,			/* Release a job for printing */
263  IPP_OP_RESTART_JOB,			/* Reprint a job */
264  IPP_OP_PAUSE_PRINTER = 0x0010,	/* Stop a printer */
265  IPP_OP_RESUME_PRINTER,		/* Start a printer */
266  IPP_OP_PURGE_JOBS,			/* Cancel all jobs */
267  IPP_OP_SET_PRINTER_ATTRIBUTES,	/* Set printer attributes */
268  IPP_OP_SET_JOB_ATTRIBUTES,		/* Set job attributes */
269  IPP_OP_GET_PRINTER_SUPPORTED_VALUES,	/* Get supported attribute values */
270  IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS,	/* Create one or more printer subscriptions @since CUPS 1.2/macOS 10.5@ */
271  IPP_OP_CREATE_JOB_SUBSCRIPTIONS,	/* Create one of more job subscriptions @since CUPS 1.2/macOS 10.5@ */
272  IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES,	/* Get subscription attributes @since CUPS 1.2/macOS 10.5@ */
273  IPP_OP_GET_SUBSCRIPTIONS,		/* Get list of subscriptions @since CUPS 1.2/macOS 10.5@ */
274  IPP_OP_RENEW_SUBSCRIPTION,		/* Renew a printer subscription @since CUPS 1.2/macOS 10.5@ */
275  IPP_OP_CANCEL_SUBSCRIPTION,		/* Cancel a subscription @since CUPS 1.2/macOS 10.5@ */
276  IPP_OP_GET_NOTIFICATIONS,		/* Get notification events @since CUPS 1.2/macOS 10.5@ */
277  IPP_OP_SEND_NOTIFICATIONS,		/* Send notification events @private@ */
278  IPP_OP_GET_RESOURCE_ATTRIBUTES,	/* Get resource attributes @private@ */
279  IPP_OP_GET_RESOURCE_DATA,		/* Get resource data @private@ */
280  IPP_OP_GET_RESOURCES,			/* Get list of resources @private@ */
281  IPP_OP_GET_PRINT_SUPPORT_FILES,	/* Get printer support files @private@ */
282  IPP_OP_ENABLE_PRINTER,		/* Start a printer */
283  IPP_OP_DISABLE_PRINTER,		/* Stop a printer */
284  IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB,
285					/* Stop printer after the current job */
286  IPP_OP_HOLD_NEW_JOBS,			/* Hold new jobs */
287  IPP_OP_RELEASE_HELD_NEW_JOBS,		/* Release new jobs */
288  IPP_OP_DEACTIVATE_PRINTER,		/* Stop a printer */
289  IPP_OP_ACTIVATE_PRINTER,		/* Start a printer */
290  IPP_OP_RESTART_PRINTER,		/* Restart a printer */
291  IPP_OP_SHUTDOWN_PRINTER,		/* Turn a printer off */
292  IPP_OP_STARTUP_PRINTER,		/* Turn a printer on */
293  IPP_OP_REPROCESS_JOB,			/* Reprint a job */
294  IPP_OP_CANCEL_CURRENT_JOB,		/* Cancel the current job */
295  IPP_OP_SUSPEND_CURRENT_JOB,		/* Suspend the current job */
296  IPP_OP_RESUME_JOB,			/* Resume the current job */
297  IPP_OP_PROMOTE_JOB,			/* Promote a job to print sooner */
298  IPP_OP_SCHEDULE_JOB_AFTER,		/* Schedule a job to print after another */
299  IPP_OP_CANCEL_DOCUMENT = 0x0033,	/* Cancel-Document */
300  IPP_OP_GET_DOCUMENT_ATTRIBUTES,	/* Get-Document-Attributes */
301  IPP_OP_GET_DOCUMENTS,			/* Get-Documents */
302  IPP_OP_DELETE_DOCUMENT,		/* Delete-Document */
303  IPP_OP_SET_DOCUMENT_ATTRIBUTES,	/* Set-Document-Attributes */
304  IPP_OP_CANCEL_JOBS,			/* Cancel-Jobs */
305  IPP_OP_CANCEL_MY_JOBS,		/* Cancel-My-Jobs */
306  IPP_OP_RESUBMIT_JOB,			/* Resubmit-Job */
307  IPP_OP_CLOSE_JOB,			/* Close-Job */
308  IPP_OP_IDENTIFY_PRINTER,		/* Identify-Printer */
309  IPP_OP_VALIDATE_DOCUMENT,		/* Validate-Document */
310  IPP_OP_ADD_DOCUMENT_IMAGES,		/* Add-Document-Images */
311  IPP_OP_ACKNOWLEDGE_DOCUMENT,		/* Acknowledge-Document */
312  IPP_OP_ACKNOWLEDGE_IDENTIFY_PRINTER,	/* Acknowledge-Identify-Printer */
313  IPP_OP_ACKNOWLEDGE_JOB,		/* Acknowledge-Job */
314  IPP_OP_FETCH_DOCUMENT,		/* Fetch-Document */
315  IPP_OP_FETCH_JOB,			/* Fetch-Job */
316  IPP_OP_GET_OUTPUT_DEVICE_ATTRIBUTES,	/* Get-Output-Device-Attributes */
317  IPP_OP_UPDATE_ACTIVE_JOBS,		/* Update-Active-Jobs */
318  IPP_OP_DEREGISTER_OUTPUT_DEVICE,	/* Deregister-Output-Device */
319  IPP_OP_UPDATE_DOCUMENT_STATUS,	/* Update-Document-Status */
320  IPP_OP_UPDATE_JOB_STATUS,		/* Update-Job-Status */
321  IPP_OP_UPDATE_OUTPUT_DEVICE_ATTRIBUTES,
322					/* Update-Output-Device-Attributes */
323  IPP_OP_GET_NEXT_DOCUMENT_DATA,	/* Get-Next-Document-Data */
324
325  IPP_OP_PRIVATE = 0x4000,		/* Reserved @private@ */
326  IPP_OP_CUPS_GET_DEFAULT,		/* Get the default printer */
327  IPP_OP_CUPS_GET_PRINTERS,		/* Get a list of printers and/or classes */
328  IPP_OP_CUPS_ADD_MODIFY_PRINTER,	/* Add or modify a printer */
329  IPP_OP_CUPS_DELETE_PRINTER,		/* Delete a printer */
330  IPP_OP_CUPS_GET_CLASSES,		/* Get a list of classes @deprecated@ */
331  IPP_OP_CUPS_ADD_MODIFY_CLASS,		/* Add or modify a class */
332  IPP_OP_CUPS_DELETE_CLASS,		/* Delete a class */
333  IPP_OP_CUPS_ACCEPT_JOBS,		/* Accept new jobs on a printer */
334  IPP_OP_CUPS_REJECT_JOBS,		/* Reject new jobs on a printer */
335  IPP_OP_CUPS_SET_DEFAULT,		/* Set the default printer */
336  IPP_OP_CUPS_GET_DEVICES,		/* Get a list of supported devices @deprecated@ */
337  IPP_OP_CUPS_GET_PPDS,			/* Get a list of supported drivers @deprecated@ */
338  IPP_OP_CUPS_MOVE_JOB,			/* Move a job to a different printer */
339  IPP_OP_CUPS_AUTHENTICATE_JOB,		/* Authenticate a job @since CUPS 1.2/macOS 10.5@ */
340  IPP_OP_CUPS_GET_PPD,			/* Get a PPD file @deprecated@ */
341  IPP_OP_CUPS_GET_DOCUMENT = 0x4027,	/* Get a document file @since CUPS 1.4/macOS 10.6@ */
342  IPP_OP_CUPS_CREATE_LOCAL_PRINTER	/* Create a local (temporary) printer @since CUPS 2.2 */
343
344#  ifndef _CUPS_NO_DEPRECATED
345#    define IPP_PRINT_JOB			IPP_OP_PRINT_JOB
346#    define IPP_PRINT_URI			IPP_OP_PRINT_URI
347#    define IPP_VALIDATE_JOB			IPP_OP_VALIDATE_JOB
348#    define IPP_CREATE_JOB			IPP_OP_CREATE_JOB
349#    define IPP_SEND_DOCUMENT			IPP_OP_SEND_DOCUMENT
350#    define IPP_SEND_URI			IPP_OP_SEND_URI
351#    define IPP_CANCEL_JOB			IPP_OP_CANCEL_JOB
352#    define IPP_GET_JOB_ATTRIBUTES		IPP_OP_GET_JOB_ATTRIBUTES
353#    define IPP_GET_JOBS			IPP_OP_GET_JOBS
354#    define IPP_GET_PRINTER_ATTRIBUTES		IPP_OP_GET_PRINTER_ATTRIBUTES
355#    define IPP_HOLD_JOB			IPP_OP_HOLD_JOB
356#    define IPP_RELEASE_JOB			IPP_OP_RELEASE_JOB
357#    define IPP_RESTART_JOB			IPP_OP_RESTART_JOB
358#    define IPP_PAUSE_PRINTER			IPP_OP_PAUSE_PRINTER
359#    define IPP_RESUME_PRINTER			IPP_OP_RESUME_PRINTER
360#    define IPP_PURGE_JOBS			IPP_OP_PURGE_JOBS
361#    define IPP_SET_PRINTER_ATTRIBUTES		IPP_OP_SET_PRINTER_ATTRIBUTES
362#    define IPP_SET_JOB_ATTRIBUTES		IPP_OP_SET_JOB_ATTRIBUTES
363#    define IPP_GET_PRINTER_SUPPORTED_VALUES	IPP_OP_GET_PRINTER_SUPPORTED_VALUES
364#    define IPP_CREATE_PRINTER_SUBSCRIPTION	IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS
365#    define IPP_CREATE_JOB_SUBSCRIPTION		IPP_OP_CREATE_JOB_SUBSCRIPTIONS
366#    define IPP_OP_CREATE_PRINTER_SUBSCRIPTION	IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS
367#    define IPP_OP_CREATE_JOB_SUBSCRIPTION		IPP_OP_CREATE_JOB_SUBSCRIPTIONS
368#    define IPP_GET_SUBSCRIPTION_ATTRIBUTES	IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES
369#    define IPP_GET_SUBSCRIPTIONS		IPP_OP_GET_SUBSCRIPTIONS
370#    define IPP_RENEW_SUBSCRIPTION		IPP_OP_RENEW_SUBSCRIPTION
371#    define IPP_CANCEL_SUBSCRIPTION		IPP_OP_CANCEL_SUBSCRIPTION
372#    define IPP_GET_NOTIFICATIONS		IPP_OP_GET_NOTIFICATIONS
373#    define IPP_SEND_NOTIFICATIONS		IPP_OP_SEND_NOTIFICATIONS
374#    define IPP_GET_RESOURCE_ATTRIBUTES		IPP_OP_GET_RESOURCE_ATTRIBUTES
375#    define IPP_GET_RESOURCE_DATA		IPP_OP_GET_RESOURCE_DATA
376#    define IPP_GET_RESOURCES			IPP_OP_GET_RESOURCES
377#    define IPP_GET_PRINT_SUPPORT_FILES		IPP_OP_GET_PRINT_SUPPORT_FILES
378#    define IPP_ENABLE_PRINTER			IPP_OP_ENABLE_PRINTER
379#    define IPP_DISABLE_PRINTER			IPP_OP_DISABLE_PRINTER
380#    define IPP_PAUSE_PRINTER_AFTER_CURRENT_JOB	IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB
381#    define IPP_HOLD_NEW_JOBS			IPP_OP_HOLD_NEW_JOBS
382#    define IPP_RELEASE_HELD_NEW_JOBS		IPP_OP_RELEASE_HELD_NEW_JOBS
383#    define IPP_DEACTIVATE_PRINTER		IPP_OP_DEACTIVATE_PRINTER
384#    define IPP_ACTIVATE_PRINTER		IPP_OP_ACTIVATE_PRINTER
385#    define IPP_RESTART_PRINTER			IPP_OP_RESTART_PRINTER
386#    define IPP_SHUTDOWN_PRINTER		IPP_OP_SHUTDOWN_PRINTER
387#    define IPP_STARTUP_PRINTER			IPP_OP_STARTUP_PRINTER
388#    define IPP_REPROCESS_JOB			IPP_OP_REPROCESS_JOB
389#    define IPP_CANCEL_CURRENT_JOB		IPP_OP_CANCEL_CURRENT_JOB
390#    define IPP_SUSPEND_CURRENT_JOB		IPP_OP_SUSPEND_CURRENT_JOB
391#    define IPP_RESUME_JOB			IPP_OP_RESUME_JOB
392#    define IPP_PROMOTE_JOB			IPP_OP_PROMOTE_JOB
393#    define IPP_SCHEDULE_JOB_AFTER		IPP_OP_SCHEDULE_JOB_AFTER
394#    define IPP_CANCEL_DOCUMENT			IPP_OP_CANCEL_DOCUMENT
395#    define IPP_GET_DOCUMENT_ATTRIBUTES		IPP_OP_GET_DOCUMENT_ATTRIBUTES
396#    define IPP_GET_DOCUMENTS			IPP_OP_GET_DOCUMENTS
397#    define IPP_DELETE_DOCUMENT			IPP_OP_DELETE_DOCUMENT
398#    define IPP_SET_DOCUMENT_ATTRIBUTES		IPP_OP_SET_DOCUMENT_ATTRIBUTES
399#    define IPP_CANCEL_JOBS			IPP_OP_CANCEL_JOBS
400#    define IPP_CANCEL_MY_JOBS			IPP_OP_CANCEL_MY_JOBS
401#    define IPP_RESUBMIT_JOB			IPP_OP_RESUBMIT_JOB
402#    define IPP_CLOSE_JOB			IPP_OP_CLOSE_JOB
403#    define IPP_IDENTIFY_PRINTER		IPP_OP_IDENTIFY_PRINTER
404#    define IPP_VALIDATE_DOCUMENT		IPP_OP_VALIDATE_DOCUMENT
405#    define IPP_OP_SEND_HARDCOPY_DOCUMENT	IPP_OP_ADD_DOCUMENT_IMAGES
406#    define IPP_PRIVATE				IPP_OP_PRIVATE
407#    define CUPS_GET_DEFAULT			IPP_OP_CUPS_GET_DEFAULT
408#    define CUPS_GET_PRINTERS			IPP_OP_CUPS_GET_PRINTERS
409#    define CUPS_ADD_MODIFY_PRINTER		IPP_OP_CUPS_ADD_MODIFY_PRINTER
410#    define CUPS_DELETE_PRINTER			IPP_OP_CUPS_DELETE_PRINTER
411#    define CUPS_GET_CLASSES			IPP_OP_CUPS_GET_CLASSES
412#    define CUPS_ADD_MODIFY_CLASS		IPP_OP_CUPS_ADD_MODIFY_CLASS
413#    define CUPS_DELETE_CLASS			IPP_OP_CUPS_DELETE_CLASS
414#    define CUPS_ACCEPT_JOBS			IPP_OP_CUPS_ACCEPT_JOBS
415#    define CUPS_REJECT_JOBS			IPP_OP_CUPS_REJECT_JOBS
416#    define CUPS_SET_DEFAULT			IPP_OP_CUPS_SET_DEFAULT
417#    define CUPS_GET_DEVICES			IPP_OP_CUPS_GET_DEVICES
418#    define CUPS_GET_PPDS			IPP_OP_CUPS_GET_PPDS
419#    define CUPS_MOVE_JOB			IPP_OP_CUPS_MOVE_JOB
420#    define CUPS_AUTHENTICATE_JOB		IPP_OP_CUPS_AUTHENTICATE_JOB
421#    define CUPS_GET_PPD			IPP_OP_CUPS_GET_PPD
422#    define CUPS_GET_DOCUMENT			IPP_OP_CUPS_GET_DOCUMENT
423     /* Legacy names */
424#    define CUPS_ADD_PRINTER			IPP_OP_CUPS_ADD_MODIFY_PRINTER
425#    define CUPS_ADD_CLASS			IPP_OP_CUPS_ADD_MODIFY_CLASS
426#  endif /* !_CUPS_NO_DEPRECATED */
427} ipp_op_t;
428
429typedef enum ipp_orient_e		/**** Orientation values ****/
430{
431  IPP_ORIENT_PORTRAIT = 3,		/* No rotation */
432  IPP_ORIENT_LANDSCAPE,			/* 90 degrees counter-clockwise */
433  IPP_ORIENT_REVERSE_LANDSCAPE,		/* 90 degrees clockwise */
434  IPP_ORIENT_REVERSE_PORTRAIT,		/* 180 degrees */
435  IPP_ORIENT_NONE			/* No rotation */
436
437#  ifndef _CUPS_NO_DEPRECATED
438#    define IPP_PORTRAIT		IPP_ORIENT_PORTRAIT
439#    define IPP_LANDSCAPE		IPP_ORIENT_LANDSCAPE
440#    define IPP_REVERSE_LANDSCAPE	IPP_ORIENT_REVERSE_LANDSCAPE
441#    define IPP_REVERSE_PORTRAIT	IPP_ORIENT_REVERSE_PORTRAIT
442#  endif /* !_CUPS_NO_DEPRECATED */
443} ipp_orient_t;
444
445typedef enum ipp_pstate_e		/**** Printer states ****/
446{
447  IPP_PSTATE_IDLE = 3,			/* Printer is idle */
448  IPP_PSTATE_PROCESSING,		/* Printer is working */
449  IPP_PSTATE_STOPPED			/* Printer is stopped */
450
451#  ifndef _CUPS_NO_DEPRECATED
452#    define IPP_PRINTER_IDLE		IPP_PSTATE_IDLE
453#    define IPP_PRINTER_PROCESSING	IPP_PSTATE_PROCESSING
454#    define IPP_PRINTER_STOPPED		IPP_PSTATE_STOPPED
455#  endif /* _CUPS_NO_DEPRECATED */
456} ipp_pstate_t;
457
458typedef enum ipp_quality_e		/**** Qualities ****/
459{
460  IPP_QUALITY_DRAFT = 3,		/* Draft quality */
461  IPP_QUALITY_NORMAL,			/* Normal quality */
462  IPP_QUALITY_HIGH			/* High quality */
463} ipp_quality_t;
464
465typedef enum ipp_res_e			/**** Resolution units ****/
466{
467  IPP_RES_PER_INCH = 3,			/* Pixels per inch */
468  IPP_RES_PER_CM			/* Pixels per centimeter */
469} ipp_res_t;
470
471typedef enum ipp_state_e		/**** IPP states ****/
472{
473  IPP_STATE_ERROR = -1,			/* An error occurred */
474  IPP_STATE_IDLE,			/* Nothing is happening/request completed */
475  IPP_STATE_HEADER,			/* The request header needs to be sent/received */
476  IPP_STATE_ATTRIBUTE,			/* One or more attributes need to be sent/received */
477  IPP_STATE_DATA			/* IPP request data needs to be sent/received */
478
479#  ifndef _CUPS_NO_DEPRECATED
480#    define IPP_ERROR		IPP_STATE_ERROR
481#    define IPP_IDLE		IPP_STATE_IDLE
482#    define IPP_HEADER		IPP_STATE_HEADER
483#    define IPP_ATTRIBUTE	IPP_STATE_ATTRIBUTE
484#    define IPP_DATA		IPP_STATE_DATA
485#  endif /* !_CUPS_NO_DEPRECATED */
486} ipp_state_t;
487
488typedef enum ipp_status_e		/**** IPP status codes ****/
489{
490  IPP_STATUS_CUPS_INVALID = -1,		/* Invalid status name for @link ippErrorValue@ */
491  IPP_STATUS_OK = 0x0000,		/* successful-ok */
492  IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED,	/* successful-ok-ignored-or-substituted-attributes */
493  IPP_STATUS_OK_CONFLICTING,		/* successful-ok-conflicting-attributes */
494  IPP_STATUS_OK_IGNORED_SUBSCRIPTIONS,	/* successful-ok-ignored-subscriptions */
495  IPP_STATUS_OK_IGNORED_NOTIFICATIONS,	/* successful-ok-ignored-notifications @private@ */
496  IPP_STATUS_OK_TOO_MANY_EVENTS,	/* successful-ok-too-many-events */
497  IPP_STATUS_OK_BUT_CANCEL_SUBSCRIPTION,/* successful-ok-but-cancel-subscription @private@ */
498  IPP_STATUS_OK_EVENTS_COMPLETE,	/* successful-ok-events-complete */
499  IPP_STATUS_REDIRECTION_OTHER_SITE = 0x0200,
500					/* redirection-other-site @private@ */
501  IPP_STATUS_CUPS_SEE_OTHER = 0x0280,	/* cups-see-other */
502  IPP_STATUS_ERROR_BAD_REQUEST = 0x0400,/* client-error-bad-request */
503  IPP_STATUS_ERROR_FORBIDDEN,		/* client-error-forbidden */
504  IPP_STATUS_ERROR_NOT_AUTHENTICATED,	/* client-error-not-authenticated */
505  IPP_STATUS_ERROR_NOT_AUTHORIZED,	/* client-error-not-authorized */
506  IPP_STATUS_ERROR_NOT_POSSIBLE,	/* client-error-not-possible */
507  IPP_STATUS_ERROR_TIMEOUT,		/* client-error-timeout */
508  IPP_STATUS_ERROR_NOT_FOUND,		/* client-error-not-found */
509  IPP_STATUS_ERROR_GONE,		/* client-error-gone */
510  IPP_STATUS_ERROR_REQUEST_ENTITY,	/* client-error-request-entity-too-large */
511  IPP_STATUS_ERROR_REQUEST_VALUE,	/* client-error-request-value-too-long */
512  IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED,
513					/* client-error-document-format-not-supported */
514  IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES,/* client-error-attributes-or-values-not-supported */
515  IPP_STATUS_ERROR_URI_SCHEME,		/* client-error-uri-scheme-not-supported */
516  IPP_STATUS_ERROR_CHARSET,		/* client-error-charset-not-supported */
517  IPP_STATUS_ERROR_CONFLICTING,		/* client-error-conflicting-attributes */
518  IPP_STATUS_ERROR_COMPRESSION_NOT_SUPPORTED,
519					/* client-error-compression-not-supported */
520  IPP_STATUS_ERROR_COMPRESSION_ERROR,	/* client-error-compression-error */
521  IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR,
522					/* client-error-document-format-error */
523  IPP_STATUS_ERROR_DOCUMENT_ACCESS,	/* client-error-document-access-error */
524  IPP_STATUS_ERROR_ATTRIBUTES_NOT_SETTABLE,
525					/* client-error-attributes-not-settable */
526  IPP_STATUS_ERROR_IGNORED_ALL_SUBSCRIPTIONS,
527					/* client-error-ignored-all-subscriptions */
528  IPP_STATUS_ERROR_TOO_MANY_SUBSCRIPTIONS,
529					/* client-error-too-many-subscriptions */
530  IPP_STATUS_ERROR_IGNORED_ALL_NOTIFICATIONS,
531					/* client-error-ignored-all-notifications @private@ */
532  IPP_STATUS_ERROR_PRINT_SUPPORT_FILE_NOT_FOUND,
533					/* client-error-print-support-file-not-found @private@ */
534  IPP_STATUS_ERROR_DOCUMENT_PASSWORD,	/* client-error-document-password-error */
535  IPP_STATUS_ERROR_DOCUMENT_PERMISSION,	/* client-error-document-permission-error */
536  IPP_STATUS_ERROR_DOCUMENT_SECURITY,	/* client-error-document-security-error */
537  IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE,/* client-error-document-unprintable-error */
538  IPP_STATUS_ERROR_ACCOUNT_INFO_NEEDED,	/* client-error-account-info-needed */
539  IPP_STATUS_ERROR_ACCOUNT_CLOSED,	/* client-error-account-closed */
540  IPP_STATUS_ERROR_ACCOUNT_LIMIT_REACHED,
541					/* client-error-account-limit-reached */
542  IPP_STATUS_ERROR_ACCOUNT_AUTHORIZATION_FAILED,
543					/* client-error-account-authorization-failed */
544  IPP_STATUS_ERROR_NOT_FETCHABLE,	/* client-error-not-fetchable */
545
546  /* Legacy status codes for paid printing */
547  IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED = 0x049C,
548					/* cups-error-account-info-needed @deprecated@ */
549  IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED,	/* cups-error-account-closed @deprecate@ */
550  IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED,
551					/* cups-error-account-limit-reached @deprecated@ */
552  IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED,
553					/* cups-error-account-authorization-failed @deprecated@ */
554
555  IPP_STATUS_ERROR_INTERNAL = 0x0500,	/* server-error-internal-error */
556  IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED,
557					/* server-error-operation-not-supported */
558  IPP_STATUS_ERROR_SERVICE_UNAVAILABLE,	/* server-error-service-unavailable */
559  IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED,
560					/* server-error-version-not-supported */
561  IPP_STATUS_ERROR_DEVICE,		/* server-error-device-error */
562  IPP_STATUS_ERROR_TEMPORARY,		/* server-error-temporary-error */
563  IPP_STATUS_ERROR_NOT_ACCEPTING_JOBS,	/* server-error-not-accepting-jobs */
564  IPP_STATUS_ERROR_BUSY,		/* server-error-busy */
565  IPP_STATUS_ERROR_JOB_CANCELED,	/* server-error-job-canceled */
566  IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED,
567					/* server-error-multiple-document-jobs-not-supported */
568  IPP_STATUS_ERROR_PRINTER_IS_DEACTIVATED,
569					/* server-error-printer-is-deactivated */
570  IPP_STATUS_ERROR_TOO_MANY_JOBS,	/* server-error-too-many-jobs */
571  IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS,	/* server-error-too-many-documents */
572
573  /* These are internal and never sent over the wire... */
574  IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED = 0x1000,
575					/* cups-authentication-canceled - Authentication canceled by user @since CUPS 1.5/macOS 10.7@ */
576  IPP_STATUS_ERROR_CUPS_PKI,		/* cups-pki-error - Error negotiating a secure connection @since CUPS 1.5/macOS 10.7@ */
577  IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED/* cups-upgrade-required - TLS upgrade required */
578
579#  ifndef _CUPS_NO_DEPRECATED
580#    define IPP_OK				IPP_STATUS_OK
581#    define IPP_OK_SUBST			IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED
582#    define IPP_OK_CONFLICT			IPP_STATUS_OK_CONFLICTING
583#    define IPP_OK_IGNORED_SUBSCRIPTIONS	IPP_STATUS_OK_IGNORED_SUBSCRIPTIONS
584#    define IPP_OK_IGNORED_NOTIFICATIONS	IPP_STATUS_OK_IGNORED_NOTIFICATIONS
585#    define IPP_OK_TOO_MANY_EVENTS		IPP_STATUS_OK_TOO_MANY_EVENTS
586#    define IPP_OK_BUT_CANCEL_SUBSCRIPTION	IPP_STATUS_OK_BUT_CANCEL_SUBSCRIPTION
587#    define IPP_OK_EVENTS_COMPLETE		IPP_STATUS_OK_EVENTS_COMPLETE
588#    define IPP_REDIRECTION_OTHER_SITE		IPP_STATUS_REDIRECTION_OTHER_SITE
589#    define CUPS_SEE_OTHER			IPP_STATUS_CUPS_SEE_OTHER
590#    define IPP_BAD_REQUEST			IPP_STATUS_ERROR_BAD_REQUEST
591#    define IPP_FORBIDDEN			IPP_STATUS_ERROR_FORBIDDEN
592#    define IPP_NOT_AUTHENTICATED		IPP_STATUS_ERROR_NOT_AUTHENTICATED
593#    define IPP_NOT_AUTHORIZED			IPP_STATUS_ERROR_NOT_AUTHORIZED
594#    define IPP_NOT_POSSIBLE			IPP_STATUS_ERROR_NOT_POSSIBLE
595#    define IPP_TIMEOUT				IPP_STATUS_ERROR_TIMEOUT
596#    define IPP_NOT_FOUND			IPP_STATUS_ERROR_NOT_FOUND
597#    define IPP_GONE				IPP_STATUS_ERROR_GONE
598#    define IPP_REQUEST_ENTITY			IPP_STATUS_ERROR_REQUEST_ENTITY
599#    define IPP_REQUEST_VALUE			IPP_STATUS_ERROR_REQUEST_VALUE
600#    define IPP_DOCUMENT_FORMAT			IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED
601#    define IPP_ATTRIBUTES			IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES
602#    define IPP_URI_SCHEME			IPP_STATUS_ERROR_URI_SCHEME
603#    define IPP_CHARSET				IPP_STATUS_ERROR_CHARSET
604#    define IPP_CONFLICT			IPP_STATUS_ERROR_CONFLICTING
605#    define IPP_COMPRESSION_NOT_SUPPORTED	IPP_STATUS_ERROR_COMPRESSION_NOT_SUPPORTED
606#    define IPP_COMPRESSION_ERROR		IPP_STATUS_ERROR_COMPRESSION_ERROR
607#    define IPP_DOCUMENT_FORMAT_ERROR		IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR
608#    define IPP_DOCUMENT_ACCESS_ERROR		IPP_STATUS_ERROR_DOCUMENT_ACCESS
609#    define IPP_ATTRIBUTES_NOT_SETTABLE		IPP_STATUS_ERROR_ATTRIBUTES_NOT_SETTABLE
610#    define IPP_IGNORED_ALL_SUBSCRIPTIONS	IPP_STATUS_ERROR_IGNORED_ALL_SUBSCRIPTIONS
611#    define IPP_TOO_MANY_SUBSCRIPTIONS		IPP_STATUS_ERROR_TOO_MANY_SUBSCRIPTIONS
612#    define IPP_IGNORED_ALL_NOTIFICATIONS	IPP_STATUS_ERROR_IGNORED_ALL_NOTIFICATIONS
613#    define IPP_PRINT_SUPPORT_FILE_NOT_FOUND	IPP_STATUS_ERROR_PRINT_SUPPORT_FILE_NOT_FOUND
614#    define IPP_DOCUMENT_PASSWORD_ERROR		IPP_STATUS_ERROR_DOCUMENT_PASSWORD
615#    define IPP_DOCUMENT_PERMISSION_ERROR	IPP_STATUS_ERROR_DOCUMENT_PERMISSION
616#    define IPP_DOCUMENT_SECURITY_ERROR		IPP_STATUS_ERROR_DOCUMENT_SECURITY
617#    define IPP_DOCUMENT_UNPRINTABLE_ERROR	IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE
618#    define IPP_INTERNAL_ERROR			IPP_STATUS_ERROR_INTERNAL
619#    define IPP_OPERATION_NOT_SUPPORTED		IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED
620#    define IPP_SERVICE_UNAVAILABLE		IPP_STATUS_ERROR_SERVICE_UNAVAILABLE
621#    define IPP_VERSION_NOT_SUPPORTED		IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED
622#    define IPP_DEVICE_ERROR			IPP_STATUS_ERROR_DEVICE
623#    define IPP_TEMPORARY_ERROR			IPP_STATUS_ERROR_TEMPORARY
624#    define IPP_NOT_ACCEPTING			IPP_STATUS_ERROR_NOT_ACCEPTING_JOBS
625#    define IPP_PRINTER_BUSY			IPP_STATUS_ERROR_BUSY
626#    define IPP_ERROR_JOB_CANCELED		IPP_STATUS_ERROR_JOB_CANCELED
627#    define IPP_MULTIPLE_JOBS_NOT_SUPPORTED	IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED
628#    define IPP_PRINTER_IS_DEACTIVATED		IPP_STATUS_ERROR_PRINTER_IS_DEACTIVATED
629#    define IPP_TOO_MANY_JOBS			IPP_STATUS_ERROR_TOO_MANY_JOBS
630#    define IPP_TOO_MANY_DOCUMENTS		IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS
631#    define IPP_AUTHENTICATION_CANCELED		IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED
632#    define IPP_PKI_ERROR			IPP_STATUS_ERROR_CUPS_PKI
633#    define IPP_UPGRADE_REQUIRED		IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED
634     /* Legacy name for canceled status */
635#    define IPP_ERROR_JOB_CANCELLED		IPP_STATUS_ERROR_JOB_CANCELED
636#  endif /* _CUPS_NO_DEPRECATED */
637} ipp_status_t;
638
639typedef enum ipp_tag_e			/**** Format tags for attributes ****/
640{
641  IPP_TAG_CUPS_INVALID = -1,		/* Invalid tag name for @link ippTagValue@ */
642  IPP_TAG_ZERO = 0x00,			/* Zero tag - used for separators */
643  IPP_TAG_OPERATION,			/* Operation group */
644  IPP_TAG_JOB,				/* Job group */
645  IPP_TAG_END,				/* End-of-attributes */
646  IPP_TAG_PRINTER,			/* Printer group */
647  IPP_TAG_UNSUPPORTED_GROUP,		/* Unsupported attributes group */
648  IPP_TAG_SUBSCRIPTION,			/* Subscription group */
649  IPP_TAG_EVENT_NOTIFICATION,		/* Event group */
650  IPP_TAG_RESOURCE,			/* Resource group @private@ */
651  IPP_TAG_DOCUMENT,			/* Document group */
652  IPP_TAG_UNSUPPORTED_VALUE = 0x10,	/* Unsupported value */
653  IPP_TAG_DEFAULT,			/* Default value */
654  IPP_TAG_UNKNOWN,			/* Unknown value */
655  IPP_TAG_NOVALUE,			/* No-value value */
656  IPP_TAG_NOTSETTABLE = 0x15,		/* Not-settable value */
657  IPP_TAG_DELETEATTR,			/* Delete-attribute value */
658  IPP_TAG_ADMINDEFINE,			/* Admin-defined value */
659  IPP_TAG_INTEGER = 0x21,		/* Integer value */
660  IPP_TAG_BOOLEAN,			/* Boolean value */
661  IPP_TAG_ENUM,				/* Enumeration value */
662  IPP_TAG_STRING = 0x30,		/* Octet string value */
663  IPP_TAG_DATE,				/* Date/time value */
664  IPP_TAG_RESOLUTION,			/* Resolution value */
665  IPP_TAG_RANGE,			/* Range value */
666  IPP_TAG_BEGIN_COLLECTION,		/* Beginning of collection value */
667  IPP_TAG_TEXTLANG,			/* Text-with-language value */
668  IPP_TAG_NAMELANG,			/* Name-with-language value */
669  IPP_TAG_END_COLLECTION,		/* End of collection value */
670  IPP_TAG_TEXT = 0x41,			/* Text value */
671  IPP_TAG_NAME,				/* Name value */
672  IPP_TAG_RESERVED_STRING,		/* Reserved for future string value @private@ */
673  IPP_TAG_KEYWORD,			/* Keyword value */
674  IPP_TAG_URI,				/* URI value */
675  IPP_TAG_URISCHEME,			/* URI scheme value */
676  IPP_TAG_CHARSET,			/* Character set value */
677  IPP_TAG_LANGUAGE,			/* Language value */
678  IPP_TAG_MIMETYPE,			/* MIME media type value */
679  IPP_TAG_MEMBERNAME,			/* Collection member name value */
680  IPP_TAG_EXTENSION = 0x7f,		/* Extension point for 32-bit tags */
681  IPP_TAG_CUPS_MASK = 0x7fffffff,	/* Mask for copied attribute values @private@ */
682  /* The following expression is used to avoid compiler warnings with +/-0x80000000 */
683  IPP_TAG_CUPS_CONST = -0x7fffffff-1	/* Bitflag for copied/const attribute values @private@ */
684
685#  ifndef _CUPS_NO_DEPRECATED
686#    define IPP_TAG_MASK		IPP_TAG_CUPS_MASK
687#    define IPP_TAG_COPY		IPP_TAG_CUPS_CONST
688#  endif /* !_CUPS_NO_DEPRECATED */
689} ipp_tag_t;
690
691typedef unsigned char ipp_uchar_t;	/**** Unsigned 8-bit integer/character ****/
692typedef struct _ipp_s ipp_t;		/**** IPP request/response data ****/
693typedef struct _ipp_attribute_s ipp_attribute_t;
694					/**** IPP attribute ****/
695
696/**** New in CUPS 1.2/macOS 10.5 ****/
697typedef ssize_t	(*ipp_iocb_t)(void *context, ipp_uchar_t *buffer, size_t bytes);
698					/**** IPP IO Callback Function @since CUPS 1.2/macOS 10.5@ ****/
699
700/**** New in CUPS 1.6/macOS 10.8 ****/
701typedef int (*ipp_copycb_t)(void *context, ipp_t *dst, ipp_attribute_t *attr);
702
703
704/*
705 * The following structures are PRIVATE starting with CUPS 1.6/macOS 10.8.
706 * Please use the new accessor functions available in CUPS 1.6 and later, as
707 * these definitions will be moved to a private header file in a future release.
708 *
709 * Define _IPP_PRIVATE_STRUCTURES to 1 to cause the private IPP structures to be
710 * exposed in CUPS 1.6.  This happens automatically on macOS when compiling for
711 * a deployment target of 10.7 or earlier.
712 *
713 * Define _IPP_PRIVATE_STRUCTURES to 0 to prevent the private IPP structures
714 * from being exposed.  This is useful when migrating existing code to the new
715 * accessors.
716 */
717
718#  ifdef _IPP_PRIVATE_STRUCTURES
719     /* Somebody has overridden the value */
720#  elif defined(_CUPS_SOURCE) || defined(_CUPS_IPP_PRIVATE_H_)
721     /* Building CUPS */
722#    define _IPP_PRIVATE_STRUCTURES 1
723#  elif defined(__APPLE__)
724#    if defined(MAC_OS_X_VERSION_10_8) && MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_8
725       /* Building for 10.7 and earlier */
726#      define _IPP_PRIVATE_STRUCTURES 1
727#    elif !defined(MAC_OS_X_VERSION_10_8)
728       /* Building for 10.7 and earlier */
729#      define _IPP_PRIVATE_STRUCTURES 1
730#    endif /* MAC_OS_X_VERSION_10_8 && MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_8 */
731#  else
732#    define _IPP_PRIVATE_STRUCTURES 0
733#  endif /* _CUPS_SOURCE || _CUPS_IPP_PRIVATE_H_ */
734
735#  if _IPP_PRIVATE_STRUCTURES
736typedef union _ipp_request_u		/**** Request Header ****/
737{
738  struct				/* Any Header */
739  {
740    ipp_uchar_t	version[2];		/* Protocol version number */
741    int		op_status;		/* Operation ID or status code*/
742    int		request_id;		/* Request ID */
743  }		any;
744
745  struct				/* Operation Header */
746  {
747    ipp_uchar_t	version[2];		/* Protocol version number */
748    ipp_op_t	operation_id;		/* Operation ID */
749    int		request_id;		/* Request ID */
750  }		op;
751
752  struct				/* Status Header */
753  {
754    ipp_uchar_t	version[2];		/* Protocol version number */
755    ipp_status_t status_code;		/* Status code */
756    int		request_id;		/* Request ID */
757  }		status;
758
759  /**** New in CUPS 1.1.19 ****/
760  struct				/* Event Header @since CUPS 1.1.19/macOS 10.3@ */
761  {
762    ipp_uchar_t	version[2];		/* Protocol version number */
763    ipp_status_t status_code;		/* Status code */
764    int		request_id;		/* Request ID */
765  }		event;
766} _ipp_request_t;
767
768/**** New in CUPS 1.1.19 ****/
769
770typedef union _ipp_value_u		/**** Attribute Value ****/
771{
772  int		integer;		/* Integer/enumerated value */
773
774  char		boolean;		/* Boolean value */
775
776  ipp_uchar_t	date[11];		/* Date/time value */
777
778  struct
779  {
780    int		xres,			/* Horizontal resolution */
781		yres;			/* Vertical resolution */
782    ipp_res_t	units;			/* Resolution units */
783  }		resolution;		/* Resolution value */
784
785  struct
786  {
787    int		lower,			/* Lower value */
788		upper;			/* Upper value */
789  }		range;			/* Range of integers value */
790
791  struct
792  {
793    char	*language;		/* Language code */
794    char	*text;			/* String */
795  }		string;			/* String with language value */
796
797  struct
798  {
799    int		length;			/* Length of attribute */
800    void	*data;			/* Data in attribute */
801  }		unknown;		/* Unknown attribute type */
802
803/**** New in CUPS 1.1.19 ****/
804  ipp_t		*collection;		/* Collection value @since CUPS 1.1.19/macOS 10.3@ */
805} _ipp_value_t;
806typedef _ipp_value_t ipp_value_t;	/**** Convenience typedef that will be removed @private@ ****/
807
808struct _ipp_attribute_s			/**** Attribute ****/
809{
810  ipp_attribute_t *next;		/* Next attribute in list */
811  ipp_tag_t	group_tag,		/* Job/Printer/Operation group tag */
812		value_tag;		/* What type of value is it? */
813  char		*name;			/* Name of attribute */
814  int		num_values;		/* Number of values */
815  _ipp_value_t	values[1];		/* Values */
816};
817
818struct _ipp_s				/**** IPP Request/Response/Notification ****/
819{
820  ipp_state_t		state;		/* State of request */
821  _ipp_request_t	request;	/* Request header */
822  ipp_attribute_t	*attrs;		/* Attributes */
823  ipp_attribute_t	*last;		/* Last attribute in list */
824  ipp_attribute_t	*current;	/* Current attribute (for read/write) */
825  ipp_tag_t		curtag;		/* Current attribute group tag */
826
827/**** New in CUPS 1.2 ****/
828  ipp_attribute_t	*prev;		/* Previous attribute (for read) @since CUPS 1.2/macOS 10.5@ */
829
830/**** New in CUPS 1.4.4 ****/
831  int			use;		/* Use count @since CUPS 1.4.4/macOS 10.6.?@ */
832/**** New in CUPS 2.0 ****/
833  int			atend,		/* At end of list? */
834			curindex;	/* Current attribute index for hierarchical search */
835};
836#  endif /* _IPP_PRIVATE_STRUCTURES */
837
838
839/*
840 * Prototypes...
841 */
842
843extern ipp_attribute_t	*ippAddBoolean(ipp_t *ipp, ipp_tag_t group,
844			               const char *name, char value);
845extern ipp_attribute_t	*ippAddBooleans(ipp_t *ipp, ipp_tag_t group,
846			                const char *name, int num_values,
847					const char *values);
848extern ipp_attribute_t	*ippAddDate(ipp_t *ipp, ipp_tag_t group,
849			            const char *name, const ipp_uchar_t *value);
850extern ipp_attribute_t	*ippAddInteger(ipp_t *ipp, ipp_tag_t group,
851			               ipp_tag_t value_tag, const char *name,
852				       int value);
853extern ipp_attribute_t	*ippAddIntegers(ipp_t *ipp, ipp_tag_t group,
854			                ipp_tag_t value_tag, const char *name,
855					int num_values, const int *values);
856extern ipp_attribute_t	*ippAddRange(ipp_t *ipp, ipp_tag_t group,
857			             const char *name, int lower, int upper);
858extern ipp_attribute_t	*ippAddRanges(ipp_t *ipp, ipp_tag_t group,
859			              const char *name, int num_values,
860				      const int *lower, const int *upper);
861extern ipp_attribute_t	*ippAddResolution(ipp_t *ipp, ipp_tag_t group,
862			                  const char *name, ipp_res_t units,
863					  int xres, int yres);
864extern ipp_attribute_t	*ippAddResolutions(ipp_t *ipp, ipp_tag_t group,
865			                   const char *name, int num_values,
866					   ipp_res_t units, const int *xres,
867					   const int *yres);
868extern ipp_attribute_t	*ippAddSeparator(ipp_t *ipp);
869extern ipp_attribute_t	*ippAddString(ipp_t *ipp, ipp_tag_t group,
870			              ipp_tag_t value_tag, const char *name,
871				      const char *language, const char *value);
872extern ipp_attribute_t	*ippAddStrings(ipp_t *ipp, ipp_tag_t group,
873			               ipp_tag_t value_tag, const char *name,
874				       int num_values, const char *language,
875				       const char * const *values);
876extern time_t		ippDateToTime(const ipp_uchar_t *date);
877extern void		ippDelete(ipp_t *ipp);
878extern const char	*ippErrorString(ipp_status_t error);
879extern ipp_attribute_t	*ippFindAttribute(ipp_t *ipp, const char *name,
880			                  ipp_tag_t value_tag);
881extern ipp_attribute_t	*ippFindNextAttribute(ipp_t *ipp, const char *name,
882			                      ipp_tag_t value_tag);
883extern size_t		ippLength(ipp_t *ipp);
884extern ipp_t		*ippNew(void);
885extern ipp_state_t	ippRead(http_t *http, ipp_t *ipp);
886extern const ipp_uchar_t *ippTimeToDate(time_t t);
887extern ipp_state_t	ippWrite(http_t *http, ipp_t *ipp);
888extern int		ippPort(void);
889extern void		ippSetPort(int p);
890
891/**** New in CUPS 1.1.19 ****/
892extern ipp_attribute_t	*ippAddCollection(ipp_t *ipp, ipp_tag_t group,
893			                  const char *name, ipp_t *value) _CUPS_API_1_1_19;
894extern ipp_attribute_t	*ippAddCollections(ipp_t *ipp, ipp_tag_t group,
895			                   const char *name, int num_values,
896					   const ipp_t **values) _CUPS_API_1_1_19;
897extern void		ippDeleteAttribute(ipp_t *ipp, ipp_attribute_t *attr) _CUPS_API_1_1_19;
898extern ipp_state_t	ippReadFile(int fd, ipp_t *ipp) _CUPS_API_1_1_19;
899extern ipp_state_t	ippWriteFile(int fd, ipp_t *ipp) _CUPS_API_1_1_19;
900
901/**** New in CUPS 1.2/macOS 10.5 ****/
902extern ipp_attribute_t	*ippAddOctetString(ipp_t *ipp, ipp_tag_t group,
903			                   const char *name,
904					   const void *data, int datalen) _CUPS_API_1_2;
905extern ipp_status_t	ippErrorValue(const char *name) _CUPS_API_1_2;
906extern ipp_t		*ippNewRequest(ipp_op_t op) _CUPS_API_1_2;
907extern const char	*ippOpString(ipp_op_t op) _CUPS_API_1_2;
908extern ipp_op_t		ippOpValue(const char *name) _CUPS_API_1_2;
909extern ipp_state_t	ippReadIO(void *src, ipp_iocb_t cb, int blocking,
910			          ipp_t *parent, ipp_t *ipp) _CUPS_API_1_2;
911extern ipp_state_t	ippWriteIO(void *dst, ipp_iocb_t cb, int blocking,
912			           ipp_t *parent, ipp_t *ipp) _CUPS_API_1_2;
913
914/**** New in CUPS 1.4/macOS 10.6 ****/
915extern const char	*ippTagString(ipp_tag_t tag) _CUPS_API_1_4;
916extern ipp_tag_t	ippTagValue(const char *name) _CUPS_API_1_4;
917
918/**** New in CUPS 1.6/macOS 10.8 ****/
919extern ipp_attribute_t	*ippAddOutOfBand(ipp_t *ipp, ipp_tag_t group,
920			                 ipp_tag_t value_tag, const char *name)
921			                 _CUPS_API_1_6;
922extern size_t		ippAttributeString(ipp_attribute_t *attr, char *buffer,
923			                   size_t bufsize) _CUPS_API_1_6;
924extern ipp_attribute_t	*ippCopyAttribute(ipp_t *dst, ipp_attribute_t *attr,
925			                 int quickcopy) _CUPS_API_1_6;
926extern int		ippCopyAttributes(ipp_t *dst, ipp_t *src,
927			                  int quickcopy, ipp_copycb_t cb,
928			                  void *context) _CUPS_API_1_6;
929extern int		ippDeleteValues(ipp_t *ipp, ipp_attribute_t **attr,
930			                int element, int count) _CUPS_API_1_6;
931extern const char	*ippEnumString(const char *attrname, int enumvalue)
932			               _CUPS_API_1_6;
933extern int		ippEnumValue(const char *attrname,
934			             const char *enumstring) _CUPS_API_1_6;
935extern ipp_attribute_t	*ippFirstAttribute(ipp_t *ipp) _CUPS_API_1_6;
936extern int		ippGetBoolean(ipp_attribute_t *attr, int element)
937			              _CUPS_API_1_6;
938extern ipp_t		*ippGetCollection(ipp_attribute_t *attr,
939			                  int element) _CUPS_API_1_6;
940extern int		ippGetCount(ipp_attribute_t *attr) _CUPS_API_1_6;
941extern const ipp_uchar_t *ippGetDate(ipp_attribute_t *attr, int element)
942			             _CUPS_API_1_6;
943extern ipp_tag_t	ippGetGroupTag(ipp_attribute_t *attr) _CUPS_API_1_6;
944extern int		ippGetInteger(ipp_attribute_t *attr, int element)
945			              _CUPS_API_1_6;
946extern const char	*ippGetName(ipp_attribute_t *attr) _CUPS_API_1_6;
947extern ipp_op_t		ippGetOperation(ipp_t *ipp) _CUPS_API_1_6;
948extern int		ippGetRange(ipp_attribute_t *attr, int element,
949			            int *upper) _CUPS_API_1_6;
950extern int		ippGetRequestId(ipp_t *ipp) _CUPS_API_1_6;
951extern int		ippGetResolution(ipp_attribute_t *attr, int element,
952			                 int *yres, ipp_res_t *units)
953			                 _CUPS_API_1_6;
954extern ipp_state_t	ippGetState(ipp_t *ipp) _CUPS_API_1_6;
955extern ipp_status_t	ippGetStatusCode(ipp_t *ipp) _CUPS_API_1_6;
956extern const char	*ippGetString(ipp_attribute_t *attr, int element,
957				      const char **language) _CUPS_API_1_6;
958extern ipp_tag_t	ippGetValueTag(ipp_attribute_t *attr) _CUPS_API_1_6;
959extern int		ippGetVersion(ipp_t *ipp, int *minor) _CUPS_API_1_6;
960extern ipp_attribute_t	*ippNextAttribute(ipp_t *ipp) _CUPS_API_1_6;
961extern int		ippSetBoolean(ipp_t *ipp, ipp_attribute_t **attr,
962			              int element, int boolvalue) _CUPS_API_1_6;
963extern int		ippSetCollection(ipp_t *ipp, ipp_attribute_t **attr,
964			                 int element, ipp_t *colvalue)
965			                 _CUPS_API_1_6;
966extern int		ippSetDate(ipp_t *ipp, ipp_attribute_t **attr,
967			            int element, const ipp_uchar_t *datevalue)
968				    _CUPS_API_1_6;
969extern int		ippSetGroupTag(ipp_t *ipp, ipp_attribute_t **attr,
970			               ipp_tag_t group_tag) _CUPS_API_1_6;
971extern int		ippSetInteger(ipp_t *ipp, ipp_attribute_t **attr,
972			              int element, int intvalue) _CUPS_API_1_6;
973extern int		ippSetName(ipp_t *ipp, ipp_attribute_t **attr,
974			            const char *name) _CUPS_API_1_6;
975extern int		ippSetOperation(ipp_t *ipp, ipp_op_t op) _CUPS_API_1_6;
976extern int		ippSetRange(ipp_t *ipp, ipp_attribute_t **attr,
977			            int element, int lowervalue, int uppervalue)
978			            _CUPS_API_1_6;
979extern int		ippSetRequestId(ipp_t *ipp, int request_id)
980			                _CUPS_API_1_6;
981extern int		ippSetResolution(ipp_t *ipp, ipp_attribute_t **attr,
982			                 int element, ipp_res_t unitsvalue,
983			                 int xresvalue, int yresvalue)
984			                 _CUPS_API_1_6;
985extern int		ippSetState(ipp_t *ipp, ipp_state_t state)
986			            _CUPS_API_1_6;
987extern int		ippSetStatusCode(ipp_t *ipp, ipp_status_t status)
988			                 _CUPS_API_1_6;
989extern int		ippSetString(ipp_t *ipp, ipp_attribute_t **attr,
990			             int element, const char *strvalue)
991			             _CUPS_API_1_6;
992extern int		ippSetValueTag(ipp_t *ipp, ipp_attribute_t **attr,
993			               ipp_tag_t value_tag) _CUPS_API_1_6;
994extern int		ippSetVersion(ipp_t *ipp, int major, int minor)
995			              _CUPS_API_1_6;
996
997/**** New in CUPS 1.7 ****/
998extern ipp_attribute_t	*ippAddStringf(ipp_t *ipp, ipp_tag_t group,
999			               ipp_tag_t value_tag, const char *name,
1000			               const char *language, const char *format,
1001			               ...) _CUPS_API_1_7;
1002extern ipp_attribute_t	*ippAddStringfv(ipp_t *ipp, ipp_tag_t group,
1003					ipp_tag_t value_tag, const char *name,
1004					const char *language,
1005					const char *format, va_list ap)
1006					_CUPS_API_1_7;
1007extern int		ippContainsInteger(ipp_attribute_t *attr, int value)
1008			                   _CUPS_API_1_7;
1009extern int		ippContainsString(ipp_attribute_t *attr,
1010			                  const char *value) _CUPS_API_1_7;
1011extern cups_array_t	*ippCreateRequestedArray(ipp_t *request) _CUPS_API_1_7;
1012extern void		*ippGetOctetString(ipp_attribute_t *attr, int element,
1013			                   int *datalen) _CUPS_API_1_7;
1014extern ipp_t		*ippNewResponse(ipp_t *request) _CUPS_API_1_7;
1015extern int		ippSetOctetString(ipp_t *ipp, ipp_attribute_t **attr,
1016			                  int element, const void *data,
1017					  int datalen) _CUPS_API_1_7;
1018extern int		ippSetStringf(ipp_t *ipp, ipp_attribute_t **attr,
1019			              int element, const char *format,
1020				      ...) _CUPS_API_1_7;
1021extern int		ippSetStringfv(ipp_t *ipp, ipp_attribute_t **attr,
1022			               int element, const char *format,
1023				       va_list ap) _CUPS_API_1_7;
1024extern int		ippValidateAttribute(ipp_attribute_t *attr)
1025			                     _CUPS_API_1_7;
1026extern int		ippValidateAttributes(ipp_t *ipp) _CUPS_API_1_7;
1027
1028
1029/**** New in CUPS 2.0 ****/
1030extern const char	*ippStateString(ipp_state_t state) _CUPS_API_2_0;
1031
1032
1033/*
1034 * C++ magic...
1035 */
1036
1037#  ifdef __cplusplus
1038}
1039#  endif /* __cplusplus */
1040#endif /* !_CUPS_IPP_H_ */
1041