1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  *
26  */
27 
28 /* $Id: strings.c 151 2006-04-25 16:55:34Z njacobs $ */
29 
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <string.h>
33 
34 #include "ipp.h"
35 
36 static char *tag_strings[] = {
37 	/* delimiter tags */
38 	"reserved-delimiter-00",
39 	"operational-attributes-group",
40 	"job-attributes-group",
41 	"end-of-attributes-group",
42 	"printer-attributes-group",
43 	"unsupported-attributes-group",
44 	"subscription-attributes-group",
45 	"event-notification-attributes-group",
46 	"reserved-delimiter-08",
47 	"reserved-delimiter-09",
48 	"reserved-delimiter-0a",
49 	"reserved-delimiter-0b",
50 	"reserved-delimiter-0c",
51 	"reserved-delimiter-0d",
52 	"reserved-delimiter-0e",
53 	"reserved-delimiter-0f",
54 	/* value tags */
55 	"unsupported",
56 	"reserved-default",
57 	"unknown",
58 	"no-value",
59 	"reserved-out-of-band-14",
60 	"not-settable",
61 	"delete-attribute",
62 	"admin-define",
63 	"reserved-out-of-band-18",
64 	"reserved-out-of-band-19",
65 	"reserved-out-of-band-1a",
66 	"reserved-out-of-band-1b",
67 	"reserved-out-of-band-1c",
68 	"reserved-out-of-band-1d",
69 	"reserved-out-of-band-1e",
70 	"reserved-out-of-band-1f",
71 	"reserved",
72 	"integer",
73 	"boolean",
74 	"enum",
75 	"reserved-integer-type-24",
76 	"reserved-integer-type-25",
77 	"reserved-integer-type-26",
78 	"reserved-integer-type-27",
79 	"reserved-integer-type-28",
80 	"reserved-integer-type-29",
81 	"reserved-integer-type-2a",
82 	"reserved-integer-type-2b",
83 	"reserved-integer-type-2c",
84 	"reserved-integer-type-2d",
85 	"reserved-integer-type-2e",
86 	"reserved-integer-type-2f",
87 	"octetString",
88 	"dateTime",
89 	"resolution",
90 	"rangeOfInteger",
91 	"begCollection",
92 	"textWithLanguage",
93 	"nameWithLanguage",
94 	"endCollection",
95 	"reserved-octetString-38",
96 	"reserved-octetString-39",
97 	"reserved-octetString-3a",
98 	"reserved-octetString-3b",
99 	"reserved-octetString-3c",
100 	"reserved-octetString-3d",
101 	"reserved-octetString-3e",
102 	"reserved-octetString-3f",
103 	"reserved",
104 	"textWithoutLanguage",
105 	"nameWithoutLanguage",
106 	"reserved",
107 	"keyword",
108 	"uri",
109 	"uriScheme",
110 	"charset",
111 	"naturalLanguage",
112 	"mimeMediaType",
113 	"memberAttrName",
114 	"reserved-charString-4b",
115 	"reserved-charString-4c",
116 	"reserved-charString-4d",
117 	"reserved-charString-4e",
118 	"reserved-charString-4f",
119 	"reserved-charString-50",
120 	"reserved-charString-51",
121 	"reserved-charString-52",
122 	"reserved-charString-53",
123 	"reserved-charString-54",
124 	"reserved-charString-55",
125 	"reserved-charString-56",
126 	"reserved-charString-57",
127 	"reserved-charString-58",
128 	"reserved-charString-59",
129 	"reserved-charString-5a",
130 	"reserved-charString-5b",
131 	"reserved-charString-5c",
132 	"reserved-charString-5d",
133 	"reserved-charString-5e",
134 	"reserved-charString-5f",
135 };
136 
137 static char *opid_strings[] = {
138 	"reserved-0x0000",
139 	"reserved-0x0001",
140 	"Print-Job",
141 	"Print-URI",
142 	"Validate-Job",
143 	"Create-Job",
144 	"Send-Document",
145 	"Send-URI",
146 	"Cancel-Job",
147 	"Get-Job-Attributes",
148 	"Get-Jobs",
149 	"Get-Printer-Attributes",
150 	"Hold-Job",
151 	"Release-Job",
152 	"Restart-Job",
153 	"reserved-0x000f",
154 	"Pause-Printer",
155 	"Resume-Printer",
156 	"Purge-Jobs",
157 	"Set-Printer-Attributes",
158 	"Set-Job-Attributes",
159 	"Get-Printer-Supported-Values",
160 	"Create-Printer-Subscription",
161 	"Create-Job-Subscription",
162 	"Get-Subscription-Attributes",
163 	"Get-Subscriptions",
164 	"Renew-Subscription",
165 	"Cancel-Subscription",
166 	"Get-Notifications",
167 	"Send-Notifications",
168 	"Get-Resource-Attributes-deleted",
169 	"Get-Resource-Data-deleted",
170 	"Get-Resources-deleted",
171 	"Get-Print-Support-Files",
172 	"Disable-Printer",
173 	"Pause-Printer-After-Current-Job",
174 	"Hold-New-Jobs",
175 	"Release-Held-New-Jobs",
176 	"Deactivate-Printer",
177 	"Activate-Printer",
178 	"Restart-Printer",
179 	"Shutdown-Printer",
180 	"Startup-Printer",
181 	"Reprocess-Job",
182 	"Cancel-Current-Job",
183 	"Suspend-Current-Job",
184 	"Resume-Job",
185 	"Promote-Job",
186 	"Schedule-Job-After",
187 	NULL
188 };
189 
190 static char *res_opid_strings[] = {
191 	"Microsoft-0x4000",
192 	"CUPS-Get-Default",
193 	"CUPS-Get-Printers",
194 	"CUPS-Add-Printer",
195 	"CUPS-Delete-Printer",
196 	"CUPS-Get-Classes",
197 	"CUPS-Add-Class",
198 	"CUPS-Delete-Class",
199 	"CUPS-Accept-Jobs",
200 	"CUPS-Reject-Jobs",
201 	"CUPS-Set-Default",
202 	"CUPS-Get-Devices",
203 	"CUPS-Get-PPDs",
204 	"CUPS-Move-Job",
205 	"CUPS-0x400e",
206 	"CUPS-0x400f",
207 	"Peerless-0x4010",
208 	NULL
209 };
210 #define	KNOWN_RESERVED_MIN 0x4000
211 #define	KNOWN_RESERVED_MAX 0x4010
212 
213 static char *ok_status_strings[] = {
214 	"successful-ok",
215 	"successful-ok-ignored-or-substituted-attributes",
216 	"successful-ok-conflicting-attributes",
217 	"successful-ok-ignored-subscriptions",
218 	"successful-ok-ignored-notifications",
219 	"successful-ok-too-many-events",
220 	"successful-ok-but-cancel-subscription"
221 };
222 
223 static char *redir_status_strings[] = {
224 	"redirection-other-site"
225 };
226 
227 static char *client_error_status_strings[] = {
228 	"client-error-bad-request",
229 	"client-error-forbidden",
230 	"client-error-not-authenticated",
231 	"client-error-not-authorized",
232 	"client-error-not-possible",
233 	"client-error-timeout",
234 	"client-error-not-found",
235 	"client-error-gone",
236 	"client-error-request-entity-too-large",
237 	"client-error-request-value-too-long",
238 	"client-error-document-format-not-supported",
239 	"client-error-attributes-or-values-not-supported",
240 	"client-error-uri-scheme-not-supported",
241 	"client-error-charset-not-supported",
242 	"client-error-conflicting-attributes",
243 	"client-error-compression-not-supported",
244 	"client-error-compression-error",
245 	"client-error-document-format-error",
246 	"client-error-document-access-error",
247 	"client-error-attributes-not-settable",
248 	"client-error-ignored-all-subscriptions",
249 	"client-error-too-many-subscriptions",
250 	"client-error-ignored-all-notifications",
251 	"client-error-print-support-file-not-found"
252 };
253 
254 static char *server_error_status_strings[] = {
255 	"server-error-internal-error",
256 	"server-error-operation-not-supported",
257 	"server-error-service-unavailable",
258 	"server-error-version-not-supported",
259 	"server-error-device-error",
260 	"server-error-temporary-error",
261 	"server-error-not-accepting-jobs",
262 	"server-error-busy",
263 	"server-error-job-canceled",
264 	"server-error-multiple-document-jobs-not-supported",
265 	"server-error-printer-is-deactivated"
266 };
267 
268 char *
ipp_tag_string(int8_t id,char * ret,size_t len)269 ipp_tag_string(int8_t id, char *ret, size_t len)
270 {
271 	if (id < VTAG_MAX)
272 		(void) strlcpy(ret, tag_strings[id], len);
273 	else if (id == VTAG_EXTEND)
274 		(void) strlcpy(ret, "extension", len);
275 	else
276 		(void) snprintf(ret, len, "bogus-0x%.2x", id);
277 
278 	return (ret);
279 }
280 
281 char *
ipp_opid_string(int16_t id,char * ret,size_t len)282 ipp_opid_string(int16_t id, char *ret, size_t len)
283 {
284 	if (id < OPID_RESERVED_MIN)
285 		(void) strlcpy(ret, opid_strings[id], len);
286 	else if (id < OPID_RESERVED_VENDOR_MIN)
287 		(void) snprintf(ret, len, "reserved-0x%.4x", id);
288 	else if (id <= KNOWN_RESERVED_MAX)
289 		(void) strlcpy(ret,
290 				res_opid_strings[id - KNOWN_RESERVED_MIN], len);
291 	else /* if (id <= OPID_RESERVED_VENDOR_MAX) */
292 		(void) snprintf(ret, len, "reserved-vendor-0x%.4x", id);
293 
294 	return (ret);
295 }
296 
297 int16_t
ipp_string_opid(char * string)298 ipp_string_opid(char *string)
299 {
300 	int i;
301 
302 	for (i = 0; opid_strings[i] != NULL; i++)
303 		if (strcasecmp(opid_strings[i], string) == 0)
304 			return (i);
305 
306 	for (i = 0; res_opid_strings[i] != NULL; i++)
307 		if (strcasecmp(res_opid_strings[i], string) == 0)
308 			return (0x4000 + i);
309 
310 	return (-1);
311 }
312 
313 char *
ipp_status_string(int16_t id,char * ret,size_t len)314 ipp_status_string(int16_t id, char *ret, size_t len)
315 {
316 	if (id <= IPP_OK_MAX)
317 		(void) strlcpy(ret, ok_status_strings[id], len);
318 	else if (id >= IPP_REDIR_MIN && id <= IPP_REDIR_MAX)
319 		(void) strlcpy(ret,
320 			redir_status_strings[id - IPP_REDIR_MIN], len);
321 	else if (id >= IPP_CERR_MIN && id <= IPP_CERR_MAX)
322 		(void) strlcpy(ret,
323 			client_error_status_strings[id - IPP_CERR_MIN], len);
324 	else if (id >= IPP_SERR_MIN && id <= IPP_SERR_MAX)
325 		(void) strlcpy(ret,
326 			server_error_status_strings[id - IPP_SERR_MIN], len);
327 	else
328 		(void) snprintf(ret, len, "bogus-0x%.4hx", id);
329 
330 	return (ret);
331 }
332 
333 
334 
335 /*
336  * attribute template handling routines
337  */
338 char *job_template[] = {
339 	"copies",
340 	"finishing",
341 	"job-hold-until",
342 	"job-priority",
343 	"job-sheets",
344 	"media",
345 	"multiple-document-handling",
346 	"number-up",
347 	"page-ranges-supported",
348 	"print-quality",
349 	"printer-resoultion",
350 	"sides",
351 	NULL
352 };
353 
354 char *job_description[] = {
355 	"copies-default", "copies-supported",
356 	"finishing-default", "finishing-supported",
357 	"job-hold-until-default", "job-hold-until-supported",
358 	"job-priority-default", "job-priority-supported",
359 	"job-sheets-default", "job-sheets-supported",
360 	"media-default", "media-supported",
361 	"multiple-document-handling-default",
362 	"multiple-document-handling-supported",
363 	"number-up-default", "number-up-supported",
364 	"page-ranges-supported",
365 	"print-quality-default", "print-quality-supported",
366 	"printer-resoultion-default", "printer-resoultion-supported",
367 	"sides-default", "sides-supported",
368 	NULL
369 };
370 
371 char *printer_description[] = {
372 	"printer-uri-supported",
373 	"uri-security-supported",
374 	"uri-authentication-supported",
375 	"printer-name",
376 	"printer-location",
377 	"printer-info",
378 	"printer-more-info",
379 	"printer-driver-installer",
380 	"printer-make-and-model",
381 	"printer-more-info-manufacturer",
382 	"printer-state",
383 	"printer-state-reasons",
384 	"printer-state-message",
385 	"ipp-versions-supported",
386 	"multiple-document-jobs-supported",
387 	"charset-configured",
388 	"charset-supported",
389 	"natural-language-configured",
390 	"generated-natural-language-supported",
391 	"document-format-default",
392 	"document-format-supported",
393 	"printer-is-accepting-jobs",
394 	"queued-job-count",
395 	"printer-message-from-operator",
396 	"color-supported",
397 	"reference-uri-schemes-supported",
398 	"pdl-override-supported",
399 	"printer-up-time",
400 	"printer-current-time",
401 	"multiple-operation-time-out",
402 	"compression-supported",
403 	"job-k-octets-supported",
404 	"job-impressions-supported",
405 	"job-media-sheets-supported",
406 	"pages-per-minute",
407 	"pages-per-minute-color",
408 	NULL
409 };
410