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