]> git.ipfire.org Git - thirdparty/cups.git/blame - cups/ipp-support.c
Remove support for AIX, HP-UX, and OSF/1.
[thirdparty/cups.git] / cups / ipp-support.c
CommitLineData
ef416fc2 1/*
f2d18633 2 * "$Id$"
ef416fc2 3 *
d21dc0ed 4 * Internet Printing Protocol support functions for CUPS.
ef416fc2 5 *
d21dc0ed
MS
6 * Copyright 2007-2013 by Apple Inc.
7 * Copyright 1997-2007 by Easy Software Products, all rights reserved.
ef416fc2 8 *
d21dc0ed
MS
9 * These coded instructions, statements, and computer programs are the
10 * property of Apple Inc. and are protected by Federal copyright
11 * law. Distribution and use rights are outlined in the file "LICENSE.txt"
12 * which should have been included with this file. If this file is
13 * file is missing or damaged, see the license at "http://www.cups.org/".
ef416fc2 14 *
d21dc0ed 15 * This file is subject to the Apple OS-Developed Software exception.
ef416fc2 16 */
17
18/*
19 * Include necessary headers...
20 */
21
71e16022 22#include "cups-private.h"
ef416fc2 23
24
25/*
26 * Local globals...
27 */
28
d21dc0ed
MS
29static const char * const ipp_states[] =
30 {
31 "IPP_STATE_ERROR",
32 "IPP_STATE_IDLE",
33 "IPP_STATE_HEADER",
34 "IPP_STATE_ATTRIBUTE",
35 "IPP_STATE_DATA"
36 };
ef416fc2 37static const char * const ipp_status_oks[] = /* "OK" status codes */
a2326b5b 38 { /* (name) = abandoned standard value */
ef416fc2 39 "successful-ok",
40 "successful-ok-ignored-or-substituted-attributes",
41 "successful-ok-conflicting-attributes",
42 "successful-ok-ignored-subscriptions",
a2326b5b 43 "(successful-ok-ignored-notifications)",
ef416fc2 44 "successful-ok-too-many-events",
a2326b5b 45 "(successful-ok-but-cancel-subscription)",
bd7854cb 46 "successful-ok-events-complete"
ef416fc2 47 },
48 * const ipp_status_400s[] = /* Client errors */
a2326b5b 49 { /* (name) = abandoned standard value */
ef416fc2 50 "client-error-bad-request",
51 "client-error-forbidden",
52 "client-error-not-authenticated",
53 "client-error-not-authorized",
54 "client-error-not-possible",
55 "client-error-timeout",
56 "client-error-not-found",
57 "client-error-gone",
58 "client-error-request-entity-too-large",
59 "client-error-request-value-too-long",
60 "client-error-document-format-not-supported",
61 "client-error-attributes-or-values-not-supported",
62 "client-error-uri-scheme-not-supported",
63 "client-error-charset-not-supported",
64 "client-error-conflicting-attributes",
65 "client-error-compression-not-supported",
66 "client-error-compression-error",
67 "client-error-document-format-error",
68 "client-error-document-access-error",
69 "client-error-attributes-not-settable",
70 "client-error-ignored-all-subscriptions",
71 "client-error-too-many-subscriptions",
a2326b5b 72 "(client-error-ignored-all-notifications)",
82cc1f9a
MS
73 "(client-error-client-print-support-file-not-found)",
74 "client-error-document-password-error",
75 "client-error-document-permission-error",
76 "client-error-document-security-error",
77 "client-error-document-unprintable-error"
ef416fc2 78 },
a469f8a5
MS
79 * const ipp_status_480s[] = /* Vendor client errors */
80 {
81 /* 0x0480 - 0x048F */
82 "0x0480",
83 "0x0481",
84 "0x0482",
85 "0x0483",
86 "0x0484",
87 "0x0485",
88 "0x0486",
89 "0x0487",
90 "0x0488",
91 "0x0489",
92 "0x048A",
93 "0x048B",
94 "0x048C",
95 "0x048D",
96 "0x048E",
97 "0x048F",
98 /* 0x0490 - 0x049F */
99 "0x0490",
100 "0x0491",
101 "0x0492",
102 "0x0493",
103 "0x0494",
104 "0x0495",
105 "0x0496",
106 "0x0497",
107 "0x0498",
108 "0x0499",
109 "0x049A",
110 "0x049B",
111 "cups-error-account-info-needed",
112 "cups-error-account-closed",
113 "cups-error-account-limit-reached",
114 "cups-error-account-authorization-failed"
115 },
ef416fc2 116 * const ipp_status_500s[] = /* Server errors */
117 {
118 "server-error-internal-error",
119 "server-error-operation-not-supported",
120 "server-error-service-unavailable",
121 "server-error-version-not-supported",
122 "server-error-device-error",
123 "server-error-temporary-error",
124 "server-error-not-accepting-jobs",
125 "server-error-busy",
126 "server-error-job-canceled",
127 "server-error-multiple-document-jobs-not-supported",
a2326b5b
MS
128 "server-error-printer-is-deactivated",
129 "server-error-too-many-jobs",
130 "server-error-too-many-documents"
7cf5915e
MS
131 },
132 * const ipp_status_1000s[] = /* CUPS internal */
133 {
a469f8a5 134 "cups-authentication-canceled",
7cf5915e
MS
135 "cups-pki-error",
136 "cups-upgrade-required"
ef416fc2 137 };
a2326b5b 138static const char * const ipp_std_ops[] =
ef416fc2 139 {
140 /* 0x0000 - 0x000f */
db8b865d
MS
141 "0x0000",
142 "0x0001",
aaf19ab0
MS
143 "Print-Job",
144 "Print-URI",
145 "Validate-Job",
146 "Create-Job",
147 "Send-Document",
148 "Send-URI",
149 "Cancel-Job",
150 "Get-Job-Attributes",
151 "Get-Jobs",
152 "Get-Printer-Attributes",
153 "Hold-Job",
154 "Release-Job",
155 "Restart-Job",
db8b865d 156 "0x000f",
ef416fc2 157
158 /* 0x0010 - 0x001f */
aaf19ab0
MS
159 "Pause-Printer",
160 "Resume-Printer",
161 "Purge-Jobs",
162 "Set-Printer-Attributes",
ef416fc2 163 "Set-Job-Attributes",
164 "Get-Printer-Supported-Values",
165 "Create-Printer-Subscription",
166 "Create-Job-Subscription",
167 "Get-Subscription-Attributes",
aaf19ab0
MS
168 "Get-Subscriptions",
169 "Renew-Subscription",
170 "Cancel-Subscription",
171 "Get-Notifications",
a2326b5b
MS
172 "(Send-Notifications)",
173 "(Get-Resource-Attributes)",
174 "(Get-Resource-Data)",
ef416fc2 175
176 /* 0x0020 - 0x002f */
a2326b5b
MS
177 "(Get-Resources)",
178 "(Get-Printer-Support-Files)",
ef416fc2 179 "Enable-Printer",
180 "Disable-Printer",
181 "Pause-Printer-After-Current-Job",
182 "Hold-New-Jobs",
183 "Release-Held-New-Jobs",
184 "Deactivate-Printer",
185 "Activate-Printer",
186 "Restart-Printer",
187 "Shutdown-Printer",
188 "Startup-Printer",
189 "Reprocess-Job",
190 "Cancel-Current-Job",
191 "Suspend-Current-Job",
192 "Resume-Job",
193
9475ec92 194 /* 0x0030 - 0x003e */
ef416fc2 195 "Promote-Job",
aaf19ab0 196 "Schedule-Job-After",
db8b865d 197 "0x0032",
aaf19ab0
MS
198 "Cancel-Document",
199 "Get-Document-Attributes",
200 "Get-Documents",
201 "Delete-Document",
202 "Set-Document-Attributes",
203 "Cancel-Jobs",
204 "Cancel-My-Jobs",
205 "Resubmit-Job",
771bd8cb 206 "Close-Job",
82cc1f9a 207 "Identify-Printer",
9475ec92
MS
208 "Validate-Document",
209 "Send-Hardcopy-Document"
ef416fc2 210 },
211 * const ipp_cups_ops[] =
212 {
213 "CUPS-Get-Default",
214 "CUPS-Get-Printers",
480ef0fe 215 "CUPS-Add-Modify-Printer",
ef416fc2 216 "CUPS-Delete-Printer",
217 "CUPS-Get-Classes",
480ef0fe 218 "CUPS-Add-Modify-Class",
ef416fc2 219 "CUPS-Delete-Class",
220 "CUPS-Accept-Jobs",
221 "CUPS-Reject-Jobs",
222 "CUPS-Set-Default",
223 "CUPS-Get-Devices",
224 "CUPS-Get-PPDs",
225 "CUPS-Move-Job",
b94498cf 226 "CUPS-Authenticate-Job",
227 "CUPS-Get-PPD"
2e4ff8af
MS
228 },
229 * const ipp_cups_ops2[] =
230 {
231 "CUPS-Get-Document"
1ff0402e
MS
232 },
233 * const ipp_tag_names[] =
234 { /* Value/group tag names */
235 "zero", /* 0x00 */
236 "operation-attributes-tag",
237 /* 0x01 */
238 "job-attributes-tag", /* 0x02 */
239 "end-of-attributes-tag",
240 /* 0x03 */
241 "printer-attributes-tag",
242 /* 0x04 */
243 "unsupported-attributes-tag",
244 /* 0x05 */
245 "subscription-attributes-tag",
246 /* 0x06 */
247 "event-notification-attributes-tag",
248 /* 0x07 */
a2326b5b
MS
249 "(resource-attributes-tag)",
250 /* 0x08 */
d7225fc2
MS
251 "document-attributes-tag",
252 /* 0x09 */
253 "0x0a", /* 0x0a */
254 "0x0b", /* 0x0b */
255 "0x0c", /* 0x0c */
256 "0x0d", /* 0x0d */
257 "0x0e", /* 0x0e */
258 "0x0f", /* 0x0f */
1ff0402e
MS
259 "unsupported", /* 0x10 */
260 "default", /* 0x11 */
261 "unknown", /* 0x12 */
262 "no-value", /* 0x13 */
d7225fc2 263 "0x14", /* 0x14 */
1ff0402e
MS
264 "not-settable", /* 0x15 */
265 "delete-attribute", /* 0x16 */
266 "admin-define", /* 0x17 */
d7225fc2
MS
267 "0x18", /* 0x18 */
268 "0x19", /* 0x19 */
269 "0x1a", /* 0x1a */
270 "0x1b", /* 0x1b */
271 "0x1c", /* 0x1c */
272 "0x1d", /* 0x1d */
273 "0x1e", /* 0x1e */
274 "0x1f", /* 0x1f */
275 "0x20", /* 0x20 */
1ff0402e
MS
276 "integer", /* 0x21 */
277 "boolean", /* 0x22 */
278 "enum", /* 0x23 */
d7225fc2
MS
279 "0x24", /* 0x24 */
280 "0x25", /* 0x25 */
281 "0x26", /* 0x26 */
282 "0x27", /* 0x27 */
283 "0x28", /* 0x28 */
284 "0x29", /* 0x29 */
285 "0x2a", /* 0x2a */
286 "0x2b", /* 0x2b */
287 "0x2c", /* 0x2c */
288 "0x2d", /* 0x2d */
289 "0x2e", /* 0x2e */
290 "0x2f", /* 0x2f */
1ff0402e
MS
291 "octetString", /* 0x30 */
292 "dateTime", /* 0x31 */
293 "resolution", /* 0x32 */
294 "rangeOfInteger", /* 0x33 */
f8b3a85b 295 "collection", /* 0x34 */
1ff0402e
MS
296 "textWithLanguage", /* 0x35 */
297 "nameWithLanguage", /* 0x36 */
298 "endCollection", /* 0x37 */
d7225fc2
MS
299 "0x38", /* 0x38 */
300 "0x39", /* 0x39 */
301 "0x3a", /* 0x3a */
302 "0x3b", /* 0x3b */
303 "0x3c", /* 0x3c */
304 "0x3d", /* 0x3d */
305 "0x3e", /* 0x3e */
306 "0x3f", /* 0x3f */
307 "0x40", /* 0x40 */
1ff0402e
MS
308 "textWithoutLanguage",/* 0x41 */
309 "nameWithoutLanguage",/* 0x42 */
d7225fc2 310 "0x43", /* 0x43 */
1ff0402e
MS
311 "keyword", /* 0x44 */
312 "uri", /* 0x45 */
313 "uriScheme", /* 0x46 */
314 "charset", /* 0x47 */
315 "naturalLanguage", /* 0x48 */
316 "mimeMediaType", /* 0x49 */
317 "memberAttrName" /* 0x4a */
ef416fc2 318 };
a2326b5b
MS
319static const char * const ipp_document_states[] =
320 { /* document-state-enums */
321 "pending",
322 "4",
323 "processing",
324 "6",
325 "canceled",
326 "aborted",
327 "completed"
328 },
329 * const ipp_finishings[] =
330 { /* finishings enums */
331 "none",
332 "staple",
333 "punch",
334 "cover",
335 "bind",
336 "saddle-stitch",
337 "edge-stitch",
338 "fold",
339 "trim",
340 "bale",
341 "booklet-maker",
342 "jog-offset",
343 "15",
344 "16",
345 "17",
346 "18",
347 "19",
348 "staple-top-left",
349 "staple-bottom-left",
350 "staple-top-right",
351 "staple-bottom-right",
352 "edge-stitch-left",
353 "edge-stitch-top",
354 "edge-stitch-right",
355 "edge-stitch-bottom",
356 "staple-dual-left",
357 "staple-dual-top",
358 "staple-dual-right",
359 "staple-dual-bottom",
360 "32",
361 "33",
362 "34",
363 "35",
364 "36",
365 "37",
366 "38",
367 "39",
368 "40",
369 "41",
370 "42",
371 "43",
372 "44",
373 "45",
374 "46",
375 "47",
376 "48",
377 "49",
378 "bind-left",
379 "bind-top",
380 "bind-right",
381 "bind-bottom",
382 "54",
383 "55",
384 "56",
385 "57",
386 "58",
387 "59",
388 "trim-after-pages",
389 "trim-after-documents",
390 "trim-after-copies",
9475ec92
MS
391 "trim-after-job",
392 "64",
393 "65",
394 "66",
395 "67",
396 "68",
397 "69",
398 "punch-top-left",
399 "punch-bottom-left",
400 "punch-top-right",
401 "punch-bottom-right",
402 "punch-dual-left",
403 "punch-dual-top",
404 "punch-dual-right",
405 "punch-dual-bottom",
406 "punch-triple-left",
407 "punch-triple-top",
408 "punch-triple-right",
409 "punch-triple-bottom",
410 "punch-quad-left",
411 "punch-quad-top",
412 "punch-quad-right",
413 "punch-quad-bottom",
414 "86",
415 "87",
416 "88",
417 "89",
418 "fold-accordian",
419 "fold-double-gate",
420 "fold-gate",
421 "fold-half",
422 "fold-half-z",
423 "fold-left-gate",
424 "fold-letter",
425 "fold-parallel",
426 "fold-poster",
427 "fold-right-gate",
428 "fold-z"
a2326b5b 429 },
a469f8a5
MS
430 * const ipp_finishings_vendor[] =
431 {
432 /* 0x40000000 to 0x4000000F */
433 "0x40000000",
434 "0x40000001",
435 "0x40000002",
436 "0x40000003",
437 "0x40000004",
438 "0x40000005",
439 "0x40000006",
440 "0x40000007",
441 "0x40000008",
442 "0x40000009",
443 "0x4000000A",
444 "0x4000000B",
445 "0x4000000C",
446 "0x4000000D",
447 "0x4000000E",
448 "0x4000000F",
449 /* 0x40000010 to 0x4000001F */
450 "0x40000010",
451 "0x40000011",
452 "0x40000012",
453 "0x40000013",
454 "0x40000014",
455 "0x40000015",
456 "0x40000016",
457 "0x40000017",
458 "0x40000018",
459 "0x40000019",
460 "0x4000001A",
461 "0x4000001B",
462 "0x4000001C",
463 "0x4000001D",
464 "0x4000001E",
465 "0x4000001F",
466 /* 0x40000020 to 0x4000002F */
467 "0x40000020",
468 "0x40000021",
469 "0x40000022",
470 "0x40000023",
471 "0x40000024",
472 "0x40000025",
473 "0x40000026",
474 "0x40000027",
475 "0x40000028",
476 "0x40000029",
477 "0x4000002A",
478 "0x4000002B",
479 "0x4000002C",
480 "0x4000002D",
481 "0x4000002E",
482 "0x4000002F",
483 /* 0x40000030 to 0x4000003F */
484 "0x40000030",
485 "0x40000031",
486 "0x40000032",
487 "0x40000033",
488 "0x40000034",
489 "0x40000035",
490 "0x40000036",
491 "0x40000037",
492 "0x40000038",
493 "0x40000039",
494 "0x4000003A",
495 "0x4000003B",
496 "0x4000003C",
497 "0x4000003D",
498 "0x4000003E",
499 "0x4000003F",
500 /* 0x40000040 - 0x4000004F */
501 "0x40000040",
502 "0x40000041",
503 "0x40000042",
504 "0x40000043",
505 "0x40000044",
506 "0x40000045",
9475ec92
MS
507 "cups-punch-top-left",
508 "cups-punch-bottom-left",
509 "cups-punch-top-right",
510 "cups-punch-bottom-right",
511 "cups-punch-dual-left",
512 "cups-punch-dual-top",
513 "cups-punch-dual-right",
514 "cups-punch-dual-bottom",
515 "cups-punch-triple-left",
516 "cups-punch-triple-top",
6961465f 517 /* 0x40000050 - 0x4000005F */
9475ec92
MS
518 "cups-punch-triple-right",
519 "cups-punch-triple-bottom",
520 "cups-punch-quad-left",
521 "cups-punch-quad-top",
522 "cups-punch-quad-right",
523 "cups-punch-quad-bottom",
6961465f
MS
524 "0x40000056",
525 "0x40000057",
526 "0x40000058",
527 "0x40000059",
9475ec92
MS
528 "cups-fold-accordian",
529 "cups-fold-double-gate",
530 "cups-fold-gate",
531 "cups-fold-half",
532 "cups-fold-half-z",
533 "cups-fold-left-gate",
6961465f 534 /* 0x40000060 - 0x40000064 */
9475ec92
MS
535 "cups-fold-letter",
536 "cups-fold-parallel",
537 "cups-fold-poster",
538 "cups-fold-right-gate",
539 "cups-fold-z"
a469f8a5 540 },
a2326b5b
MS
541 * const ipp_job_collation_types[] =
542 { /* job-collation-type enums */
543 "uncollated-sheets",
544 "collated-documents",
545 "uncollated-documents"
546 },
547 * const ipp_job_states[] =
548 { /* job-state enums */
549 "pending",
550 "pending-held",
551 "processing",
552 "processing-stopped",
553 "canceled",
554 "aborted",
555 "completed"
556 },
557 * const ipp_orientation_requesteds[] =
558 { /* orientation-requested enums */
559 "portrait",
560 "landscape",
561 "reverse-landscape",
562 "reverse-portrait"
563 },
564 * const ipp_print_qualities[] =
565 { /* print-quality enums */
566 "draft",
567 "normal",
568 "high"
569 },
570 * const ipp_printer_states[] =
571 { /* printer-state enums */
572 "idle",
573 "processing",
574 "stopped",
575 };
aaf19ab0
MS
576
577
578/*
579 * Local functions...
580 */
581
582static size_t ipp_col_string(ipp_t *col, char *buffer, size_t bufsize);
583
584
585/*
a2326b5b 586 * 'ippAttributeString()' - Convert the attribute's value to a string.
aaf19ab0
MS
587 *
588 * Returns the number of bytes that would be written, not including the
589 * trailing nul. The buffer pointer can be NULL to get the required length,
590 * just like (v)snprintf.
a2326b5b 591 *
f3c17241 592 * @since CUPS 1.6/OS X 10.8@
aaf19ab0
MS
593 */
594
595size_t /* O - Number of bytes less nul */
a2326b5b
MS
596ippAttributeString(
597 ipp_attribute_t *attr, /* I - Attribute */
598 char *buffer, /* I - String buffer or NULL */
599 size_t bufsize) /* I - Size of string buffer */
aaf19ab0
MS
600{
601 int i; /* Looping var */
602 char *bufptr, /* Pointer into buffer */
603 *bufend, /* End of buffer */
604 temp[256]; /* Temporary string */
db8b865d
MS
605 const char *ptr, /* Pointer into string */
606 *end; /* Pointer to end of string */
a2326b5b 607 _ipp_value_t *val; /* Current value */
aaf19ab0
MS
608
609
610 if (!attr || !attr->name)
611 {
612 if (buffer)
613 *buffer = '\0';
614
615 return (0);
616 }
617
618 bufptr = buffer;
619 if (buffer)
620 bufend = buffer + bufsize - 1;
621 else
622 bufend = NULL;
623
624 for (i = attr->num_values, val = attr->values; i > 0; i --, val ++)
625 {
626 if (val > attr->values)
627 {
7cf5915e 628 if (buffer && bufptr < bufend)
aaf19ab0
MS
629 *bufptr++ = ',';
630 else
631 bufptr ++;
632 }
633
cb7f98ee 634 switch (attr->value_tag & ~IPP_TAG_CUPS_CONST)
aaf19ab0
MS
635 {
636 case IPP_TAG_ENUM :
a2326b5b 637 ptr = ippEnumString(attr->name, val->integer);
aaf19ab0 638
a2326b5b
MS
639 if (buffer && bufptr < bufend)
640 strlcpy(bufptr, ptr, bufend - bufptr + 1);
9b66acc5 641
a2326b5b
MS
642 bufptr += strlen(ptr);
643 break;
aaf19ab0
MS
644
645 case IPP_TAG_INTEGER :
7cf5915e 646 if (buffer && bufptr < bufend)
aaf19ab0
MS
647 bufptr += snprintf(bufptr, bufend - bufptr + 1, "%d", val->integer);
648 else
649 bufptr += snprintf(temp, sizeof(temp), "%d", val->integer);
650 break;
651
652 case IPP_TAG_BOOLEAN :
7cf5915e 653 if (buffer && bufptr < bufend)
aaf19ab0
MS
654 strlcpy(bufptr, val->boolean ? "true" : "false",
655 bufend - bufptr + 1);
656
657 bufptr += val->boolean ? 4 : 5;
658 break;
659
660 case IPP_TAG_RANGE :
7cf5915e 661 if (buffer && bufptr < bufend)
aaf19ab0
MS
662 bufptr += snprintf(bufptr, bufend - bufptr + 1, "%d-%d",
663 val->range.lower, val->range.upper);
664 else
665 bufptr += snprintf(temp, sizeof(temp), "%d-%d", val->range.lower,
666 val->range.upper);
667 break;
668
669 case IPP_TAG_RESOLUTION :
7cf5915e 670 if (buffer && bufptr < bufend)
aaf19ab0
MS
671 bufptr += snprintf(bufptr, bufend - bufptr + 1, "%dx%d%s",
672 val->resolution.xres, val->resolution.yres,
673 val->resolution.units == IPP_RES_PER_INCH ?
3e7fe0ca 674 "dpi" : "dpcm");
aaf19ab0
MS
675 else
676 bufptr += snprintf(temp, sizeof(temp), "%dx%d%s",
677 val->resolution.xres, val->resolution.yres,
678 val->resolution.units == IPP_RES_PER_INCH ?
3e7fe0ca 679 "dpi" : "dpcm");
aaf19ab0
MS
680 break;
681
682 case IPP_TAG_DATE :
683 {
684 unsigned year; /* Year */
685
686 year = (val->date[0] << 8) + val->date[1];
687
688 if (val->date[9] == 0 && val->date[10] == 0)
689 snprintf(temp, sizeof(temp), "%04u-%02u-%02uT%02u:%02u:%02uZ",
690 year, val->date[2], val->date[3], val->date[4],
691 val->date[5], val->date[6]);
692 else
693 snprintf(temp, sizeof(temp),
694 "%04u-%02u-%02uT%02u:%02u:%02u%c%02u%02u",
695 year, val->date[2], val->date[3], val->date[4],
696 val->date[5], val->date[6], val->date[8], val->date[9],
697 val->date[10]);
698
7cf5915e 699 if (buffer && bufptr < bufend)
aaf19ab0
MS
700 strlcpy(bufptr, temp, bufend - bufptr + 1);
701
702 bufptr += strlen(temp);
703 }
704 break;
705
706 case IPP_TAG_TEXT :
707 case IPP_TAG_NAME :
708 case IPP_TAG_KEYWORD :
709 case IPP_TAG_CHARSET :
710 case IPP_TAG_URI :
d7225fc2 711 case IPP_TAG_URISCHEME :
aaf19ab0
MS
712 case IPP_TAG_MIMETYPE :
713 case IPP_TAG_LANGUAGE :
714 case IPP_TAG_TEXTLANG :
715 case IPP_TAG_NAMELANG :
7cf5915e
MS
716 if (!val->string.text)
717 break;
718
aaf19ab0
MS
719 for (ptr = val->string.text; *ptr; ptr ++)
720 {
a2326b5b 721 if (*ptr == '\\' || *ptr == '\"' || *ptr == '[')
aaf19ab0 722 {
7cf5915e 723 if (buffer && bufptr < bufend)
aaf19ab0
MS
724 *bufptr = '\\';
725 bufptr ++;
726 }
727
7cf5915e 728 if (buffer && bufptr < bufend)
aaf19ab0
MS
729 *bufptr = *ptr;
730 bufptr ++;
731 }
a2326b5b
MS
732
733 if (val->string.language)
734 {
735 /*
736 * Add "[language]" to end of string...
737 */
738
739 if (buffer && bufptr < bufend)
740 *bufptr = '[';
741 bufptr ++;
742
743 if (buffer && bufptr < bufend)
744 strlcpy(bufptr, val->string.language, bufend - bufptr);
745 bufptr += strlen(val->string.language);
746
747 if (buffer && bufptr < bufend)
748 *bufptr = ']';
749 bufptr ++;
750 }
aaf19ab0
MS
751 break;
752
753 case IPP_TAG_BEGIN_COLLECTION :
7cf5915e 754 if (buffer && bufptr < bufend)
aaf19ab0
MS
755 bufptr += ipp_col_string(val->collection, bufptr,
756 bufend - bufptr + 1);
757 else
758 bufptr += ipp_col_string(val->collection, NULL, 0);
759 break;
760
761 case IPP_TAG_STRING :
db8b865d
MS
762 for (ptr = val->unknown.data, end = ptr + val->unknown.length;
763 ptr < end; ptr ++)
aaf19ab0 764 {
7cf5915e 765 if (*ptr == '\\' || _cups_isspace(*ptr))
aaf19ab0 766 {
7cf5915e 767 if (buffer && bufptr < bufend)
aaf19ab0
MS
768 *bufptr = '\\';
769 bufptr ++;
770
7cf5915e 771 if (buffer && bufptr < bufend)
aaf19ab0
MS
772 *bufptr = *ptr;
773 bufptr ++;
774 }
775 else if (!isprint(*ptr & 255))
776 {
7cf5915e 777 if (buffer && bufptr < bufend)
aaf19ab0
MS
778 bufptr += snprintf(bufptr, bufend - bufptr + 1, "\\%03o",
779 *ptr & 255);
780 else
781 bufptr += snprintf(temp, sizeof(temp), "\\%03o",
782 *ptr & 255);
783 }
784 else
785 {
7cf5915e 786 if (buffer && bufptr < bufend)
aaf19ab0
MS
787 *bufptr = *ptr;
788 bufptr ++;
789 }
790 }
791 break;
792
793 default :
794 ptr = ippTagString(attr->value_tag);
7cf5915e 795 if (buffer && bufptr < bufend)
aaf19ab0
MS
796 strlcpy(bufptr, ptr, bufend - bufptr + 1);
797 bufptr += strlen(ptr);
798 break;
799 }
800 }
801
7cf5915e 802 if (buffer && bufptr < bufend)
aaf19ab0
MS
803 *bufptr = '\0';
804 else if (bufend)
805 *bufend = '\0';
806
807 return (bufptr - buffer);
808}
ef416fc2 809
810
db8b865d
MS
811/*
812 * 'ippCreateRequestedArray()' - Create a CUPS array of attribute names from the
813 * given requested-attributes attribute.
814 *
815 * This function creates a (sorted) CUPS array of attribute names matching the
816 * list of "requested-attribute" values supplied in an IPP request. All IANA-
817 * registered values are supported in addition to the CUPS IPP extension
818 * attributes.
819 *
820 * The @code request@ parameter specifies the request message that was read from
821 * the client.
822 *
823 * @code NULL@ is returned if all attributes should be returned. Otherwise, the
824 * result is a sorted array of attribute names, where @code cupsArrayFind(array,
825 * "attribute-name")@ will return a non-NULL pointer. The array must be freed
826 * using the @code cupsArrayDelete@ function.
827 *
9c0e8e5d 828 * @since CUPS 1.7/OS X 10.9@
db8b865d
MS
829 */
830
831cups_array_t * /* O - CUPS array or @code NULL@ if all */
832ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
833{
834 int i, j, /* Looping vars */
835 count, /* Number of values */
836 added; /* Was name added? */
837 ipp_attribute_t *requested; /* requested-attributes attribute */
838 cups_array_t *ra; /* Requested attributes array */
839 const char *value; /* Current value */
840 /* The following lists come from the current IANA IPP registry of attributes */
841 static const char * const document_description[] =
842 { /* document-description group */
843 "compression",
844 "copies-actual",
845 "cover-back-actual",
846 "cover-front-actual",
847 "current-page-order",
848 "date-time-at-completed",
849 "date-time-at-creation",
850 "date-time-at-processing",
851 "detailed-status-messages",
852 "document-access-errors",
853 "document-charset",
854 "document-digital-signature",
855 "document-format",
856 "document-format-details",
857 "document-format-detected",
858 "document-format-version",
859 "document-format-version-detected",
860 "document-job-id",
861 "document-job-uri",
862 "document-message",
863 "document-metadata",
864 "document-name",
865 "document-natural-language",
866 "document-number",
867 "document-printer-uri",
868 "document-state",
869 "document-state-message",
870 "document-state-reasons",
871 "document-uri",
872 "document-uuid",
873 "errors-count",
874 "finishings-actual",
875 "finishings-col-actual",
876 "force-front-side-actual",
877 "imposition-template-actual",
878 "impressions",
879 "impressions-completed",
880 "impressions-completed-current-copy",
881 "insert-sheet-actual",
882 "k-octets",
883 "k-octets-processed",
884 "last-document",
885 "media-actual",
886 "media-col-actual",
887 "media-input-tray-check-actual",
888 "media-sheets",
889 "media-sheets-completed",
890 "more-info",
891 "number-up-actual",
892 "orientation-requested-actual",
893 "output-bin-actual",
894 "output-device-assigned",
895 "overrides-actual",
896 "page-delivery-actual",
897 "page-order-received-actual",
898 "page-ranges-actual",
899 "pages",
900 "pages-completed",
901 "pages-completed-current-copy",
902 "presentation-direction-number-up-actual",
903 "print-color-mode-actual",
904 "print-content-optimize-actual",
905 "print-quality-actual",
906 "print-rendering-intent-actual",
6961465f 907 "print-scaling-actual", /* IPP Paid Printing */
db8b865d
MS
908 "printer-resolution-actual",
909 "printer-up-time",
910 "separator-sheets-actual",
911 "sheet-completed-copy-number",
912 "sides-actual",
913 "time-at-completed",
914 "time-at-creation",
915 "time-at-processing",
916 "x-image-position-actual",
917 "x-image-shift-actual",
918 "x-side1-image-shift-actual",
919 "x-side2-image-shift-actual",
920 "y-image-position-actual",
921 "y-image-shift-actual",
922 "y-side1-image-shift-actual",
923 "y-side2-image-shift-actual"
924 };
925 static const char * const document_template[] =
926 { /* document-template group */
927 "copies",
928 "copies-default",
929 "copies-supported",
930 "cover-back",
931 "cover-back-default",
932 "cover-back-supported",
933 "cover-front",
934 "cover-front-default",
935 "cover-front-supported",
936 "feed-orientation",
937 "feed-orientation-default",
938 "feed-orientation-supported",
939 "finishings",
940 "finishings-col",
941 "finishings-col-default",
942 "finishings-col-supported",
943 "finishings-default",
944 "finishings-supported",
945 "font-name-requested",
946 "font-name-requested-default",
947 "font-name-requested-supported",
948 "font-size-requested",
949 "font-size-requested-default",
950 "font-size-requested-supported",
951 "force-front-side",
952 "force-front-side-default",
953 "force-front-side-supported",
954 "imposition-template",
955 "imposition-template-default",
956 "imposition-template-supported",
957 "insert-after-page-number-supported",
958 "insert-count-supported",
959 "insert-sheet",
960 "insert-sheet-default",
961 "insert-sheet-supported",
962 "max-stitching-locations-supported",
963 "media",
964 "media-back-coating-supported",
965 "media-bottom-margin-supported",
966 "media-col",
967 "media-col-default",
968 "media-col-supported",
969 "media-color-supported",
970 "media-default",
971 "media-front-coating-supported",
972 "media-grain-supported",
973 "media-hole-count-supported",
974 "media-info-supported",
975 "media-input-tray-check",
976 "media-input-tray-check-default",
977 "media-input-tray-check-supported",
978 "media-key-supported",
979 "media-left-margin-supported",
980 "media-order-count-supported",
981 "media-pre-printed-supported",
982 "media-recycled-supported",
983 "media-right-margin-supported",
984 "media-size-supported",
985 "media-source-supported",
986 "media-supported",
987 "media-thickness-supported",
988 "media-top-margin-supported",
989 "media-type-supported",
990 "media-weight-metric-supported",
991 "multiple-document-handling",
992 "multiple-document-handling-default",
993 "multiple-document-handling-supported",
994 "number-up",
995 "number-up-default",
996 "number-up-supported",
997 "orientation-requested",
998 "orientation-requested-default",
999 "orientation-requested-supported",
6961465f
MS
1000 "output-mode", /* CUPS extension */
1001 "output-mode-default", /* CUPS extension */
1002 "output-mode-supported", /* CUPS extension */
db8b865d
MS
1003 "overrides",
1004 "overrides-supported",
1005 "page-delivery",
1006 "page-delivery-default",
1007 "page-delivery-supported",
1008 "page-order-received",
1009 "page-order-received-default",
1010 "page-order-received-supported",
1011 "page-ranges",
1012 "page-ranges-supported",
1013 "pages-per-subset",
1014 "pages-per-subset-supported",
1015 "pdl-init-file",
1016 "pdl-init-file-default",
1017 "pdl-init-file-entry-supported",
1018 "pdl-init-file-location-supported",
1019 "pdl-init-file-name-subdirectory-supported",
1020 "pdl-init-file-name-supported",
1021 "pdl-init-file-supported",
1022 "presentation-direction-number-up",
1023 "presentation-direction-number-up-default",
1024 "presentation-direction-number-up-supported",
1025 "print-color-mode",
1026 "print-color-mode-default",
1027 "print-color-mode-supported",
1028 "print-content-optimize",
1029 "print-content-optimize-default",
1030 "print-content-optimize-supported",
1031 "print-quality",
1032 "print-quality-default",
1033 "print-quality-supported",
1034 "print-rendering-intent",
1035 "print-rendering-intent-default",
1036 "print-rendering-intent-supported",
6961465f
MS
1037 "print-scaling", /* IPP Paid Printing */
1038 "print-scaling-default", /* IPP Paid Printing */
1039 "print-scaling-supported", /* IPP Paid Printing */
db8b865d
MS
1040 "printer-resolution",
1041 "printer-resolution-default",
1042 "printer-resolution-supported",
1043 "separator-sheets",
1044 "separator-sheets-default",
1045 "separator-sheets-supported",
1046 "sheet-collate",
1047 "sheet-collate-default",
1048 "sheet-collate-supported",
1049 "sides",
1050 "sides-default",
1051 "sides-supported",
1052 "stitching-locations-supported",
1053 "stitching-offset-supported",
1054 "x-image-position",
1055 "x-image-position-default",
1056 "x-image-position-supported",
1057 "x-image-shift",
1058 "x-image-shift-default",
1059 "x-image-shift-supported",
1060 "x-side1-image-shift",
1061 "x-side1-image-shift-default",
1062 "x-side1-image-shift-supported",
1063 "x-side2-image-shift",
1064 "x-side2-image-shift-default",
1065 "x-side2-image-shift-supported",
1066 "y-image-position",
1067 "y-image-position-default",
1068 "y-image-position-supported",
1069 "y-image-shift",
1070 "y-image-shift-default",
1071 "y-image-shift-supported",
1072 "y-side1-image-shift",
1073 "y-side1-image-shift-default",
1074 "y-side1-image-shift-supported",
1075 "y-side2-image-shift",
1076 "y-side2-image-shift-default",
1077 "y-side2-image-shift-supported"
1078 };
1079 static const char * const job_description[] =
1080 { /* job-description group */
1081 "compression-supplied",
1082 "copies-actual",
1083 "cover-back-actual",
1084 "cover-front-actual",
1085 "current-page-order",
1086 "date-time-at-completed",
1087 "date-time-at-creation",
1088 "date-time-at-processing",
1089 "destination-statuses",
1090 "document-charset-supplied",
1091 "document-digital-signature-supplied",
1092 "document-format-details-supplied",
1093 "document-format-supplied",
1094 "document-message-supplied",
1095 "document-metadata",
1096 "document-name-supplied",
1097 "document-natural-language-supplied",
1098 "document-overrides-actual",
1099 "errors-count",
1100 "finishings-actual",
1101 "finishings-col-actual",
1102 "force-front-side-actual",
1103 "imposition-template-actual",
1104 "impressions-completed-current-copy",
1105 "insert-sheet-actual",
1106 "job-account-id-actual",
1107 "job-accounting-sheets-actual",
1108 "job-accounting-user-id-actual",
1109 "job-attribute-fidelity",
1110 "job-charge-info", /* CUPS extension */
1111 "job-collation-type",
1112 "job-collation-type-actual",
1113 "job-copies-actual",
1114 "job-cover-back-actual",
1115 "job-cover-front-actual",
1116 "job-detailed-status-message",
1117 "job-document-access-errors",
1118 "job-error-sheet-actual",
1119 "job-finishings-actual",
1120 "job-finishings-col-actual",
1121 "job-hold-until-actual",
1122 "job-id",
1123 "job-impressions",
1124 "job-impressions-completed",
1125 "job-k-octets",
1126 "job-k-octets-processed",
1127 "job-mandatory-attributes",
1128 "job-media-progress", /* CUPS extension */
1129 "job-media-sheets",
1130 "job-media-sheets-completed",
1131 "job-message-from-operator",
1132 "job-more-info",
1133 "job-name",
1134 "job-originating-host-name", /* CUPS extension */
1135 "job-originating-user-name",
1136 "job-originating-user-uri",
1137 "job-pages",
1138 "job-pages-completed",
1139 "job-pages-completed-current-copy",
1140 "job-printer-state-message", /* CUPS extension */
1141 "job-printer-state-reasons", /* CUPS extension */
1142 "job-printer-up-time",
1143 "job-printer-uri",
1144 "job-priority-actual",
1145 "job-save-printer-make-and-model",
1146 "job-sheet-message-actual",
1147 "job-sheets-actual",
1148 "job-sheets-col-actual",
1149 "job-state",
1150 "job-state-message",
1151 "job-state-reasons",
1152 "job-uri",
1153 "job-uuid",
1154 "media-actual",
1155 "media-col-actual",
1156 "media-check-input-tray-actual",
1157 "multiple-document-handling-actual",
1158 "number-of-documents",
1159 "number-of-intervening-jobs",
1160 "number-up-actual",
1161 "orientation-requested-actual",
1162 "original-requesting-user-name",
1163 "output-bin-actual",
1164 "output-device-assigned",
1165 "overrides-actual",
1166 "page-delivery-actual",
1167 "page-order-received-actual",
1168 "page-ranges-actual",
1169 "presentation-direction-number-up-actual",
1170 "print-color-mode-actual",
1171 "print-content-optimize-actual",
1172 "print-quality-actual",
1173 "print-rendering-intent-actual",
6961465f 1174 "print-scaling-actual", /* IPP Paid Printing */
db8b865d
MS
1175 "printer-resolution-actual",
1176 "separator-sheets-actual",
1177 "sheet-collate-actual",
1178 "sheet-completed-copy-number",
1179 "sheet-completed-document-number",
1180 "sides-actual",
1181 "time-at-completed",
1182 "time-at-creation",
1183 "time-at-processing",
1184 "warnings-count",
1185 "x-image-position-actual",
1186 "x-image-shift-actual",
1187 "x-side1-image-shift-actual",
1188 "x-side2-image-shift-actual",
1189 "y-image-position-actual",
1190 "y-image-shift-actual",
1191 "y-side1-image-shift-actual",
1192 "y-side2-image-shift-actual"
1193 };
1194 static const char * const job_template[] =
1195 { /* job-template group */
1196 "confirmation-sheet-print", /* IPP FaxOut */
1197 "confirmation-sheet-print-default",
1198 "copies",
1199 "copies-default",
1200 "copies-supported",
1201 "cover-back",
1202 "cover-back-default",
1203 "cover-back-supported",
1204 "cover-front",
1205 "cover-front-default",
1206 "cover-front-supported",
1207 "cover-sheet-info", /* IPP FaxOut */
1208 "cover-sheet-info-default",
1209 "cover-sheet-info-supported",
1210 "destination-uri-schemes-supported",/* IPP FaxOut */
1211 "destination-uris", /* IPP FaxOut */
1212 "destination-uris-supported",
1213 "feed-orientation",
1214 "feed-orientation-default",
1215 "feed-orientation-supported",
1216 "finishings",
1217 "finishings-col",
1218 "finishings-col-default",
1219 "finishings-col-supported",
1220 "finishings-default",
1221 "finishings-supported",
1222 "font-name-requested",
1223 "font-name-requested-default",
1224 "font-name-requested-supported",
1225 "font-size-requested",
1226 "font-size-requested-default",
1227 "font-size-requested-supported",
1228 "force-front-side",
1229 "force-front-side-default",
1230 "force-front-side-supported",
1231 "imposition-template",
1232 "imposition-template-default",
1233 "imposition-template-supported",
1234 "insert-after-page-number-supported",
1235 "insert-count-supported",
1236 "insert-sheet",
1237 "insert-sheet-default",
1238 "insert-sheet-supported",
1239 "job-account-id",
1240 "job-account-id-default",
1241 "job-account-id-supported",
1242 "job-accounting-sheets"
1243 "job-accounting-sheets-default"
1244 "job-accounting-sheets-supported"
1245 "job-accounting-user-id",
1246 "job-accounting-user-id-default",
1247 "job-accounting-user-id-supported",
1248 "job-copies",
1249 "job-copies-default",
1250 "job-copies-supported",
1251 "job-cover-back",
1252 "job-cover-back-default",
1253 "job-cover-back-supported",
1254 "job-cover-front",
1255 "job-cover-front-default",
1256 "job-cover-front-supported",
1257 "job-delay-output-until",
1258 "job-delay-output-until-default",
1259 "job-delay-output-until-supported",
1260 "job-delay-output-until-time",
1261 "job-delay-output-until-time-default",
1262 "job-delay-output-until-time-supported",
1263 "job-error-action",
1264 "job-error-action-default",
1265 "job-error-action-supported",
1266 "job-error-sheet",
1267 "job-error-sheet-default",
1268 "job-error-sheet-supported",
1269 "job-finishings",
1270 "job-finishings-col",
1271 "job-finishings-col-default",
1272 "job-finishings-col-supported",
1273 "job-finishings-default",
1274 "job-finishings-supported",
1275 "job-hold-until",
1276 "job-hold-until-default",
1277 "job-hold-until-supported",
1278 "job-hold-until-time",
1279 "job-hold-until-time-default",
1280 "job-hold-until-time-supported",
1281 "job-message-to-operator",
1282 "job-message-to-operator-default",
1283 "job-message-to-operator-supported",
1284 "job-phone-number",
1285 "job-phone-number-default",
1286 "job-phone-number-supported",
1287 "job-priority",
1288 "job-priority-default",
1289 "job-priority-supported",
1290 "job-recipient-name",
1291 "job-recipient-name-default",
1292 "job-recipient-name-supported",
1293 "job-save-disposition",
1294 "job-save-disposition-default",
1295 "job-save-disposition-supported",
1296 "job-sheets",
1297 "job-sheets-col",
1298 "job-sheets-col-default",
1299 "job-sheets-col-supported",
1300 "job-sheets-default",
1301 "job-sheets-supported",
1302 "logo-uri-schemes-supported",
1303 "max-save-info-supported",
1304 "max-stitching-locations-supported",
1305 "media",
1306 "media-back-coating-supported",
1307 "media-bottom-margin-supported",
1308 "media-col",
1309 "media-col-default",
1310 "media-col-supported",
1311 "media-color-supported",
1312 "media-default",
1313 "media-front-coating-supported",
1314 "media-grain-supported",
1315 "media-hole-count-supported",
1316 "media-info-supported",
1317 "media-input-tray-check",
1318 "media-input-tray-check-default",
1319 "media-input-tray-check-supported",
1320 "media-key-supported",
1321 "media-left-margin-supported",
1322 "media-order-count-supported",
1323 "media-pre-printed-supported",
1324 "media-recycled-supported",
1325 "media-right-margin-supported",
1326 "media-size-supported",
1327 "media-source-supported",
1328 "media-supported",
1329 "media-thickness-supported",
1330 "media-top-margin-supported",
1331 "media-type-supported",
1332 "media-weight-metric-supported",
1333 "multiple-document-handling",
1334 "multiple-document-handling-default",
1335 "multiple-document-handling-supported",
1336 "number-of-retries", /* IPP FaxOut */
1337 "number-of-retries-default",
1338 "number-of-retries-supported",
1339 "number-up",
1340 "number-up-default",
1341 "number-up-supported",
1342 "orientation-requested",
1343 "orientation-requested-default",
1344 "orientation-requested-supported",
1345 "output-bin",
1346 "output-bin-default",
1347 "output-bin-supported",
1348 "output-device",
1349 "output-device-default",
1350 "output-device-supported",
6961465f
MS
1351 "output-mode", /* CUPS extension */
1352 "output-mode-default", /* CUPS extension */
1353 "output-mode-supported", /* CUPS extension */
db8b865d
MS
1354 "overrides",
1355 "overrides-supported",
1356 "page-delivery",
1357 "page-delivery-default",
1358 "page-delivery-supported",
1359 "page-order-received",
1360 "page-order-received-default",
1361 "page-order-received-supported",
1362 "page-ranges",
1363 "page-ranges-supported",
1364 "pages-per-subset",
1365 "pages-per-subset-supported",
1366 "pdl-init-file",
1367 "pdl-init-file-default",
1368 "pdl-init-file-entry-supported",
1369 "pdl-init-file-location-supported",
1370 "pdl-init-file-name-subdirectory-supported",
1371 "pdl-init-file-name-supported",
1372 "pdl-init-file-supported",
1373 "presentation-direction-number-up",
1374 "presentation-direction-number-up-default",
1375 "presentation-direction-number-up-supported",
1376 "print-color-mode",
1377 "print-color-mode-default",
1378 "print-color-mode-supported",
1379 "print-content-optimize",
1380 "print-content-optimize-default",
1381 "print-content-optimize-supported",
1382 "print-quality",
1383 "print-quality-default",
1384 "print-quality-supported",
1385 "print-rendering-intent",
1386 "print-rendering-intent-default",
1387 "print-rendering-intent-supported",
6961465f
MS
1388 "print-scaling", /* IPP Paid Printing */
1389 "print-scaling-default", /* IPP Paid Printing */
1390 "print-scaling-supported", /* IPP Paid Printing */
db8b865d
MS
1391 "printer-resolution",
1392 "printer-resolution-default",
1393 "printer-resolution-supported",
1394 "proof-print",
1395 "proof-print-default",
1396 "proof-print-supported",
1397 "retry-interval", /* IPP FaxOut */
1398 "retry-interval-default",
1399 "retry-interval-supported",
1400 "retry-timeout", /* IPP FaxOut */
1401 "retry-timeout-default",
1402 "retry-timeout-supported",
1403 "save-disposition-supported",
1404 "save-document-format-default",
1405 "save-document-format-supported",
1406 "save-location-default",
1407 "save-location-supported",
1408 "save-name-subdirectory-supported",
1409 "save-name-supported",
1410 "separator-sheets",
1411 "separator-sheets-default",
1412 "separator-sheets-supported",
1413 "sheet-collate",
1414 "sheet-collate-default",
1415 "sheet-collate-supported",
1416 "sides",
1417 "sides-default",
1418 "sides-supported",
1419 "stitching-locations-supported",
1420 "stitching-offset-supported",
1421 "x-image-position",
1422 "x-image-position-default",
1423 "x-image-position-supported",
1424 "x-image-shift",
1425 "x-image-shift-default",
1426 "x-image-shift-supported",
1427 "x-side1-image-shift",
1428 "x-side1-image-shift-default",
1429 "x-side1-image-shift-supported",
1430 "x-side2-image-shift",
1431 "x-side2-image-shift-default",
1432 "x-side2-image-shift-supported",
1433 "y-image-position",
1434 "y-image-position-default",
1435 "y-image-position-supported",
1436 "y-image-shift",
1437 "y-image-shift-default",
1438 "y-image-shift-supported",
1439 "y-side1-image-shift",
1440 "y-side1-image-shift-default",
1441 "y-side1-image-shift-supported",
1442 "y-side2-image-shift",
1443 "y-side2-image-shift-default",
1444 "y-side2-image-shift-supported"
1445 };
1446 static const char * const printer_description[] =
1447 { /* printer-description group */
1448 "auth-info-required", /* CUPS extension */
1449 "charset-configured",
1450 "charset-supported",
1451 "color-supported",
1452 "compression-supported",
1453 "device-service-count",
1454 "device-uri", /* CUPS extension */
1455 "device-uuid",
1456 "document-charset-default",
1457 "document-charset-supported",
1458 "document-creation-attributes-supported",
1459 "document-digital-signature-default",
1460 "document-digital-signature-supported",
1461 "document-format-default",
1462 "document-format-details-default",
1463 "document-format-details-supported",
1464 "document-format-supported",
1465 "document-format-varying-attributes",
1466 "document-format-version-default",
1467 "document-format-version-supported",
1468 "document-natural-language-default",
1469 "document-natural-language-supported",
1470 "document-password-supported",
1471 "generated-natural-language-supported",
1472 "identify-actions-default",
1473 "identify-actions-supported",
1474 "input-source-supported",
1475 "ipp-features-supported",
1476 "ipp-versions-supported",
1477 "ippget-event-life",
1478 "job-authorization-uri-supported", /* CUPS extension */
1479 "job-constraints-supported",
1480 "job-creation-attributes-supported",
1481 "job-finishings-col-ready",
1482 "job-finishings-ready",
1483 "job-ids-supported",
1484 "job-impressions-supported",
1485 "job-k-limit", /* CUPS extension */
1486 "job-k-octets-supported",
1487 "job-media-sheets-supported",
1488 "job-page-limit", /* CUPS extension */
1489 "job-password-encryption-supported",
1490 "job-password-supported",
1491 "job-quota-period", /* CUPS extension */
1492 "job-resolvers-supported",
1493 "job-settable-attributes-supported",
1494 "job-spooling-supported",
c5b24bfa
MS
1495 "jpeg-k-octets-supported", /* CUPS extension */
1496 "jpeg-x-dimension-supported", /* CUPS extension */
1497 "jpeg-y-dimension-supported", /* CUPS extension */
1498 "landscape-orientation-requested-preferred",
1499 /* CUPS extension */
db8b865d
MS
1500 "marker-change-time", /* CUPS extension */
1501 "marker-colors", /* CUPS extension */
1502 "marker-high-levels", /* CUPS extension */
1503 "marker-levels", /* CUPS extension */
1504 "marker-low-levels", /* CUPS extension */
1505 "marker-message", /* CUPS extension */
1506 "marker-names", /* CUPS extension */
1507 "marker-types", /* CUPS extension */
1508 "media-col-ready",
1509 "media-ready",
1510 "member-names", /* CUPS extension */
1511 "member-uris", /* CUPS extension */
1512 "multiple-destination-uris-supported",/* IPP FaxOut */
1513 "multiple-document-jobs-supported",
1514 "multiple-operation-time-out",
1515 "multiple-operation-time-out-action",
1516 "natural-language-configured",
1517 "operations-supported",
1518 "pages-per-minute",
1519 "pages-per-minute-color",
c5b24bfa
MS
1520 "pdf-k-octets-supported", /* CUPS extension */
1521 "pdf-versions-supported", /* CUPS extension */
db8b865d
MS
1522 "pdl-override-supported",
1523 "port-monitor", /* CUPS extension */
1524 "port-monitor-supported", /* CUPS extension */
1525 "preferred-attributes-supported",
1526 "printer-alert",
1527 "printer-alert-description",
1528 "printer-charge-info",
1529 "printer-charge-info-uri",
1530 "printer-commands", /* CUPS extension */
1531 "printer-current-time",
1532 "printer-detailed-status-messages",
1533 "printer-device-id",
1534 "printer-dns-sd-name", /* CUPS extension */
1535 "printer-driver-installer",
1536 "printer-fax-log-uri", /* IPP FaxOut */
1537 "printer-fax-modem-info", /* IPP FaxOut */
1538 "printer-fax-modem-name", /* IPP FaxOut */
1539 "printer-fax-modem-number", /* IPP FaxOut */
1540 "printer-geo-location",
1541 "printer-get-attributes-supported",
1542 "printer-icc-profiles",
1543 "printer-icons",
1544 "printer-info",
1545 "printer-is-accepting-jobs",
6961465f
MS
1546 "printer-is-shared", /* CUPS extension */
1547 "printer-kind", /* IPP Paid Printing */
db8b865d
MS
1548 "printer-location",
1549 "printer-make-and-model",
1550 "printer-mandatory-job-attributes",
1551 "printer-message-date-time",
1552 "printer-message-from-operator",
1553 "printer-message-time",
1554 "printer-more-info",
1555 "printer-more-info-manufacturer",
1556 "printer-name",
6961465f 1557 "printer-native-formats",
db8b865d
MS
1558 "printer-organization",
1559 "printer-organizational-unit",
1560 "printer-settable-attributes-supported",
1561 "printer-state",
1562 "printer-state-change-date-time",
1563 "printer-state-change-time",
1564 "printer-state-message",
1565 "printer-state-reasons",
1566 "printer-supply",
1567 "printer-supply-description",
1568 "printer-supply-info-uri",
1569 "printer-type", /* CUPS extension */
1570 "printer-up-time",
1571 "printer-uri-supported",
1572 "printer-uuid",
1573 "printer-xri-supported",
1574 "pwg-raster-document-resolution-supported",
1575 "pwg-raster-document-sheet-back",
1576 "pwg-raster-document-type-supported",
1577 "queued-job-count",
1578 "reference-uri-schemes-supported",
1579 "repertoire-supported",
1580 "requesting-user-name-allowed", /* CUPS extension */
1581 "requesting-user-name-denied", /* CUPS extension */
1582 "requesting-user-uri-supported",
1583 "subordinate-printers-supported",
6961465f 1584 "urf-supported", /* CUPS extension */
db8b865d
MS
1585 "uri-authentication-supported",
1586 "uri-security-supported",
1587 "user-defined-value-supported",
1588 "which-jobs-supported",
1589 "xri-authentication-supported",
1590 "xri-security-supported",
1591 "xri-uri-scheme-supported"
1592 };
1593 static const char * const subscription_description[] =
1594 { /* subscription-description group */
1595 "notify-job-id",
1596 "notify-lease-expiration-time",
1597 "notify-printer-up-time",
1598 "notify-printer-uri",
1599 "notify-sequence-number",
1600 "notify-subscriber-user-name",
1601 "notify-subscriber-user-uri",
1602 "notify-subscription-id",
1603 "subscriptions-uuid"
1604 };
1605 static const char * const subscription_template[] =
1606 { /* subscription-template group */
1607 "notify-attributes",
1608 "notify-attributes-supported",
1609 "notify-charset",
1610 "notify-events",
1611 "notify-events-default",
1612 "notify-events-supported",
1613 "notify-lease-duration",
1614 "notify-lease-duration-default",
1615 "notify-lease-duration-supported",
1616 "notify-max-events-supported",
1617 "notify-natural-language",
1618 "notify-pull-method",
1619 "notify-pull-method-supported",
1620 "notify-recipient-uri",
1621 "notify-schemes-supported",
1622 "notify-time-interval",
1623 "notify-user-data"
1624 };
1625
1626
1627 /*
1628 * Get the requested-attributes attribute...
1629 */
1630
1631 if ((requested = ippFindAttribute(request, "requested-attributes",
1632 IPP_TAG_KEYWORD)) == NULL)
1633 {
1634 /*
1635 * The Get-Jobs operation defaults to "job-id" and "job-uri", all others
1636 * default to "all"...
1637 */
1638
cb7f98ee 1639 if (ippGetOperation(request) == IPP_OP_GET_JOBS)
db8b865d
MS
1640 {
1641 ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
1642 cupsArrayAdd(ra, "job-id");
1643 cupsArrayAdd(ra, "job-uri");
1644
1645 return (ra);
1646 }
1647 else
1648 return (NULL);
1649 }
1650
1651 /*
1652 * If the attribute contains a single "all" keyword, return NULL...
1653 */
1654
1655 count = ippGetCount(requested);
1656 if (count == 1 && !strcmp(ippGetString(requested, 0, NULL), "all"))
1657 return (NULL);
1658
1659 /*
1660 * Create an array using "strcmp" as the comparison function...
1661 */
1662
1663 ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
1664
1665 for (i = 0; i < count; i ++)
1666 {
1667 added = 0;
1668 value = ippGetString(requested, i, NULL);
1669
1670 if (!strcmp(value, "document-description") || !strcmp(value, "all"))
1671 {
1672 for (j = 0;
1673 j < (int)(sizeof(document_description) /
1674 sizeof(document_description[0]));
1675 j ++)
1676 cupsArrayAdd(ra, (void *)document_description[j]);
1677
1678 added = 1;
1679 }
1680
1681 if (!strcmp(value, "document-template") || !strcmp(value, "all"))
1682 {
1683 for (j = 0;
1684 j < (int)(sizeof(document_template) / sizeof(document_template[0]));
1685 j ++)
1686 cupsArrayAdd(ra, (void *)document_template[j]);
1687
1688 added = 1;
1689 }
1690
1691 if (!strcmp(value, "job-description") || !strcmp(value, "all"))
1692 {
1693 for (j = 0;
1694 j < (int)(sizeof(job_description) / sizeof(job_description[0]));
1695 j ++)
1696 cupsArrayAdd(ra, (void *)job_description[j]);
1697
1698 added = 1;
1699 }
1700
1701 if (!strcmp(value, "job-template") || !strcmp(value, "all"))
1702 {
1703 for (j = 0;
1704 j < (int)(sizeof(job_template) / sizeof(job_template[0]));
1705 j ++)
1706 cupsArrayAdd(ra, (void *)job_template[j]);
1707
1708 added = 1;
1709 }
1710
1711 if (!strcmp(value, "printer-description") || !strcmp(value, "all"))
1712 {
1713 for (j = 0;
1714 j < (int)(sizeof(printer_description) /
1715 sizeof(printer_description[0]));
1716 j ++)
1717 cupsArrayAdd(ra, (void *)printer_description[j]);
1718
1719 added = 1;
1720 }
1721
1722 if (!strcmp(value, "subscription-description") || !strcmp(value, "all"))
1723 {
1724 for (j = 0;
1725 j < (int)(sizeof(subscription_description) /
1726 sizeof(subscription_description[0]));
1727 j ++)
1728 cupsArrayAdd(ra, (void *)subscription_description[j]);
1729
1730 added = 1;
1731 }
1732
1733 if (!strcmp(value, "subscription-template") || !strcmp(value, "all"))
1734 {
1735 for (j = 0;
1736 j < (int)(sizeof(subscription_template) /
1737 sizeof(subscription_template[0]));
1738 j ++)
1739 cupsArrayAdd(ra, (void *)subscription_template[j]);
1740
1741 added = 1;
1742 }
1743
1744 if (!added)
1745 cupsArrayAdd(ra, (void *)value);
1746 }
1747
1748 return (ra);
1749}
1750
1751
a2326b5b
MS
1752/*
1753 * 'ippEnumString()' - Return a string corresponding to the enum value.
1754 */
1755
1756const char * /* O - Enum string */
1757ippEnumString(const char *attrname, /* I - Attribute name */
1758 int enumvalue) /* I - Enum value */
1759{
1760 _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
1761
1762
1763 /*
1764 * Check for standard enum values...
1765 */
1766
1767 if (!strcmp(attrname, "document-state") &&
1768 enumvalue >= 3 &&
0fa6c7fa
MS
1769 enumvalue < (3 + (int)(sizeof(ipp_document_states) /
1770 sizeof(ipp_document_states[0]))))
a2326b5b 1771 return (ipp_document_states[enumvalue - 3]);
a469f8a5
MS
1772 else if (!strcmp(attrname, "finishings") ||
1773 !strcmp(attrname, "finishings-actual") ||
1774 !strcmp(attrname, "finishings-default") ||
1775 !strcmp(attrname, "finishings-ready") ||
6961465f
MS
1776 !strcmp(attrname, "finishings-supported") ||
1777 !strcmp(attrname, "job-finishings") ||
1778 !strcmp(attrname, "job-finishings-default") ||
1779 !strcmp(attrname, "job-finishings-supported"))
a469f8a5
MS
1780 {
1781 if (enumvalue >= 3 &&
0fa6c7fa
MS
1782 enumvalue < (3 + (int)(sizeof(ipp_finishings) /
1783 sizeof(ipp_finishings[0]))))
a469f8a5
MS
1784 return (ipp_finishings[enumvalue - 3]);
1785 else if (enumvalue >= 0x40000000 &&
1786 enumvalue <= (0x40000000 + (int)(sizeof(ipp_finishings_vendor) /
1787 sizeof(ipp_finishings_vendor[0]))))
1788 return (ipp_finishings_vendor[enumvalue - 0x40000000]);
1789 }
a2326b5b
MS
1790 else if ((!strcmp(attrname, "job-collation-type") ||
1791 !strcmp(attrname, "job-collation-type-actual")) &&
1792 enumvalue >= 3 &&
0fa6c7fa
MS
1793 enumvalue < (3 + (int)(sizeof(ipp_job_collation_types) /
1794 sizeof(ipp_job_collation_types[0]))))
a2326b5b
MS
1795 return (ipp_job_collation_types[enumvalue - 3]);
1796 else if (!strcmp(attrname, "job-state") &&
cb7f98ee
MS
1797 enumvalue >= IPP_JSTATE_PENDING && enumvalue <= IPP_JSTATE_COMPLETED)
1798 return (ipp_job_states[enumvalue - IPP_JSTATE_PENDING]);
a2326b5b
MS
1799 else if (!strcmp(attrname, "operations-supported"))
1800 return (ippOpString((ipp_op_t)enumvalue));
1801 else if ((!strcmp(attrname, "orientation-requested") ||
1802 !strcmp(attrname, "orientation-requested-actual") ||
1803 !strcmp(attrname, "orientation-requested-default") ||
1804 !strcmp(attrname, "orientation-requested-supported")) &&
1805 enumvalue >= 3 &&
0fa6c7fa
MS
1806 enumvalue < (3 + (int)(sizeof(ipp_orientation_requesteds) /
1807 sizeof(ipp_orientation_requesteds[0]))))
a2326b5b
MS
1808 return (ipp_orientation_requesteds[enumvalue - 3]);
1809 else if ((!strcmp(attrname, "print-quality") ||
1810 !strcmp(attrname, "print-quality-actual") ||
1811 !strcmp(attrname, "print-quality-default") ||
1812 !strcmp(attrname, "print-quality-supported")) &&
1813 enumvalue >= 3 &&
0fa6c7fa
MS
1814 enumvalue < (3 + (int)(sizeof(ipp_print_qualities) /
1815 sizeof(ipp_print_qualities[0]))))
a2326b5b
MS
1816 return (ipp_print_qualities[enumvalue - 3]);
1817 else if (!strcmp(attrname, "printer-state") &&
cb7f98ee
MS
1818 enumvalue >= IPP_PSTATE_IDLE && enumvalue <= IPP_PSTATE_STOPPED)
1819 return (ipp_printer_states[enumvalue - IPP_PSTATE_IDLE]);
a2326b5b
MS
1820
1821 /*
1822 * Not a standard enum value, just return the decimal equivalent...
1823 */
1824
1825 snprintf(cg->ipp_unknown, sizeof(cg->ipp_unknown), "%d", enumvalue);
1826 return (cg->ipp_unknown);
1827}
1828
1829
1830/*
1831 * 'ippEnumValue()' - Return the value associated with a given enum string.
1832 */
1833
1834int /* O - Enum value or -1 if unknown */
1835ippEnumValue(const char *attrname, /* I - Attribute name */
1836 const char *enumstring) /* I - Enum string */
1837{
1838 int i, /* Looping var */
1839 num_strings; /* Number of strings to compare */
1840 const char * const *strings; /* Strings to compare */
1841
1842
1843 /*
1844 * If the string is just a number, return it...
1845 */
1846
1847 if (isdigit(*enumstring & 255))
1848 return (strtol(enumstring, NULL, 0));
1849
1850 /*
1851 * Otherwise look up the string...
1852 */
1853
1854 if (!strcmp(attrname, "document-state"))
1855 {
1856 num_strings = (int)(sizeof(ipp_document_states) / sizeof(ipp_document_states[0]));
1857 strings = ipp_document_states;
1858 }
1859 else if (!strcmp(attrname, "finishings") ||
1860 !strcmp(attrname, "finishings-actual") ||
1861 !strcmp(attrname, "finishings-default") ||
1862 !strcmp(attrname, "finishings-ready") ||
1863 !strcmp(attrname, "finishings-supported"))
1864 {
a469f8a5
MS
1865 for (i = 0;
1866 i < (int)(sizeof(ipp_finishings_vendor) /
1867 sizeof(ipp_finishings_vendor[0]));
1868 i ++)
1869 if (!strcmp(enumstring, ipp_finishings_vendor[i]))
1870 return (i + 0x40000000);
1871
a2326b5b
MS
1872 num_strings = (int)(sizeof(ipp_finishings) / sizeof(ipp_finishings[0]));
1873 strings = ipp_finishings;
1874 }
1875 else if (!strcmp(attrname, "job-collation-type") ||
1876 !strcmp(attrname, "job-collation-type-actual"))
1877 {
1878 num_strings = (int)(sizeof(ipp_job_collation_types) /
1879 sizeof(ipp_job_collation_types[0]));
1880 strings = ipp_job_collation_types;
1881 }
1882 else if (!strcmp(attrname, "job-state"))
1883 {
1884 num_strings = (int)(sizeof(ipp_job_states) / sizeof(ipp_job_states[0]));
1885 strings = ipp_job_states;
1886 }
1887 else if (!strcmp(attrname, "operations-supported"))
1888 return (ippOpValue(enumstring));
1889 else if (!strcmp(attrname, "orientation-requested") ||
1890 !strcmp(attrname, "orientation-requested-actual") ||
1891 !strcmp(attrname, "orientation-requested-default") ||
1892 !strcmp(attrname, "orientation-requested-supported"))
1893 {
1894 num_strings = (int)(sizeof(ipp_orientation_requesteds) /
1895 sizeof(ipp_orientation_requesteds[0]));
1896 strings = ipp_orientation_requesteds;
1897 }
1898 else if (!strcmp(attrname, "print-quality") ||
1899 !strcmp(attrname, "print-quality-actual") ||
1900 !strcmp(attrname, "print-quality-default") ||
1901 !strcmp(attrname, "print-quality-supported"))
1902 {
1903 num_strings = (int)(sizeof(ipp_print_qualities) / sizeof(ipp_print_qualities[0]));
1904 strings = ipp_print_qualities;
1905 }
1906 else if (!strcmp(attrname, "printer-state"))
1907 {
1908 num_strings = (int)(sizeof(ipp_printer_states) / sizeof(ipp_printer_states[0]));
1909 strings = ipp_printer_states;
1910 }
1911 else
1912 return (-1);
1913
1914 for (i = 0; i < num_strings; i ++)
1915 if (!strcmp(enumstring, strings[i]))
1916 return (i + 3);
1917
1918 return (-1);
1919}
1920
1921
ef416fc2 1922/*
1923 * 'ippErrorString()' - Return a name for the given status code.
1924 */
1925
1926const char * /* O - Text string */
1927ippErrorString(ipp_status_t error) /* I - Error status */
1928{
1929 _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
1930
1931
1932 /*
1933 * See if the error code is a known value...
1934 */
1935
a469f8a5 1936 if (error >= IPP_STATUS_OK && error <= IPP_STATUS_OK_EVENTS_COMPLETE)
ef416fc2 1937 return (ipp_status_oks[error]);
a469f8a5 1938 else if (error == IPP_STATUS_REDIRECTION_OTHER_SITE)
ef416fc2 1939 return ("redirection-other-site");
a469f8a5 1940 else if (error == IPP_STATUS_CUPS_SEE_OTHER)
b94498cf 1941 return ("cups-see-other");
a469f8a5
MS
1942 else if (error >= IPP_STATUS_ERROR_BAD_REQUEST &&
1943 error <= IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE)
1944 return (ipp_status_400s[error - IPP_STATUS_ERROR_BAD_REQUEST]);
1945 else if (error >= 0x480 &&
1946 error <= IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED)
1947 return (ipp_status_480s[error - 0x0480]);
1948 else if (error >= IPP_STATUS_ERROR_INTERNAL &&
1949 error <= IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS)
1950 return (ipp_status_500s[error - IPP_STATUS_ERROR_INTERNAL]);
1951 else if (error >= IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED &&
1952 error <= IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED)
1953 return (ipp_status_1000s[error -
1954 IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED]);
ef416fc2 1955
1956 /*
d7225fc2 1957 * No, build an "0xxxxx" error string...
ef416fc2 1958 */
1959
d7225fc2 1960 sprintf(cg->ipp_unknown, "0x%04x", error);
ef416fc2 1961
1962 return (cg->ipp_unknown);
1963}
1964
1965
1966/*
1967 * 'ippErrorValue()' - Return a status code for the given name.
1968 *
f3c17241 1969 * @since CUPS 1.2/OS X 10.5@
ef416fc2 1970 */
1971
1972ipp_status_t /* O - IPP status code */
1973ippErrorValue(const char *name) /* I - Name */
1974{
1975 int i;
1976
1977
1978 for (i = 0; i < (sizeof(ipp_status_oks) / sizeof(ipp_status_oks[0])); i ++)
88f9aafc 1979 if (!_cups_strcasecmp(name, ipp_status_oks[i]))
ef416fc2 1980 return ((ipp_status_t)i);
1981
88f9aafc 1982 if (!_cups_strcasecmp(name, "redirection-other-site"))
a469f8a5 1983 return (IPP_STATUS_REDIRECTION_OTHER_SITE);
ef416fc2 1984
88f9aafc 1985 if (!_cups_strcasecmp(name, "cups-see-other"))
a469f8a5 1986 return (IPP_STATUS_CUPS_SEE_OTHER);
b94498cf 1987
ef416fc2 1988 for (i = 0; i < (sizeof(ipp_status_400s) / sizeof(ipp_status_400s[0])); i ++)
88f9aafc 1989 if (!_cups_strcasecmp(name, ipp_status_400s[i]))
ef416fc2 1990 return ((ipp_status_t)(i + 0x400));
1991
a469f8a5
MS
1992 for (i = 0; i < (sizeof(ipp_status_480s) / sizeof(ipp_status_480s[0])); i ++)
1993 if (!_cups_strcasecmp(name, ipp_status_480s[i]))
1994 return ((ipp_status_t)(i + 0x480));
1995
ef416fc2 1996 for (i = 0; i < (sizeof(ipp_status_500s) / sizeof(ipp_status_500s[0])); i ++)
88f9aafc 1997 if (!_cups_strcasecmp(name, ipp_status_500s[i]))
ef416fc2 1998 return ((ipp_status_t)(i + 0x500));
1999
7cf5915e 2000 for (i = 0; i < (sizeof(ipp_status_1000s) / sizeof(ipp_status_1000s[0])); i ++)
88f9aafc 2001 if (!_cups_strcasecmp(name, ipp_status_1000s[i]))
7cf5915e
MS
2002 return ((ipp_status_t)(i + 0x1000));
2003
ef416fc2 2004 return ((ipp_status_t)-1);
2005}
2006
2007
2008/*
2009 * 'ippOpString()' - Return a name for the given operation id.
2010 *
f3c17241 2011 * @since CUPS 1.2/OS X 10.5@
ef416fc2 2012 */
2013
2014const char * /* O - Name */
2015ippOpString(ipp_op_t op) /* I - Operation ID */
2016{
2017 _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
2018
2019
2020 /*
2021 * See if the operation ID is a known value...
2022 */
2023
db8b865d 2024 if (op >= IPP_OP_PRINT_JOB && op <= IPP_OP_VALIDATE_DOCUMENT)
ef416fc2 2025 return (ipp_std_ops[op]);
a469f8a5 2026 else if (op == IPP_OP_PRIVATE)
ef416fc2 2027 return ("windows-ext");
a469f8a5 2028 else if (op >= IPP_OP_CUPS_GET_DEFAULT && op <= IPP_OP_CUPS_GET_PPD)
cb7f98ee 2029 return (ipp_cups_ops[op - IPP_OP_CUPS_GET_DEFAULT]);
a469f8a5 2030 else if (op == IPP_OP_CUPS_GET_DOCUMENT)
2e4ff8af 2031 return (ipp_cups_ops2[0]);
ef416fc2 2032
2033 /*
d7225fc2 2034 * No, build an "0xxxxx" operation string...
ef416fc2 2035 */
2036
9b66acc5 2037 sprintf(cg->ipp_unknown, "0x%04x", op);
ef416fc2 2038
2039 return (cg->ipp_unknown);
2040}
2041
2042
2043/*
2044 * 'ippOpValue()' - Return an operation id for the given name.
2045 *
f3c17241 2046 * @since CUPS 1.2/OS X 10.5@
ef416fc2 2047 */
2048
2049ipp_op_t /* O - Operation ID */
2050ippOpValue(const char *name) /* I - Textual name */
2051{
2052 int i;
2053
2054
9b66acc5
MS
2055 if (!strncmp(name, "0x", 2))
2056 return ((ipp_op_t)strtol(name + 2, NULL, 16));
2057
ef416fc2 2058 for (i = 0; i < (sizeof(ipp_std_ops) / sizeof(ipp_std_ops[0])); i ++)
88f9aafc 2059 if (!_cups_strcasecmp(name, ipp_std_ops[i]))
ef416fc2 2060 return ((ipp_op_t)i);
2061
88f9aafc 2062 if (!_cups_strcasecmp(name, "windows-ext"))
a469f8a5 2063 return (IPP_OP_PRIVATE);
ef416fc2 2064
2065 for (i = 0; i < (sizeof(ipp_cups_ops) / sizeof(ipp_cups_ops[0])); i ++)
88f9aafc 2066 if (!_cups_strcasecmp(name, ipp_cups_ops[i]))
ef416fc2 2067 return ((ipp_op_t)(i + 0x4001));
2068
2e4ff8af 2069 for (i = 0; i < (sizeof(ipp_cups_ops2) / sizeof(ipp_cups_ops2[0])); i ++)
88f9aafc 2070 if (!_cups_strcasecmp(name, ipp_cups_ops2[i]))
2e4ff8af
MS
2071 return ((ipp_op_t)(i + 0x4027));
2072
88f9aafc 2073 if (!_cups_strcasecmp(name, "CUPS-Add-Class"))
a469f8a5 2074 return (IPP_OP_CUPS_ADD_MODIFY_CLASS);
480ef0fe 2075
88f9aafc 2076 if (!_cups_strcasecmp(name, "CUPS-Add-Printer"))
a469f8a5 2077 return (IPP_OP_CUPS_ADD_MODIFY_PRINTER);
480ef0fe 2078
a469f8a5 2079 return (IPP_OP_CUPS_INVALID);
ef416fc2 2080}
2081
2082
2083/*
2084 * 'ippPort()' - Return the default IPP port number.
2085 */
2086
2087int /* O - Port number */
2088ippPort(void)
2089{
ef416fc2 2090 _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
2091
2092
d09495fa 2093 DEBUG_puts("ippPort()");
2094
2095 if (!cg->ipp_port)
e07d4801 2096 _cupsSetDefaults();
d09495fa 2097
e07d4801 2098 DEBUG_printf(("1ippPort: Returning %d...", cg->ipp_port));
d09495fa 2099
ef416fc2 2100 return (cg->ipp_port);
2101}
2102
2103
2104/*
2105 * 'ippSetPort()' - Set the default port number.
2106 */
2107
2108void
2109ippSetPort(int p) /* I - Port number to use */
2110{
e07d4801 2111 DEBUG_printf(("ippSetPort(p=%d)", p));
d09495fa 2112
ef416fc2 2113 _cupsGlobals()->ipp_port = p;
2114}
2115
2116
d21dc0ed
MS
2117/*
2118 * 'ippStateString()' - Return the name corresponding to a state value.
2119 *
2120 * @since CUPS 2.0@
2121 */
2122
2123const char * /* O - State name */
2124ippStateString(ipp_state_t state) /* I - State value */
2125{
2126 if (state >= IPP_STATE_ERROR && state <= IPP_STATE_DATA)
2127 return (ipp_states[state - IPP_STATE_ERROR]);
2128 else
2129 return ("UNKNOWN");
2130}
2131
2132
ef416fc2 2133/*
1ff0402e
MS
2134 * 'ippTagString()' - Return the tag name corresponding to a tag value.
2135 *
2136 * The returned names are defined in RFC 2911 and 3382.
2137 *
f3c17241 2138 * @since CUPS 1.4/OS X 10.6@
1ff0402e
MS
2139 */
2140
2141const char * /* O - Tag name */
2142ippTagString(ipp_tag_t tag) /* I - Tag value */
2143{
cb7f98ee 2144 tag &= IPP_TAG_CUPS_MASK;
ed6e7faf 2145
1ff0402e
MS
2146 if (tag < (ipp_tag_t)(sizeof(ipp_tag_names) / sizeof(ipp_tag_names[0])))
2147 return (ipp_tag_names[tag]);
2148 else
2149 return ("UNKNOWN");
2150}
2151
2152
2153/*
2154 * 'ippTagValue()' - Return the tag value corresponding to a tag name.
2155 *
2156 * The tag names are defined in RFC 2911 and 3382.
2157 *
f3c17241 2158 * @since CUPS 1.4/OS X 10.6@
1ff0402e
MS
2159 */
2160
2161ipp_tag_t /* O - Tag value */
2162ippTagValue(const char *name) /* I - Tag name */
2163{
2164 int i; /* Looping var */
2165
2166
2167 for (i = 0; i < (sizeof(ipp_tag_names) / sizeof(ipp_tag_names[0])); i ++)
88f9aafc 2168 if (!_cups_strcasecmp(name, ipp_tag_names[i]))
1ff0402e
MS
2169 return ((ipp_tag_t)i);
2170
88f9aafc 2171 if (!_cups_strcasecmp(name, "operation"))
1ff0402e 2172 return (IPP_TAG_OPERATION);
88f9aafc 2173 else if (!_cups_strcasecmp(name, "job"))
1ff0402e 2174 return (IPP_TAG_JOB);
88f9aafc 2175 else if (!_cups_strcasecmp(name, "printer"))
1ff0402e 2176 return (IPP_TAG_PRINTER);
88f9aafc 2177 else if (!_cups_strcasecmp(name, "unsupported"))
5a6b583a 2178 return (IPP_TAG_UNSUPPORTED_GROUP);
88f9aafc 2179 else if (!_cups_strcasecmp(name, "subscription"))
1ff0402e 2180 return (IPP_TAG_SUBSCRIPTION);
88f9aafc 2181 else if (!_cups_strcasecmp(name, "event"))
5a6b583a 2182 return (IPP_TAG_EVENT_NOTIFICATION);
88f9aafc 2183 else if (!_cups_strcasecmp(name, "language"))
1ff0402e 2184 return (IPP_TAG_LANGUAGE);
88f9aafc 2185 else if (!_cups_strcasecmp(name, "mimetype"))
1ff0402e 2186 return (IPP_TAG_MIMETYPE);
88f9aafc 2187 else if (!_cups_strcasecmp(name, "name"))
1ff0402e 2188 return (IPP_TAG_NAME);
88f9aafc 2189 else if (!_cups_strcasecmp(name, "text"))
1ff0402e 2190 return (IPP_TAG_TEXT);
88f9aafc 2191 else if (!_cups_strcasecmp(name, "begCollection"))
5a6b583a 2192 return (IPP_TAG_BEGIN_COLLECTION);
1ff0402e
MS
2193 else
2194 return (IPP_TAG_ZERO);
2195}
2196
2197
2198/*
1106b00e
MS
2199 * 'ipp_col_string()' - Convert a collection to a string.
2200 */
2201
2202static size_t /* O - Number of bytes */
2203ipp_col_string(ipp_t *col, /* I - Collection attribute */
2204 char *buffer, /* I - Buffer or NULL */
2205 size_t bufsize) /* I - Size of buffer */
2206{
2207 char *bufptr, /* Position in buffer */
2208 *bufend, /* End of buffer */
9c80ffa2 2209 prefix = '{', /* Prefix character */
1106b00e
MS
2210 temp[256]; /* Temporary string */
2211 ipp_attribute_t *attr; /* Current member attribute */
2212
2213
2214 bufptr = buffer;
2215 bufend = buffer + bufsize - 1;
2216
1106b00e
MS
2217 for (attr = col->attrs; attr; attr = attr->next)
2218 {
2219 if (!attr->name)
2220 continue;
2221
9c80ffa2
MS
2222 if (buffer && bufptr < bufend)
2223 *bufptr = prefix;
2224 bufptr ++;
2225 prefix = ' ';
2226
1106b00e
MS
2227 if (buffer && bufptr < bufend)
2228 bufptr += snprintf(bufptr, bufend - bufptr + 1, "%s=", attr->name);
2229 else
2230 bufptr += strlen(attr->name) + 1;
2231
2232 if (buffer && bufptr < bufend)
a2326b5b 2233 bufptr += ippAttributeString(attr, bufptr, bufend - bufptr + 1);
1106b00e 2234 else
a2326b5b 2235 bufptr += ippAttributeString(attr, temp, sizeof(temp));
1106b00e
MS
2236 }
2237
9c80ffa2
MS
2238 if (prefix == '{')
2239 {
2240 if (buffer && bufptr < bufend)
2241 *bufptr = prefix;
2242 bufptr ++;
2243 }
2244
1106b00e
MS
2245 if (buffer && bufptr < bufend)
2246 *bufptr = '}';
2247 bufptr ++;
2248
2249 return (bufptr - buffer);
2250}
2251
2252
2253/*
f2d18633 2254 * End of "$Id$".
ef416fc2 2255 */