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