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