From 6c019649f4fe60c55f009906cf687402cbe3d2b6 Mon Sep 17 00:00:00 2001
From: msweet
marker-types
, printer-alert
, and
printer-alert-description
printer attributes. Standard
marker-types
values are listed in Table
- 1.
+ 1. String values need special handling - see Reporting Attribute String Values below.
When reporting string values using "ATTR:" messages, a filter or backend must take special care to appropriately quote those values. The scheduler uses the CUPS option parsing code for attributes, so the general syntax is:
+ ++name=simple +name=simple,simple,... +name='complex value' +name="complex value" +name='"complex value"','"complex value"',... ++ +
Simple values are strings that do not contain spaces, quotes, backslashes, or the comma and can be placed verbatim in the "ATTR:" message, for example:
+ ++int levels[4] = { 40, 50, 60, 70 }; /* CMYK */ + +fputs("ATTR: marker-colors=#00FFFF,#FF00FF,#FFFF00,#000000\n", stderr); +fputs("ATTR: marker-high-levels=100,100,100,100\n", stderr); +fprintf(stderr, "ATTR: marker-levels=%d,%d,%d,%d\n", levels[0], levels[1], + levels[2], levels[3], levels[4]); +fputs("ATTR: marker-low-levels=5,5,5,5\n", stderr); +fputs("ATTR: marker-types=toner,toner,toner,toner\n", stderr); ++ +
Complex values that contains spaces, quotes, backslashes, or the comma must be quoted. For a single value a single set of quotes is sufficient:
+ ++fputs("ATTR: marker-message='Levels shown are approximate.'\n", stderr); ++ +
When multiple values are reported, each value must be enclosed by a set of single and double quotes:
+ ++fputs("ATTR: marker-names='\"Cyan Toner\"','\"Magenta Toner\"'," + "'\"Yellow Toner\"','\"Black Toner\"'\n", stderr); ++ +
The IPP backend includes a quote_string function that may be used to properly quote a complex value in an "ATTR:" message:
+ ++static const char * /* O - Quoted string */ +quote_string(const char *s, /* I - String */ + char *q, /* I - Quoted string buffer */ + size_t qsize) /* I - Size of quoted string buffer */ +{ + char *qptr, /* Pointer into string buffer */ + *qend; /* End of string buffer */ + + + qptr = q; + qend = q + qsize - 5; + + if (qend < q) + { + *q = '\0'; + return (q); + } + + *qptr++ = '\''; + *qptr++ = '\"'; + + while (*s && qptr < qend) + { + if (*s == '\\' || *s == '\"' || *s == '\'') + { + if (qptr < (qend - 4)) + { + *qptr++ = '\\'; + *qptr++ = '\\'; + *qptr++ = '\\'; + } + else + break; + } + + *qptr++ = *s++; + } + + *qptr++ = '\"'; + *qptr++ = '\''; + *qptr = '\0'; + + return (q); +} ++ +
Filters are responsible for managing the state keywords they set using diff --git a/doc/help/api-filter.html b/doc/help/api-filter.html index 5428058792..566bc149df 100644 --- a/doc/help/api-filter.html +++ b/doc/help/api-filter.html @@ -345,7 +345,7 @@ div.contents ul.subcontents li { Filter and backend programming header for CUPS. - Copyright 2008-2011 by Apple Inc. + Copyright 2008-2014 by Apple Inc. These coded instructions, statements, and computer programs are the property of Apple Inc. and are protected by Federal copyright @@ -664,7 +664,7 @@ prefix strings:
marker-types
, printer-alert
, and
printer-alert-description
printer attributes. Standard
marker-types
values are listed in Table
- 1.When reporting string values using "ATTR:" messages, a filter or backend must take special care to appropriately quote those values. The scheduler uses the CUPS option parsing code for attributes, so the general syntax is:
+ ++name=simple +name=simple,simple,... +name='complex value' +name="complex value" +name='"complex value"','"complex value"',... ++ +
Simple values are strings that do not contain spaces, quotes, backslashes, or the comma and can be placed verbatim in the "ATTR:" message, for example:
+ ++int levels[4] = { 40, 50, 60, 70 }; /* CMYK */ + +fputs("ATTR: marker-colors=#00FFFF,#FF00FF,#FFFF00,#000000\n", stderr); +fputs("ATTR: marker-high-levels=100,100,100,100\n", stderr); +fprintf(stderr, "ATTR: marker-levels=%d,%d,%d,%d\n", levels[0], levels[1], + levels[2], levels[3], levels[4]); +fputs("ATTR: marker-low-levels=5,5,5,5\n", stderr); +fputs("ATTR: marker-types=toner,toner,toner,toner\n", stderr); ++ +
Complex values that contains spaces, quotes, backslashes, or the comma must be quoted. For a single value a single set of quotes is sufficient:
+ ++fputs("ATTR: marker-message='Levels shown are approximate.'\n", stderr); ++ +
When multiple values are reported, each value must be enclosed by a set of single and double quotes:
+ ++fputs("ATTR: marker-names='\"Cyan Toner\"','\"Magenta Toner\"'," + "'\"Yellow Toner\"','\"Black Toner\"'\n", stderr); ++ +
The IPP backend includes a quote_string function that may be used to properly quote a complex value in an "ATTR:" message:
+ ++static const char * /* O - Quoted string */ +quote_string(const char *s, /* I - String */ + char *q, /* I - Quoted string buffer */ + size_t qsize) /* I - Size of quoted string buffer */ +{ + char *qptr, /* Pointer into string buffer */ + *qend; /* End of string buffer */ + + + qptr = q; + qend = q + qsize - 5; + + if (qend < q) + { + *q = '\0'; + return (q); + } + + *qptr++ = '\''; + *qptr++ = '\"'; + + while (*s && qptr < qend) + { + if (*s == '\\' || *s == '\"' || *s == '\'') + { + if (qptr < (qend - 4)) + { + *qptr++ = '\\'; + *qptr++ = '\\'; + *qptr++ = '\\'; + } + else + break; + } + + *qptr++ = *s++; + } + + *qptr++ = '\"'; + *qptr++ = '\''; + *qptr = '\0'; + + return (q); +} ++ +
Filters are responsible for managing the state keywords they set using diff --git a/doc/help/api-httpipp.html b/doc/help/api-httpipp.html index f6f117b56b..9023f0e980 100644 --- a/doc/help/api-httpipp.html +++ b/doc/help/api-httpipp.html @@ -5986,10 +5986,10 @@ are server-oriented...