From 4f63d6cdafa4052f52fa15e8fc97650c558d45b4 Mon Sep 17 00:00:00 2001
From: Michael Sweet
Date: Tue, 28 Nov 2017 12:59:45 -0500
Subject: [PATCH] Add support for finishings-col (Issue #5180)
- cups/ppd-cache.c: Look for cupsFinishingTemplate option,
finishings-col-database attribute. Add finishings-col with
finishing-template.
- cups/ppd-private.h: Add array of finishing-template names.
- scheduler/printers.c: Add finishings-col-database.
---
CHANGES.md | 3 +-
cups/ppd-cache.c | 63 +++++++++++++++++++----
cups/ppd-private.h | 1 +
doc/help/cupspm.epub | Bin 219681 -> 220297 bytes
doc/help/cupspm.html | 29 +++++++++++
doc/help/spec-ppd.html | 73 +++++++++++++++++++++++++++
filter/spec-ppd.shtml | 72 ++++++++++++++++++++++++++
scheduler/printers.c | 31 ++++++++----
xcode/CUPS.xcodeproj/project.pbxproj | 2 +-
9 files changed, 251 insertions(+), 23 deletions(-)
diff --git a/CHANGES.md b/CHANGES.md
index 0b370e110..a7a90062c 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,4 +1,4 @@
-CHANGES - 2.3b1 - 2017-11-27
+CHANGES - 2.3b1 - 2017-11-28
============================
@@ -41,4 +41,5 @@ Changes in CUPS v2.3b1
when available (Issue #5168)
- The cups-driverd program incorrectly stopped scanning PPDs as soon as a loop
was seen (Issue #5170)
+- IPP Everywhere PPDs now support finishing templates (Issue #5180)
diff --git a/cups/ppd-cache.c b/cups/ppd-cache.c
index 925028790..042ba73cc 100644
--- a/cups/ppd-cache.c
+++ b/cups/ppd-cache.c
@@ -69,7 +69,8 @@ _cupsConvertOptions(
*media_type, /* media-type value */
*collate_str, /* multiple-document-handling value */
*color_attr_name, /* Supported color attribute */
- *mandatory; /* Mandatory attributes */
+ *mandatory, /* Mandatory attributes */
+ *finishing_template; /* Finishing template */
int num_finishings = 0, /* Number of finishing values */
finishings[10]; /* Finishing enum values */
ppd_choice_t *choice; /* Marked choice */
@@ -136,6 +137,8 @@ _cupsConvertOptions(
if (strcmp(mandatory, "copies") &&
strcmp(mandatory, "destination-uris") &&
strcmp(mandatory, "finishings") &&
+ strcmp(mandatory, "finishings-col") &&
+ strcmp(mandatory, "finishing-template") &&
strcmp(mandatory, "job-account-id") &&
strcmp(mandatory, "job-accounting-user-id") &&
strcmp(mandatory, "job-password") &&
@@ -358,10 +361,16 @@ _cupsConvertOptions(
* Map finishing options...
*/
- num_finishings = _ppdCacheGetFinishingValues(pc, num_options, options, (int)(sizeof(finishings) / sizeof(finishings[0])), finishings);
- if (num_finishings > 0)
+ if ((finishing_template = cupsGetOption("cupsFinishingTemplate", num_options, options)) == NULL)
+ finishing_template = cupsGetOption("finishing-template", num_options, options);
+
+ if (finishing_template)
{
- ippAddIntegers(request, IPP_TAG_JOB, IPP_TAG_ENUM, "finishings", num_finishings, finishings);
+ ipp_t *fin_col = ippNew(); /* finishings-col value */
+
+ ippAddString(fin_col, IPP_TAG_JOB, IPP_TAG_KEYWORD, "finishing-template", NULL, finishing_template);
+ ippAddCollection(request, IPP_TAG_JOB, "finishings-col", fin_col);
+ ippDelete(fin_col);
if (copies != finishings_copies && (keyword = cupsGetOption("job-impressions", num_options, options)) != NULL)
{
@@ -372,6 +381,23 @@ _cupsConvertOptions(
ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-pages-per-set", atoi(keyword) / finishings_copies);
}
}
+ else
+ {
+ num_finishings = _ppdCacheGetFinishingValues(pc, num_options, options, (int)(sizeof(finishings) / sizeof(finishings[0])), finishings);
+ if (num_finishings > 0)
+ {
+ ippAddIntegers(request, IPP_TAG_JOB, IPP_TAG_ENUM, "finishings", num_finishings, finishings);
+
+ if (copies != finishings_copies && (keyword = cupsGetOption("job-impressions", num_options, options)) != NULL)
+ {
+ /*
+ * Send job-pages-per-set attribute to apply finishings correctly...
+ */
+
+ ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-pages-per-set", atoi(keyword) / finishings_copies);
+ }
+ }
+ }
return (copies);
}
@@ -863,6 +889,13 @@ _ppdCacheCreateWithFile(
cupsArrayAdd(pc->finishings, finishings);
}
+ else if (!_cups_strcasecmp(line, "FinishingTemplate"))
+ {
+ if (!pc->templates)
+ pc->templates = cupsArrayNew3((cups_array_func_t)strcmp, NULL, NULL, 0, (cups_acopy_func_t)_cupsStrAlloc, (cups_afree_func_t)_cupsStrFree);
+
+ cupsArrayAdd(pc->templates, value);
+ }
else if (!_cups_strcasecmp(line, "MaxCopies"))
pc->max_copies = atoi(value);
else if (!_cups_strcasecmp(line, "ChargeInfoURI"))
@@ -958,7 +991,8 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
*media_type, /* MediaType option */
*output_bin, /* OutputBin option */
*color_model, /* ColorModel option */
- *duplex; /* Duplex option */
+ *duplex, /* Duplex option */
+ *ppd_option; /* Other PPD option */
ppd_choice_t *choice; /* Current InputSlot/MediaType */
pwg_map_t *map; /* Current source/type map */
ppd_attr_t *ppd_attr; /* Current PPD preset attribute */
@@ -1695,8 +1729,6 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
* No IPP mapping data, try to map common/standard PPD keywords...
*/
- ppd_option_t *ppd_option; /* PPD option */
-
pc->finishings = cupsArrayNew3((cups_array_func_t)pwg_compare_finishings, NULL, NULL, 0, NULL, (cups_afree_func_t)pwg_free_finishings);
if ((ppd_option = ppdFindOption(ppd, "StapleLocation")) != NULL)
@@ -1798,6 +1830,14 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
}
}
+ if ((ppd_option = ppdFindOption(ppd, "cupsFinishingTemplate")) != NULL)
+ {
+ pc->templates = cupsArrayNew3((cups_array_func_t)strcmp, NULL, NULL, 0, (cups_acopy_func_t)_cupsStrAlloc, (cups_afree_func_t)_cupsStrFree);
+
+ for (choice = ppd_option->choices, i = ppd_option->num_choices; i > 0; choice ++, i --)
+ cupsArrayAdd(pc->templates, (void *)choice->choice);
+ }
+
/*
* Max copies...
*/
@@ -2730,7 +2770,7 @@ _ppdCacheWriteFile(
pwg_map_t *map; /* Current map */
_pwg_finishings_t *f; /* Current finishing option */
cups_option_t *option; /* Current option */
- const char *value; /* Filter/pre-filter value */
+ const char *value; /* String value */
char newfile[1024]; /* New filename */
@@ -2878,6 +2918,9 @@ _ppdCacheWriteFile(
cupsFilePutChar(fp, '\n');
}
+ for (value = (const char *)cupsArrayFirst(pc->templates); value; value = (const char *)cupsArrayNext(pc->templates))
+ cupsFilePutConf(fp, "FinishingTemplate", value);
+
/*
* Max copies...
*/
@@ -4036,8 +4079,8 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */
cupsFilePrintf(fp, "*OpenUI *cupsFinishingTemplate/%s: PickOne\n", _cupsLangString(lang, _("Finishing Preset")));
cupsFilePuts(fp, "*OrderDependency: 10 AnySetup *cupsFinishingTemplate\n");
- cupsFilePuts(fp, "*DefaultcupsFinishingTemplate: None\n");
- cupsFilePrintf(fp, "*cupsFinishingTemplate None/%s: \"\"\n", _cupsLangString(lang, _("None")));
+ cupsFilePuts(fp, "*DefaultcupsFinishingTemplate: none\n");
+ cupsFilePrintf(fp, "*cupsFinishingTemplate none/%s: \"\"\n", _cupsLangString(lang, _("None")));
templates = cupsArrayNew((cups_array_func_t)strcmp, NULL);
count = ippGetCount(attr);
diff --git a/cups/ppd-private.h b/cups/ppd-private.h
index e7c0d6e5f..6cd168327 100644
--- a/cups/ppd-private.h
+++ b/cups/ppd-private.h
@@ -139,6 +139,7 @@ struct _ppd_cache_s /**** PPD cache and PWG conversion data ****/
*prefilters; /* cupsPreFilter values */
int single_file; /* cupsSingleFile value */
cups_array_t *finishings; /* cupsIPPFinishings values */
+ cups_array_t *templates; /* cupsFinishingTemplate values */
int max_copies, /* cupsMaxCopies value */
account_id, /* cupsJobAccountId value */
accounting_user_id; /* cupsJobAccountingUserId value */
diff --git a/doc/help/cupspm.epub b/doc/help/cupspm.epub
index 331d9be1d76624b394eef68d80159dfad0a1baf4..e857f988bcde430145c2e99828156d559babe646 100644
GIT binary patch
delta 17066
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
delta 16563
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
a-0bcC*8;p**+42dfbb4bnSKP&Rt5l*(iCL?
diff --git a/doc/help/cupspm.html b/doc/help/cupspm.html
index ba52cad6a..b07dadb00 100644
--- a/doc/help/cupspm.html
+++ b/doc/help/cupspm.html
@@ -6291,15 +6291,21 @@ are server-oriented...
IPP operations
Constants
+ IPP_OP_ALLOCATE_PRINTER_RESOURCES | Allocate-Printer-Resources: Use resources for a printer. |
IPP_OP_CANCEL_CURRENT_JOB | Cancel-Current-Job: Cancel the current job |
IPP_OP_CANCEL_JOB | Cancel-Job: Cancel a job |
IPP_OP_CANCEL_JOBS | Cancel-Jobs: Cancel all jobs (administrative) |
IPP_OP_CANCEL_MY_JOBS | Cancel-My-Jobs: Cancel a user's jobs |
+ IPP_OP_CANCEL_RESOURCE | Cancel-Resource: Uninstall a resource. |
IPP_OP_CANCEL_SUBSCRIPTION CUPS 1.2/macOS 10.5 | Cancel-Subscription: Cancel a subscription |
IPP_OP_CLOSE_JOB | Close-Job: Close a job and start printing |
IPP_OP_CREATE_JOB | Create-Job: Create an empty print job |
IPP_OP_CREATE_JOB_SUBSCRIPTIONS CUPS 1.2/macOS 10.5 | Create-Job-Subscriptions: Create one of more job subscriptions |
+ IPP_OP_CREATE_PRINTER | Create-Printer: Create a new service. |
IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS CUPS 1.2/macOS 10.5 | Create-Printer-Subscriptions: Create one or more printer subscriptions |
+ IPP_OP_CREATE_RESOURCE | Create-Resource: Create a new (empty) resource. |
+ IPP_OP_CREATE_RESOURCE_SUBSCRIPTIONS | Create-Resource-Subscriptions: Create event subscriptions for a resource. |
+ IPP_OP_CREATE_SYSTEM_SUBSCRIPTIONS | Create-System-Subscriptions: Create event subscriptions for a system. |
IPP_OP_CUPS_ADD_MODIFY_CLASS | CUPS-Add-Modify-Class: Add or modify a class |
IPP_OP_CUPS_ADD_MODIFY_PRINTER | CUPS-Add-Modify-Printer: Add or modify a printer |
IPP_OP_CUPS_AUTHENTICATE_JOB CUPS 1.2/macOS 10.5 | CUPS-Authenticate-Job: Authenticate a job |
@@ -6315,32 +6321,52 @@ are server-oriented...
IPP_OP_CUPS_INVALID | Invalid operation name for ippOpValue |
IPP_OP_CUPS_MOVE_JOB | CUPS-Move-Job: Move a job to a different printer |
IPP_OP_CUPS_SET_DEFAULT | CUPS-Set-Default: Set the default printer |
+ IPP_OP_DEALLOCATE_PRINTER_RESOURCES | Deallocate-Printer-Resources: Stop using resources for a printer. |
+ IPP_OP_DELETE_PRINTER | Delete-Printer: Delete an existing service. |
+ IPP_OP_DISABLE_ALL_PRINTERS | Disable-All-Printers: Stop accepting new jobs on all services. |
IPP_OP_DISABLE_PRINTER | Disable-Printer: Reject new jobs for a printer |
+ IPP_OP_ENABLE_ALL_PRINTERS | Enable-All-Printers: Start accepting new jobs on all services. |
IPP_OP_ENABLE_PRINTER | Enable-Printer: Accept new jobs for a printer |
IPP_OP_GET_JOBS | Get-Jobs: Get a list of jobs |
IPP_OP_GET_JOB_ATTRIBUTES | Get-Job-Attribute: Get information about a job |
IPP_OP_GET_NOTIFICATIONS CUPS 1.2/macOS 10.5 | Get-Notifications: Get notification events |
+ IPP_OP_GET_PRINTERS | Get-Printers: Get a list of services. |
IPP_OP_GET_PRINTER_ATTRIBUTES | Get-Printer-Attributes: Get information about a printer |
IPP_OP_GET_PRINTER_SUPPORTED_VALUES | Get-Printer-Supported-Values: Get supported values |
IPP_OP_GET_SUBSCRIPTIONS CUPS 1.2/macOS 10.5 | Get-Subscriptions: Get list of subscriptions |
IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES CUPS 1.2/macOS 10.5 | Get-Subscription-Attributes: Get subscription information |
+ IPP_OP_GET_SYSTEM_ATTRIBUTES | Get-System-Attributes: Get system object attributes. |
+ IPP_OP_GET_SYSTEM_SUPPORTED_VALUES | Get-System-Supported-Values: Get supported values for system object attributes. |
IPP_OP_HOLD_JOB | Hold-Job: Hold a job for printing |
IPP_OP_HOLD_NEW_JOBS | Hold-New-Jobs: Hold new jobs |
IPP_OP_IDENTIFY_PRINTER | Identify-Printer: Make the printer beep, flash, or display a message for identification |
+ IPP_OP_INSTALL_RESOURCE | Install-Resource: Install a resource. |
+ IPP_OP_PAUSE_ALL_PRINTERS | Pause-All-Printers: Stop all services immediately. |
+ IPP_OP_PAUSE_ALL_PRINTERS_AFTER_CURRENT_JOB | Pause-All-Printers-After-Current-Job: Stop all services after processing the current jobs. |
IPP_OP_PAUSE_PRINTER | Pause-Printer: Stop a printer |
IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB | Pause-Printer-After-Current-Job: Stop printer after the current job |
IPP_OP_PRINT_JOB | Print-Job: Print a single file |
IPP_OP_PROMOTE_JOB | Promote-Job: Promote a job to print sooner |
+ IPP_OP_REGISTER_OUTPUT_DEVICE | Register-Output-Device: Register a remote service. |
IPP_OP_RELEASE_HELD_NEW_JOBS | Release-Held-New-Jobs: Release new jobs that were previously held |
IPP_OP_RELEASE_JOB | Release-Job: Release a job for printing |
IPP_OP_RENEW_SUBSCRIPTION CUPS 1.2/macOS 10.5 | Renew-Subscription: Renew a printer subscription |
IPP_OP_RESTART_JOB DEPRECATED | Restart-Job: Reprint a job |
+ IPP_OP_RESTART_SYSTEM | Restart-System: Restart all services. |
+ IPP_OP_RESUME_ALL_PRINTERS | Resume-All-Printers: Start job processing on all services. |
IPP_OP_RESUME_JOB | Resume-Job: Resume the current job |
IPP_OP_RESUME_PRINTER | Resume-Printer: Start a printer |
IPP_OP_SCHEDULE_JOB_AFTER | Schedule-Job-After: Schedule a job to print after another |
IPP_OP_SEND_DOCUMENT | Send-Document: Add a file to a job |
+ IPP_OP_SEND_RESOURCE_DATA | Send-Resource-Data: Upload the data for a resource. |
IPP_OP_SET_JOB_ATTRIBUTES | Set-Job-Attributes: Set job values |
IPP_OP_SET_PRINTER_ATTRIBUTES | Set-Printer-Attributes: Set printer values |
+ IPP_OP_SET_RESOURCE_ATTRIBUTES | Set-Resource-Attributes: Set resource object attributes. |
+ IPP_OP_SET_SYSTEM_ATTRIBUTES | Set-System-Attributes: Set system object attributes. |
+ IPP_OP_SHUTDOWN_ALL_PRINTERS | Shutdown-All-Printers: Shutdown all services. |
+ IPP_OP_SHUTDOWN_ONE_PRINTER | Shutdown-One-Printer: Shutdown a service. |
+ IPP_OP_STARTUP_ALL_PRINTERS | Startup-All-Printers: Startup all services. |
+ IPP_OP_STARTUP_ONE_PRINTER | Startup-One-Printer: Start a service. |
IPP_OP_SUSPEND_CURRENT_JOB | Suspend-Current-Job: Suspend the current job |
IPP_OP_VALIDATE_JOB | Validate-Job: Validate job values prior to submission |
@@ -6461,6 +6487,7 @@ are server-oriented...
IPP_TAG_DATE | Date/time value |
IPP_TAG_DEFAULT | Default value |
IPP_TAG_DELETEATTR | Delete-attribute value |
+ IPP_TAG_DOCUMENT | Document group |
IPP_TAG_END | End-of-attributes |
IPP_TAG_ENUM | Enumeration value |
IPP_TAG_EVENT_NOTIFICATION | Event group |
@@ -6477,8 +6504,10 @@ are server-oriented...
IPP_TAG_PRINTER | Printer group |
IPP_TAG_RANGE | Range value |
IPP_TAG_RESOLUTION | Resolution value |
+ IPP_TAG_RESOURCE | Resource group |
IPP_TAG_STRING | Octet string value |
IPP_TAG_SUBSCRIPTION | Subscription group |
+ IPP_TAG_SYSTEM | System group |
IPP_TAG_TEXT | Text value |
IPP_TAG_TEXTLANG | Text-with-language value |
IPP_TAG_UNKNOWN | Unknown value |
diff --git a/doc/help/spec-ppd.html b/doc/help/spec-ppd.html
index 06f5769a8..dd2c07a15 100644
--- a/doc/help/spec-ppd.html
+++ b/doc/help/spec-ppd.html
@@ -419,6 +419,7 @@ div.contents ul.subcontents li {
cupsFax
cupsFilter
cupsFilter2
+ cupsFinishingTemplate
cupsFlipDuplex
cupsIPPFinishings
cupsIPPReason
@@ -491,6 +492,7 @@ LINE-END = CR / LF / CR LF
CUPS supports several methods of auto-configuration via PPD keywords.
+
*APAutoSetupTool: "/LibraryPrinters/vendor/filename"
@@ -506,6 +508,7 @@ LINE-END = CR / LF / CR LF
*APAutoSetupTool: "/Library/Printers/vendor/Tools/autosetuptool"
+
*?MainKeyword: "
@@ -535,6 +538,7 @@ LINE-END = CR / LF / CR LF
*CloseUI: OptionDuplex
+
*?OIDMainKeyword: ".n.n.n..."
@@ -566,6 +570,7 @@ LINE-END = CR / LF / CR LF
+
*cupsColorProfile Resolution/MediaType: "density gamma m00 m01 m02 m10 m11 m12 m20 m21 m22"
@@ -642,6 +647,7 @@ f(x) = density * x gamma
*cupsICCQualifier3: Resolution
+
*APSupportsCustomColorMatching: true
@@ -743,6 +749,7 @@ f(x) = density * x gamma
+
*cupsUIConstraints resolver: "*Keyword1 *Keyword2 ..."
@@ -773,6 +780,7 @@ f(x) = density * x gamma
*cupsUIConstraints photo: "*OutputMode Photo *MediaType Transparency *Resolution 1200dpi"
+
*cupsUIResolver resolver: "*Keyword1 OptionKeyword1 *Keyword2 OptionKeyword2 ..."
@@ -990,6 +998,7 @@ option value is "1234" then CUPS will output the string "@PJL SET PASSCODE=1234"
The resulting dictionary sets the page device attributes that are sent to your raster driver in the page header.
+
Custom Page Size Code
There are many possible implementations of the CustomPageSize code. For CUPS raster drivers, the following code is recommended:
@@ -1003,6 +1012,7 @@ option value is "1234" then CUPS will output the string "@PJL SET PASSCODE=1234"
*CustomPageSize True: "pop pop pop <</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice"
+
Supported PostScript Operators
CUPS supports the following PostScript operators in addition to the usual PostScript number, string (literal and hex-encoded), boolean, null, and name values:
@@ -1062,6 +1072,7 @@ PRE B {
+
Supported Page Device Attributes
Table 2 shows the supported page device attributes along with PostScript code examples.
@@ -1333,6 +1344,7 @@ PRE B {
The CUPS media keywords allow drivers to specify alternate custom page
size limits based on up to two options.
+
*cupsMediaQualifier2: MainKeyword
@@ -1352,6 +1364,7 @@ custom page size limits.
*cupsMinSize ..Photo: "300 300"
+
*cupsMediaQualifier3: MainKeyword
@@ -1371,6 +1384,7 @@ custom page size limits.
*cupsMinSize ..Photo: "300 300"
+
*cupsMinSize .Qualifier2.Qualifier3: "width length"
@@ -1394,6 +1408,7 @@ are used to identify options to use for matching.
*cupsMinSize ..Photo: "300 300"
+
*cupsMaxSize .Qualifier2.Qualifier3: "width length"
@@ -1531,6 +1546,7 @@ will be ignored.
Also see the related APDuplexRequiresFlippedMargin
keyword.
+
*cupsCommands: "name name2 ... nameN"
@@ -1562,6 +1578,7 @@ printing is selected. The default value is false
.
*cupsEvenDuplex: true
+
*cupsFax: boolean
@@ -1574,6 +1591,7 @@ printing is selected. The default value is false
.
*cupsFax: true
+
*cupsFilter: "source/type cost program"
@@ -1596,6 +1614,7 @@ the special filter program "-" may be specified.
*cupsFilter: "application/vnd.cups-postscript 0 -"
+
*cupsFilter2: "source/type destination/type cost program"
@@ -1621,6 +1640,26 @@ the special filter program "-" may be specified.
*cupsFilter2: "application/vnd.cups-postscript application/postscript 0 -"
+
+
+
+*cupsFinishingTemplate name/text: ""
+
+This option keyword specifies a finishing template (preset) that applies zero or more finishing processes to a job. Unlike cupsIPPFinishings, only one template can be selected by the user. PPD files also generally apply a constraint between this option and other finishing options like Booklet, FoldType, PunchMedia, and StapleWhen.
+
+Examples:
+
+
+*cupsFinishingTemplate none/None: ""
+*cupsFinishingTemplate fold/Letter Fold: ""
+*cupsFinishingTemplate punch/2/3-Hole Punch: ""
+*cupsFinishingTemplate staple/Corner Staple: ""
+*cupsFinishingTemplate staple-dual/Double Staple: ""
+*cupsFinishingTemplate staple-and-fold/Corner Staple and Letter Fold: ""
+*cupsFinishingTemplate staple-and-punch/Corner Staple and 2/3-Hole Punch: ""
+
+
+
*cupsFlipDuplex: boolean
@@ -1656,6 +1695,7 @@ Ghostscript can use:
*cupsFlipDuplex: true
+
*cupsIPPFinishings number/text: "*Option Choice ..."
@@ -1672,6 +1712,7 @@ values to PPD options and choices.
*cupsIPPFinishings 21/staple-bottom-left: "*StapleLocation SingleLandscape"
+
*cupsIPPReason reason/Reason Text: "optional URIs"
@@ -1712,6 +1753,7 @@ http://www.vendor.com/help"
*End
+
*cupsIPPSupplies: boolean
@@ -1813,6 +1855,7 @@ hardware. The default value is false
.
*cupsManualCopies: true
+
*cupsMarkerName/Name Text: ""
@@ -1827,6 +1870,7 @@ generated by the driver to human readable text.
*cupsMarkerName cyanToner/Cyan Toner: ""
+
*cupsMarkerNotice: "disclaimer text"
@@ -1841,6 +1885,7 @@ are approximate".
*cupsMarkerNotice: "Supply levels are approximate."
+
*cupsMaxCopies: integer
@@ -1854,6 +1899,7 @@ are approximate".
*cupsMaxCopies: 99
+
*cupsModelNumber: number
@@ -1885,6 +1931,7 @@ assumed.
*cupsPJLCharset: "UTF-8"
+
*cupsPJLDisplay: "what"
@@ -1904,6 +1951,7 @@ to use "@PJL RDYMSG DISPLAY". The default is "job".
*cupsPJLDisplay: "none"
+
*cupsPortMonitor urischeme/Descriptive Text: "port monitor"
@@ -1936,6 +1984,7 @@ to disable the port monitor for the given URI scheme.
*cupsPortMonitor usb/USB Status Monitor: "epson-usb"
+
*cupsPreFilter: "source/type cost program"
@@ -1979,6 +2028,7 @@ before the filter that accepts the given MIME type.
*CloseUI: *cupsPrintQuality
+
*cupsSingleFile: Boolean
@@ -1995,6 +2045,7 @@ before the filter that accepts the given MIME type.
*cupsSingleFile: True
+
*cupsSNMPSupplies: boolean
@@ -2010,6 +2061,7 @@ the standard SNMP Printer MIB OIDs for supply levels. The default value is
*cupsSNMPSupplies: False
+
*cupsVersion: major.minor
@@ -2068,6 +2120,7 @@ in order to be usable with all applications.
*APDialogExtension: "/Library/Printers/vendor/options.plugin"
+
*APDuplexRequiresFlippedMargin: boolean
@@ -2150,6 +2203,7 @@ and the Tumble page attribute.
Also see the related cupsBackSide
keyword.
+
*APHelpBook: "bundle URL"
@@ -2165,6 +2219,7 @@ looking up IPP reason codes for this printer driver. The
*APHelpBook: "file:///Library/Printers/vendor/Help.bundle"
+
*APICADriver: boolean
@@ -2179,6 +2234,7 @@ Architecture (ICA) driver for scanning. The default is False.
*APScanAppBundleID: "com.apple.ImageCaptureApp"
+
*APPrinterIconPath: "/Library/Printers/vendor/filename.icns"
@@ -2193,6 +2249,7 @@ displaying the printer. The file must be in the Apple icon format.
*APPrinterIconPath: "/Library/Printers/vendor/Icons/filename.icns"
+
*APPrinterLowInkTool: "/Library/Printers/vendor/program"
@@ -2210,6 +2267,7 @@ Technical Note TN2144 for more information.
*APPrinterLowInkTool: "/Library/Printers/vendor/Tools/lowinktool"
+
*APPrinterPreset name/text: "*Option Choice ..."
@@ -2280,6 +2338,7 @@ choice (*MainKeyword OptionKeyword) or a preset identifier and value
*fr.APPrinterPreset Photo_on_Photo_Paper/Photo sur papier photographique: ""
+
*APPrinterPrinterUtilityPath: "/Library/Printers/vendor/filename.app"
@@ -2295,6 +2354,7 @@ information.
*APPrinterPrinterUtilityPath: "/Library/Printers/vendor/Tools/utility.app"
+
*APScannerOnly: boolean
@@ -2309,6 +2369,7 @@ capabilities. The default is False.
*APScannerOnly: True
+
*APScanAppBundleID: "bundle ID"
@@ -2326,6 +2387,15 @@ the device.
+Changes in CUPS 2.3
+
+
+
+
Changes in CUPS 1.7
@@ -2442,6 +2512,7 @@ the device.
+
Changes in CUPS 1.2.8
@@ -2451,6 +2522,7 @@ the device.
+
Changes in CUPS 1.2
@@ -2476,6 +2548,7 @@ the device.
+
Changes in CUPS 1.1
diff --git a/filter/spec-ppd.shtml b/filter/spec-ppd.shtml
index 3b7543082..6f84dbdab 100644
--- a/filter/spec-ppd.shtml
+++ b/filter/spec-ppd.shtml
@@ -30,6 +30,7 @@ LINE-END = CR / LF / CR LF
CUPS supports several methods of auto-configuration via PPD keywords.
+
*APAutoSetupTool: "/LibraryPrinters/vendor/filename"
@@ -45,6 +46,7 @@ LINE-END = CR / LF / CR LF
*APAutoSetupTool: "/Library/Printers/vendor/Tools/autosetuptool"
+
*?MainKeyword: "
@@ -74,6 +76,7 @@ LINE-END = CR / LF / CR LF
*CloseUI: OptionDuplex
+
*?OIDMainKeyword: ".n.n.n..."
@@ -105,6 +108,7 @@ LINE-END = CR / LF / CR LF
+
*cupsColorProfile Resolution/MediaType: "density gamma m00 m01 m02 m10 m11 m12 m20 m21 m22"
@@ -181,6 +185,7 @@ f(x) = density * x gamma
*cupsICCQualifier3: Resolution
+
*APSupportsCustomColorMatching: true
@@ -282,6 +287,7 @@ f(x) = density * x gamma
+
*cupsUIConstraints resolver: "*Keyword1 *Keyword2 ..."
@@ -312,6 +318,7 @@ f(x) = density * x gamma
*cupsUIConstraints photo: "*OutputMode Photo *MediaType Transparency *Resolution 1200dpi"
+
*cupsUIResolver resolver: "*Keyword1 OptionKeyword1 *Keyword2 OptionKeyword2 ..."
@@ -529,6 +536,7 @@ option value is "1234" then CUPS will output the string "@PJL SET PASSCODE=1234"
The resulting dictionary sets the page device attributes that are sent to your raster driver in the page header.
+
Custom Page Size Code
There are many possible implementations of the CustomPageSize code. For CUPS raster drivers, the following code is recommended:
@@ -542,6 +550,7 @@ option value is "1234" then CUPS will output the string "@PJL SET PASSCODE=1234"
*CustomPageSize True: "pop pop pop <</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice"
+
Supported PostScript Operators
CUPS supports the following PostScript operators in addition to the usual PostScript number, string (literal and hex-encoded), boolean, null, and name values:
@@ -601,6 +610,7 @@ PRE B {
+
Supported Page Device Attributes
Table 2 shows the supported page device attributes along with PostScript code examples.
@@ -872,6 +882,7 @@ PRE B {
The CUPS media keywords allow drivers to specify alternate custom page
size limits based on up to two options.
+
*cupsMediaQualifier2: MainKeyword
@@ -891,6 +902,7 @@ custom page size limits.
*cupsMinSize ..Photo: "300 300"
+
*cupsMediaQualifier3: MainKeyword
@@ -910,6 +922,7 @@ custom page size limits.
*cupsMinSize ..Photo: "300 300"
+
*cupsMinSize .Qualifier2.Qualifier3: "width length"
@@ -933,6 +946,7 @@ are used to identify options to use for matching.
*cupsMinSize ..Photo: "300 300"
+
*cupsMaxSize .Qualifier2.Qualifier3: "width length"
@@ -1070,6 +1084,7 @@ will be ignored.
Also see the related APDuplexRequiresFlippedMargin
keyword.
+
*cupsCommands: "name name2 ... nameN"
@@ -1101,6 +1116,7 @@ printing is selected. The default value is false
.
*cupsEvenDuplex: true
+
*cupsFax: boolean
@@ -1113,6 +1129,7 @@ printing is selected. The default value is false
.
*cupsFax: true
+
*cupsFilter: "source/type cost program"
@@ -1135,6 +1152,7 @@ the special filter program "-" may be specified.
*cupsFilter: "application/vnd.cups-postscript 0 -"
+
*cupsFilter2: "source/type destination/type cost program"
@@ -1160,6 +1178,26 @@ the special filter program "-" may be specified.
*cupsFilter2: "application/vnd.cups-postscript application/postscript 0 -"
+
+
+
+*cupsFinishingTemplate name/text: ""
+
+This option keyword specifies a finishing template (preset) that applies zero or more finishing processes to a job. Unlike cupsIPPFinishings, only one template can be selected by the user. PPD files also generally apply a constraint between this option and other finishing options like Booklet, FoldType, PunchMedia, and StapleWhen.
+
+Examples:
+
+
+*cupsFinishingTemplate none/None: ""
+*cupsFinishingTemplate fold/Letter Fold: ""
+*cupsFinishingTemplate punch/2/3-Hole Punch: ""
+*cupsFinishingTemplate staple/Corner Staple: ""
+*cupsFinishingTemplate staple-dual/Double Staple: ""
+*cupsFinishingTemplate staple-and-fold/Corner Staple and Letter Fold: ""
+*cupsFinishingTemplate staple-and-punch/Corner Staple and 2/3-Hole Punch: ""
+
+
+
*cupsFlipDuplex: boolean
@@ -1195,6 +1233,7 @@ Ghostscript can use:
*cupsFlipDuplex: true
+
*cupsIPPFinishings number/text: "*Option Choice ..."
@@ -1211,6 +1250,7 @@ values to PPD options and choices.
*cupsIPPFinishings 21/staple-bottom-left: "*StapleLocation SingleLandscape"
+
*cupsIPPReason reason/Reason Text: "optional URIs"
@@ -1251,6 +1291,7 @@ http://www.vendor.com/help"
*End
+
*cupsIPPSupplies: boolean
@@ -1352,6 +1393,7 @@ hardware. The default value is false
.
*cupsManualCopies: true
+
*cupsMarkerName/Name Text: ""
@@ -1366,6 +1408,7 @@ generated by the driver to human readable text.
*cupsMarkerName cyanToner/Cyan Toner: ""
+
*cupsMarkerNotice: "disclaimer text"
@@ -1380,6 +1423,7 @@ are approximate".
*cupsMarkerNotice: "Supply levels are approximate."
+
*cupsMaxCopies: integer
@@ -1393,6 +1437,7 @@ are approximate".
*cupsMaxCopies: 99
+
*cupsModelNumber: number
@@ -1424,6 +1469,7 @@ assumed.
*cupsPJLCharset: "UTF-8"
+
*cupsPJLDisplay: "what"
@@ -1443,6 +1489,7 @@ to use "@PJL RDYMSG DISPLAY". The default is "job".
*cupsPJLDisplay: "none"
+
*cupsPortMonitor urischeme/Descriptive Text: "port monitor"
@@ -1475,6 +1522,7 @@ to disable the port monitor for the given URI scheme.
*cupsPortMonitor usb/USB Status Monitor: "epson-usb"
+
*cupsPreFilter: "source/type cost program"
@@ -1518,6 +1566,7 @@ before the filter that accepts the given MIME type.
*CloseUI: *cupsPrintQuality
+
*cupsSingleFile: Boolean
@@ -1534,6 +1583,7 @@ before the filter that accepts the given MIME type.
*cupsSingleFile: True
+
*cupsSNMPSupplies: boolean
@@ -1549,6 +1599,7 @@ the standard SNMP Printer MIB OIDs for supply levels. The default value is
*cupsSNMPSupplies: False
+
*cupsVersion: major.minor
@@ -1607,6 +1658,7 @@ in order to be usable with all applications.
*APDialogExtension: "/Library/Printers/vendor/options.plugin"
+
*APDuplexRequiresFlippedMargin: boolean
@@ -1689,6 +1741,7 @@ and the Tumble page attribute.
Also see the related cupsBackSide
keyword.
+
*APHelpBook: "bundle URL"
@@ -1704,6 +1757,7 @@ looking up IPP reason codes for this printer driver. The
*APHelpBook: "file:///Library/Printers/vendor/Help.bundle"
+
*APICADriver: boolean
@@ -1718,6 +1772,7 @@ Architecture (ICA) driver for scanning. The default is False.
*APScanAppBundleID: "com.apple.ImageCaptureApp"
+
*APPrinterIconPath: "/Library/Printers/vendor/filename.icns"
@@ -1732,6 +1787,7 @@ displaying the printer. The file must be in the Apple icon format.
*APPrinterIconPath: "/Library/Printers/vendor/Icons/filename.icns"
+
*APPrinterLowInkTool: "/Library/Printers/vendor/program"
@@ -1749,6 +1805,7 @@ Technical Note TN2144 for more information.
*APPrinterLowInkTool: "/Library/Printers/vendor/Tools/lowinktool"
+
*APPrinterPreset name/text: "*Option Choice ..."
@@ -1819,6 +1876,7 @@ choice (*MainKeyword OptionKeyword) or a preset identifier and value
*fr.APPrinterPreset Photo_on_Photo_Paper/Photo sur papier photographique: ""
+
*APPrinterPrinterUtilityPath: "/Library/Printers/vendor/filename.app"
@@ -1834,6 +1892,7 @@ information.
*APPrinterPrinterUtilityPath: "/Library/Printers/vendor/Tools/utility.app"
+
*APScannerOnly: boolean
@@ -1848,6 +1907,7 @@ capabilities. The default is False.
*APScannerOnly: True
+
*APScanAppBundleID: "bundle ID"
@@ -1865,6 +1925,15 @@ the device.
+Changes in CUPS 2.3
+
+
+
+
Changes in CUPS 1.7
@@ -1981,6 +2050,7 @@ the device.
+
Changes in CUPS 1.2.8
@@ -1990,6 +2060,7 @@ the device.
+
Changes in CUPS 1.2
@@ -2015,6 +2086,7 @@ the device.
+
Changes in CUPS 1.1
diff --git a/scheduler/printers.c b/scheduler/printers.c
index 662c58c98..557d7514f 100644
--- a/scheduler/printers.c
+++ b/scheduler/printers.c
@@ -4098,17 +4098,10 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
input_slot = ppdFindMarkedChoice(ppd, "InputSlot");
media_type = ppdFindMarkedChoice(ppd, "MediaType");
col = new_media_col(pwgsize,
- input_slot ?
- _ppdCacheGetSource(p->pc,
- input_slot->choice) :
- NULL,
- media_type ?
- _ppdCacheGetType(p->pc,
- media_type->choice) :
- NULL);
-
- ippAddCollection(p->ppd_attrs, IPP_TAG_PRINTER, "media-col-default",
- col);
+ input_slot ? _ppdCacheGetSource(p->pc, input_slot->choice) : NULL,
+ media_type ? _ppdCacheGetType(p->pc, media_type->choice) : NULL);
+
+ ippAddCollection(p->ppd_attrs, IPP_TAG_PRINTER, "media-col-default", col);
ippDelete(col);
}
@@ -4698,6 +4691,22 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
}
}
+ if (p->pc && p->pc->templates)
+ {
+ const char *template; /* Finishing template */
+ ipp_attribute_t *fin_col_db; /* finishings-col-database attribute */
+ ipp_t *fin_col; /* finishings-col value */
+
+ fin_col_db = ippAddCollections(p->ppd_attrs, IPP_TAG_PRINTER, "finishings-col-database", cupsArrayCount(p->pc->templates), NULL);
+ for (i = 0, template = (const char *)cupsArrayFirst(p->pc->templates); template; i ++, template = (const char *)cupsArrayNext(p->pc->templates))
+ {
+ fin_col = ippNew();
+ ippAddString(fin_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishing-template", NULL, template);
+ ippSetCollection(p->ppd_attrs, &fin_col_db, i, fin_col);
+ ippDelete(fin_col);
+ }
+ }
+
for (i = 0; i < ppd->num_sizes; i ++)
if (ppd->sizes[i].length > 1728)
p->type |= CUPS_PRINTER_LARGE;
diff --git a/xcode/CUPS.xcodeproj/project.pbxproj b/xcode/CUPS.xcodeproj/project.pbxproj
index b057da2c9..b4729ddb6 100644
--- a/xcode/CUPS.xcodeproj/project.pbxproj
+++ b/xcode/CUPS.xcodeproj/project.pbxproj
@@ -7211,7 +7211,7 @@
72BF96371333042100B1EAD7 /* Project object */ = {
isa = PBXProject;
attributes = {
- LastUpgradeCheck = 0920;
+ LastUpgradeCheck = 0910;
ORGANIZATIONNAME = "Apple Inc.";
TargetAttributes = {
270695FD1CADF3E200FFE5FB = {
--
2.39.2