1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * Option encoding routines for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright © 2007-2019 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright © 1997-2007 by Easy Software Products.
6*5e7646d2SAndroid Build Coastguard Worker *
7*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more
8*5e7646d2SAndroid Build Coastguard Worker * information.
9*5e7646d2SAndroid Build Coastguard Worker */
10*5e7646d2SAndroid Build Coastguard Worker
11*5e7646d2SAndroid Build Coastguard Worker /*
12*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
13*5e7646d2SAndroid Build Coastguard Worker */
14*5e7646d2SAndroid Build Coastguard Worker
15*5e7646d2SAndroid Build Coastguard Worker #include "cups-private.h"
16*5e7646d2SAndroid Build Coastguard Worker #include "debug-internal.h"
17*5e7646d2SAndroid Build Coastguard Worker
18*5e7646d2SAndroid Build Coastguard Worker
19*5e7646d2SAndroid Build Coastguard Worker /*
20*5e7646d2SAndroid Build Coastguard Worker * Local list of option names, the value tags they should use, and the list of
21*5e7646d2SAndroid Build Coastguard Worker * supported operations...
22*5e7646d2SAndroid Build Coastguard Worker *
23*5e7646d2SAndroid Build Coastguard Worker * **** THIS LIST MUST BE SORTED BY ATTRIBUTE NAME ****
24*5e7646d2SAndroid Build Coastguard Worker */
25*5e7646d2SAndroid Build Coastguard Worker
26*5e7646d2SAndroid Build Coastguard Worker static const ipp_op_t ipp_job_creation[] =
27*5e7646d2SAndroid Build Coastguard Worker {
28*5e7646d2SAndroid Build Coastguard Worker IPP_OP_PRINT_JOB,
29*5e7646d2SAndroid Build Coastguard Worker IPP_OP_PRINT_URI,
30*5e7646d2SAndroid Build Coastguard Worker IPP_OP_VALIDATE_JOB,
31*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CREATE_JOB,
32*5e7646d2SAndroid Build Coastguard Worker IPP_OP_HOLD_JOB,
33*5e7646d2SAndroid Build Coastguard Worker IPP_OP_SET_JOB_ATTRIBUTES,
34*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CUPS_NONE
35*5e7646d2SAndroid Build Coastguard Worker };
36*5e7646d2SAndroid Build Coastguard Worker
37*5e7646d2SAndroid Build Coastguard Worker static const ipp_op_t ipp_doc_creation[] =
38*5e7646d2SAndroid Build Coastguard Worker {
39*5e7646d2SAndroid Build Coastguard Worker IPP_OP_PRINT_JOB,
40*5e7646d2SAndroid Build Coastguard Worker IPP_OP_PRINT_URI,
41*5e7646d2SAndroid Build Coastguard Worker IPP_OP_SEND_DOCUMENT,
42*5e7646d2SAndroid Build Coastguard Worker IPP_OP_SEND_URI,
43*5e7646d2SAndroid Build Coastguard Worker IPP_OP_SET_JOB_ATTRIBUTES,
44*5e7646d2SAndroid Build Coastguard Worker IPP_OP_SET_DOCUMENT_ATTRIBUTES,
45*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CUPS_NONE
46*5e7646d2SAndroid Build Coastguard Worker };
47*5e7646d2SAndroid Build Coastguard Worker
48*5e7646d2SAndroid Build Coastguard Worker static const ipp_op_t ipp_sub_creation[] =
49*5e7646d2SAndroid Build Coastguard Worker {
50*5e7646d2SAndroid Build Coastguard Worker IPP_OP_PRINT_JOB,
51*5e7646d2SAndroid Build Coastguard Worker IPP_OP_PRINT_URI,
52*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CREATE_JOB,
53*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS,
54*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CREATE_JOB_SUBSCRIPTIONS,
55*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CUPS_NONE
56*5e7646d2SAndroid Build Coastguard Worker };
57*5e7646d2SAndroid Build Coastguard Worker
58*5e7646d2SAndroid Build Coastguard Worker static const ipp_op_t ipp_all_print[] =
59*5e7646d2SAndroid Build Coastguard Worker {
60*5e7646d2SAndroid Build Coastguard Worker IPP_OP_PRINT_JOB,
61*5e7646d2SAndroid Build Coastguard Worker IPP_OP_PRINT_URI,
62*5e7646d2SAndroid Build Coastguard Worker IPP_OP_VALIDATE_JOB,
63*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CREATE_JOB,
64*5e7646d2SAndroid Build Coastguard Worker IPP_OP_SEND_DOCUMENT,
65*5e7646d2SAndroid Build Coastguard Worker IPP_OP_SEND_URI,
66*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CUPS_NONE
67*5e7646d2SAndroid Build Coastguard Worker };
68*5e7646d2SAndroid Build Coastguard Worker
69*5e7646d2SAndroid Build Coastguard Worker static const ipp_op_t ipp_set_printer[] =
70*5e7646d2SAndroid Build Coastguard Worker {
71*5e7646d2SAndroid Build Coastguard Worker IPP_OP_SET_PRINTER_ATTRIBUTES,
72*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CUPS_ADD_MODIFY_PRINTER,
73*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CUPS_ADD_MODIFY_CLASS,
74*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CUPS_NONE
75*5e7646d2SAndroid Build Coastguard Worker };
76*5e7646d2SAndroid Build Coastguard Worker
77*5e7646d2SAndroid Build Coastguard Worker static const ipp_op_t cups_schemes[] =
78*5e7646d2SAndroid Build Coastguard Worker {
79*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CUPS_GET_DEVICES,
80*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CUPS_GET_PPDS,
81*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CUPS_NONE
82*5e7646d2SAndroid Build Coastguard Worker };
83*5e7646d2SAndroid Build Coastguard Worker
84*5e7646d2SAndroid Build Coastguard Worker static const ipp_op_t cups_get_ppds[] =
85*5e7646d2SAndroid Build Coastguard Worker {
86*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CUPS_GET_PPDS,
87*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CUPS_NONE
88*5e7646d2SAndroid Build Coastguard Worker };
89*5e7646d2SAndroid Build Coastguard Worker
90*5e7646d2SAndroid Build Coastguard Worker static const ipp_op_t cups_ppd_name[] =
91*5e7646d2SAndroid Build Coastguard Worker {
92*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CUPS_ADD_MODIFY_PRINTER,
93*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CUPS_GET_PPD,
94*5e7646d2SAndroid Build Coastguard Worker IPP_OP_CUPS_NONE
95*5e7646d2SAndroid Build Coastguard Worker };
96*5e7646d2SAndroid Build Coastguard Worker
97*5e7646d2SAndroid Build Coastguard Worker static const _ipp_option_t ipp_options[] =
98*5e7646d2SAndroid Build Coastguard Worker {
99*5e7646d2SAndroid Build Coastguard Worker { 1, "auth-info", IPP_TAG_TEXT, IPP_TAG_JOB },
100*5e7646d2SAndroid Build Coastguard Worker { 1, "auth-info-default", IPP_TAG_TEXT, IPP_TAG_PRINTER },
101*5e7646d2SAndroid Build Coastguard Worker { 1, "auth-info-required", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
102*5e7646d2SAndroid Build Coastguard Worker { 0, "blackplot", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
103*5e7646d2SAndroid Build Coastguard Worker { 0, "blackplot-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
104*5e7646d2SAndroid Build Coastguard Worker { 0, "brightness", IPP_TAG_INTEGER, IPP_TAG_JOB },
105*5e7646d2SAndroid Build Coastguard Worker { 0, "brightness-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
106*5e7646d2SAndroid Build Coastguard Worker { 0, "columns", IPP_TAG_INTEGER, IPP_TAG_JOB },
107*5e7646d2SAndroid Build Coastguard Worker { 0, "columns-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
108*5e7646d2SAndroid Build Coastguard Worker { 0, "compression", IPP_TAG_KEYWORD, IPP_TAG_OPERATION,
109*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO,
110*5e7646d2SAndroid Build Coastguard Worker ipp_doc_creation },
111*5e7646d2SAndroid Build Coastguard Worker { 0, "copies", IPP_TAG_INTEGER, IPP_TAG_JOB,
112*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
113*5e7646d2SAndroid Build Coastguard Worker { 0, "copies-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
114*5e7646d2SAndroid Build Coastguard Worker { 0, "date-time-at-completed",IPP_TAG_DATE, IPP_TAG_ZERO }, /* never send as option */
115*5e7646d2SAndroid Build Coastguard Worker { 0, "date-time-at-creation", IPP_TAG_DATE, IPP_TAG_ZERO }, /* never send as option */
116*5e7646d2SAndroid Build Coastguard Worker { 0, "date-time-at-processing",IPP_TAG_DATE, IPP_TAG_ZERO }, /* never send as option */
117*5e7646d2SAndroid Build Coastguard Worker { 0, "device-uri", IPP_TAG_URI, IPP_TAG_PRINTER },
118*5e7646d2SAndroid Build Coastguard Worker { 1, "document-copies", IPP_TAG_RANGE, IPP_TAG_JOB,
119*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT,
120*5e7646d2SAndroid Build Coastguard Worker ipp_doc_creation },
121*5e7646d2SAndroid Build Coastguard Worker { 0, "document-format", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION,
122*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO,
123*5e7646d2SAndroid Build Coastguard Worker ipp_doc_creation },
124*5e7646d2SAndroid Build Coastguard Worker { 0, "document-format-default", IPP_TAG_MIMETYPE, IPP_TAG_PRINTER },
125*5e7646d2SAndroid Build Coastguard Worker { 1, "document-numbers", IPP_TAG_RANGE, IPP_TAG_JOB,
126*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT,
127*5e7646d2SAndroid Build Coastguard Worker ipp_all_print },
128*5e7646d2SAndroid Build Coastguard Worker { 1, "exclude-schemes", IPP_TAG_NAME, IPP_TAG_OPERATION,
129*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO,
130*5e7646d2SAndroid Build Coastguard Worker cups_schemes },
131*5e7646d2SAndroid Build Coastguard Worker { 1, "finishings", IPP_TAG_ENUM, IPP_TAG_JOB,
132*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
133*5e7646d2SAndroid Build Coastguard Worker { 1, "finishings-col", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB,
134*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
135*5e7646d2SAndroid Build Coastguard Worker { 1, "finishings-col-default", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_PRINTER },
136*5e7646d2SAndroid Build Coastguard Worker { 1, "finishings-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
137*5e7646d2SAndroid Build Coastguard Worker { 0, "fit-to-page", IPP_TAG_BOOLEAN, IPP_TAG_JOB,
138*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
139*5e7646d2SAndroid Build Coastguard Worker { 0, "fit-to-page-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
140*5e7646d2SAndroid Build Coastguard Worker { 0, "fitplot", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
141*5e7646d2SAndroid Build Coastguard Worker { 0, "fitplot-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
142*5e7646d2SAndroid Build Coastguard Worker { 0, "gamma", IPP_TAG_INTEGER, IPP_TAG_JOB },
143*5e7646d2SAndroid Build Coastguard Worker { 0, "gamma-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
144*5e7646d2SAndroid Build Coastguard Worker { 0, "hue", IPP_TAG_INTEGER, IPP_TAG_JOB },
145*5e7646d2SAndroid Build Coastguard Worker { 0, "hue-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
146*5e7646d2SAndroid Build Coastguard Worker { 1, "include-schemes", IPP_TAG_NAME, IPP_TAG_OPERATION,
147*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO,
148*5e7646d2SAndroid Build Coastguard Worker cups_schemes },
149*5e7646d2SAndroid Build Coastguard Worker { 0, "ipp-attribute-fidelity", IPP_TAG_BOOLEAN, IPP_TAG_OPERATION },
150*5e7646d2SAndroid Build Coastguard Worker { 0, "job-account-id", IPP_TAG_NAME, IPP_TAG_JOB },
151*5e7646d2SAndroid Build Coastguard Worker { 0, "job-account-id-default",IPP_TAG_NAME, IPP_TAG_PRINTER },
152*5e7646d2SAndroid Build Coastguard Worker { 0, "job-accounting-user-id", IPP_TAG_NAME, IPP_TAG_JOB },
153*5e7646d2SAndroid Build Coastguard Worker { 0, "job-accounting-user-id-default", IPP_TAG_NAME, IPP_TAG_PRINTER },
154*5e7646d2SAndroid Build Coastguard Worker { 0, "job-authorization-uri", IPP_TAG_URI, IPP_TAG_OPERATION },
155*5e7646d2SAndroid Build Coastguard Worker { 0, "job-cancel-after", IPP_TAG_INTEGER, IPP_TAG_JOB },
156*5e7646d2SAndroid Build Coastguard Worker { 0, "job-cancel-after-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
157*5e7646d2SAndroid Build Coastguard Worker { 0, "job-hold-until", IPP_TAG_KEYWORD, IPP_TAG_JOB },
158*5e7646d2SAndroid Build Coastguard Worker { 0, "job-hold-until-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
159*5e7646d2SAndroid Build Coastguard Worker { 0, "job-id", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */
160*5e7646d2SAndroid Build Coastguard Worker { 0, "job-impressions", IPP_TAG_INTEGER, IPP_TAG_OPERATION },
161*5e7646d2SAndroid Build Coastguard Worker { 0, "job-impressions-completed", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */
162*5e7646d2SAndroid Build Coastguard Worker { 0, "job-k-limit", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
163*5e7646d2SAndroid Build Coastguard Worker { 0, "job-k-octets", IPP_TAG_INTEGER, IPP_TAG_OPERATION },
164*5e7646d2SAndroid Build Coastguard Worker { 0, "job-k-octets-completed",IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */
165*5e7646d2SAndroid Build Coastguard Worker { 0, "job-media-sheets", IPP_TAG_INTEGER, IPP_TAG_OPERATION },
166*5e7646d2SAndroid Build Coastguard Worker { 0, "job-media-sheets-completed", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */
167*5e7646d2SAndroid Build Coastguard Worker { 0, "job-name", IPP_TAG_NAME, IPP_TAG_OPERATION,
168*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_JOB },
169*5e7646d2SAndroid Build Coastguard Worker { 0, "job-page-limit", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
170*5e7646d2SAndroid Build Coastguard Worker { 0, "job-pages", IPP_TAG_INTEGER, IPP_TAG_OPERATION },
171*5e7646d2SAndroid Build Coastguard Worker { 0, "job-pages-completed", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */
172*5e7646d2SAndroid Build Coastguard Worker { 0, "job-password", IPP_TAG_STRING, IPP_TAG_OPERATION,
173*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO,
174*5e7646d2SAndroid Build Coastguard Worker ipp_job_creation },
175*5e7646d2SAndroid Build Coastguard Worker { 0, "job-password-encryption", IPP_TAG_KEYWORD, IPP_TAG_OPERATION,
176*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO,
177*5e7646d2SAndroid Build Coastguard Worker ipp_job_creation },
178*5e7646d2SAndroid Build Coastguard Worker { 0, "job-priority", IPP_TAG_INTEGER, IPP_TAG_JOB },
179*5e7646d2SAndroid Build Coastguard Worker { 0, "job-priority-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
180*5e7646d2SAndroid Build Coastguard Worker { 0, "job-quota-period", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
181*5e7646d2SAndroid Build Coastguard Worker { 1, "job-sheets", IPP_TAG_NAME, IPP_TAG_JOB },
182*5e7646d2SAndroid Build Coastguard Worker { 1, "job-sheets-default", IPP_TAG_NAME, IPP_TAG_PRINTER },
183*5e7646d2SAndroid Build Coastguard Worker { 0, "job-state", IPP_TAG_ENUM, IPP_TAG_ZERO }, /* never send as option */
184*5e7646d2SAndroid Build Coastguard Worker { 0, "job-state-message", IPP_TAG_TEXT, IPP_TAG_ZERO }, /* never send as option */
185*5e7646d2SAndroid Build Coastguard Worker { 0, "job-state-reasons", IPP_TAG_KEYWORD, IPP_TAG_ZERO }, /* never send as option */
186*5e7646d2SAndroid Build Coastguard Worker { 0, "job-uuid", IPP_TAG_URI, IPP_TAG_JOB },
187*5e7646d2SAndroid Build Coastguard Worker { 0, "landscape", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
188*5e7646d2SAndroid Build Coastguard Worker { 1, "marker-change-time", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
189*5e7646d2SAndroid Build Coastguard Worker { 1, "marker-colors", IPP_TAG_NAME, IPP_TAG_PRINTER },
190*5e7646d2SAndroid Build Coastguard Worker { 1, "marker-high-levels", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
191*5e7646d2SAndroid Build Coastguard Worker { 1, "marker-levels", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
192*5e7646d2SAndroid Build Coastguard Worker { 1, "marker-low-levels", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
193*5e7646d2SAndroid Build Coastguard Worker { 0, "marker-message", IPP_TAG_TEXT, IPP_TAG_PRINTER },
194*5e7646d2SAndroid Build Coastguard Worker { 1, "marker-names", IPP_TAG_NAME, IPP_TAG_PRINTER },
195*5e7646d2SAndroid Build Coastguard Worker { 1, "marker-types", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
196*5e7646d2SAndroid Build Coastguard Worker { 1, "media", IPP_TAG_KEYWORD, IPP_TAG_JOB,
197*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
198*5e7646d2SAndroid Build Coastguard Worker { 0, "media-bottom-margin", IPP_TAG_INTEGER, IPP_TAG_JOB,
199*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
200*5e7646d2SAndroid Build Coastguard Worker { 0, "media-col", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB,
201*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
202*5e7646d2SAndroid Build Coastguard Worker { 0, "media-col-default", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_PRINTER },
203*5e7646d2SAndroid Build Coastguard Worker { 0, "media-color", IPP_TAG_KEYWORD, IPP_TAG_JOB,
204*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
205*5e7646d2SAndroid Build Coastguard Worker { 1, "media-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
206*5e7646d2SAndroid Build Coastguard Worker { 0, "media-key", IPP_TAG_KEYWORD, IPP_TAG_JOB,
207*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
208*5e7646d2SAndroid Build Coastguard Worker { 0, "media-left-margin", IPP_TAG_INTEGER, IPP_TAG_JOB,
209*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
210*5e7646d2SAndroid Build Coastguard Worker { 0, "media-right-margin", IPP_TAG_INTEGER, IPP_TAG_JOB,
211*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
212*5e7646d2SAndroid Build Coastguard Worker { 0, "media-size", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB,
213*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
214*5e7646d2SAndroid Build Coastguard Worker { 0, "media-size-name", IPP_TAG_KEYWORD, IPP_TAG_JOB,
215*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
216*5e7646d2SAndroid Build Coastguard Worker { 0, "media-source", IPP_TAG_KEYWORD, IPP_TAG_JOB,
217*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
218*5e7646d2SAndroid Build Coastguard Worker { 0, "media-top-margin", IPP_TAG_INTEGER, IPP_TAG_JOB,
219*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
220*5e7646d2SAndroid Build Coastguard Worker { 0, "media-type", IPP_TAG_KEYWORD, IPP_TAG_JOB,
221*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
222*5e7646d2SAndroid Build Coastguard Worker { 0, "mirror", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
223*5e7646d2SAndroid Build Coastguard Worker { 0, "mirror-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
224*5e7646d2SAndroid Build Coastguard Worker { 0, "multiple-document-handling", IPP_TAG_KEYWORD, IPP_TAG_JOB,
225*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
226*5e7646d2SAndroid Build Coastguard Worker { 0, "multiple-document-handling-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
227*5e7646d2SAndroid Build Coastguard Worker { 0, "natural-scaling", IPP_TAG_INTEGER, IPP_TAG_JOB },
228*5e7646d2SAndroid Build Coastguard Worker { 0, "natural-scaling-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
229*5e7646d2SAndroid Build Coastguard Worker { 0, "notify-charset", IPP_TAG_CHARSET, IPP_TAG_SUBSCRIPTION },
230*5e7646d2SAndroid Build Coastguard Worker { 1, "notify-events", IPP_TAG_KEYWORD, IPP_TAG_SUBSCRIPTION },
231*5e7646d2SAndroid Build Coastguard Worker { 1, "notify-events-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
232*5e7646d2SAndroid Build Coastguard Worker { 0, "notify-lease-duration", IPP_TAG_INTEGER, IPP_TAG_SUBSCRIPTION },
233*5e7646d2SAndroid Build Coastguard Worker { 0, "notify-lease-duration-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
234*5e7646d2SAndroid Build Coastguard Worker { 0, "notify-natural-language", IPP_TAG_LANGUAGE, IPP_TAG_SUBSCRIPTION },
235*5e7646d2SAndroid Build Coastguard Worker { 0, "notify-pull-method", IPP_TAG_KEYWORD, IPP_TAG_SUBSCRIPTION },
236*5e7646d2SAndroid Build Coastguard Worker { 0, "notify-recipient-uri", IPP_TAG_URI, IPP_TAG_SUBSCRIPTION },
237*5e7646d2SAndroid Build Coastguard Worker { 0, "notify-time-interval", IPP_TAG_INTEGER, IPP_TAG_SUBSCRIPTION },
238*5e7646d2SAndroid Build Coastguard Worker { 0, "notify-user-data", IPP_TAG_STRING, IPP_TAG_SUBSCRIPTION },
239*5e7646d2SAndroid Build Coastguard Worker { 0, "number-up", IPP_TAG_INTEGER, IPP_TAG_JOB,
240*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
241*5e7646d2SAndroid Build Coastguard Worker { 0, "number-up-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
242*5e7646d2SAndroid Build Coastguard Worker { 0, "number-up-layout", IPP_TAG_KEYWORD, IPP_TAG_JOB,
243*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
244*5e7646d2SAndroid Build Coastguard Worker { 0, "number-up-layout-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
245*5e7646d2SAndroid Build Coastguard Worker { 0, "orientation-requested", IPP_TAG_ENUM, IPP_TAG_JOB,
246*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
247*5e7646d2SAndroid Build Coastguard Worker { 0, "orientation-requested-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
248*5e7646d2SAndroid Build Coastguard Worker { 0, "output-bin", IPP_TAG_KEYWORD, IPP_TAG_JOB,
249*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
250*5e7646d2SAndroid Build Coastguard Worker { 0, "output-bin-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
251*5e7646d2SAndroid Build Coastguard Worker { 1, "overrides", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB,
252*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
253*5e7646d2SAndroid Build Coastguard Worker { 0, "page-bottom", IPP_TAG_INTEGER, IPP_TAG_JOB },
254*5e7646d2SAndroid Build Coastguard Worker { 0, "page-bottom-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
255*5e7646d2SAndroid Build Coastguard Worker { 0, "page-delivery", IPP_TAG_KEYWORD, IPP_TAG_JOB,
256*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
257*5e7646d2SAndroid Build Coastguard Worker { 0, "page-delivery-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
258*5e7646d2SAndroid Build Coastguard Worker { 0, "page-left", IPP_TAG_INTEGER, IPP_TAG_JOB },
259*5e7646d2SAndroid Build Coastguard Worker { 0, "page-left-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
260*5e7646d2SAndroid Build Coastguard Worker { 1, "page-ranges", IPP_TAG_RANGE, IPP_TAG_JOB,
261*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
262*5e7646d2SAndroid Build Coastguard Worker { 0, "page-right", IPP_TAG_INTEGER, IPP_TAG_JOB },
263*5e7646d2SAndroid Build Coastguard Worker { 0, "page-right-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
264*5e7646d2SAndroid Build Coastguard Worker { 0, "page-top", IPP_TAG_INTEGER, IPP_TAG_JOB },
265*5e7646d2SAndroid Build Coastguard Worker { 0, "page-top-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
266*5e7646d2SAndroid Build Coastguard Worker { 1, "pages", IPP_TAG_RANGE, IPP_TAG_JOB,
267*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
268*5e7646d2SAndroid Build Coastguard Worker { 0, "penwidth", IPP_TAG_INTEGER, IPP_TAG_JOB },
269*5e7646d2SAndroid Build Coastguard Worker { 0, "penwidth-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
270*5e7646d2SAndroid Build Coastguard Worker { 0, "port-monitor", IPP_TAG_NAME, IPP_TAG_PRINTER },
271*5e7646d2SAndroid Build Coastguard Worker { 0, "ppd-device-id", IPP_TAG_TEXT, IPP_TAG_OPERATION,
272*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO,
273*5e7646d2SAndroid Build Coastguard Worker cups_get_ppds },
274*5e7646d2SAndroid Build Coastguard Worker { 0, "ppd-make", IPP_TAG_TEXT, IPP_TAG_OPERATION,
275*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO,
276*5e7646d2SAndroid Build Coastguard Worker cups_get_ppds },
277*5e7646d2SAndroid Build Coastguard Worker { 0, "ppd-make-and-model", IPP_TAG_TEXT, IPP_TAG_OPERATION,
278*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO,
279*5e7646d2SAndroid Build Coastguard Worker cups_get_ppds },
280*5e7646d2SAndroid Build Coastguard Worker { 0, "ppd-model-number", IPP_TAG_INTEGER, IPP_TAG_OPERATION,
281*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO,
282*5e7646d2SAndroid Build Coastguard Worker cups_get_ppds },
283*5e7646d2SAndroid Build Coastguard Worker { 0, "ppd-name", IPP_TAG_NAME, IPP_TAG_OPERATION,
284*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO,
285*5e7646d2SAndroid Build Coastguard Worker cups_ppd_name },
286*5e7646d2SAndroid Build Coastguard Worker { 0, "ppd-natural-language", IPP_TAG_LANGUAGE, IPP_TAG_OPERATION,
287*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO,
288*5e7646d2SAndroid Build Coastguard Worker cups_get_ppds },
289*5e7646d2SAndroid Build Coastguard Worker { 0, "ppd-product", IPP_TAG_TEXT, IPP_TAG_OPERATION,
290*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO,
291*5e7646d2SAndroid Build Coastguard Worker cups_get_ppds },
292*5e7646d2SAndroid Build Coastguard Worker { 0, "ppd-psversion", IPP_TAG_TEXT, IPP_TAG_OPERATION,
293*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO,
294*5e7646d2SAndroid Build Coastguard Worker cups_get_ppds },
295*5e7646d2SAndroid Build Coastguard Worker { 0, "ppd-type", IPP_TAG_KEYWORD, IPP_TAG_OPERATION,
296*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO,
297*5e7646d2SAndroid Build Coastguard Worker cups_get_ppds },
298*5e7646d2SAndroid Build Coastguard Worker { 0, "ppi", IPP_TAG_INTEGER, IPP_TAG_JOB },
299*5e7646d2SAndroid Build Coastguard Worker { 0, "ppi-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
300*5e7646d2SAndroid Build Coastguard Worker { 0, "prettyprint", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
301*5e7646d2SAndroid Build Coastguard Worker { 0, "prettyprint-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
302*5e7646d2SAndroid Build Coastguard Worker { 0, "print-color-mode", IPP_TAG_KEYWORD, IPP_TAG_JOB,
303*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
304*5e7646d2SAndroid Build Coastguard Worker { 0, "print-color-mode-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
305*5e7646d2SAndroid Build Coastguard Worker { 0, "print-content-optimize", IPP_TAG_KEYWORD, IPP_TAG_JOB,
306*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
307*5e7646d2SAndroid Build Coastguard Worker { 0, "print-content-optimize-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
308*5e7646d2SAndroid Build Coastguard Worker { 0, "print-quality", IPP_TAG_ENUM, IPP_TAG_JOB,
309*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
310*5e7646d2SAndroid Build Coastguard Worker { 0, "print-quality-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
311*5e7646d2SAndroid Build Coastguard Worker { 0, "print-rendering-intent", IPP_TAG_KEYWORD, IPP_TAG_JOB,
312*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
313*5e7646d2SAndroid Build Coastguard Worker { 0, "print-rendering-intent-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
314*5e7646d2SAndroid Build Coastguard Worker { 0, "print-scaling", IPP_TAG_KEYWORD, IPP_TAG_JOB,
315*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
316*5e7646d2SAndroid Build Coastguard Worker { 0, "print-scaling-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
317*5e7646d2SAndroid Build Coastguard Worker { 1, "printer-alert", IPP_TAG_STRING, IPP_TAG_PRINTER },
318*5e7646d2SAndroid Build Coastguard Worker { 1, "printer-alert-description", IPP_TAG_TEXT, IPP_TAG_PRINTER },
319*5e7646d2SAndroid Build Coastguard Worker { 1, "printer-commands", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
320*5e7646d2SAndroid Build Coastguard Worker { 0, "printer-error-policy", IPP_TAG_NAME, IPP_TAG_PRINTER },
321*5e7646d2SAndroid Build Coastguard Worker { 1, "printer-finisher", IPP_TAG_STRING, IPP_TAG_PRINTER },
322*5e7646d2SAndroid Build Coastguard Worker { 1, "printer-finisher-description", IPP_TAG_TEXT, IPP_TAG_PRINTER },
323*5e7646d2SAndroid Build Coastguard Worker { 1, "printer-finisher-supplies", IPP_TAG_STRING, IPP_TAG_PRINTER },
324*5e7646d2SAndroid Build Coastguard Worker { 1, "printer-finisher-supplies-description", IPP_TAG_TEXT, IPP_TAG_PRINTER },
325*5e7646d2SAndroid Build Coastguard Worker { 0, "printer-geo-location", IPP_TAG_URI, IPP_TAG_PRINTER },
326*5e7646d2SAndroid Build Coastguard Worker { 0, "printer-info", IPP_TAG_TEXT, IPP_TAG_PRINTER },
327*5e7646d2SAndroid Build Coastguard Worker { 1, "printer-input-tray", IPP_TAG_STRING, IPP_TAG_PRINTER },
328*5e7646d2SAndroid Build Coastguard Worker { 0, "printer-is-accepting-jobs", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
329*5e7646d2SAndroid Build Coastguard Worker { 0, "printer-is-shared", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
330*5e7646d2SAndroid Build Coastguard Worker { 0, "printer-is-temporary", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
331*5e7646d2SAndroid Build Coastguard Worker { 0, "printer-location", IPP_TAG_TEXT, IPP_TAG_PRINTER },
332*5e7646d2SAndroid Build Coastguard Worker { 0, "printer-make-and-model", IPP_TAG_TEXT, IPP_TAG_PRINTER },
333*5e7646d2SAndroid Build Coastguard Worker { 0, "printer-more-info", IPP_TAG_URI, IPP_TAG_PRINTER },
334*5e7646d2SAndroid Build Coastguard Worker { 0, "printer-op-policy", IPP_TAG_NAME, IPP_TAG_PRINTER },
335*5e7646d2SAndroid Build Coastguard Worker { 1, "printer-output-tray", IPP_TAG_STRING, IPP_TAG_PRINTER },
336*5e7646d2SAndroid Build Coastguard Worker { 0, "printer-resolution", IPP_TAG_RESOLUTION, IPP_TAG_JOB,
337*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
338*5e7646d2SAndroid Build Coastguard Worker { 0, "printer-resolution-default", IPP_TAG_RESOLUTION, IPP_TAG_PRINTER },
339*5e7646d2SAndroid Build Coastguard Worker { 0, "printer-state", IPP_TAG_ENUM, IPP_TAG_PRINTER },
340*5e7646d2SAndroid Build Coastguard Worker { 0, "printer-state-change-time", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
341*5e7646d2SAndroid Build Coastguard Worker { 1, "printer-state-reasons", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
342*5e7646d2SAndroid Build Coastguard Worker { 1, "printer-supply", IPP_TAG_STRING, IPP_TAG_PRINTER },
343*5e7646d2SAndroid Build Coastguard Worker { 1, "printer-supply-description", IPP_TAG_TEXT, IPP_TAG_PRINTER },
344*5e7646d2SAndroid Build Coastguard Worker { 0, "printer-type", IPP_TAG_ENUM, IPP_TAG_PRINTER },
345*5e7646d2SAndroid Build Coastguard Worker { 0, "printer-uri", IPP_TAG_URI, IPP_TAG_OPERATION },
346*5e7646d2SAndroid Build Coastguard Worker { 1, "printer-uri-supported", IPP_TAG_URI, IPP_TAG_PRINTER },
347*5e7646d2SAndroid Build Coastguard Worker { 0, "queued-job-count", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
348*5e7646d2SAndroid Build Coastguard Worker { 0, "raw", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION },
349*5e7646d2SAndroid Build Coastguard Worker { 1, "requested-attributes", IPP_TAG_NAME, IPP_TAG_OPERATION },
350*5e7646d2SAndroid Build Coastguard Worker { 1, "requesting-user-name-allowed", IPP_TAG_NAME, IPP_TAG_PRINTER },
351*5e7646d2SAndroid Build Coastguard Worker { 1, "requesting-user-name-denied", IPP_TAG_NAME, IPP_TAG_PRINTER },
352*5e7646d2SAndroid Build Coastguard Worker { 0, "resolution", IPP_TAG_RESOLUTION, IPP_TAG_JOB },
353*5e7646d2SAndroid Build Coastguard Worker { 0, "resolution-default", IPP_TAG_RESOLUTION, IPP_TAG_PRINTER },
354*5e7646d2SAndroid Build Coastguard Worker { 0, "saturation", IPP_TAG_INTEGER, IPP_TAG_JOB },
355*5e7646d2SAndroid Build Coastguard Worker { 0, "saturation-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
356*5e7646d2SAndroid Build Coastguard Worker { 0, "scaling", IPP_TAG_INTEGER, IPP_TAG_JOB },
357*5e7646d2SAndroid Build Coastguard Worker { 0, "scaling-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
358*5e7646d2SAndroid Build Coastguard Worker { 0, "sides", IPP_TAG_KEYWORD, IPP_TAG_JOB,
359*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
360*5e7646d2SAndroid Build Coastguard Worker { 0, "sides-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
361*5e7646d2SAndroid Build Coastguard Worker { 0, "time-at-completed", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */
362*5e7646d2SAndroid Build Coastguard Worker { 0, "time-at-creation", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */
363*5e7646d2SAndroid Build Coastguard Worker { 0, "time-at-processing", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */
364*5e7646d2SAndroid Build Coastguard Worker { 0, "wrap", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
365*5e7646d2SAndroid Build Coastguard Worker { 0, "wrap-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
366*5e7646d2SAndroid Build Coastguard Worker { 0, "x-dimension", IPP_TAG_INTEGER, IPP_TAG_JOB,
367*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT },
368*5e7646d2SAndroid Build Coastguard Worker { 0, "y-dimension", IPP_TAG_INTEGER, IPP_TAG_JOB,
369*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_DOCUMENT }
370*5e7646d2SAndroid Build Coastguard Worker };
371*5e7646d2SAndroid Build Coastguard Worker
372*5e7646d2SAndroid Build Coastguard Worker
373*5e7646d2SAndroid Build Coastguard Worker /*
374*5e7646d2SAndroid Build Coastguard Worker * Local functions...
375*5e7646d2SAndroid Build Coastguard Worker */
376*5e7646d2SAndroid Build Coastguard Worker
377*5e7646d2SAndroid Build Coastguard Worker static int compare_ipp_options(_ipp_option_t *a, _ipp_option_t *b);
378*5e7646d2SAndroid Build Coastguard Worker
379*5e7646d2SAndroid Build Coastguard Worker
380*5e7646d2SAndroid Build Coastguard Worker /*
381*5e7646d2SAndroid Build Coastguard Worker * '_cupsEncodeOption()' - Encode a single option as an IPP attribute.
382*5e7646d2SAndroid Build Coastguard Worker */
383*5e7646d2SAndroid Build Coastguard Worker
384*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t * /* O - New attribute or @code NULL@ on error */
_cupsEncodeOption(ipp_t * ipp,ipp_tag_t group_tag,_ipp_option_t * map,const char * name,const char * value)385*5e7646d2SAndroid Build Coastguard Worker _cupsEncodeOption(
386*5e7646d2SAndroid Build Coastguard Worker ipp_t *ipp, /* I - IPP request/response/collection */
387*5e7646d2SAndroid Build Coastguard Worker ipp_tag_t group_tag, /* I - Group tag */
388*5e7646d2SAndroid Build Coastguard Worker _ipp_option_t *map, /* I - Option mapping, if any */
389*5e7646d2SAndroid Build Coastguard Worker const char *name, /* I - Attribute name */
390*5e7646d2SAndroid Build Coastguard Worker const char *value) /* I - Value */
391*5e7646d2SAndroid Build Coastguard Worker {
392*5e7646d2SAndroid Build Coastguard Worker int i, /* Looping var */
393*5e7646d2SAndroid Build Coastguard Worker count; /* Number of values */
394*5e7646d2SAndroid Build Coastguard Worker char *s, /* Pointer into option value */
395*5e7646d2SAndroid Build Coastguard Worker *val, /* Pointer to option value */
396*5e7646d2SAndroid Build Coastguard Worker *copy, /* Copy of option value */
397*5e7646d2SAndroid Build Coastguard Worker *sep, /* Option separator */
398*5e7646d2SAndroid Build Coastguard Worker quote; /* Quote character */
399*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *attr; /* IPP attribute */
400*5e7646d2SAndroid Build Coastguard Worker ipp_tag_t value_tag; /* IPP value tag */
401*5e7646d2SAndroid Build Coastguard Worker ipp_t *collection; /* Collection value */
402*5e7646d2SAndroid Build Coastguard Worker int num_cols; /* Number of collection values */
403*5e7646d2SAndroid Build Coastguard Worker cups_option_t *cols; /* Collection values */
404*5e7646d2SAndroid Build Coastguard Worker
405*5e7646d2SAndroid Build Coastguard Worker
406*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("_cupsEncodeOption(ipp=%p(%s), group=%s, map=%p, name=\"%s\", value=\"%s\")", (void *)ipp, ipp ? ippOpString(ippGetOperation(ipp)) : "", ippTagString(group_tag), (void *)map, name, value));
407*5e7646d2SAndroid Build Coastguard Worker
408*5e7646d2SAndroid Build Coastguard Worker /*
409*5e7646d2SAndroid Build Coastguard Worker * Figure out the attribute syntax for encoding...
410*5e7646d2SAndroid Build Coastguard Worker */
411*5e7646d2SAndroid Build Coastguard Worker
412*5e7646d2SAndroid Build Coastguard Worker if (!map)
413*5e7646d2SAndroid Build Coastguard Worker map = _ippFindOption(name);
414*5e7646d2SAndroid Build Coastguard Worker
415*5e7646d2SAndroid Build Coastguard Worker if (map)
416*5e7646d2SAndroid Build Coastguard Worker value_tag = map->value_tag;
417*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "true") || !_cups_strcasecmp(value, "false"))
418*5e7646d2SAndroid Build Coastguard Worker value_tag = IPP_TAG_BOOLEAN;
419*5e7646d2SAndroid Build Coastguard Worker else if (value[0] == '{')
420*5e7646d2SAndroid Build Coastguard Worker value_tag = IPP_TAG_BEGIN_COLLECTION;
421*5e7646d2SAndroid Build Coastguard Worker else
422*5e7646d2SAndroid Build Coastguard Worker value_tag = IPP_TAG_NAME;
423*5e7646d2SAndroid Build Coastguard Worker
424*5e7646d2SAndroid Build Coastguard Worker /*
425*5e7646d2SAndroid Build Coastguard Worker * Count the number of values...
426*5e7646d2SAndroid Build Coastguard Worker */
427*5e7646d2SAndroid Build Coastguard Worker
428*5e7646d2SAndroid Build Coastguard Worker if (map && map->multivalue)
429*5e7646d2SAndroid Build Coastguard Worker {
430*5e7646d2SAndroid Build Coastguard Worker for (count = 1, sep = (char *)value, quote = 0; *sep; sep ++)
431*5e7646d2SAndroid Build Coastguard Worker {
432*5e7646d2SAndroid Build Coastguard Worker if (*sep == quote)
433*5e7646d2SAndroid Build Coastguard Worker quote = 0;
434*5e7646d2SAndroid Build Coastguard Worker else if (!quote && (*sep == '\'' || *sep == '\"'))
435*5e7646d2SAndroid Build Coastguard Worker {
436*5e7646d2SAndroid Build Coastguard Worker /*
437*5e7646d2SAndroid Build Coastguard Worker * Skip quoted option value...
438*5e7646d2SAndroid Build Coastguard Worker */
439*5e7646d2SAndroid Build Coastguard Worker
440*5e7646d2SAndroid Build Coastguard Worker quote = *sep;
441*5e7646d2SAndroid Build Coastguard Worker }
442*5e7646d2SAndroid Build Coastguard Worker else if (*sep == ',' && !quote)
443*5e7646d2SAndroid Build Coastguard Worker count ++;
444*5e7646d2SAndroid Build Coastguard Worker else if (*sep == '\\' && sep[1])
445*5e7646d2SAndroid Build Coastguard Worker sep ++;
446*5e7646d2SAndroid Build Coastguard Worker }
447*5e7646d2SAndroid Build Coastguard Worker }
448*5e7646d2SAndroid Build Coastguard Worker else
449*5e7646d2SAndroid Build Coastguard Worker count = 1;
450*5e7646d2SAndroid Build Coastguard Worker
451*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("2_cupsEncodeOption: value_tag=%s, count=%d", ippTagString(value_tag), count));
452*5e7646d2SAndroid Build Coastguard Worker
453*5e7646d2SAndroid Build Coastguard Worker /*
454*5e7646d2SAndroid Build Coastguard Worker * Allocate memory for the attribute values...
455*5e7646d2SAndroid Build Coastguard Worker */
456*5e7646d2SAndroid Build Coastguard Worker
457*5e7646d2SAndroid Build Coastguard Worker if ((attr = ippAddStrings(ipp, group_tag, value_tag, name, count, NULL, NULL)) == NULL)
458*5e7646d2SAndroid Build Coastguard Worker {
459*5e7646d2SAndroid Build Coastguard Worker /*
460*5e7646d2SAndroid Build Coastguard Worker * Ran out of memory!
461*5e7646d2SAndroid Build Coastguard Worker */
462*5e7646d2SAndroid Build Coastguard Worker
463*5e7646d2SAndroid Build Coastguard Worker DEBUG_puts("1_cupsEncodeOption: Ran out of memory for attributes.");
464*5e7646d2SAndroid Build Coastguard Worker return (NULL);
465*5e7646d2SAndroid Build Coastguard Worker }
466*5e7646d2SAndroid Build Coastguard Worker
467*5e7646d2SAndroid Build Coastguard Worker if (count > 1)
468*5e7646d2SAndroid Build Coastguard Worker {
469*5e7646d2SAndroid Build Coastguard Worker /*
470*5e7646d2SAndroid Build Coastguard Worker * Make a copy of the value we can fiddle with...
471*5e7646d2SAndroid Build Coastguard Worker */
472*5e7646d2SAndroid Build Coastguard Worker
473*5e7646d2SAndroid Build Coastguard Worker if ((copy = strdup(value)) == NULL)
474*5e7646d2SAndroid Build Coastguard Worker {
475*5e7646d2SAndroid Build Coastguard Worker /*
476*5e7646d2SAndroid Build Coastguard Worker * Ran out of memory!
477*5e7646d2SAndroid Build Coastguard Worker */
478*5e7646d2SAndroid Build Coastguard Worker
479*5e7646d2SAndroid Build Coastguard Worker DEBUG_puts("1_cupsEncodeOption: Ran out of memory for value copy.");
480*5e7646d2SAndroid Build Coastguard Worker ippDeleteAttribute(ipp, attr);
481*5e7646d2SAndroid Build Coastguard Worker return (NULL);
482*5e7646d2SAndroid Build Coastguard Worker }
483*5e7646d2SAndroid Build Coastguard Worker
484*5e7646d2SAndroid Build Coastguard Worker val = copy;
485*5e7646d2SAndroid Build Coastguard Worker }
486*5e7646d2SAndroid Build Coastguard Worker else
487*5e7646d2SAndroid Build Coastguard Worker {
488*5e7646d2SAndroid Build Coastguard Worker /*
489*5e7646d2SAndroid Build Coastguard Worker * Since we have a single value, use the value directly...
490*5e7646d2SAndroid Build Coastguard Worker */
491*5e7646d2SAndroid Build Coastguard Worker
492*5e7646d2SAndroid Build Coastguard Worker val = (char *)value;
493*5e7646d2SAndroid Build Coastguard Worker copy = NULL;
494*5e7646d2SAndroid Build Coastguard Worker }
495*5e7646d2SAndroid Build Coastguard Worker
496*5e7646d2SAndroid Build Coastguard Worker /*
497*5e7646d2SAndroid Build Coastguard Worker * Scan the value string for values...
498*5e7646d2SAndroid Build Coastguard Worker */
499*5e7646d2SAndroid Build Coastguard Worker
500*5e7646d2SAndroid Build Coastguard Worker for (i = 0, sep = val; i < count; val = sep, i ++)
501*5e7646d2SAndroid Build Coastguard Worker {
502*5e7646d2SAndroid Build Coastguard Worker /*
503*5e7646d2SAndroid Build Coastguard Worker * Find the end of this value and mark it if needed...
504*5e7646d2SAndroid Build Coastguard Worker */
505*5e7646d2SAndroid Build Coastguard Worker
506*5e7646d2SAndroid Build Coastguard Worker if (count > 1)
507*5e7646d2SAndroid Build Coastguard Worker {
508*5e7646d2SAndroid Build Coastguard Worker for (quote = 0; *sep; sep ++)
509*5e7646d2SAndroid Build Coastguard Worker {
510*5e7646d2SAndroid Build Coastguard Worker if (*sep == quote)
511*5e7646d2SAndroid Build Coastguard Worker {
512*5e7646d2SAndroid Build Coastguard Worker /*
513*5e7646d2SAndroid Build Coastguard Worker * Finish quoted value...
514*5e7646d2SAndroid Build Coastguard Worker */
515*5e7646d2SAndroid Build Coastguard Worker
516*5e7646d2SAndroid Build Coastguard Worker quote = 0;
517*5e7646d2SAndroid Build Coastguard Worker }
518*5e7646d2SAndroid Build Coastguard Worker else if (!quote && (*sep == '\'' || *sep == '\"'))
519*5e7646d2SAndroid Build Coastguard Worker {
520*5e7646d2SAndroid Build Coastguard Worker /*
521*5e7646d2SAndroid Build Coastguard Worker * Handle quoted option value...
522*5e7646d2SAndroid Build Coastguard Worker */
523*5e7646d2SAndroid Build Coastguard Worker
524*5e7646d2SAndroid Build Coastguard Worker quote = *sep;
525*5e7646d2SAndroid Build Coastguard Worker }
526*5e7646d2SAndroid Build Coastguard Worker else if (*sep == ',')
527*5e7646d2SAndroid Build Coastguard Worker break;
528*5e7646d2SAndroid Build Coastguard Worker else if (*sep == '\\' && sep[1])
529*5e7646d2SAndroid Build Coastguard Worker {
530*5e7646d2SAndroid Build Coastguard Worker /*
531*5e7646d2SAndroid Build Coastguard Worker * Skip quoted character...
532*5e7646d2SAndroid Build Coastguard Worker */
533*5e7646d2SAndroid Build Coastguard Worker
534*5e7646d2SAndroid Build Coastguard Worker memmove(sep, sep + 1, strlen(sep));
535*5e7646d2SAndroid Build Coastguard Worker }
536*5e7646d2SAndroid Build Coastguard Worker }
537*5e7646d2SAndroid Build Coastguard Worker
538*5e7646d2SAndroid Build Coastguard Worker if (*sep == ',')
539*5e7646d2SAndroid Build Coastguard Worker *sep++ = '\0';
540*5e7646d2SAndroid Build Coastguard Worker }
541*5e7646d2SAndroid Build Coastguard Worker
542*5e7646d2SAndroid Build Coastguard Worker /*
543*5e7646d2SAndroid Build Coastguard Worker * Copy the option value(s) over as needed by the type...
544*5e7646d2SAndroid Build Coastguard Worker */
545*5e7646d2SAndroid Build Coastguard Worker
546*5e7646d2SAndroid Build Coastguard Worker switch (attr->value_tag)
547*5e7646d2SAndroid Build Coastguard Worker {
548*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_INTEGER :
549*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_ENUM :
550*5e7646d2SAndroid Build Coastguard Worker /*
551*5e7646d2SAndroid Build Coastguard Worker * Integer/enumeration value...
552*5e7646d2SAndroid Build Coastguard Worker */
553*5e7646d2SAndroid Build Coastguard Worker
554*5e7646d2SAndroid Build Coastguard Worker ippSetInteger(ipp, &attr, i, (int)strtol(val, &s, 10));
555*5e7646d2SAndroid Build Coastguard Worker break;
556*5e7646d2SAndroid Build Coastguard Worker
557*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_BOOLEAN :
558*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(val, "true") || !_cups_strcasecmp(val, "on") || !_cups_strcasecmp(val, "yes"))
559*5e7646d2SAndroid Build Coastguard Worker {
560*5e7646d2SAndroid Build Coastguard Worker /*
561*5e7646d2SAndroid Build Coastguard Worker * Boolean value - true...
562*5e7646d2SAndroid Build Coastguard Worker */
563*5e7646d2SAndroid Build Coastguard Worker
564*5e7646d2SAndroid Build Coastguard Worker ippSetBoolean(ipp, &attr, i, 1);
565*5e7646d2SAndroid Build Coastguard Worker }
566*5e7646d2SAndroid Build Coastguard Worker else
567*5e7646d2SAndroid Build Coastguard Worker {
568*5e7646d2SAndroid Build Coastguard Worker /*
569*5e7646d2SAndroid Build Coastguard Worker * Boolean value - false...
570*5e7646d2SAndroid Build Coastguard Worker */
571*5e7646d2SAndroid Build Coastguard Worker
572*5e7646d2SAndroid Build Coastguard Worker ippSetBoolean(ipp, &attr, i, 0);
573*5e7646d2SAndroid Build Coastguard Worker }
574*5e7646d2SAndroid Build Coastguard Worker break;
575*5e7646d2SAndroid Build Coastguard Worker
576*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_RANGE :
577*5e7646d2SAndroid Build Coastguard Worker {
578*5e7646d2SAndroid Build Coastguard Worker /*
579*5e7646d2SAndroid Build Coastguard Worker * Range...
580*5e7646d2SAndroid Build Coastguard Worker */
581*5e7646d2SAndroid Build Coastguard Worker
582*5e7646d2SAndroid Build Coastguard Worker int lower, upper; /* Lower and upper ranges... */
583*5e7646d2SAndroid Build Coastguard Worker
584*5e7646d2SAndroid Build Coastguard Worker if (*val == '-')
585*5e7646d2SAndroid Build Coastguard Worker {
586*5e7646d2SAndroid Build Coastguard Worker lower = 1;
587*5e7646d2SAndroid Build Coastguard Worker s = val;
588*5e7646d2SAndroid Build Coastguard Worker }
589*5e7646d2SAndroid Build Coastguard Worker else
590*5e7646d2SAndroid Build Coastguard Worker lower = (int)strtol(val, &s, 10);
591*5e7646d2SAndroid Build Coastguard Worker
592*5e7646d2SAndroid Build Coastguard Worker if (*s == '-')
593*5e7646d2SAndroid Build Coastguard Worker {
594*5e7646d2SAndroid Build Coastguard Worker if (s[1])
595*5e7646d2SAndroid Build Coastguard Worker upper = (int)strtol(s + 1, NULL, 10);
596*5e7646d2SAndroid Build Coastguard Worker else
597*5e7646d2SAndroid Build Coastguard Worker upper = 2147483647;
598*5e7646d2SAndroid Build Coastguard Worker }
599*5e7646d2SAndroid Build Coastguard Worker else
600*5e7646d2SAndroid Build Coastguard Worker upper = lower;
601*5e7646d2SAndroid Build Coastguard Worker
602*5e7646d2SAndroid Build Coastguard Worker ippSetRange(ipp, &attr, i, lower, upper);
603*5e7646d2SAndroid Build Coastguard Worker }
604*5e7646d2SAndroid Build Coastguard Worker break;
605*5e7646d2SAndroid Build Coastguard Worker
606*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_RESOLUTION :
607*5e7646d2SAndroid Build Coastguard Worker {
608*5e7646d2SAndroid Build Coastguard Worker /*
609*5e7646d2SAndroid Build Coastguard Worker * Resolution...
610*5e7646d2SAndroid Build Coastguard Worker */
611*5e7646d2SAndroid Build Coastguard Worker int xres, yres; /* Resolution values */
612*5e7646d2SAndroid Build Coastguard Worker ipp_res_t units; /* Resolution units */
613*5e7646d2SAndroid Build Coastguard Worker
614*5e7646d2SAndroid Build Coastguard Worker xres = (int)strtol(val, &s, 10);
615*5e7646d2SAndroid Build Coastguard Worker
616*5e7646d2SAndroid Build Coastguard Worker if (*s == 'x')
617*5e7646d2SAndroid Build Coastguard Worker yres = (int)strtol(s + 1, &s, 10);
618*5e7646d2SAndroid Build Coastguard Worker else
619*5e7646d2SAndroid Build Coastguard Worker yres = xres;
620*5e7646d2SAndroid Build Coastguard Worker
621*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(s, "dpc") || !_cups_strcasecmp(s, "dpcm"))
622*5e7646d2SAndroid Build Coastguard Worker units = IPP_RES_PER_CM;
623*5e7646d2SAndroid Build Coastguard Worker else
624*5e7646d2SAndroid Build Coastguard Worker units = IPP_RES_PER_INCH;
625*5e7646d2SAndroid Build Coastguard Worker
626*5e7646d2SAndroid Build Coastguard Worker ippSetResolution(ipp, &attr, i, units, xres, yres);
627*5e7646d2SAndroid Build Coastguard Worker }
628*5e7646d2SAndroid Build Coastguard Worker break;
629*5e7646d2SAndroid Build Coastguard Worker
630*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_STRING :
631*5e7646d2SAndroid Build Coastguard Worker /*
632*5e7646d2SAndroid Build Coastguard Worker * octetString
633*5e7646d2SAndroid Build Coastguard Worker */
634*5e7646d2SAndroid Build Coastguard Worker
635*5e7646d2SAndroid Build Coastguard Worker ippSetOctetString(ipp, &attr, i, val, (int)strlen(val));
636*5e7646d2SAndroid Build Coastguard Worker break;
637*5e7646d2SAndroid Build Coastguard Worker
638*5e7646d2SAndroid Build Coastguard Worker case IPP_TAG_BEGIN_COLLECTION :
639*5e7646d2SAndroid Build Coastguard Worker /*
640*5e7646d2SAndroid Build Coastguard Worker * Collection value
641*5e7646d2SAndroid Build Coastguard Worker */
642*5e7646d2SAndroid Build Coastguard Worker
643*5e7646d2SAndroid Build Coastguard Worker num_cols = cupsParseOptions(val, 0, &cols);
644*5e7646d2SAndroid Build Coastguard Worker if ((collection = ippNew()) == NULL)
645*5e7646d2SAndroid Build Coastguard Worker {
646*5e7646d2SAndroid Build Coastguard Worker cupsFreeOptions(num_cols, cols);
647*5e7646d2SAndroid Build Coastguard Worker
648*5e7646d2SAndroid Build Coastguard Worker if (copy)
649*5e7646d2SAndroid Build Coastguard Worker free(copy);
650*5e7646d2SAndroid Build Coastguard Worker
651*5e7646d2SAndroid Build Coastguard Worker ippDeleteAttribute(ipp, attr);
652*5e7646d2SAndroid Build Coastguard Worker return (NULL);
653*5e7646d2SAndroid Build Coastguard Worker }
654*5e7646d2SAndroid Build Coastguard Worker
655*5e7646d2SAndroid Build Coastguard Worker ippSetCollection(ipp, &attr, i, collection);
656*5e7646d2SAndroid Build Coastguard Worker cupsEncodeOptions2(collection, num_cols, cols, IPP_TAG_JOB);
657*5e7646d2SAndroid Build Coastguard Worker cupsFreeOptions(num_cols, cols);
658*5e7646d2SAndroid Build Coastguard Worker break;
659*5e7646d2SAndroid Build Coastguard Worker
660*5e7646d2SAndroid Build Coastguard Worker default :
661*5e7646d2SAndroid Build Coastguard Worker ippSetString(ipp, &attr, i, val);
662*5e7646d2SAndroid Build Coastguard Worker break;
663*5e7646d2SAndroid Build Coastguard Worker }
664*5e7646d2SAndroid Build Coastguard Worker }
665*5e7646d2SAndroid Build Coastguard Worker
666*5e7646d2SAndroid Build Coastguard Worker if (copy)
667*5e7646d2SAndroid Build Coastguard Worker free(copy);
668*5e7646d2SAndroid Build Coastguard Worker
669*5e7646d2SAndroid Build Coastguard Worker return (attr);
670*5e7646d2SAndroid Build Coastguard Worker }
671*5e7646d2SAndroid Build Coastguard Worker
672*5e7646d2SAndroid Build Coastguard Worker
673*5e7646d2SAndroid Build Coastguard Worker /*
674*5e7646d2SAndroid Build Coastguard Worker * 'cupsEncodeOption()' - Encode a single option into an IPP attribute.
675*5e7646d2SAndroid Build Coastguard Worker *
676*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 2.3/macOS 10.14@
677*5e7646d2SAndroid Build Coastguard Worker */
678*5e7646d2SAndroid Build Coastguard Worker
679*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t * /* O - New attribute or @code NULL@ on error */
cupsEncodeOption(ipp_t * ipp,ipp_tag_t group_tag,const char * name,const char * value)680*5e7646d2SAndroid Build Coastguard Worker cupsEncodeOption(ipp_t *ipp, /* I - IPP request/response */
681*5e7646d2SAndroid Build Coastguard Worker ipp_tag_t group_tag, /* I - Attribute group */
682*5e7646d2SAndroid Build Coastguard Worker const char *name, /* I - Option name */
683*5e7646d2SAndroid Build Coastguard Worker const char *value) /* I - Option string value */
684*5e7646d2SAndroid Build Coastguard Worker {
685*5e7646d2SAndroid Build Coastguard Worker return (_cupsEncodeOption(ipp, group_tag, _ippFindOption(name), name, value));
686*5e7646d2SAndroid Build Coastguard Worker }
687*5e7646d2SAndroid Build Coastguard Worker
688*5e7646d2SAndroid Build Coastguard Worker
689*5e7646d2SAndroid Build Coastguard Worker /*
690*5e7646d2SAndroid Build Coastguard Worker * 'cupsEncodeOptions()' - Encode printer options into IPP attributes.
691*5e7646d2SAndroid Build Coastguard Worker *
692*5e7646d2SAndroid Build Coastguard Worker * This function adds operation, job, and then subscription attributes,
693*5e7646d2SAndroid Build Coastguard Worker * in that order. Use the @link cupsEncodeOptions2@ function to add attributes
694*5e7646d2SAndroid Build Coastguard Worker * for a single group.
695*5e7646d2SAndroid Build Coastguard Worker */
696*5e7646d2SAndroid Build Coastguard Worker
697*5e7646d2SAndroid Build Coastguard Worker void
cupsEncodeOptions(ipp_t * ipp,int num_options,cups_option_t * options)698*5e7646d2SAndroid Build Coastguard Worker cupsEncodeOptions(ipp_t *ipp, /* I - IPP request/response */
699*5e7646d2SAndroid Build Coastguard Worker int num_options, /* I - Number of options */
700*5e7646d2SAndroid Build Coastguard Worker cups_option_t *options) /* I - Options */
701*5e7646d2SAndroid Build Coastguard Worker {
702*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("cupsEncodeOptions(%p, %d, %p)", (void *)ipp, num_options, (void *)options));
703*5e7646d2SAndroid Build Coastguard Worker
704*5e7646d2SAndroid Build Coastguard Worker /*
705*5e7646d2SAndroid Build Coastguard Worker * Add the options in the proper groups & order...
706*5e7646d2SAndroid Build Coastguard Worker */
707*5e7646d2SAndroid Build Coastguard Worker
708*5e7646d2SAndroid Build Coastguard Worker cupsEncodeOptions2(ipp, num_options, options, IPP_TAG_OPERATION);
709*5e7646d2SAndroid Build Coastguard Worker cupsEncodeOptions2(ipp, num_options, options, IPP_TAG_JOB);
710*5e7646d2SAndroid Build Coastguard Worker cupsEncodeOptions2(ipp, num_options, options, IPP_TAG_SUBSCRIPTION);
711*5e7646d2SAndroid Build Coastguard Worker }
712*5e7646d2SAndroid Build Coastguard Worker
713*5e7646d2SAndroid Build Coastguard Worker
714*5e7646d2SAndroid Build Coastguard Worker /*
715*5e7646d2SAndroid Build Coastguard Worker * 'cupsEncodeOptions2()' - Encode printer options into IPP attributes for a group.
716*5e7646d2SAndroid Build Coastguard Worker *
717*5e7646d2SAndroid Build Coastguard Worker * This function only adds attributes for a single group. Call this
718*5e7646d2SAndroid Build Coastguard Worker * function multiple times for each group, or use @link cupsEncodeOptions@
719*5e7646d2SAndroid Build Coastguard Worker * to add the standard groups.
720*5e7646d2SAndroid Build Coastguard Worker *
721*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 1.2/macOS 10.5@
722*5e7646d2SAndroid Build Coastguard Worker */
723*5e7646d2SAndroid Build Coastguard Worker
724*5e7646d2SAndroid Build Coastguard Worker void
cupsEncodeOptions2(ipp_t * ipp,int num_options,cups_option_t * options,ipp_tag_t group_tag)725*5e7646d2SAndroid Build Coastguard Worker cupsEncodeOptions2(
726*5e7646d2SAndroid Build Coastguard Worker ipp_t *ipp, /* I - IPP request/response */
727*5e7646d2SAndroid Build Coastguard Worker int num_options, /* I - Number of options */
728*5e7646d2SAndroid Build Coastguard Worker cups_option_t *options, /* I - Options */
729*5e7646d2SAndroid Build Coastguard Worker ipp_tag_t group_tag) /* I - Group to encode */
730*5e7646d2SAndroid Build Coastguard Worker {
731*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
732*5e7646d2SAndroid Build Coastguard Worker char *val; /* Pointer to option value */
733*5e7646d2SAndroid Build Coastguard Worker cups_option_t *option; /* Current option */
734*5e7646d2SAndroid Build Coastguard Worker ipp_op_t op; /* Operation for this request */
735*5e7646d2SAndroid Build Coastguard Worker const ipp_op_t *ops; /* List of allowed operations */
736*5e7646d2SAndroid Build Coastguard Worker
737*5e7646d2SAndroid Build Coastguard Worker
738*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("cupsEncodeOptions2(ipp=%p(%s), num_options=%d, options=%p, group_tag=%x)", (void *)ipp, ipp ? ippOpString(ippGetOperation(ipp)) : "", num_options, (void *)options, group_tag));
739*5e7646d2SAndroid Build Coastguard Worker
740*5e7646d2SAndroid Build Coastguard Worker /*
741*5e7646d2SAndroid Build Coastguard Worker * Range check input...
742*5e7646d2SAndroid Build Coastguard Worker */
743*5e7646d2SAndroid Build Coastguard Worker
744*5e7646d2SAndroid Build Coastguard Worker if (!ipp || num_options < 1 || !options)
745*5e7646d2SAndroid Build Coastguard Worker return;
746*5e7646d2SAndroid Build Coastguard Worker
747*5e7646d2SAndroid Build Coastguard Worker /*
748*5e7646d2SAndroid Build Coastguard Worker * Do special handling for the document-format/raw options...
749*5e7646d2SAndroid Build Coastguard Worker */
750*5e7646d2SAndroid Build Coastguard Worker
751*5e7646d2SAndroid Build Coastguard Worker op = ippGetOperation(ipp);
752*5e7646d2SAndroid Build Coastguard Worker
753*5e7646d2SAndroid Build Coastguard Worker if (group_tag == IPP_TAG_OPERATION && (op == IPP_OP_PRINT_JOB || op == IPP_OP_PRINT_URI || op == IPP_OP_SEND_DOCUMENT || op == IPP_OP_SEND_URI))
754*5e7646d2SAndroid Build Coastguard Worker {
755*5e7646d2SAndroid Build Coastguard Worker /*
756*5e7646d2SAndroid Build Coastguard Worker * Handle the document format stuff first...
757*5e7646d2SAndroid Build Coastguard Worker */
758*5e7646d2SAndroid Build Coastguard Worker
759*5e7646d2SAndroid Build Coastguard Worker if ((val = (char *)cupsGetOption("document-format", num_options, options)) != NULL)
760*5e7646d2SAndroid Build Coastguard Worker ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, val);
761*5e7646d2SAndroid Build Coastguard Worker else if (cupsGetOption("raw", num_options, options))
762*5e7646d2SAndroid Build Coastguard Worker ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, "application/vnd.cups-raw");
763*5e7646d2SAndroid Build Coastguard Worker else
764*5e7646d2SAndroid Build Coastguard Worker ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, "application/octet-stream");
765*5e7646d2SAndroid Build Coastguard Worker }
766*5e7646d2SAndroid Build Coastguard Worker
767*5e7646d2SAndroid Build Coastguard Worker /*
768*5e7646d2SAndroid Build Coastguard Worker * Then loop through the options...
769*5e7646d2SAndroid Build Coastguard Worker */
770*5e7646d2SAndroid Build Coastguard Worker
771*5e7646d2SAndroid Build Coastguard Worker for (i = num_options, option = options; i > 0; i --, option ++)
772*5e7646d2SAndroid Build Coastguard Worker {
773*5e7646d2SAndroid Build Coastguard Worker _ipp_option_t *match; /* Matching attribute */
774*5e7646d2SAndroid Build Coastguard Worker
775*5e7646d2SAndroid Build Coastguard Worker /*
776*5e7646d2SAndroid Build Coastguard Worker * Skip document format options that are handled above...
777*5e7646d2SAndroid Build Coastguard Worker */
778*5e7646d2SAndroid Build Coastguard Worker
779*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(option->name, "raw") || !_cups_strcasecmp(option->name, "document-format") || !option->name[0])
780*5e7646d2SAndroid Build Coastguard Worker continue;
781*5e7646d2SAndroid Build Coastguard Worker
782*5e7646d2SAndroid Build Coastguard Worker /*
783*5e7646d2SAndroid Build Coastguard Worker * Figure out the proper value and group tags for this option...
784*5e7646d2SAndroid Build Coastguard Worker */
785*5e7646d2SAndroid Build Coastguard Worker
786*5e7646d2SAndroid Build Coastguard Worker if ((match = _ippFindOption(option->name)) != NULL)
787*5e7646d2SAndroid Build Coastguard Worker {
788*5e7646d2SAndroid Build Coastguard Worker if (match->group_tag != group_tag && match->alt_group_tag != group_tag)
789*5e7646d2SAndroid Build Coastguard Worker continue;
790*5e7646d2SAndroid Build Coastguard Worker
791*5e7646d2SAndroid Build Coastguard Worker if (match->operations)
792*5e7646d2SAndroid Build Coastguard Worker ops = match->operations;
793*5e7646d2SAndroid Build Coastguard Worker else if (group_tag == IPP_TAG_JOB)
794*5e7646d2SAndroid Build Coastguard Worker ops = ipp_job_creation;
795*5e7646d2SAndroid Build Coastguard Worker else if (group_tag == IPP_TAG_DOCUMENT)
796*5e7646d2SAndroid Build Coastguard Worker ops = ipp_doc_creation;
797*5e7646d2SAndroid Build Coastguard Worker else if (group_tag == IPP_TAG_SUBSCRIPTION)
798*5e7646d2SAndroid Build Coastguard Worker ops = ipp_sub_creation;
799*5e7646d2SAndroid Build Coastguard Worker else if (group_tag == IPP_TAG_PRINTER)
800*5e7646d2SAndroid Build Coastguard Worker ops = ipp_set_printer;
801*5e7646d2SAndroid Build Coastguard Worker else
802*5e7646d2SAndroid Build Coastguard Worker {
803*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("2cupsEncodeOptions2: Skipping \"%s\".", option->name));
804*5e7646d2SAndroid Build Coastguard Worker continue;
805*5e7646d2SAndroid Build Coastguard Worker }
806*5e7646d2SAndroid Build Coastguard Worker }
807*5e7646d2SAndroid Build Coastguard Worker else
808*5e7646d2SAndroid Build Coastguard Worker {
809*5e7646d2SAndroid Build Coastguard Worker int namelen; /* Length of name */
810*5e7646d2SAndroid Build Coastguard Worker
811*5e7646d2SAndroid Build Coastguard Worker namelen = (int)strlen(option->name);
812*5e7646d2SAndroid Build Coastguard Worker
813*5e7646d2SAndroid Build Coastguard Worker if (namelen < 10 || (strcmp(option->name + namelen - 8, "-default") && strcmp(option->name + namelen - 10, "-supported")))
814*5e7646d2SAndroid Build Coastguard Worker {
815*5e7646d2SAndroid Build Coastguard Worker if (group_tag != IPP_TAG_JOB && group_tag != IPP_TAG_DOCUMENT)
816*5e7646d2SAndroid Build Coastguard Worker {
817*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("2cupsEncodeOptions2: Skipping \"%s\".", option->name));
818*5e7646d2SAndroid Build Coastguard Worker continue;
819*5e7646d2SAndroid Build Coastguard Worker }
820*5e7646d2SAndroid Build Coastguard Worker }
821*5e7646d2SAndroid Build Coastguard Worker else if (group_tag != IPP_TAG_PRINTER)
822*5e7646d2SAndroid Build Coastguard Worker {
823*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("2cupsEncodeOptions2: Skipping \"%s\".", option->name));
824*5e7646d2SAndroid Build Coastguard Worker continue;
825*5e7646d2SAndroid Build Coastguard Worker }
826*5e7646d2SAndroid Build Coastguard Worker
827*5e7646d2SAndroid Build Coastguard Worker if (group_tag == IPP_TAG_JOB)
828*5e7646d2SAndroid Build Coastguard Worker ops = ipp_job_creation;
829*5e7646d2SAndroid Build Coastguard Worker else if (group_tag == IPP_TAG_DOCUMENT)
830*5e7646d2SAndroid Build Coastguard Worker ops = ipp_doc_creation;
831*5e7646d2SAndroid Build Coastguard Worker else
832*5e7646d2SAndroid Build Coastguard Worker ops = ipp_set_printer;
833*5e7646d2SAndroid Build Coastguard Worker }
834*5e7646d2SAndroid Build Coastguard Worker
835*5e7646d2SAndroid Build Coastguard Worker /*
836*5e7646d2SAndroid Build Coastguard Worker * Verify that we send this attribute for this operation...
837*5e7646d2SAndroid Build Coastguard Worker */
838*5e7646d2SAndroid Build Coastguard Worker
839*5e7646d2SAndroid Build Coastguard Worker while (*ops != IPP_OP_CUPS_NONE)
840*5e7646d2SAndroid Build Coastguard Worker if (op == *ops)
841*5e7646d2SAndroid Build Coastguard Worker break;
842*5e7646d2SAndroid Build Coastguard Worker else
843*5e7646d2SAndroid Build Coastguard Worker ops ++;
844*5e7646d2SAndroid Build Coastguard Worker
845*5e7646d2SAndroid Build Coastguard Worker if (*ops == IPP_OP_CUPS_NONE && op != IPP_OP_CUPS_NONE)
846*5e7646d2SAndroid Build Coastguard Worker {
847*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("2cupsEncodeOptions2: Skipping \"%s\".", option->name));
848*5e7646d2SAndroid Build Coastguard Worker continue;
849*5e7646d2SAndroid Build Coastguard Worker }
850*5e7646d2SAndroid Build Coastguard Worker
851*5e7646d2SAndroid Build Coastguard Worker _cupsEncodeOption(ipp, group_tag, match, option->name, option->value);
852*5e7646d2SAndroid Build Coastguard Worker }
853*5e7646d2SAndroid Build Coastguard Worker }
854*5e7646d2SAndroid Build Coastguard Worker
855*5e7646d2SAndroid Build Coastguard Worker
856*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
857*5e7646d2SAndroid Build Coastguard Worker /*
858*5e7646d2SAndroid Build Coastguard Worker * '_ippCheckOptions()' - Validate that the option array is sorted properly.
859*5e7646d2SAndroid Build Coastguard Worker */
860*5e7646d2SAndroid Build Coastguard Worker
861*5e7646d2SAndroid Build Coastguard Worker const char * /* O - First out-of-order option or NULL */
_ippCheckOptions(void)862*5e7646d2SAndroid Build Coastguard Worker _ippCheckOptions(void)
863*5e7646d2SAndroid Build Coastguard Worker {
864*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
865*5e7646d2SAndroid Build Coastguard Worker
866*5e7646d2SAndroid Build Coastguard Worker
867*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < (int)(sizeof(ipp_options) / sizeof(ipp_options[0]) - 1); i ++)
868*5e7646d2SAndroid Build Coastguard Worker if (strcmp(ipp_options[i].name, ipp_options[i + 1].name) >= 0)
869*5e7646d2SAndroid Build Coastguard Worker return (ipp_options[i + 1].name);
870*5e7646d2SAndroid Build Coastguard Worker
871*5e7646d2SAndroid Build Coastguard Worker return (NULL);
872*5e7646d2SAndroid Build Coastguard Worker }
873*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
874*5e7646d2SAndroid Build Coastguard Worker
875*5e7646d2SAndroid Build Coastguard Worker
876*5e7646d2SAndroid Build Coastguard Worker /*
877*5e7646d2SAndroid Build Coastguard Worker * '_ippFindOption()' - Find the attribute information for an option.
878*5e7646d2SAndroid Build Coastguard Worker */
879*5e7646d2SAndroid Build Coastguard Worker
880*5e7646d2SAndroid Build Coastguard Worker _ipp_option_t * /* O - Attribute information */
_ippFindOption(const char * name)881*5e7646d2SAndroid Build Coastguard Worker _ippFindOption(const char *name) /* I - Option/attribute name */
882*5e7646d2SAndroid Build Coastguard Worker {
883*5e7646d2SAndroid Build Coastguard Worker _ipp_option_t key; /* Search key */
884*5e7646d2SAndroid Build Coastguard Worker
885*5e7646d2SAndroid Build Coastguard Worker
886*5e7646d2SAndroid Build Coastguard Worker /*
887*5e7646d2SAndroid Build Coastguard Worker * Lookup the proper value and group tags for this option...
888*5e7646d2SAndroid Build Coastguard Worker */
889*5e7646d2SAndroid Build Coastguard Worker
890*5e7646d2SAndroid Build Coastguard Worker key.name = name;
891*5e7646d2SAndroid Build Coastguard Worker
892*5e7646d2SAndroid Build Coastguard Worker return ((_ipp_option_t *)bsearch(&key, ipp_options,
893*5e7646d2SAndroid Build Coastguard Worker sizeof(ipp_options) / sizeof(ipp_options[0]),
894*5e7646d2SAndroid Build Coastguard Worker sizeof(ipp_options[0]),
895*5e7646d2SAndroid Build Coastguard Worker (int (*)(const void *, const void *))
896*5e7646d2SAndroid Build Coastguard Worker compare_ipp_options));
897*5e7646d2SAndroid Build Coastguard Worker }
898*5e7646d2SAndroid Build Coastguard Worker
899*5e7646d2SAndroid Build Coastguard Worker
900*5e7646d2SAndroid Build Coastguard Worker /*
901*5e7646d2SAndroid Build Coastguard Worker * 'compare_ipp_options()' - Compare two IPP options.
902*5e7646d2SAndroid Build Coastguard Worker */
903*5e7646d2SAndroid Build Coastguard Worker
904*5e7646d2SAndroid Build Coastguard Worker static int /* O - Result of comparison */
compare_ipp_options(_ipp_option_t * a,_ipp_option_t * b)905*5e7646d2SAndroid Build Coastguard Worker compare_ipp_options(_ipp_option_t *a, /* I - First option */
906*5e7646d2SAndroid Build Coastguard Worker _ipp_option_t *b) /* I - Second option */
907*5e7646d2SAndroid Build Coastguard Worker {
908*5e7646d2SAndroid Build Coastguard Worker return (strcmp(a->name, b->name));
909*5e7646d2SAndroid Build Coastguard Worker }
910