From dcb445bcf3e9ec2efd56550263052aca70beb08e Mon Sep 17 00:00:00 2001
From: msweet
Date: Thu, 19 Jan 2012 16:53:50 +0000
Subject: [PATCH] Merge changes from CUPS 1.6svn-r10188, including changes for
CUPS 1.6: New printer/printing APIs
git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@3618 a1ca3aef-8c08-0410-bb20-df032aa958be
---
CHANGES-1.5.txt | 1 +
CHANGES-IPPTOOL.txt | 22 +-
CHANGES.txt | 14 +-
IPPTOOL.txt | 2 +-
backend/ipp.c | 255 +-
backend/network.c | 2 +-
backend/testbackend.c | 25 +-
config-scripts/cups-gssapi.m4 | 1 +
cups/Dependencies | 2463 ++++++++-----
cups/Makefile | 22 +-
cups/cups-private.h | 57 +-
cups/cups.h | 363 +-
cups/dest-job.c | 145 +
cups/dest-localization.c | 76 +
cups/dest-options.c | 1164 ++++++
cups/dest.c | 1310 ++++++-
cups/encode.c | 67 +-
cups/getdevices.c | 4 +-
cups/globals.c | 4 +-
cups/http-addrlist.c | 179 +-
cups/http.c | 56 +-
cups/http.h | 7 +-
cups/ipp-private.h | 9 +-
cups/ipp.c | 266 +-
cups/ipp.h | 3 +
cups/libcups2.def | 45 +-
cups/libcups_s.exp | 2 +
cups/localize.c | 4 +-
cups/ppd-cache.c | 257 +-
cups/ppd-private.h | 18 +-
cups/pwg-media.c | 4 +-
cups/pwg-private.h | 4 +-
cups/sidechannel.c | 93 +-
cups/snmp.c | 2 +-
cups/testcups.c | 146 +-
cups/testppd.c | 20 +
cups/usersys.c | 267 +-
doc/de/index.html.in | 2 +-
doc/es/index.html.in | 2 +-
doc/eu/index.html.in | 2 +-
doc/help/ref-client-conf.html | 19 +
doc/help/ref-cupsd-conf.html.in | 33 +
doc/id/index.html.in | 2 +-
doc/index.html.in | 2 +-
doc/it/index.html.in | 2 +-
doc/ja/index.html.in | 2 +-
doc/pl/index.html.in | 2 +-
doc/ru/index.html.in | 2 +-
locale/Makefile | 6 +-
locale/cups.pot | 1748 +++++----
locale/cups.strings | 81 +-
locale/cups_da.po | 5716 +++++++++++++++++++-----------
locale/cups_de.po | 5733 +++++++++++++++++++-----------
locale/cups_es.po | 3230 ++++-------------
locale/cups_eu.po | 5841 +++++++++++++++++++------------
locale/cups_fi.po | 5699 +++++++++++++++++++-----------
locale/cups_fr.po | 5747 +++++++++++++++++++-----------
locale/cups_id.po | 5717 +++++++++++++++++++-----------
locale/cups_it.po | 5782 +++++++++++++++++++-----------
locale/cups_ja.po | 5814 +++++++++++++++++++-----------
locale/cups_ko.po | 5657 +++++++++++++++++++-----------
locale/cups_nl.po | 5760 ++++++++++++++++++------------
locale/cups_no.po | 5675 +++++++++++++++++++-----------
locale/cups_pl.po | 5691 +++++++++++++++++++-----------
locale/cups_pt.po | 5733 +++++++++++++++++++-----------
locale/cups_pt_BR.po | 5705 +++++++++++++++++++-----------
locale/cups_ru.po | 5695 +++++++++++++++++++-----------
locale/cups_sv.po | 5670 +++++++++++++++++++-----------
locale/cups_zh.po | 5645 ++++++++++++++++++-----------
locale/cups_zh_TW.po | 5641 ++++++++++++++++++-----------
man/Makefile | 8 +-
man/cupsd.conf.man.in | 15 +-
notifier/dbus.c | 122 +-
scheduler/auth.c | 239 +-
scheduler/auth.h | 3 +-
scheduler/client.c | 26 +-
scheduler/conf.c | 155 +-
scheduler/conf.h | 11 +-
scheduler/cups-driverd.cxx | 28 +-
scheduler/dirsvc.c | 13 +-
scheduler/ipp.c | 123 +-
scheduler/job.c | 118 +-
scheduler/job.h | 5 +-
scheduler/log.c | 48 +-
scheduler/main.c | 74 +-
scheduler/printers.c | 2 +-
scheduler/select.c | 4 +-
scheduler/server.c | 12 +-
scheduler/sysman.c | 25 +-
test/ipp-1.1.test | 23 +-
test/ippserver.c | 6 +-
test/ipptool.c | 1086 +++---
tools/makeipptoolpkg | 20 +-
vcnet/ipptool-installer.vdproj | 118 +-
94 files changed, 73631 insertions(+), 44088 deletions(-)
create mode 100644 cups/dest-job.c
create mode 100644 cups/dest-localization.c
create mode 100644 cups/dest-options.c
diff --git a/CHANGES-1.5.txt b/CHANGES-1.5.txt
index 88de1a9d4..1feca4aac 100644
--- a/CHANGES-1.5.txt
+++ b/CHANGES-1.5.txt
@@ -5,6 +5,7 @@ CHANGES IN CUPS V1.5.1
- Documentation updates (STR #3885, STR #3946, STR #3969)
- Build fixes (STR #3956)
+ - The DBUS notifier did not validate string parameters (STR #3984)
- Group quota ACLs did not work with Kerberos (STR #3972)
- The IPP backend did not retry when a printer responded with
client-error-not-possible (STR #3963)
diff --git a/CHANGES-IPPTOOL.txt b/CHANGES-IPPTOOL.txt
index 2d787597b..9c307156d 100644
--- a/CHANGES-IPPTOOL.txt
+++ b/CHANGES-IPPTOOL.txt
@@ -1,10 +1,30 @@
-CHANGES-IPPTOOL.txt - 2011-10-05
+CHANGES-IPPTOOL.txt - 2012-01-10
--------------------------------
This file provides a list of changes to the ipptool binary distribution posted
on cups.org.
+2012-01-10
+
+ - Fixed an issue with the IPP/1.1 test file where the "waiting for job
+ completion" test did not work.
+ - The attribute groups out of order error was not shown for the
+ operation-attributes-tag group.
+
+
+2011-12-02
+
+ - Fixed a truncated XML output bug that would happen for certain errors.
+ - Fixed the order-of-groups tests.
+ - Fixed "WITH-VALUE >N" for rangeOfInteger attributes.
+ - The Windows installer was missing the get-printer-attributes.test
+ file.
+ - The Linux binaries are now compiled for all LSB 4.x-compliant Linux
+ distributions.
+ - The Linux binaries no longer support SSL or TLS.
+
+
2011-10-05
- Fixed a crasher bug that showed up on Windows.
diff --git a/CHANGES.txt b/CHANGES.txt
index 2261b5906..9c23b913f 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,8 +1,20 @@
-CHANGES.txt - 1.6b1 - 2011-11-03
+CHANGES.txt - 1.6b1 - 2012-01-13
--------------------------------
CHANGES IN CUPS V1.6b1
+ - Added new destination connection and enumeration functions (STR #3924)
+ - Added new option, localization, and job submission functions that do
+ not depend on PPD files (STR #3925)
+ - Added a new MaxJobTime directive for cupsd that specifies the maximum
+ amount of time allowed for a job to complete before it is canceled.
+ - The default password callback now supports passwords up to 127
+ characters.
+ - The scheduler now supports a DefaultAuthType of "auto" to
+ automatically choose between Basic (username/password) and Negotiate
+ (Kerberos) authentication.
+ - cupsSideChannelSNMPGet/Walk now support OIDs and values up to 64k in
+ length.
- CUPS no longer supports automatic remote printers or implicit classes
via the CUPS, LDAP, or SLP protocols (STR #3922, STR #3923)
- The PPD APIs are now deprecated and will be removed in a future
diff --git a/IPPTOOL.txt b/IPPTOOL.txt
index b0c671c2b..3447b1939 100644
--- a/IPPTOOL.txt
+++ b/IPPTOOL.txt
@@ -1,4 +1,4 @@
-IPPTOOL.txt - 2011-09-28
+IPPTOOL.txt - 2011-12-02
------------------------
See the file CHANGES-IPPTOOL.txt for a list of changes to this software.
diff --git a/backend/ipp.c b/backend/ipp.c
index 99df346ae..21eacde39 100644
--- a/backend/ipp.c
+++ b/backend/ipp.c
@@ -3,7 +3,7 @@
*
* IPP backend for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
+ * Copyright 2007-2012 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -63,6 +63,7 @@ typedef struct _cups_monitor_s /**** Monitoring data ****/
int port, /* Port number */
version, /* IPP version */
job_id; /* Job ID for submitted job */
+ const char *job_name; /* Job name for submitted job */
http_encryption_t encryption; /* Use encryption? */
ipp_jstate_t job_state; /* Current job state */
ipp_pstate_t printer_state; /* Current printer state */
@@ -82,6 +83,8 @@ static const char * const jattrs[] = /* Job attributes we want */
{
"job-impressions-completed",
"job-media-sheets-completed",
+ "job-name",
+ "job-originating-user-name",
"job-state",
"job-state-reasons"
};
@@ -205,6 +208,7 @@ main(int argc, /* I - Number of command-line args */
int port; /* Port number (not used) */
char portname[255]; /* Port name */
char uri[HTTP_MAX_URI]; /* Updated URI without user/pass */
+ char print_job_name[1024]; /* Update job-name for Print-Job */
http_status_t http_status; /* Status of HTTP request */
ipp_status_t ipp_status; /* Status of IPP request */
http_t *http; /* HTTP connection */
@@ -231,7 +235,9 @@ main(int argc, /* I - Number of command-line args */
ipp_attribute_t *doc_handling_sup; /* multiple-document-handling-supported */
ipp_attribute_t *printer_state; /* printer-state attribute */
ipp_attribute_t *printer_accepting; /* printer-is-accepting-jobs */
- int validate_job; /* Does printer support Validate-Job? */
+ int create_job = 0, /* Does printer support Create-Job? */
+ send_document = 0, /* Does printer support Send-Document? */
+ validate_job = 0; /* Does printer support Validate-Job? */
int copies, /* Number of copies for job */
copies_remaining; /* Number of copies remaining */
const char *content_type, /* CONTENT_TYPE environment variable */
@@ -789,7 +795,6 @@ main(int argc, /* I - Number of command-line args */
supported = NULL;
operations_sup = NULL;
doc_handling_sup = NULL;
- validate_job = 0;
do
{
@@ -1042,11 +1047,21 @@ main(int argc, /* I - Number of command-line args */
"cups-ipp-missing-get-printer-attributes");
for (i = 0; i < operations_sup->num_values; i ++)
+ {
if (operations_sup->values[i].integer == IPP_VALIDATE_JOB)
- {
validate_job = 1;
- break;
- }
+ else if (operations_sup->values[i].integer == IPP_CREATE_JOB)
+ create_job = 1;
+ else if (operations_sup->values[i].integer == IPP_SEND_DOCUMENT)
+ send_document = 1;
+ }
+
+ if (!send_document)
+ {
+ fputs("DEBUG: Printer supports Create-Job but not Send-Document.\n",
+ stderr);
+ create_job = 0;
+ }
if (!validate_job)
update_reasons(NULL, "+cups-ipp-conformance-failure-report,"
@@ -1116,7 +1131,7 @@ main(int argc, /* I - Number of command-line args */
{
copies_remaining = 1;
- if (argc < 7 && !send_options)
+ if (argc < 7 && !_cups_strncasecmp(final_content_type, "image/", 6))
copies = 1;
}
else
@@ -1220,6 +1235,17 @@ main(int argc, /* I - Number of command-line args */
monitor.job_state = IPP_JOB_PENDING;
monitor.printer_state = IPP_PRINTER_IDLE;
+ if (create_job)
+ {
+ monitor.job_name = argv[3];
+ }
+ else
+ {
+ snprintf(print_job_name, sizeof(print_job_name), "%s - %s", argv[1],
+ argv[3]);
+ monitor.job_name = print_job_name;
+ }
+
_cupsThreadCreate((_cups_thread_func_t)monitor_printer, &monitor);
/*
@@ -1228,8 +1254,8 @@ main(int argc, /* I - Number of command-line args */
while (!job_canceled && validate_job)
{
- request = new_request(IPP_VALIDATE_JOB, version, uri, argv[2], argv[3],
- num_options, options, compression,
+ request = new_request(IPP_VALIDATE_JOB, version, uri, argv[2],
+ monitor.job_name, num_options, options, compression,
copies_sup ? copies : 1, document_format, pc,
media_col_sup, doc_handling_sup);
@@ -1306,16 +1332,17 @@ main(int argc, /* I - Number of command-line args */
if (job_canceled)
break;
- request = new_request(num_files > 1 ? IPP_CREATE_JOB : IPP_PRINT_JOB,
- version, uri, argv[2], argv[3], num_options, options,
- compression, copies_sup ? copies : 1, document_format,
- pc, media_col_sup, doc_handling_sup);
+ request = new_request((num_files > 1 || create_job) ? IPP_CREATE_JOB :
+ IPP_PRINT_JOB,
+ version, uri, argv[2], monitor.job_name, num_options,
+ options, compression, copies_sup ? copies : 1,
+ document_format, pc, media_col_sup, doc_handling_sup);
/*
* Do the request...
*/
- if (num_files > 1)
+ if (num_files > 1 || create_job)
response = cupsDoRequest(http, request, resource);
else
{
@@ -1333,7 +1360,13 @@ main(int argc, /* I - Number of command-line args */
if (http_status == HTTP_CONTINUE && request->state == IPP_DATA)
{
if (num_files == 1)
- fd = open(files[0], O_RDONLY);
+ {
+ if ((fd = open(files[0], O_RDONLY)) < 0)
+ {
+ _cupsLangPrintError("ERROR", _("Unable to open print file"));
+ return (CUPS_BACKEND_FAILED);
+ }
+ }
else
{
fd = 0;
@@ -1382,7 +1415,7 @@ main(int argc, /* I - Number of command-line args */
ipp_status = cupsLastError();
fprintf(stderr, "DEBUG: %s: %s (%s)\n",
- num_files > 1 ? "Create-Job" : "Print-Job",
+ (num_files > 1 || create_job) ? "Create-Job" : "Print-Job",
ippErrorString(ipp_status), cupsLastErrorString());
if (ipp_status > IPP_OK_CONFLICT)
@@ -1466,14 +1499,15 @@ main(int argc, /* I - Number of command-line args */
_("Print file accepted - job ID %d."), job_id);
}
+ fprintf(stderr, "DEBUG: job-id=%d\n", job_id);
ippDelete(response);
if (job_canceled)
break;
- if (job_id && num_files > 1)
+ if (job_id && (num_files > 1 || create_job))
{
- for (i = 0; i < num_files; i ++)
+ for (i = 0; num_files == 0 || i < num_files; i ++)
{
/*
* Check for side-channel requests...
@@ -1499,16 +1533,34 @@ main(int argc, /* I - Number of command-line args */
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
"requesting-user-name", NULL, argv[2]);
- if ((i + 1) == num_files)
+ if ((i + 1) >= num_files)
ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", 1);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE,
- "document-format", NULL, content_type);
+ "document-format", NULL, document_format);
fprintf(stderr, "DEBUG: Sending file %d using chunking...\n", i + 1);
http_status = cupsSendRequest(http, request, resource, 0);
- if (http_status == HTTP_CONTINUE && request->state == IPP_DATA &&
- (fd = open(files[i], O_RDONLY)) >= 0)
+ if (http_status == HTTP_CONTINUE && request->state == IPP_DATA)
+ {
+ if (num_files == 0)
+ {
+ fd = 0;
+ http_status = cupsWriteRequestData(http, buffer, bytes);
+ }
+ else
+ {
+ if ((fd = open(files[i], O_RDONLY)) < 0)
+ {
+ _cupsLangPrintError("ERROR", _("Unable to open print file"));
+ return (CUPS_BACKEND_FAILED);
+ }
+ }
+ }
+ else
+ fd = -1;
+
+ if (fd >= 0)
{
while (!job_canceled &&
(bytes = read(fd, buffer, sizeof(buffer))) > 0)
@@ -1525,7 +1577,8 @@ main(int argc, /* I - Number of command-line args */
}
}
- close(fd);
+ if (fd > 0)
+ close(fd);
}
ippDelete(cupsGetResponse(http, resource));
@@ -1542,6 +1595,8 @@ main(int argc, /* I - Number of command-line args */
_("Unable to add document to print job."));
break;
}
+ else if (num_files == 0 || fd < 0)
+ break;
}
}
@@ -1972,6 +2027,11 @@ monitor_printer(
ipp_attribute_t *attr; /* Attribute in response */
int delay, /* Current delay */
prev_delay; /* Previous delay */
+ ipp_op_t job_op; /* Operation to use */
+ int job_id; /* Job ID */
+ const char *job_name; /* Job name */
+ ipp_jstate_t job_state; /* Job state */
+ const char *job_user; /* Job originating user name */
/*
@@ -2006,47 +2066,96 @@ monitor_printer(
monitor->user,
monitor->version);
- if (monitor->job_id > 0)
- {
- /*
- * Check the status of the job itself...
- */
+ /*
+ * Check the status of the job itself...
+ */
- request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES);
- request->request.op.version[0] = monitor->version / 10;
- request->request.op.version[1] = monitor->version % 10;
+ job_op = monitor->job_id > 0 ? IPP_GET_JOB_ATTRIBUTES : IPP_GET_JOBS;
+ request = ippNewRequest(job_op);
+ request->request.op.version[0] = monitor->version / 10;
+ request->request.op.version[1] = monitor->version % 10;
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
- NULL, monitor->uri);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
+ NULL, monitor->uri);
+ if (job_op == IPP_GET_JOB_ATTRIBUTES)
ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id",
- monitor->job_id);
+ monitor->job_id);
- if (monitor->user && monitor->user[0])
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
- "requesting-user-name", NULL, monitor->user);
+ if (monitor->user && monitor->user[0])
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
+ "requesting-user-name", NULL, monitor->user);
- ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
- "requested-attributes",
- (int)(sizeof(jattrs) / sizeof(jattrs[0])), NULL, jattrs);
+ ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
+ "requested-attributes",
+ (int)(sizeof(jattrs) / sizeof(jattrs[0])), NULL, jattrs);
- /*
- * Do the request...
- */
+ /*
+ * Do the request...
+ */
- response = cupsDoRequest(http, request, monitor->resource);
+ response = cupsDoRequest(http, request, monitor->resource);
- fprintf(stderr, "DEBUG: Get-Job-Attributes: %s (%s)\n",
- ippErrorString(cupsLastError()), cupsLastErrorString());
+ fprintf(stderr, "DEBUG: %s: %s (%s)\n", ippOpString(job_op),
+ ippErrorString(cupsLastError()), cupsLastErrorString());
+ if (job_op == IPP_GET_JOB_ATTRIBUTES)
+ {
if ((attr = ippFindAttribute(response, "job-state",
IPP_TAG_ENUM)) != NULL)
monitor->job_state = (ipp_jstate_t)attr->values[0].integer;
else
monitor->job_state = IPP_JOB_COMPLETED;
+ }
+ else
+ {
+ for (attr = response->attrs; attr; attr = attr->next)
+ {
+ job_id = 0;
+ job_name = NULL;
+ job_state = IPP_JOB_PENDING;
+ job_user = NULL;
+
+ while (attr && attr->group_tag != IPP_TAG_JOB)
+ attr = attr->next;
- ippDelete(response);
+ if (!attr)
+ break;
+
+ while (attr && attr->group_tag == IPP_TAG_JOB)
+ {
+ if (!strcmp(attr->name, "job-id") &&
+ attr->value_tag == IPP_TAG_INTEGER)
+ job_id = attr->values[0].integer;
+ else if (!strcmp(attr->name, "job-name") &&
+ (attr->value_tag == IPP_TAG_NAME ||
+ attr->value_tag == IPP_TAG_NAMELANG))
+ job_name = attr->values[0].string.text;
+ else if (!strcmp(attr->name, "job-state") &&
+ attr->value_tag == IPP_TAG_ENUM)
+ job_state = attr->values[0].integer;
+ else if (!strcmp(attr->name, "job-originating-user-name") &&
+ (attr->value_tag == IPP_TAG_NAME ||
+ attr->value_tag == IPP_TAG_NAMELANG))
+ job_user = attr->values[0].string.text;
+
+ attr = attr->next;
+ }
+
+ if (job_id > 0 && job_name && !strcmp(job_name, monitor->job_name) &&
+ job_user && monitor->user && !strcmp(job_user, monitor->user))
+ {
+ monitor->job_id = job_id;
+ monitor->job_state = job_state;
+ break;
+ }
+
+ if (!attr)
+ break;
+ }
}
+ ippDelete(response);
+
/*
* Disconnect from the printer - we'll reconnect on the next poll...
*/
@@ -2063,6 +2172,15 @@ monitor_printer(
delay = _cupsNextDelay(delay, &prev_delay);
}
+ /*
+ * Cancel the job if necessary...
+ */
+
+ if (job_canceled && monitor->job_id > 0)
+ if (!httpReconnect(http))
+ cancel_job(http, monitor->uri, monitor->job_id, monitor->resource,
+ monitor->user, monitor->version);
+
/*
* Cleanup and return...
*/
@@ -2088,7 +2206,7 @@ new_request(
cups_option_t *options, /* I - Options to send */
const char *compression, /* I - compression value or NULL */
int copies, /* I - copies value or 0 */
- const char *format, /* I - documet-format value or NULL */
+ const char *format, /* I - document-format value or NULL */
_ppd_cache_t *pc, /* I - PPD cache and mapping data */
ipp_attribute_t *media_col_sup, /* I - media-col-supported values */
ipp_attribute_t *doc_handling_sup) /* I - multiple-document-handling-supported values */
@@ -2163,6 +2281,9 @@ new_request(
{
if (pc)
{
+ int num_finishings = 0, /* Number of finishing values */
+ finishings[10]; /* Finishing enum values */
+
/*
* Send standard IPP attributes...
*/
@@ -2284,6 +2405,7 @@ new_request(
}
if (doc_handling_sup &&
+ (!format || _cups_strncasecmp(format, "image/", 6)) &&
(keyword = cupsGetOption("collate", num_options, options)) != NULL)
{
if (!_cups_strcasecmp(keyword, "true"))
@@ -2299,6 +2421,43 @@ new_request(
break;
}
}
+
+ /*
+ * Map finishing options...
+ */
+
+ 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);
+
+ /*
+ * Map FaxOut options...
+ */
+
+ if ((keyword = cupsGetOption("phone", num_options, options)) != NULL)
+ {
+ ipp_t *destination; /* destination collection */
+ char tel_uri[1024]; /* tel: URI */
+
+ destination = ippNew();
+
+ httpAssembleURI(HTTP_URI_CODING_ALL, tel_uri, sizeof(tel_uri), "tel",
+ NULL, NULL, 0, keyword);
+ ippAddString(destination, IPP_TAG_JOB, IPP_TAG_URI, "destination-uri",
+ NULL, tel_uri);
+
+ if ((keyword = cupsGetOption("faxPrefix", num_options,
+ options)) != NULL && *keyword)
+ ippAddString(destination, IPP_TAG_JOB, IPP_TAG_TEXT,
+ "pre-dial-string", NULL, keyword);
+
+ ippAddCollection(request, IPP_TAG_JOB, "destination-uris", destination);
+ ippDelete(destination);
+ }
}
else
{
diff --git a/backend/network.c b/backend/network.c
index fb42f791f..6dbdca03b 100644
--- a/backend/network.c
+++ b/backend/network.c
@@ -71,7 +71,7 @@ backendNetworkSideCB(
{
cups_sc_command_t command; /* Request command */
cups_sc_status_t status; /* Request/response status */
- char data[2048]; /* Request/response data */
+ char data[65536]; /* Request/response data */
int datalen; /* Request/response data size */
const char *device_id; /* 1284DEVICEID env var */
diff --git a/backend/testbackend.c b/backend/testbackend.c
index cdb9a6695..6182471d1 100644
--- a/backend/testbackend.c
+++ b/backend/testbackend.c
@@ -3,7 +3,7 @@
*
* Backend test program for CUPS.
*
- * Copyright 2007-2010 by Apple Inc.
+ * Copyright 2007-2012 by Apple Inc.
* Copyright 1997-2005 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -57,7 +57,7 @@ static void walk_cb(const char *oid, const char *data, int datalen,
*
* Usage:
*
- * betest [-s] [-t] device-uri job-id user title copies options [file]
+ * testbackend [-s] [-t] device-uri job-id user title copies options [file]
*/
int /* O - Exit status */
@@ -75,7 +75,9 @@ main(int argc, /* I - Number of command-line args */
const char *oid = ".1.3.6.1.2.1.43.10.2.1.4.1.1";
/* OID to lookup or walk */
char scheme[255], /* Scheme in URI == backend */
- backend[1024]; /* Backend path */
+ backend[1024], /* Backend path */
+ libpath[1024], /* Path for libcups */
+ *ptr; /* Pointer into path */
const char *serverbin; /* CUPS_SERVERBIN environment variable */
int fd, /* Temporary file descriptor */
back_fds[2], /* Back-channel pipe */
@@ -87,6 +89,23 @@ main(int argc, /* I - Number of command-line args */
status; /* Exit status */
+ /*
+ * Get the current directory and point the run-time linker at the "cups"
+ * subdirectory...
+ */
+
+ if (getcwd(libpath, sizeof(libpath)) &&
+ (ptr = strrchr(libpath, '/')) != NULL && !strcmp(ptr, "/backend"))
+ {
+ strlcpy(ptr, "/cups", sizeof(libpath) - (ptr - libpath));
+ if (access(libpath, 0))
+#ifdef __APPLE__
+ setenv("DYLD_LIBRARY_PATH", libpath, 1);
+#else
+ setenv("LD_LIBRARY_PATH", libpath, 1);
+#endif /* __APPLE__ */
+ }
+
/*
* See if we have side-channel tests to do...
*/
diff --git a/config-scripts/cups-gssapi.m4 b/config-scripts/cups-gssapi.m4
index cf7d58052..5e70be5ef 100644
--- a/config-scripts/cups-gssapi.m4
+++ b/config-scripts/cups-gssapi.m4
@@ -163,6 +163,7 @@ else
CUPS_DEFAULT_GSSSERVICENAME=""
fi
+AC_SUBST(CUPS_DEFAULT_GSSSERVICENAME)
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_GSSSERVICENAME, "$CUPS_DEFAULT_GSSSERVICENAME")
dnl
diff --git a/cups/Dependencies b/cups/Dependencies
index a1042de8a..a9b59f2a4 100644
--- a/cups/Dependencies
+++ b/cups/Dependencies
@@ -1,813 +1,1650 @@
-# DO NOT DELETE
-
-adminutil.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-adminutil.o: array.h language.h string-private.h ../config.h debug-private.h
-adminutil.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-adminutil.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-adminutil.o: ipp-private.h ../cups/ipp.h language-private.h
-adminutil.o: ../cups/transcode.h thread-private.h adminutil.h
-array.o: string-private.h ../config.h debug-private.h ../cups/versioning.h
-array.o: array-private.h array.h versioning.h
-attr.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-attr.o: array.h language.h string-private.h ../config.h debug-private.h
-attr.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-attr.o: http-private.h ../cups/http.h md5-private.h ipp-private.h
-attr.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-auth.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-auth.o: array.h language.h string-private.h ../config.h debug-private.h
-auth.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-auth.o: http-private.h ../cups/http.h md5-private.h ipp-private.h
-auth.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-backchannel.o: cups.h
-backend.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-backend.o: array.h language.h string-private.h ../config.h debug-private.h
-backend.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-backend.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-backend.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-backend.o: thread-private.h backend.h
-conflicts.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-conflicts.o: array.h language.h string-private.h ../config.h debug-private.h
-conflicts.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-conflicts.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-conflicts.o: ipp-private.h ../cups/ipp.h language-private.h
-conflicts.o: ../cups/transcode.h thread-private.h
-custom.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-custom.o: array.h language.h string-private.h ../config.h debug-private.h
-custom.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-custom.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-custom.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-custom.o: thread-private.h
-debug.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-debug.o: array.h language.h string-private.h ../config.h debug-private.h
-debug.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-debug.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-debug.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-debug.o: thread-private.h
-dest.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-dest.o: array.h language.h string-private.h ../config.h debug-private.h
-dest.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-dest.o: http-private.h ../cups/http.h md5-private.h ipp-private.h
-dest.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-dir.o: string-private.h ../config.h debug-private.h ../cups/versioning.h
-dir.o: dir.h versioning.h
-emit.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-emit.o: array.h language.h string-private.h ../config.h debug-private.h
-emit.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-emit.o: http-private.h ../cups/http.h md5-private.h ipp-private.h
-emit.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-encode.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-encode.o: array.h language.h string-private.h ../config.h debug-private.h
-encode.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-encode.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-encode.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-encode.o: thread-private.h
-file.o: file-private.h cups-private.h ../cups/cups.h file.h versioning.h
-file.o: ipp.h http.h array.h language.h string-private.h ../config.h
-file.o: debug-private.h ../cups/versioning.h ppd-private.h ../cups/ppd.h
-file.o: cups.h pwg-private.h http-private.h ../cups/http.h md5-private.h
-file.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-file.o: thread-private.h
-getdevices.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-getdevices.o: array.h language.h string-private.h ../config.h debug-private.h
-getdevices.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-getdevices.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-getdevices.o: ipp-private.h ../cups/ipp.h language-private.h
-getdevices.o: ../cups/transcode.h thread-private.h
-getifaddrs.o: http-private.h ../config.h ../cups/http.h md5-private.h
-getifaddrs.o: ipp-private.h ../cups/ipp.h
-getputfile.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-getputfile.o: array.h language.h string-private.h ../config.h debug-private.h
-getputfile.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-getputfile.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-getputfile.o: ipp-private.h ../cups/ipp.h language-private.h
-getputfile.o: ../cups/transcode.h thread-private.h
-globals.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-globals.o: array.h language.h string-private.h ../config.h debug-private.h
-globals.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-globals.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-globals.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-globals.o: thread-private.h
-http.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-http.o: array.h language.h string-private.h ../config.h debug-private.h
-http.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-http.o: http-private.h ../cups/http.h md5-private.h ipp-private.h
-http.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-http-addr.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-http-addr.o: array.h language.h string-private.h ../config.h debug-private.h
-http-addr.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-http-addr.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-http-addr.o: ipp-private.h ../cups/ipp.h language-private.h
-http-addr.o: ../cups/transcode.h thread-private.h
-http-addrlist.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h
-http-addrlist.o: http.h array.h language.h string-private.h ../config.h
-http-addrlist.o: debug-private.h ../cups/versioning.h ppd-private.h
-http-addrlist.o: ../cups/ppd.h cups.h pwg-private.h http-private.h
-http-addrlist.o: ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h
-http-addrlist.o: language-private.h ../cups/transcode.h thread-private.h
-http-support.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h
-http-support.o: http.h array.h language.h string-private.h ../config.h
-http-support.o: debug-private.h ../cups/versioning.h ppd-private.h
-http-support.o: ../cups/ppd.h cups.h pwg-private.h http-private.h
-http-support.o: ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h
-http-support.o: language-private.h ../cups/transcode.h thread-private.h
-ipp.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h array.h
-ipp.o: language.h string-private.h ../config.h debug-private.h
-ipp.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-ipp.o: http-private.h ../cups/http.h md5-private.h ipp-private.h
-ipp.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-ipp-support.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-ipp-support.o: array.h language.h string-private.h ../config.h
-ipp-support.o: debug-private.h ../cups/versioning.h ppd-private.h
-ipp-support.o: ../cups/ppd.h cups.h pwg-private.h http-private.h
-ipp-support.o: ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h
-ipp-support.o: language-private.h ../cups/transcode.h thread-private.h
-langprintf.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-langprintf.o: array.h language.h string-private.h ../config.h debug-private.h
-langprintf.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-langprintf.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-langprintf.o: ipp-private.h ../cups/ipp.h language-private.h
-langprintf.o: ../cups/transcode.h thread-private.h
-language.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-language.o: array.h language.h string-private.h ../config.h debug-private.h
-language.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-language.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-language.o: ipp-private.h ../cups/ipp.h language-private.h
-language.o: ../cups/transcode.h thread-private.h
-localize.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-localize.o: array.h language.h string-private.h ../config.h debug-private.h
-localize.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-localize.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-localize.o: ipp-private.h ../cups/ipp.h language-private.h
-localize.o: ../cups/transcode.h thread-private.h
-mark.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-mark.o: array.h language.h string-private.h ../config.h debug-private.h
-mark.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-mark.o: http-private.h ../cups/http.h md5-private.h ipp-private.h
-mark.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-md5.o: md5-private.h string-private.h ../config.h
-md5passwd.o: http-private.h ../config.h ../cups/http.h md5-private.h
-md5passwd.o: ipp-private.h ../cups/ipp.h string-private.h
-notify.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-notify.o: array.h language.h string-private.h ../config.h debug-private.h
-notify.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-notify.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-notify.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-notify.o: thread-private.h
-options.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-options.o: array.h language.h string-private.h ../config.h debug-private.h
-options.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-options.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-options.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-options.o: thread-private.h
-page.o: string-private.h ../config.h debug-private.h ../cups/versioning.h
-page.o: ppd.h cups.h array.h versioning.h file.h
-ppd.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h array.h
-ppd.o: language.h string-private.h ../config.h debug-private.h
-ppd.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-ppd.o: http-private.h ../cups/http.h md5-private.h ipp-private.h
-ppd.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-ppd-cache.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-ppd-cache.o: array.h language.h string-private.h ../config.h debug-private.h
-ppd-cache.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-ppd-cache.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-ppd-cache.o: ipp-private.h ../cups/ipp.h language-private.h
-ppd-cache.o: ../cups/transcode.h thread-private.h
-pwg-media.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-pwg-media.o: array.h language.h string-private.h ../config.h debug-private.h
-pwg-media.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-pwg-media.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-pwg-media.o: ipp-private.h ../cups/ipp.h language-private.h
-pwg-media.o: ../cups/transcode.h thread-private.h
-request.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-request.o: array.h language.h string-private.h ../config.h debug-private.h
-request.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-request.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-request.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-request.o: thread-private.h
-sidechannel.o: sidechannel.h versioning.h string-private.h ../config.h
-sidechannel.o: debug-private.h ../cups/versioning.h
-snmp.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-snmp.o: array.h language.h string-private.h ../config.h debug-private.h
-snmp.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-snmp.o: http-private.h ../cups/http.h md5-private.h ipp-private.h
-snmp.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-snmp.o: snmp-private.h
-snprintf.o: string-private.h ../config.h
-string.o: string-private.h ../config.h debug-private.h ../cups/versioning.h
-string.o: thread-private.h array.h versioning.h
-tempfile.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-tempfile.o: array.h language.h string-private.h ../config.h debug-private.h
-tempfile.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-tempfile.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-tempfile.o: ipp-private.h ../cups/ipp.h language-private.h
-tempfile.o: ../cups/transcode.h thread-private.h
-thread.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-thread.o: array.h language.h string-private.h ../config.h debug-private.h
-thread.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-thread.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-thread.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-thread.o: thread-private.h
-transcode.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-transcode.o: array.h language.h string-private.h ../config.h debug-private.h
-transcode.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-transcode.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-transcode.o: ipp-private.h ../cups/ipp.h language-private.h
-transcode.o: ../cups/transcode.h thread-private.h
-usersys.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-usersys.o: array.h language.h string-private.h ../config.h debug-private.h
-usersys.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-usersys.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-usersys.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-usersys.o: thread-private.h
-util.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-util.o: array.h language.h string-private.h ../config.h debug-private.h
-util.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-util.o: http-private.h ../cups/http.h md5-private.h ipp-private.h
-util.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-testadmin.o: adminutil.h cups.h string-private.h ../config.h
-testarray.o: string-private.h ../config.h debug-private.h
-testarray.o: ../cups/versioning.h array.h versioning.h dir.h
-testconflicts.o: cups.h ppd.h array.h versioning.h file.h string-private.h
-testconflicts.o: ../config.h
-testcups.o: string-private.h ../config.h cups.h ppd.h array.h versioning.h
-testcups.o: file.h
-testfile.o: string-private.h ../config.h debug-private.h ../cups/versioning.h
-testfile.o: file.h versioning.h
-testhttp.o: string-private.h ../config.h http-private.h ../cups/http.h
-testhttp.o: md5-private.h ipp-private.h ../cups/ipp.h
-testi18n.o: string-private.h ../config.h language-private.h
-testi18n.o: ../cups/transcode.h language.h array.h versioning.h
-testipp.o: file.h versioning.h string-private.h ../config.h ipp-private.h
-testipp.o: ../cups/ipp.h
-testoptions.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-testoptions.o: array.h language.h string-private.h ../config.h
-testoptions.o: debug-private.h ../cups/versioning.h ppd-private.h
-testoptions.o: ../cups/ppd.h cups.h pwg-private.h http-private.h
-testoptions.o: ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h
-testoptions.o: language-private.h ../cups/transcode.h thread-private.h
-testlang.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-testlang.o: array.h language.h string-private.h ../config.h debug-private.h
-testlang.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-testlang.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-testlang.o: ipp-private.h ../cups/ipp.h language-private.h
-testlang.o: ../cups/transcode.h thread-private.h
-testppd.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-testppd.o: array.h language.h string-private.h ../config.h debug-private.h
-testppd.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-testppd.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-testppd.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-testppd.o: thread-private.h
-testpwg.o: ppd-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-testpwg.o: array.h language.h ../cups/ppd.h cups.h pwg-private.h
-testpwg.o: file-private.h cups-private.h string-private.h ../config.h
-testpwg.o: debug-private.h ../cups/versioning.h http-private.h ../cups/http.h
-testpwg.o: md5-private.h ipp-private.h ../cups/ipp.h language-private.h
-testpwg.o: ../cups/transcode.h thread-private.h
-testsnmp.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-testsnmp.o: array.h language.h string-private.h ../config.h debug-private.h
-testsnmp.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-testsnmp.o: pwg-private.h http-private.h ../cups/http.h md5-private.h
-testsnmp.o: ipp-private.h ../cups/ipp.h language-private.h
-testsnmp.o: ../cups/transcode.h thread-private.h snmp-private.h
-# DO NOT DELETE
-
-adminutil.32.o: adminutil.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-adminutil.32.o: adminutil.c array.h language.h string-private.h ../config.h debug-private.h
-adminutil.32.o: adminutil.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-adminutil.32.o: adminutil.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-adminutil.32.o: adminutil.c ipp-private.h ../cups/ipp.h language-private.h
-adminutil.32.o: adminutil.c ../cups/transcode.h thread-private.h adminutil.h
-array.32.o: array.c string-private.h ../config.h debug-private.h ../cups/versioning.h
-array.32.o: array.c array-private.h array.h versioning.h
-attr.32.o: attr.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-attr.32.o: attr.c array.h language.h string-private.h ../config.h debug-private.h
-attr.32.o: attr.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-attr.32.o: attr.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-attr.32.o: attr.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-auth.32.o: auth.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-auth.32.o: auth.c array.h language.h string-private.h ../config.h debug-private.h
-auth.32.o: auth.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-auth.32.o: auth.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-auth.32.o: auth.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-backchannel.32.o: backchannel.c cups.h
-backend.32.o: backend.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-backend.32.o: backend.c array.h language.h string-private.h ../config.h debug-private.h
-backend.32.o: backend.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-backend.32.o: backend.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-backend.32.o: backend.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-backend.32.o: backend.c thread-private.h backend.h
-conflicts.32.o: conflicts.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-conflicts.32.o: conflicts.c array.h language.h string-private.h ../config.h debug-private.h
-conflicts.32.o: conflicts.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-conflicts.32.o: conflicts.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-conflicts.32.o: conflicts.c ipp-private.h ../cups/ipp.h language-private.h
-conflicts.32.o: conflicts.c ../cups/transcode.h thread-private.h
-custom.32.o: custom.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-custom.32.o: custom.c array.h language.h string-private.h ../config.h debug-private.h
-custom.32.o: custom.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-custom.32.o: custom.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-custom.32.o: custom.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-custom.32.o: custom.c thread-private.h
-debug.32.o: debug.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-debug.32.o: debug.c array.h language.h string-private.h ../config.h debug-private.h
-debug.32.o: debug.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-debug.32.o: debug.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-debug.32.o: debug.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-debug.32.o: debug.c thread-private.h
-dest.32.o: dest.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-dest.32.o: dest.c array.h language.h string-private.h ../config.h debug-private.h
-dest.32.o: dest.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-dest.32.o: dest.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-dest.32.o: dest.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-dir.32.o: dir.c string-private.h ../config.h debug-private.h ../cups/versioning.h
-dir.32.o: dir.c dir.h versioning.h
-emit.32.o: emit.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-emit.32.o: emit.c array.h language.h string-private.h ../config.h debug-private.h
-emit.32.o: emit.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-emit.32.o: emit.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-emit.32.o: emit.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-encode.32.o: encode.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-encode.32.o: encode.c array.h language.h string-private.h ../config.h debug-private.h
-encode.32.o: encode.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-encode.32.o: encode.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-encode.32.o: encode.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-encode.32.o: encode.c thread-private.h
-file.32.o: file.c file-private.h cups-private.h ../cups/cups.h file.h versioning.h
-file.32.o: file.c ipp.h http.h array.h language.h string-private.h ../config.h
-file.32.o: file.c debug-private.h ../cups/versioning.h ppd-private.h ../cups/ppd.h
-file.32.o: file.c cups.h pwg-private.h http-private.h ../cups/http.h md5-private.h
-file.32.o: file.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-file.32.o: file.c thread-private.h
-getdevices.32.o: getdevices.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-getdevices.32.o: getdevices.c array.h language.h string-private.h ../config.h debug-private.h
-getdevices.32.o: getdevices.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-getdevices.32.o: getdevices.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-getdevices.32.o: getdevices.c ipp-private.h ../cups/ipp.h language-private.h
-getdevices.32.o: getdevices.c ../cups/transcode.h thread-private.h
-getifaddrs.32.o: getifaddrs.c http-private.h ../config.h ../cups/http.h md5-private.h
-getifaddrs.32.o: getifaddrs.c ipp-private.h ../cups/ipp.h
-getputfile.32.o: getputfile.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-getputfile.32.o: getputfile.c array.h language.h string-private.h ../config.h debug-private.h
-getputfile.32.o: getputfile.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-getputfile.32.o: getputfile.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-getputfile.32.o: getputfile.c ipp-private.h ../cups/ipp.h language-private.h
-getputfile.32.o: getputfile.c ../cups/transcode.h thread-private.h
-globals.32.o: globals.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-globals.32.o: globals.c array.h language.h string-private.h ../config.h debug-private.h
-globals.32.o: globals.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-globals.32.o: globals.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-globals.32.o: globals.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-globals.32.o: globals.c thread-private.h
-http.32.o: http.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-http.32.o: http.c array.h language.h string-private.h ../config.h debug-private.h
-http.32.o: http.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-http.32.o: http.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-http.32.o: http.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-http-addr.32.o: http-addr.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-http-addr.32.o: http-addr.c array.h language.h string-private.h ../config.h debug-private.h
-http-addr.32.o: http-addr.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-http-addr.32.o: http-addr.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-http-addr.32.o: http-addr.c ipp-private.h ../cups/ipp.h language-private.h
-http-addr.32.o: http-addr.c ../cups/transcode.h thread-private.h
-http-addrlist.32.o: http-addrlist.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h
-http-addrlist.32.o: http-addrlist.c http.h array.h language.h string-private.h ../config.h
-http-addrlist.32.o: http-addrlist.c debug-private.h ../cups/versioning.h ppd-private.h
-http-addrlist.32.o: http-addrlist.c ../cups/ppd.h cups.h pwg-private.h http-private.h
-http-addrlist.32.o: http-addrlist.c ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h
-http-addrlist.32.o: http-addrlist.c language-private.h ../cups/transcode.h thread-private.h
-http-support.32.o: http-support.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h
-http-support.32.o: http-support.c http.h array.h language.h string-private.h ../config.h
-http-support.32.o: http-support.c debug-private.h ../cups/versioning.h ppd-private.h
-http-support.32.o: http-support.c ../cups/ppd.h cups.h pwg-private.h http-private.h
-http-support.32.o: http-support.c ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h
-http-support.32.o: http-support.c language-private.h ../cups/transcode.h thread-private.h
-ipp.32.o: ipp.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h array.h
-ipp.32.o: ipp.c language.h string-private.h ../config.h debug-private.h
-ipp.32.o: ipp.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-ipp.32.o: ipp.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-ipp.32.o: ipp.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-ipp-support.32.o: ipp-support.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-ipp-support.32.o: ipp-support.c array.h language.h string-private.h ../config.h
-ipp-support.32.o: ipp-support.c debug-private.h ../cups/versioning.h ppd-private.h
-ipp-support.32.o: ipp-support.c ../cups/ppd.h cups.h pwg-private.h http-private.h
-ipp-support.32.o: ipp-support.c ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h
-ipp-support.32.o: ipp-support.c language-private.h ../cups/transcode.h thread-private.h
-langprintf.32.o: langprintf.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-langprintf.32.o: langprintf.c array.h language.h string-private.h ../config.h debug-private.h
-langprintf.32.o: langprintf.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-langprintf.32.o: langprintf.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-langprintf.32.o: langprintf.c ipp-private.h ../cups/ipp.h language-private.h
-langprintf.32.o: langprintf.c ../cups/transcode.h thread-private.h
-language.32.o: language.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-language.32.o: language.c array.h language.h string-private.h ../config.h debug-private.h
-language.32.o: language.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-language.32.o: language.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-language.32.o: language.c ipp-private.h ../cups/ipp.h language-private.h
-language.32.o: language.c ../cups/transcode.h thread-private.h
-localize.32.o: localize.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-localize.32.o: localize.c array.h language.h string-private.h ../config.h debug-private.h
-localize.32.o: localize.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-localize.32.o: localize.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-localize.32.o: localize.c ipp-private.h ../cups/ipp.h language-private.h
-localize.32.o: localize.c ../cups/transcode.h thread-private.h
-mark.32.o: mark.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-mark.32.o: mark.c array.h language.h string-private.h ../config.h debug-private.h
-mark.32.o: mark.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-mark.32.o: mark.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-mark.32.o: mark.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-md5.32.o: md5.c md5-private.h string-private.h ../config.h
-md5passwd.32.o: md5passwd.c http-private.h ../config.h ../cups/http.h md5-private.h
-md5passwd.32.o: md5passwd.c ipp-private.h ../cups/ipp.h string-private.h
-notify.32.o: notify.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-notify.32.o: notify.c array.h language.h string-private.h ../config.h debug-private.h
-notify.32.o: notify.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-notify.32.o: notify.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-notify.32.o: notify.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-notify.32.o: notify.c thread-private.h
-options.32.o: options.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-options.32.o: options.c array.h language.h string-private.h ../config.h debug-private.h
-options.32.o: options.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-options.32.o: options.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-options.32.o: options.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-options.32.o: options.c thread-private.h
-page.32.o: page.c string-private.h ../config.h debug-private.h ../cups/versioning.h
-page.32.o: page.c ppd.h cups.h array.h versioning.h file.h
-ppd.32.o: ppd.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h array.h
-ppd.32.o: ppd.c language.h string-private.h ../config.h debug-private.h
-ppd.32.o: ppd.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-ppd.32.o: ppd.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-ppd.32.o: ppd.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-ppd-cache.32.o: ppd-cache.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-ppd-cache.32.o: ppd-cache.c array.h language.h string-private.h ../config.h debug-private.h
-ppd-cache.32.o: ppd-cache.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-ppd-cache.32.o: ppd-cache.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-ppd-cache.32.o: ppd-cache.c ipp-private.h ../cups/ipp.h language-private.h
-ppd-cache.32.o: ppd-cache.c ../cups/transcode.h thread-private.h
-pwg-media.32.o: pwg-media.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-pwg-media.32.o: pwg-media.c array.h language.h string-private.h ../config.h debug-private.h
-pwg-media.32.o: pwg-media.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-pwg-media.32.o: pwg-media.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-pwg-media.32.o: pwg-media.c ipp-private.h ../cups/ipp.h language-private.h
-pwg-media.32.o: pwg-media.c ../cups/transcode.h thread-private.h
-request.32.o: request.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-request.32.o: request.c array.h language.h string-private.h ../config.h debug-private.h
-request.32.o: request.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-request.32.o: request.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-request.32.o: request.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-request.32.o: request.c thread-private.h
-sidechannel.32.o: sidechannel.c sidechannel.h versioning.h string-private.h ../config.h
-sidechannel.32.o: sidechannel.c debug-private.h ../cups/versioning.h
-snmp.32.o: snmp.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-snmp.32.o: snmp.c array.h language.h string-private.h ../config.h debug-private.h
-snmp.32.o: snmp.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-snmp.32.o: snmp.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-snmp.32.o: snmp.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-snmp.32.o: snmp.c snmp-private.h
-snprintf.32.o: snprintf.c string-private.h ../config.h
-string.32.o: string.c string-private.h ../config.h debug-private.h ../cups/versioning.h
-string.32.o: string.c thread-private.h array.h versioning.h
-tempfile.32.o: tempfile.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-tempfile.32.o: tempfile.c array.h language.h string-private.h ../config.h debug-private.h
-tempfile.32.o: tempfile.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-tempfile.32.o: tempfile.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-tempfile.32.o: tempfile.c ipp-private.h ../cups/ipp.h language-private.h
-tempfile.32.o: tempfile.c ../cups/transcode.h thread-private.h
-thread.32.o: thread.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-thread.32.o: thread.c array.h language.h string-private.h ../config.h debug-private.h
-thread.32.o: thread.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-thread.32.o: thread.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-thread.32.o: thread.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-thread.32.o: thread.c thread-private.h
-transcode.32.o: transcode.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-transcode.32.o: transcode.c array.h language.h string-private.h ../config.h debug-private.h
-transcode.32.o: transcode.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-transcode.32.o: transcode.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-transcode.32.o: transcode.c ipp-private.h ../cups/ipp.h language-private.h
-transcode.32.o: transcode.c ../cups/transcode.h thread-private.h
-usersys.32.o: usersys.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-usersys.32.o: usersys.c array.h language.h string-private.h ../config.h debug-private.h
-usersys.32.o: usersys.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-usersys.32.o: usersys.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-usersys.32.o: usersys.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-usersys.32.o: usersys.c thread-private.h
-util.32.o: util.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-util.32.o: util.c array.h language.h string-private.h ../config.h debug-private.h
-util.32.o: util.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-util.32.o: util.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-util.32.o: util.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-testadmin.32.o: testadmin.c adminutil.h cups.h string-private.h ../config.h
-testarray.32.o: testarray.c string-private.h ../config.h debug-private.h
-testarray.32.o: testarray.c ../cups/versioning.h array.h versioning.h dir.h
-testconflicts.32.o: testconflicts.c cups.h ppd.h array.h versioning.h file.h string-private.h
-testconflicts.32.o: testconflicts.c ../config.h
-testcups.32.o: testcups.c string-private.h ../config.h cups.h ppd.h array.h versioning.h
-testcups.32.o: testcups.c file.h
-testfile.32.o: testfile.c string-private.h ../config.h debug-private.h ../cups/versioning.h
-testfile.32.o: testfile.c file.h versioning.h
-testhttp.32.o: testhttp.c string-private.h ../config.h http-private.h ../cups/http.h
-testhttp.32.o: testhttp.c md5-private.h ipp-private.h ../cups/ipp.h
-testi18n.32.o: testi18n.c string-private.h ../config.h language-private.h
-testi18n.32.o: testi18n.c ../cups/transcode.h language.h array.h versioning.h
-testipp.32.o: testipp.c file.h versioning.h string-private.h ../config.h ipp-private.h
-testipp.32.o: testipp.c ../cups/ipp.h
-testoptions.32.o: testoptions.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-testoptions.32.o: testoptions.c array.h language.h string-private.h ../config.h
-testoptions.32.o: testoptions.c debug-private.h ../cups/versioning.h ppd-private.h
-testoptions.32.o: testoptions.c ../cups/ppd.h cups.h pwg-private.h http-private.h
-testoptions.32.o: testoptions.c ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h
-testoptions.32.o: testoptions.c language-private.h ../cups/transcode.h thread-private.h
-testlang.32.o: testlang.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-testlang.32.o: testlang.c array.h language.h string-private.h ../config.h debug-private.h
-testlang.32.o: testlang.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-testlang.32.o: testlang.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-testlang.32.o: testlang.c ipp-private.h ../cups/ipp.h language-private.h
-testlang.32.o: testlang.c ../cups/transcode.h thread-private.h
-testppd.32.o: testppd.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-testppd.32.o: testppd.c array.h language.h string-private.h ../config.h debug-private.h
-testppd.32.o: testppd.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-testppd.32.o: testppd.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-testppd.32.o: testppd.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-testppd.32.o: testppd.c thread-private.h
-testpwg.32.o: testpwg.c ppd-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-testpwg.32.o: testpwg.c array.h language.h ../cups/ppd.h cups.h pwg-private.h
-testpwg.32.o: testpwg.c file-private.h cups-private.h string-private.h ../config.h
-testpwg.32.o: testpwg.c debug-private.h ../cups/versioning.h http-private.h ../cups/http.h
-testpwg.32.o: testpwg.c md5-private.h ipp-private.h ../cups/ipp.h language-private.h
-testpwg.32.o: testpwg.c ../cups/transcode.h thread-private.h
-testsnmp.32.o: testsnmp.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-testsnmp.32.o: testsnmp.c array.h language.h string-private.h ../config.h debug-private.h
-testsnmp.32.o: testsnmp.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-testsnmp.32.o: testsnmp.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-testsnmp.32.o: testsnmp.c ipp-private.h ../cups/ipp.h language-private.h
-testsnmp.32.o: testsnmp.c ../cups/transcode.h thread-private.h snmp-private.h
-# DO NOT DELETE
-
-adminutil.64.o: adminutil.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-adminutil.64.o: adminutil.c array.h language.h string-private.h ../config.h debug-private.h
-adminutil.64.o: adminutil.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-adminutil.64.o: adminutil.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-adminutil.64.o: adminutil.c ipp-private.h ../cups/ipp.h language-private.h
-adminutil.64.o: adminutil.c ../cups/transcode.h thread-private.h adminutil.h
-array.64.o: array.c string-private.h ../config.h debug-private.h ../cups/versioning.h
-array.64.o: array.c array-private.h array.h versioning.h
-attr.64.o: attr.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-attr.64.o: attr.c array.h language.h string-private.h ../config.h debug-private.h
-attr.64.o: attr.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-attr.64.o: attr.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-attr.64.o: attr.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-auth.64.o: auth.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-auth.64.o: auth.c array.h language.h string-private.h ../config.h debug-private.h
-auth.64.o: auth.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-auth.64.o: auth.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-auth.64.o: auth.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-backchannel.64.o: backchannel.c cups.h
-backend.64.o: backend.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-backend.64.o: backend.c array.h language.h string-private.h ../config.h debug-private.h
-backend.64.o: backend.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-backend.64.o: backend.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-backend.64.o: backend.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-backend.64.o: backend.c thread-private.h backend.h
-conflicts.64.o: conflicts.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-conflicts.64.o: conflicts.c array.h language.h string-private.h ../config.h debug-private.h
-conflicts.64.o: conflicts.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-conflicts.64.o: conflicts.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-conflicts.64.o: conflicts.c ipp-private.h ../cups/ipp.h language-private.h
-conflicts.64.o: conflicts.c ../cups/transcode.h thread-private.h
-custom.64.o: custom.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-custom.64.o: custom.c array.h language.h string-private.h ../config.h debug-private.h
-custom.64.o: custom.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-custom.64.o: custom.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-custom.64.o: custom.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-custom.64.o: custom.c thread-private.h
-debug.64.o: debug.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-debug.64.o: debug.c array.h language.h string-private.h ../config.h debug-private.h
-debug.64.o: debug.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-debug.64.o: debug.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-debug.64.o: debug.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-debug.64.o: debug.c thread-private.h
-dest.64.o: dest.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-dest.64.o: dest.c array.h language.h string-private.h ../config.h debug-private.h
-dest.64.o: dest.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-dest.64.o: dest.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-dest.64.o: dest.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-dir.64.o: dir.c string-private.h ../config.h debug-private.h ../cups/versioning.h
-dir.64.o: dir.c dir.h versioning.h
-emit.64.o: emit.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-emit.64.o: emit.c array.h language.h string-private.h ../config.h debug-private.h
-emit.64.o: emit.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-emit.64.o: emit.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-emit.64.o: emit.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-encode.64.o: encode.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-encode.64.o: encode.c array.h language.h string-private.h ../config.h debug-private.h
-encode.64.o: encode.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-encode.64.o: encode.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-encode.64.o: encode.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-encode.64.o: encode.c thread-private.h
-file.64.o: file.c file-private.h cups-private.h ../cups/cups.h file.h versioning.h
-file.64.o: file.c ipp.h http.h array.h language.h string-private.h ../config.h
-file.64.o: file.c debug-private.h ../cups/versioning.h ppd-private.h ../cups/ppd.h
-file.64.o: file.c cups.h pwg-private.h http-private.h ../cups/http.h md5-private.h
-file.64.o: file.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-file.64.o: file.c thread-private.h
-getdevices.64.o: getdevices.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-getdevices.64.o: getdevices.c array.h language.h string-private.h ../config.h debug-private.h
-getdevices.64.o: getdevices.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-getdevices.64.o: getdevices.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-getdevices.64.o: getdevices.c ipp-private.h ../cups/ipp.h language-private.h
-getdevices.64.o: getdevices.c ../cups/transcode.h thread-private.h
-getifaddrs.64.o: getifaddrs.c http-private.h ../config.h ../cups/http.h md5-private.h
-getifaddrs.64.o: getifaddrs.c ipp-private.h ../cups/ipp.h
-getputfile.64.o: getputfile.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-getputfile.64.o: getputfile.c array.h language.h string-private.h ../config.h debug-private.h
-getputfile.64.o: getputfile.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-getputfile.64.o: getputfile.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-getputfile.64.o: getputfile.c ipp-private.h ../cups/ipp.h language-private.h
-getputfile.64.o: getputfile.c ../cups/transcode.h thread-private.h
-globals.64.o: globals.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-globals.64.o: globals.c array.h language.h string-private.h ../config.h debug-private.h
-globals.64.o: globals.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-globals.64.o: globals.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-globals.64.o: globals.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-globals.64.o: globals.c thread-private.h
-http.64.o: http.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-http.64.o: http.c array.h language.h string-private.h ../config.h debug-private.h
-http.64.o: http.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-http.64.o: http.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-http.64.o: http.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-http-addr.64.o: http-addr.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-http-addr.64.o: http-addr.c array.h language.h string-private.h ../config.h debug-private.h
-http-addr.64.o: http-addr.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-http-addr.64.o: http-addr.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-http-addr.64.o: http-addr.c ipp-private.h ../cups/ipp.h language-private.h
-http-addr.64.o: http-addr.c ../cups/transcode.h thread-private.h
-http-addrlist.64.o: http-addrlist.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h
-http-addrlist.64.o: http-addrlist.c http.h array.h language.h string-private.h ../config.h
-http-addrlist.64.o: http-addrlist.c debug-private.h ../cups/versioning.h ppd-private.h
-http-addrlist.64.o: http-addrlist.c ../cups/ppd.h cups.h pwg-private.h http-private.h
-http-addrlist.64.o: http-addrlist.c ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h
-http-addrlist.64.o: http-addrlist.c language-private.h ../cups/transcode.h thread-private.h
-http-support.64.o: http-support.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h
-http-support.64.o: http-support.c http.h array.h language.h string-private.h ../config.h
-http-support.64.o: http-support.c debug-private.h ../cups/versioning.h ppd-private.h
-http-support.64.o: http-support.c ../cups/ppd.h cups.h pwg-private.h http-private.h
-http-support.64.o: http-support.c ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h
-http-support.64.o: http-support.c language-private.h ../cups/transcode.h thread-private.h
-ipp.64.o: ipp.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h array.h
-ipp.64.o: ipp.c language.h string-private.h ../config.h debug-private.h
-ipp.64.o: ipp.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-ipp.64.o: ipp.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-ipp.64.o: ipp.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-ipp-support.64.o: ipp-support.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-ipp-support.64.o: ipp-support.c array.h language.h string-private.h ../config.h
-ipp-support.64.o: ipp-support.c debug-private.h ../cups/versioning.h ppd-private.h
-ipp-support.64.o: ipp-support.c ../cups/ppd.h cups.h pwg-private.h http-private.h
-ipp-support.64.o: ipp-support.c ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h
-ipp-support.64.o: ipp-support.c language-private.h ../cups/transcode.h thread-private.h
-langprintf.64.o: langprintf.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-langprintf.64.o: langprintf.c array.h language.h string-private.h ../config.h debug-private.h
-langprintf.64.o: langprintf.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-langprintf.64.o: langprintf.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-langprintf.64.o: langprintf.c ipp-private.h ../cups/ipp.h language-private.h
-langprintf.64.o: langprintf.c ../cups/transcode.h thread-private.h
-language.64.o: language.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-language.64.o: language.c array.h language.h string-private.h ../config.h debug-private.h
-language.64.o: language.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-language.64.o: language.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-language.64.o: language.c ipp-private.h ../cups/ipp.h language-private.h
-language.64.o: language.c ../cups/transcode.h thread-private.h
-localize.64.o: localize.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-localize.64.o: localize.c array.h language.h string-private.h ../config.h debug-private.h
-localize.64.o: localize.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-localize.64.o: localize.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-localize.64.o: localize.c ipp-private.h ../cups/ipp.h language-private.h
-localize.64.o: localize.c ../cups/transcode.h thread-private.h
-mark.64.o: mark.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-mark.64.o: mark.c array.h language.h string-private.h ../config.h debug-private.h
-mark.64.o: mark.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-mark.64.o: mark.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-mark.64.o: mark.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-md5.64.o: md5.c md5-private.h string-private.h ../config.h
-md5passwd.64.o: md5passwd.c http-private.h ../config.h ../cups/http.h md5-private.h
-md5passwd.64.o: md5passwd.c ipp-private.h ../cups/ipp.h string-private.h
-notify.64.o: notify.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-notify.64.o: notify.c array.h language.h string-private.h ../config.h debug-private.h
-notify.64.o: notify.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-notify.64.o: notify.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-notify.64.o: notify.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-notify.64.o: notify.c thread-private.h
-options.64.o: options.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-options.64.o: options.c array.h language.h string-private.h ../config.h debug-private.h
-options.64.o: options.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-options.64.o: options.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-options.64.o: options.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-options.64.o: options.c thread-private.h
-page.64.o: page.c string-private.h ../config.h debug-private.h ../cups/versioning.h
-page.64.o: page.c ppd.h cups.h array.h versioning.h file.h
-ppd.64.o: ppd.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h array.h
-ppd.64.o: ppd.c language.h string-private.h ../config.h debug-private.h
-ppd.64.o: ppd.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-ppd.64.o: ppd.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-ppd.64.o: ppd.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-ppd-cache.64.o: ppd-cache.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-ppd-cache.64.o: ppd-cache.c array.h language.h string-private.h ../config.h debug-private.h
-ppd-cache.64.o: ppd-cache.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-ppd-cache.64.o: ppd-cache.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-ppd-cache.64.o: ppd-cache.c ipp-private.h ../cups/ipp.h language-private.h
-ppd-cache.64.o: ppd-cache.c ../cups/transcode.h thread-private.h
-pwg-media.64.o: pwg-media.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-pwg-media.64.o: pwg-media.c array.h language.h string-private.h ../config.h debug-private.h
-pwg-media.64.o: pwg-media.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-pwg-media.64.o: pwg-media.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-pwg-media.64.o: pwg-media.c ipp-private.h ../cups/ipp.h language-private.h
-pwg-media.64.o: pwg-media.c ../cups/transcode.h thread-private.h
-request.64.o: request.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-request.64.o: request.c array.h language.h string-private.h ../config.h debug-private.h
-request.64.o: request.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-request.64.o: request.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-request.64.o: request.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-request.64.o: request.c thread-private.h
-sidechannel.64.o: sidechannel.c sidechannel.h versioning.h string-private.h ../config.h
-sidechannel.64.o: sidechannel.c debug-private.h ../cups/versioning.h
-snmp.64.o: snmp.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-snmp.64.o: snmp.c array.h language.h string-private.h ../config.h debug-private.h
-snmp.64.o: snmp.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-snmp.64.o: snmp.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-snmp.64.o: snmp.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-snmp.64.o: snmp.c snmp-private.h
-snprintf.64.o: snprintf.c string-private.h ../config.h
-string.64.o: string.c string-private.h ../config.h debug-private.h ../cups/versioning.h
-string.64.o: string.c thread-private.h array.h versioning.h
-tempfile.64.o: tempfile.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-tempfile.64.o: tempfile.c array.h language.h string-private.h ../config.h debug-private.h
-tempfile.64.o: tempfile.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-tempfile.64.o: tempfile.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-tempfile.64.o: tempfile.c ipp-private.h ../cups/ipp.h language-private.h
-tempfile.64.o: tempfile.c ../cups/transcode.h thread-private.h
-thread.64.o: thread.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-thread.64.o: thread.c array.h language.h string-private.h ../config.h debug-private.h
-thread.64.o: thread.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-thread.64.o: thread.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-thread.64.o: thread.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-thread.64.o: thread.c thread-private.h
-transcode.64.o: transcode.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-transcode.64.o: transcode.c array.h language.h string-private.h ../config.h debug-private.h
-transcode.64.o: transcode.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-transcode.64.o: transcode.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-transcode.64.o: transcode.c ipp-private.h ../cups/ipp.h language-private.h
-transcode.64.o: transcode.c ../cups/transcode.h thread-private.h
-usersys.64.o: usersys.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-usersys.64.o: usersys.c array.h language.h string-private.h ../config.h debug-private.h
-usersys.64.o: usersys.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-usersys.64.o: usersys.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-usersys.64.o: usersys.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-usersys.64.o: usersys.c thread-private.h
-util.64.o: util.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-util.64.o: util.c array.h language.h string-private.h ../config.h debug-private.h
-util.64.o: util.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h
-util.64.o: util.c http-private.h ../cups/http.h md5-private.h ipp-private.h
-util.64.o: util.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h
-testadmin.64.o: testadmin.c adminutil.h cups.h string-private.h ../config.h
-testarray.64.o: testarray.c string-private.h ../config.h debug-private.h
-testarray.64.o: testarray.c ../cups/versioning.h array.h versioning.h dir.h
-testconflicts.64.o: testconflicts.c cups.h ppd.h array.h versioning.h file.h string-private.h
-testconflicts.64.o: testconflicts.c ../config.h
-testcups.64.o: testcups.c string-private.h ../config.h cups.h ppd.h array.h versioning.h
-testcups.64.o: testcups.c file.h
-testfile.64.o: testfile.c string-private.h ../config.h debug-private.h ../cups/versioning.h
-testfile.64.o: testfile.c file.h versioning.h
-testhttp.64.o: testhttp.c string-private.h ../config.h http-private.h ../cups/http.h
-testhttp.64.o: testhttp.c md5-private.h ipp-private.h ../cups/ipp.h
-testi18n.64.o: testi18n.c string-private.h ../config.h language-private.h
-testi18n.64.o: testi18n.c ../cups/transcode.h language.h array.h versioning.h
-testipp.64.o: testipp.c file.h versioning.h string-private.h ../config.h ipp-private.h
-testipp.64.o: testipp.c ../cups/ipp.h
-testoptions.64.o: testoptions.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-testoptions.64.o: testoptions.c array.h language.h string-private.h ../config.h
-testoptions.64.o: testoptions.c debug-private.h ../cups/versioning.h ppd-private.h
-testoptions.64.o: testoptions.c ../cups/ppd.h cups.h pwg-private.h http-private.h
-testoptions.64.o: testoptions.c ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h
-testoptions.64.o: testoptions.c language-private.h ../cups/transcode.h thread-private.h
-testlang.64.o: testlang.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-testlang.64.o: testlang.c array.h language.h string-private.h ../config.h debug-private.h
-testlang.64.o: testlang.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-testlang.64.o: testlang.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-testlang.64.o: testlang.c ipp-private.h ../cups/ipp.h language-private.h
-testlang.64.o: testlang.c ../cups/transcode.h thread-private.h
-testppd.64.o: testppd.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-testppd.64.o: testppd.c array.h language.h string-private.h ../config.h debug-private.h
-testppd.64.o: testppd.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-testppd.64.o: testppd.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-testppd.64.o: testppd.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h
-testppd.64.o: testppd.c thread-private.h
-testpwg.64.o: testpwg.c ppd-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-testpwg.64.o: testpwg.c array.h language.h ../cups/ppd.h cups.h pwg-private.h
-testpwg.64.o: testpwg.c file-private.h cups-private.h string-private.h ../config.h
-testpwg.64.o: testpwg.c debug-private.h ../cups/versioning.h http-private.h ../cups/http.h
-testpwg.64.o: testpwg.c md5-private.h ipp-private.h ../cups/ipp.h language-private.h
-testpwg.64.o: testpwg.c ../cups/transcode.h thread-private.h
-testsnmp.64.o: testsnmp.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h
-testsnmp.64.o: testsnmp.c array.h language.h string-private.h ../config.h debug-private.h
-testsnmp.64.o: testsnmp.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h
-testsnmp.64.o: testsnmp.c pwg-private.h http-private.h ../cups/http.h md5-private.h
-testsnmp.64.o: testsnmp.c ipp-private.h ../cups/ipp.h language-private.h
-testsnmp.64.o: testsnmp.c ../cups/transcode.h thread-private.h snmp-private.h
+adminutil.o: adminutil.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h adminutil.h \
+
+array.o: array.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ array-private.h ../cups/array.h
+attr.o: attr.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+auth.o: auth.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+backchannel.o: backchannel.c cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+
+backend.o: backend.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h backend.h
+conflicts.o: conflicts.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+custom.o: custom.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+debug.o: debug.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+dest.o: dest.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+dest-job.o: dest-job.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+dest-localization.o: dest-localization.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+dest-options.o: dest-options.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+dir.o: dir.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ dir.h \
+
+emit.o: emit.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+encode.o: encode.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+file.o: file.c file-private.h cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+getdevices.o: getdevices.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+getifaddrs.o: getifaddrs.c http-private.h ../config.h \
+ ../cups/http.h versioning.h array.h \
+ md5-private.h ipp-private.h ../cups/ipp.h \
+
+getputfile.o: getputfile.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+globals.o: globals.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+http.o: http.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+http-addr.o: http-addr.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+http-addrlist.o: http-addrlist.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+http-support.o: http-support.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+ipp.o: ipp.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+ipp-support.o: ipp-support.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+langprintf.o: langprintf.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+language.o: language.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+localize.o: localize.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+mark.o: mark.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+md5.o: md5.c md5-private.h string-private.h \
+ ../config.h \
+
+md5passwd.o: md5passwd.c http-private.h ../config.h \
+ ../cups/http.h versioning.h array.h \
+ md5-private.h ipp-private.h ../cups/ipp.h \
+ string-private.h
+notify.o: notify.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+options.o: options.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+page.o: page.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ ppd.h cups.h \
+ file.h ipp.h http.h array.h \
+ language.h
+ppd.o: ppd.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+ppd-cache.o: ppd-cache.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+pwg-media.o: pwg-media.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+request.o: request.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+sidechannel.o: sidechannel.c sidechannel.h versioning.h \
+ cups-private.h ../cups/cups.h \
+ file.h ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+snmp.o: snmp.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h snmp-private.h \
+
+snprintf.o: snprintf.c string-private.h \
+ ../config.h \
+
+string.o: string.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ thread-private.h \
+ array.h \
+
+tempfile.o: tempfile.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+thread.o: thread.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+transcode.o: transcode.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+usersys.o: usersys.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+util.o: util.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+testadmin.o: testadmin.c adminutil.h \
+ cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h
+testarray.o: testarray.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ array.h dir.h \
+
+testconflicts.o: testconflicts.c cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ ppd.h \
+ string-private.h \
+ ../config.h
+testcups.o: testcups.c string-private.h \
+ ../config.h \
+ cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h ppd.h
+testfile.o: testfile.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ file.h \
+
+testhttp.o: testhttp.c string-private.h \
+ ../config.h \
+ http-private.h \
+ ../cups/http.h versioning.h array.h \
+ md5-private.h ipp-private.h ../cups/ipp.h \
+
+testi18n.o: testi18n.c string-private.h \
+ ../config.h \
+ language-private.h ../cups/transcode.h \
+ language.h array.h versioning.h \
+
+testipp.o: testipp.c file.h versioning.h \
+ string-private.h \
+ ../config.h \
+ ipp-private.h ../cups/ipp.h http.h \
+ array.h \
+
+testoptions.o: testoptions.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+testlang.o: testlang.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+testppd.o: testppd.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+testpwg.o: testpwg.c ppd-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ ../cups/ppd.h \
+ pwg-private.h \
+ file-private.h cups-private.h string-private.h \
+ ../config.h debug-private.h http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+testsnmp.o: testsnmp.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h snmp-private.h
+adminutil.32.o: adminutil.c adminutil.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h adminutil.h \
+
+array.32.o: array.c array.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ array-private.h ../cups/array.h
+attr.32.o: attr.c attr.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+auth.32.o: auth.c auth.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+backchannel.32.o: backchannel.c backchannel.c cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+
+backend.32.o: backend.c backend.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h backend.h
+conflicts.32.o: conflicts.c conflicts.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+custom.32.o: custom.c custom.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+debug.32.o: debug.c debug.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+dest.32.o: dest.c dest.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+dest-job.32.o: dest-job.c dest-job.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+dest-localization.32.o: dest-localization.c dest-localization.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+dest-options.32.o: dest-options.c dest-options.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+dir.32.o: dir.c dir.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ dir.h \
+
+emit.32.o: emit.c emit.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+encode.32.o: encode.c encode.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+file.32.o: file.c file.c file-private.h cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+getdevices.32.o: getdevices.c getdevices.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+getifaddrs.32.o: getifaddrs.c getifaddrs.c http-private.h ../config.h \
+ ../cups/http.h versioning.h array.h \
+ md5-private.h ipp-private.h ../cups/ipp.h \
+
+getputfile.32.o: getputfile.c getputfile.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+globals.32.o: globals.c globals.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+http.32.o: http.c http.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+http-addr.32.o: http-addr.c http-addr.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+http-addrlist.32.o: http-addrlist.c http-addrlist.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+http-support.32.o: http-support.c http-support.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+ipp.32.o: ipp.c ipp.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+ipp-support.32.o: ipp-support.c ipp-support.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+langprintf.32.o: langprintf.c langprintf.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+language.32.o: language.c language.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+localize.32.o: localize.c localize.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+mark.32.o: mark.c mark.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+md5.32.o: md5.c md5.c md5-private.h string-private.h \
+ ../config.h \
+
+md5passwd.32.o: md5passwd.c md5passwd.c http-private.h ../config.h \
+ ../cups/http.h versioning.h array.h \
+ md5-private.h ipp-private.h ../cups/ipp.h \
+ string-private.h
+notify.32.o: notify.c notify.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+options.32.o: options.c options.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+page.32.o: page.c page.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ ppd.h cups.h \
+ file.h ipp.h http.h array.h \
+ language.h
+ppd.32.o: ppd.c ppd.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+ppd-cache.32.o: ppd-cache.c ppd-cache.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+pwg-media.32.o: pwg-media.c pwg-media.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+request.32.o: request.c request.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+sidechannel.32.o: sidechannel.c sidechannel.c sidechannel.h versioning.h \
+ cups-private.h ../cups/cups.h \
+ file.h ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+snmp.32.o: snmp.c snmp.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h snmp-private.h \
+
+snprintf.32.o: snprintf.c snprintf.c string-private.h \
+ ../config.h \
+
+string.32.o: string.c string.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ thread-private.h \
+ array.h \
+
+tempfile.32.o: tempfile.c tempfile.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+thread.32.o: thread.c thread.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+transcode.32.o: transcode.c transcode.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+usersys.32.o: usersys.c usersys.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+util.32.o: util.c util.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+testadmin.32.o: testadmin.c testadmin.c adminutil.h \
+ cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h
+testarray.32.o: testarray.c testarray.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ array.h dir.h \
+
+testconflicts.32.o: testconflicts.c testconflicts.c cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ ppd.h \
+ string-private.h \
+ ../config.h
+testcups.32.o: testcups.c testcups.c string-private.h \
+ ../config.h \
+ cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h ppd.h
+testfile.32.o: testfile.c testfile.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ file.h \
+
+testhttp.32.o: testhttp.c testhttp.c string-private.h \
+ ../config.h \
+ http-private.h \
+ ../cups/http.h versioning.h array.h \
+ md5-private.h ipp-private.h ../cups/ipp.h \
+
+testi18n.32.o: testi18n.c testi18n.c string-private.h \
+ ../config.h \
+ language-private.h ../cups/transcode.h \
+ language.h array.h versioning.h \
+
+testipp.32.o: testipp.c testipp.c file.h versioning.h \
+ string-private.h \
+ ../config.h \
+ ipp-private.h ../cups/ipp.h http.h \
+ array.h \
+
+testoptions.32.o: testoptions.c testoptions.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+testlang.32.o: testlang.c testlang.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+testppd.32.o: testppd.c testppd.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+testpwg.32.o: testpwg.c testpwg.c ppd-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ ../cups/ppd.h \
+ pwg-private.h \
+ file-private.h cups-private.h string-private.h \
+ ../config.h debug-private.h http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+testsnmp.32.o: testsnmp.c testsnmp.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h snmp-private.h
+adminutil.64.o: adminutil.c adminutil.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h adminutil.h \
+
+array.64.o: array.c array.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ array-private.h ../cups/array.h
+attr.64.o: attr.c attr.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+auth.64.o: auth.c auth.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+backchannel.64.o: backchannel.c backchannel.c cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+
+backend.64.o: backend.c backend.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h backend.h
+conflicts.64.o: conflicts.c conflicts.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+custom.64.o: custom.c custom.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+debug.64.o: debug.c debug.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+dest.64.o: dest.c dest.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+dest-job.64.o: dest-job.c dest-job.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+dest-localization.64.o: dest-localization.c dest-localization.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+dest-options.64.o: dest-options.c dest-options.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+dir.64.o: dir.c dir.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ dir.h \
+
+emit.64.o: emit.c emit.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+encode.64.o: encode.c encode.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+file.64.o: file.c file.c file-private.h cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+getdevices.64.o: getdevices.c getdevices.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+getifaddrs.64.o: getifaddrs.c getifaddrs.c http-private.h ../config.h \
+ ../cups/http.h versioning.h array.h \
+ md5-private.h ipp-private.h ../cups/ipp.h \
+
+getputfile.64.o: getputfile.c getputfile.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+globals.64.o: globals.c globals.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+http.64.o: http.c http.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+http-addr.64.o: http-addr.c http-addr.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+http-addrlist.64.o: http-addrlist.c http-addrlist.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+http-support.64.o: http-support.c http-support.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+ipp.64.o: ipp.c ipp.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+ipp-support.64.o: ipp-support.c ipp-support.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+langprintf.64.o: langprintf.c langprintf.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+language.64.o: language.c language.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+localize.64.o: localize.c localize.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+mark.64.o: mark.c mark.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+md5.64.o: md5.c md5.c md5-private.h string-private.h \
+ ../config.h \
+
+md5passwd.64.o: md5passwd.c md5passwd.c http-private.h ../config.h \
+ ../cups/http.h versioning.h array.h \
+ md5-private.h ipp-private.h ../cups/ipp.h \
+ string-private.h
+notify.64.o: notify.c notify.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+options.64.o: options.c options.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+page.64.o: page.c page.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ ppd.h cups.h \
+ file.h ipp.h http.h array.h \
+ language.h
+ppd.64.o: ppd.c ppd.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+ppd-cache.64.o: ppd-cache.c ppd-cache.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+pwg-media.64.o: pwg-media.c pwg-media.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+request.64.o: request.c request.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+sidechannel.64.o: sidechannel.c sidechannel.c sidechannel.h versioning.h \
+ cups-private.h ../cups/cups.h \
+ file.h ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+snmp.64.o: snmp.c snmp.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h snmp-private.h \
+
+snprintf.64.o: snprintf.c snprintf.c string-private.h \
+ ../config.h \
+
+string.64.o: string.c string.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ thread-private.h \
+ array.h \
+
+tempfile.64.o: tempfile.c tempfile.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+thread.64.o: thread.c thread.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+transcode.64.o: transcode.c transcode.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+usersys.64.o: usersys.c usersys.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+util.64.o: util.c util.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+testadmin.64.o: testadmin.c testadmin.c adminutil.h \
+ cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h
+testarray.64.o: testarray.c testarray.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ array.h dir.h \
+
+testconflicts.64.o: testconflicts.c testconflicts.c cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ ppd.h \
+ string-private.h \
+ ../config.h
+testcups.64.o: testcups.c testcups.c string-private.h \
+ ../config.h \
+ cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h ppd.h
+testfile.64.o: testfile.c testfile.c string-private.h \
+ ../config.h \
+ debug-private.h ../cups/versioning.h \
+ file.h \
+
+testhttp.64.o: testhttp.c testhttp.c string-private.h \
+ ../config.h \
+ http-private.h \
+ ../cups/http.h versioning.h array.h \
+ md5-private.h ipp-private.h ../cups/ipp.h \
+
+testi18n.64.o: testi18n.c testi18n.c string-private.h \
+ ../config.h \
+ language-private.h ../cups/transcode.h \
+ language.h array.h versioning.h \
+
+testipp.64.o: testipp.c testipp.c file.h versioning.h \
+ string-private.h \
+ ../config.h \
+ ipp-private.h ../cups/ipp.h http.h \
+ array.h \
+
+testoptions.64.o: testoptions.c testoptions.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+testlang.64.o: testlang.c testlang.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+testppd.64.o: testppd.c testppd.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h
+testpwg.64.o: testpwg.c testpwg.c ppd-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ ../cups/ppd.h \
+ pwg-private.h \
+ file-private.h cups-private.h string-private.h \
+ ../config.h debug-private.h http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h \
+
+testsnmp.64.o: testsnmp.c testsnmp.c cups-private.h ../cups/cups.h \
+ file.h versioning.h \
+ ipp.h http.h array.h \
+ language.h \
+ string-private.h \
+ ../config.h debug-private.h ppd-private.h ../cups/ppd.h pwg-private.h \
+ http-private.h \
+ md5-private.h ipp-private.h \
+ language-private.h \
+ ../cups/transcode.h thread-private.h snmp-private.h
diff --git a/cups/Makefile b/cups/Makefile
index be6bd4299..28e9466ad 100644
--- a/cups/Makefile
+++ b/cups/Makefile
@@ -3,7 +3,7 @@
#
# API library Makefile for CUPS.
#
-# Copyright 2007-2011 by Apple Inc.
+# Copyright 2007-2012 by Apple Inc.
# Copyright 1997-2006 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
@@ -32,6 +32,9 @@ LIBOBJS = \
custom.o \
debug.o \
dest.o \
+ dest-job.o \
+ dest-localization.o \
+ dest-options.o \
dir.o \
emit.o \
encode.o \
@@ -68,12 +71,7 @@ LIBOBJS = \
transcode.o \
usersys.o \
util.o
-LIB32OBJS = $(LIBOBJS:.o=.32.o)
-LIB64OBJS = $(LIBOBJS:.o=.64.o)
-OBJS = \
- $(LIBOBJS) \
- $(LIB32OBJS) \
- $(LIB64OBJS) \
+TESTOBJS = \
testadmin.o \
testarray.o \
testconflicts.o \
@@ -88,6 +86,14 @@ OBJS = \
testpwg.o \
testsnmp.o
+LIB32OBJS = $(LIBOBJS:.o=.32.o)
+LIB64OBJS = $(LIBOBJS:.o=.64.o)
+OBJS = \
+ $(LIBOBJS) \
+ $(LIB32OBJS) \
+ $(LIB64OBJS) \
+ $(TESTOBJS)
+
#
# Header files to install...
@@ -192,7 +198,7 @@ clean:
depend:
touch Dependencies.tmp
- makedepend -Y -I.. -fDependencies.tmp $(OBJS:.o=.c) >/dev/null 2>&1
+ makedepend -Y -I.. -fDependencies.tmp $(LIBOBJS:.o=.c) $(TESTOBJS:.o=.c) >/dev/null 2>&1
$(RM) Dependencies
cp Dependencies.tmp Dependencies
sed -E -e '1,$$s/^([^.]+)\.o:/\1\.32.o: \1\.c /' Dependencies.tmp >>Dependencies
diff --git a/cups/cups-private.h b/cups/cups-private.h
index 16f81ea0d..e2ae33741 100644
--- a/cups/cups-private.h
+++ b/cups/cups-private.h
@@ -3,7 +3,7 @@
*
* Private definitions for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
+ * Copyright 2007-2012 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -50,6 +50,14 @@ extern "C" {
* Types...
*/
+typedef struct _cups_buffer_s /**** Read/write buffer ****/
+{
+ struct _cups_buffer_s *next; /* Next buffer in list */
+ size_t size; /* Size of buffer */
+ char used, /* Is this buffer used? */
+ d[1]; /* Data buffer */
+} _cups_buffer_t;
+
typedef struct _cups_globals_s /**** CUPS global state data ****/
{
/* Multiple places... */
@@ -95,7 +103,7 @@ typedef struct _cups_globals_s /**** CUPS global state data ****/
/* ipp.c */
ipp_uchar_t ipp_date[11]; /* RFC-1903 date/time data */
- _ipp_buffer_t *ipp_buffers; /* Buffer list */
+ _cups_buffer_t *cups_buffers; /* Buffer list */
/* ipp-support.c */
int ipp_port; /* IPP port number */
@@ -138,7 +146,8 @@ typedef struct _cups_globals_s /**** CUPS global state data ****/
http_encryption_t encryption; /* Encryption setting */
char user[65], /* User name */
server[256], /* Server address */
- servername[256];/* Server hostname */
+ servername[256],/* Server hostname */
+ password[128]; /* Password for default callback */
cups_password_cb2_t password_cb; /* Password callback */
void *password_data; /* Password user data */
http_tls_credentials_t tls_credentials;
@@ -160,6 +169,40 @@ typedef struct _cups_globals_s /**** CUPS global state data ****/
/* PPD filename */
} _cups_globals_t;
+typedef struct _cups_media_db_s /* Media database */
+{
+ char *color, /* Media color, if any */
+ *key, /* Media key, if any */
+ *info, /* Media human-readable name, if any */
+ *size_name, /* Media PWG size name, if provided */
+ *source, /* Media source, if any */
+ *type; /* Media type, if any */
+ int width, /* Width in hundredths of millimeters */
+ length, /* Length in hundredths of
+ * millimeters */
+ bottom, /* Bottom margin in hundredths of
+ * millimeters */
+ left, /* Left margin in hundredths of
+ * millimeters */
+ right, /* Right margin in hundredths of
+ * millimeters */
+ top; /* Top margin in hundredths of
+ * millimeters */
+} _cups_media_db_t;
+
+struct _cups_dinfo_s /* Destination capability and status
+ * information */
+{
+ const char *uri; /* Printer URI */
+ char *resource; /* Resource path */
+ ipp_t *attrs; /* Printer attributes */
+ cups_array_t *constraints; /* Job constraints */
+ cups_array_t *localizations; /* Localization information */
+ cups_array_t *media_db; /* Media database */
+ _cups_media_db_t min_size, /* Minimum size */
+ max_size; /* Maximum size */
+};
+
/*
* Prototypes...
@@ -174,11 +217,17 @@ extern void _cupsAppleSetDefaultPrinter(CFStringRef name);
extern void _cupsAppleSetUseLastPrinter(int uselast);
# endif /* __APPLE__ */
+extern char *_cupsBufferGet(size_t size);
+extern void _cupsBufferRelease(char *b);
+
extern http_t *_cupsConnect(void);
extern int _cupsGet1284Values(const char *device_id,
cups_option_t **values);
+extern const char *_cupsGetDestResource(cups_dest_t *dest, char *resource,
+ size_t resourcesize);
extern int _cupsGetDests(http_t *http, ipp_op_t op,
- const char *name, cups_dest_t **dests);
+ const char *name, cups_dest_t **dests,
+ cups_ptype_t type, cups_ptype_t mask);
extern const char *_cupsGetPassword(const char *prompt);
extern void _cupsGlobalLock(void);
extern _cups_globals_t *_cupsGlobals(void);
diff --git a/cups/cups.h b/cups/cups.h
index bdfd3aeef..685e54452 100644
--- a/cups/cups.h
+++ b/cups/cups.h
@@ -3,7 +3,7 @@
*
* API definitions for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
+ * Copyright 2007-2012 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -52,37 +52,160 @@ extern "C" {
* Constants...
*/
-# define CUPS_VERSION 1.0599
-# define CUPS_VERSION_MAJOR 1
-# define CUPS_VERSION_MINOR 6
-# define CUPS_VERSION_PATCH -1
-
-# define CUPS_BC_FD 3 /* Back-channel file descriptor for select/poll */
-# define CUPS_DATE_ANY (time_t)-1
-# define CUPS_EXCLUDE_NONE (const char *)0
-# define CUPS_FORMAT_AUTO "application/octet-stream"
-# define CUPS_FORMAT_COMMAND "application/vnd.cups-command"
-# define CUPS_FORMAT_PDF "application/pdf"
-# define CUPS_FORMAT_POSTSCRIPT "application/postscript"
-# define CUPS_FORMAT_RAW "application/vnd.cups-raw"
-# define CUPS_FORMAT_TEXT "text/plain"
-# define CUPS_HTTP_DEFAULT (http_t *)0
-# define CUPS_INCLUDE_ALL (const char *)0
-# define CUPS_JOBID_ALL -1
-# define CUPS_JOBID_CURRENT 0
-# define CUPS_LENGTH_VARIABLE (ssize_t)0
-# define CUPS_TIMEOUT_DEFAULT 0
-# define CUPS_WHICHJOBS_ALL -1
-# define CUPS_WHICHJOBS_ACTIVE 0
-# define CUPS_WHICHJOBS_COMPLETED 1
+# define CUPS_VERSION 1.0599
+# define CUPS_VERSION_MAJOR 1
+# define CUPS_VERSION_MINOR 6
+# define CUPS_VERSION_PATCH -1
+
+# define CUPS_BC_FD 3
+ /* Back-channel file descriptor for
+ * select/poll */
+# define CUPS_DATE_ANY (time_t)-1
+# define CUPS_EXCLUDE_NONE (const char *)0
+# define CUPS_FORMAT_AUTO "application/octet-stream"
+# define CUPS_FORMAT_COMMAND "application/vnd.cups-command"
+# define CUPS_FORMAT_JPEG "image/jpeg"
+# define CUPS_FORMAT_PDF "application/pdf"
+# define CUPS_FORMAT_POSTSCRIPT "application/postscript"
+# define CUPS_FORMAT_RAW "application/vnd.cups-raw"
+# define CUPS_FORMAT_TEXT "text/plain"
+# define CUPS_HTTP_DEFAULT (http_t *)0
+# define CUPS_INCLUDE_ALL (const char *)0
+# define CUPS_JOBID_ALL -1
+# define CUPS_JOBID_CURRENT 0
+# define CUPS_LENGTH_VARIABLE (ssize_t)0
+# define CUPS_TIMEOUT_DEFAULT 0
+# define CUPS_WHICHJOBS_ALL -1
+# define CUPS_WHICHJOBS_ACTIVE 0
+# define CUPS_WHICHJOBS_COMPLETED 1
+
+/* Flags for cupsConnectDest and cupsEnumDests */
+# define CUPS_DEST_FLAGS_NONE 0x00
+ /* No flags are set */
+# define CUPS_DEST_FLAGS_UNCONNECTED 0x01
+ /* There is not connection */
+# define CUPS_DEST_FLAGS_MORE 0x02
+ /* There are more destinations */
+# define CUPS_DEST_FLAGS_REMOVED 0x04
+ /* The destination has gone away */
+# define CUPS_DEST_FLAGS_ERROR 0x08
+ /* An error occurred */
+# define CUPS_DEST_FLAGS_RESOLVING 0x10
+ /* The destination address is being
+ * resolved */
+# define CUPS_DEST_FLAGS_CONNECTING 0x20
+ /* A connection is being established */
+# define CUPS_DEST_FLAGS_CANCELED 0x40
+ /* Operation was canceled */
+
+/* Flags for cupsGetDestMediaByName/Size */
+# define CUPS_MEDIA_FLAGS_DEFAULT 0x00
+ /* Find the closest size supported by
+ * the printer */
+# define CUPS_MEDIA_FLAGS_BORDERLESS 0x01
+ /* Find a borderless size */
+# define CUPS_MEDIA_FLAGS_DUPLEX 0x02
+ /* Find a size compatible with 2-sided
+ * printing */
+# define CUPS_MEDIA_FLAGS_EXACT 0x04
+ /* Find an exact match for the size */
+# define CUPS_MEDIA_FLAGS_READY 0x08
+ /* If the printer supports media
+ * sensing, find the size amongst the
+ * "ready" media. */
+
+/* Options and values */
+# define CUPS_COPIES "copies"
+# define CUPS_COPIES_SUPPORTED "copies-supported"
+
+# define CUPS_FINISHINGS "finishings"
+# define CUPS_FINISHINGS_SUPPORTED "finishings-supported"
+
+# define CUPS_FINISHINGS_BIND "7"
+# define CUPS_FINISHINGS_COVER "6"
+# define CUPS_FINISHINGS_FOLD "10"
+# define CUPS_FINISHINGS_NONE "3"
+# define CUPS_FINISHINGS_PUNCH "5"
+# define CUPS_FINISHINGS_STAPLE "4"
+# define CUPS_FINISHINGS_TRIM "11"
+
+# define CUPS_MEDIA "media"
+# define CUPS_MEDIA_READY "media-ready"
+# define CUPS_MEDIA_SUPPORTED "media-supported"
+
+# define CUPS_MEDIA_3X5 "na_index-3x5_3x5in"
+# define CUPS_MEDIA_4X6 "na_index-4x6_4x6in"
+# define CUPS_MEDIA_5X7 "na_5x7_5x7in"
+# define CUPS_MEDIA_8X10 "na_govt-letter_8x10in"
+# define CUPS_MEDIA_A3 "iso_a3_297x420mm"
+# define CUPS_MEDIA_A4 "iso_a4_210x297mm"
+# define CUPS_MEDIA_A5 "iso_a5_148x210mm"
+# define CUPS_MEDIA_A6 "iso_a6_105x148mm"
+# define CUPS_MEDIA_ENV10 "na_number-10_4.125x9.5in"
+# define CUPS_MEDIA_ENVDL "iso_dl_110x220mm"
+# define CUPS_MEDIA_LEGAL "na_legal_8.5x14in"
+# define CUPS_MEDIA_LETTER "na_letter_8.5x11in"
+# define CUPS_MEDIA_PHOTO_L "oe_photo-l_3.5x5in"
+# define CUPS_MEDIA_SUPERBA3 "na_super-b_13x19in"
+# define CUPS_MEDIA_TABLOID "na_ledger_11x17in"
+
+# define CUPS_MEDIA_SOURCE "media-source"
+# define CUPS_MEDIA_SOURCE_SUPPORTED "media-source-supported"
+
+# define CUPS_MEDIA_SOURCE_AUTO "auto"
+# define CUPS_MEDIA_SOURCE_MANUAL "manual"
+
+# define CUPS_MEDIA_TYPE "media-type"
+# define CUPS_MEDIA_TYPE_SUPPORTED "media-type-supported"
+
+# define CUPS_MEDIA_TYPE_AUTO "auto"
+# define CUPS_MEDIA_TYPE_ENVELOPE "envelope"
+# define CUPS_MEDIA_TYPE_LABELS "labels"
+# define CUPS_MEDIA_TYPE_LETTERHEAD "stationery-letterhead"
+# define CUPS_MEDIA_TYPE_PHOTO "photographic"
+# define CUPS_MEDIA_TYPE_PHOTO_GLOSSY "photographic-glossy"
+# define CUPS_MEDIA_TYPE_PHOTO_MATTE "photographic-matte"
+# define CUPS_MEDIA_TYPE_PLAIN "stationery"
+# define CUPS_MEDIA_TYPE_TRANSPARENCY "transparency"
+
+# define CUPS_NUMBER_UP "number-up"
+# define CUPS_NUMBER_UP_SUPPORTED "number-up-supported"
+
+# define CUPS_ORIENTATION "orientation-requested"
+# define CUPS_ORIENTATION_SUPPORTED "orientation-requested-supported"
+
+# define CUPS_ORIENTATION_PORTRAIT "3"
+# define CUPS_ORIENTATION_LANDSCAPE "4"
+
+# define CUPS_PRINT_COLOR_MODE "print-color-mode"
+# define CUPS_PRINT_COLOR_MODE_SUPPORTED "print-color-mode-supported"
+
+# define CUPS_PRINT_COLOR_MODE_AUTO "auto"
+# define CUPS_PRINT_COLOR_MODE_MONOCHROME "monochrome"
+# define CUPS_PRINT_COLOR_MODE_COLOR "color"
+
+# define CUPS_PRINT_QUALITY "print-quality"
+# define CUPS_PRINT_QUALITY_SUPPORTED "print-quality-supported"
+
+# define CUPS_PRINT_QUALITY_DRAFT "3"
+# define CUPS_PRINT_QUALITY_NORMAL "4"
+# define CUPS_PRINT_QUALITY_HIGH "5"
+
+# define CUPS_SIDES "sides"
+# define CUPS_SIDES_SUPPORTED "sides-supported"
+
+# define CUPS_SIDES_ONE_SIDED "one-sided"
+# define CUPS_SIDES_TWO_SIDED_PORTRAIT "two-sided-long-edge"
+# define CUPS_SIDES_TWO_SIDED_LANDSCAPE "two-sided-short-edge"
/*
* Types and structures...
*/
-typedef unsigned cups_ptype_t; /**** Printer type/capability bits ****/
-enum cups_ptype_e /**** Printer type/capability bit constants ****/
+typedef unsigned cups_ptype_t; /* Printer type/capability bits */
+enum cups_ptype_e /* Printer type/capability bit
+ * constants */
{ /* Not a typedef'd enum so we can OR */
CUPS_PRINTER_LOCAL = 0x0000, /* Local printer or class */
CUPS_PRINTER_CLASS = 0x0001, /* Printer class */
@@ -101,18 +224,30 @@ enum cups_ptype_e /**** Printer type/capability bit constants ****/
CUPS_PRINTER_MEDIUM = 0x2000, /* Can do Tabloid/B/C/A3/A2 */
CUPS_PRINTER_LARGE = 0x4000, /* Can do D/E/A1/A0 */
CUPS_PRINTER_VARIABLE = 0x8000, /* Can do variable sizes */
- CUPS_PRINTER_IMPLICIT = 0x10000, /* Implicit class @private@ @since Deprecated@ */
+ CUPS_PRINTER_IMPLICIT = 0x10000, /* Implicit class @private@
+ * @since Deprecated@ */
CUPS_PRINTER_DEFAULT = 0x20000, /* Default printer on network */
CUPS_PRINTER_FAX = 0x40000, /* Fax queue */
CUPS_PRINTER_REJECTING = 0x80000, /* Printer is rejecting jobs */
- CUPS_PRINTER_DELETE = 0x100000, /* Delete printer @since CUPS 1.2/Mac OS X 10.5@ */
- CUPS_PRINTER_NOT_SHARED = 0x200000, /* Printer is not shared @since CUPS 1.2/Mac OS X 10.5@ */
- CUPS_PRINTER_AUTHENTICATED = 0x400000,/* Printer requires authentication @since CUPS 1.2/Mac OS X 10.5@ */
- CUPS_PRINTER_COMMANDS = 0x800000, /* Printer supports maintenance commands @since CUPS 1.2/Mac OS X 10.5@ */
- CUPS_PRINTER_DISCOVERED = 0x1000000, /* Printer was automatically discovered and added @private@ @since Deprecated@ */
- CUPS_PRINTER_SCANNER = 0x2000000, /* Scanner-only device @since CUPS 1.4/Mac OS X 10.6@ */
- CUPS_PRINTER_MFP = 0x4000000, /* Printer with scanning capabilities @since CUPS 1.4/Mac OS X 10.6@ */
- CUPS_PRINTER_OPTIONS = 0x6fffc /* ~(CLASS | REMOTE | IMPLICIT | DEFAULT | FAX | REJECTING | DELETE | NOT_SHARED | AUTHENTICATED | COMMANDS | DISCOVERED) @private@ */
+ CUPS_PRINTER_DELETE = 0x100000, /* Delete printer
+ * @since CUPS 1.2/Mac OS X 10.5@ */
+ CUPS_PRINTER_NOT_SHARED = 0x200000, /* Printer is not shared
+ * @since CUPS 1.2/Mac OS X 10.5@ */
+ CUPS_PRINTER_AUTHENTICATED = 0x400000,/* Printer requires authentication
+ * @since CUPS 1.2/Mac OS X 10.5@ */
+ CUPS_PRINTER_COMMANDS = 0x800000, /* Printer supports maintenance commands
+ * @since CUPS 1.2/Mac OS X 10.5@ */
+ CUPS_PRINTER_DISCOVERED = 0x1000000, /* Printer was automatically discovered
+ * and added @private@
+ * @since Deprecated@ */
+ CUPS_PRINTER_SCANNER = 0x2000000, /* Scanner-only device
+ * @since CUPS 1.4/Mac OS X 10.6@ */
+ CUPS_PRINTER_MFP = 0x4000000, /* Printer with scanning capabilities
+ * @since CUPS 1.4/Mac OS X 10.6@ */
+ CUPS_PRINTER_OPTIONS = 0x6fffc /* ~(CLASS | REMOTE | IMPLICIT |
+ * DEFAULT | FAX | REJECTING | DELETE |
+ * NOT_SHARED | AUTHENTICATED |
+ * COMMANDS | DISCOVERED) @private@ */
};
typedef struct cups_option_s /**** Printer Options ****/
@@ -130,6 +265,10 @@ typedef struct cups_dest_s /**** Destination ****/
cups_option_t *options; /* Options */
} cups_dest_t;
+typedef struct _cups_dinfo_s cups_dinfo_t;
+ /* Destination capability and status
+ * information @since CUPS 1.6@ */
+
typedef struct cups_job_s /**** Job ****/
{
int id; /* The job ID */
@@ -145,19 +284,37 @@ typedef struct cups_job_s /**** Job ****/
time_t processing_time; /* Time the job was processed */
} cups_job_t;
+typedef struct cups_size_s /**** Media Size @since CUPS 1.6@ ****/
+{
+ char media[128]; /* Media name to use */
+ int width, /* Width in hundredths of millimeters */
+ length, /* Length in hundredths of
+ * millimeters */
+ bottom, /* Bottom margin in hundredths of
+ * millimeters */
+ left, /* Left margin in hundredths of
+ * millimeters */
+ right, /* Right margin in hundredths of
+ * millimeters */
+ top; /* Top margin in hundredths of
+ * millimeters */
+} cups_size_t;
+
typedef int (*cups_client_cert_cb_t)(http_t *http, void *tls,
cups_array_t *distinguished_names,
void *user_data);
- /**** Client credentials callback @since CUPS 1.5/Mac OS X 10.7@ ****/
+ /* Client credentials callback
+ * @since CUPS 1.5/Mac OS X 10.7@ */
-typedef int (*cups_dest_cb_t)(void *user_data, const char *name, const char *instance,
- int num_options, cups_option_t *options);
- /**** Destination enumeration callback @since CUPS 1.6@ ****/
+typedef int (*cups_dest_cb_t)(void *user_data, unsigned flags,
+ cups_dest_t *dest);
+ /* Destination enumeration callback
+ * @since CUPS 1.6@ */
# ifdef __BLOCKS__
-typedef int (^cups_dest_block_t)(const char *name, const char *instance, int num_options,
- cups_option_t *options);
- /**** Destination enumeration block @since CUPS 1.6@ ****/
+typedef int (^cups_dest_block_t)(unsigned flags, cups_dest_t *dest);
+ /* Destination enumeration block
+ * @since CUPS 1.6@ */
# endif /* __BLOCKS__ */
typedef void (*cups_device_cb_t)(const char *device_class,
@@ -165,20 +322,23 @@ typedef void (*cups_device_cb_t)(const char *device_class,
const char *device_make_and_model,
const char *device_uri,
const char *device_location, void *user_data);
- /**** Device callback @since CUPS 1.4/Mac OS X 10.6@ ****/
+ /* Device callback
+ * @since CUPS 1.4/Mac OS X 10.6@ */
typedef const char *(*cups_password_cb_t)(const char *prompt);
- /**** Password callback ****/
+ /* Password callback */
typedef const char *(*cups_password_cb2_t)(const char *prompt, http_t *http,
const char *method,
const char *resource,
void *user_data);
- /**** New password callback @since CUPS 1.4/Mac OS X 10.6@ ****/
+ /* New password callback
+ * @since CUPS 1.4/Mac OS X 10.6@ */
typedef int (*cups_server_cert_cb_t)(http_t *http, void *tls,
cups_array_t *certs, void *user_data);
- /**** Server credentials callback @since CUPS 1.5/Mac OS X 10.7@ ****/
+ /* Server credentials callback
+ * @since CUPS 1.5/Mac OS X 10.7@ */
/*
@@ -221,7 +381,8 @@ extern int cupsAddOption(const char *name, const char *value,
int num_options, cups_option_t **options);
extern void cupsEncodeOptions(ipp_t *ipp, int num_options,
cups_option_t *options);
-extern void cupsFreeOptions(int num_options, cups_option_t *options);
+extern void cupsFreeOptions(int num_options,
+ cups_option_t *options);
extern const char *cupsGetOption(const char *name, int num_options,
cups_option_t *options);
extern int cupsParseOptions(const char *arg, int num_options,
@@ -237,21 +398,25 @@ extern const char *cupsUser(void);
/**** New in CUPS 1.1.20 ****/
extern int cupsDoAuthentication(http_t *http, const char *method,
- const char *resource) _CUPS_API_1_1_20;
+ const char *resource)
+ _CUPS_API_1_1_20;
extern http_status_t cupsGetFile(http_t *http, const char *resource,
const char *filename) _CUPS_API_1_1_20;
extern http_status_t cupsGetFd(http_t *http, const char *resource, int fd);
extern http_status_t cupsPutFile(http_t *http, const char *resource,
const char *filename) _CUPS_API_1_1_20;
-extern http_status_t cupsPutFd(http_t *http, const char *resource, int fd) _CUPS_API_1_1_20;
+extern http_status_t cupsPutFd(http_t *http, const char *resource, int fd)
+ _CUPS_API_1_1_20;
/**** New in CUPS 1.1.21 ****/
extern const char *cupsGetDefault2(http_t *http) _CUPS_API_1_1_21;
-extern int cupsGetDests2(http_t *http, cups_dest_t **dests) _CUPS_API_1_1_21;
+extern int cupsGetDests2(http_t *http, cups_dest_t **dests)
+ _CUPS_API_1_1_21;
extern int cupsGetJobs2(http_t *http, cups_job_t **jobs,
const char *name, int myjobs,
int whichjobs) _CUPS_API_1_1_21;
-extern const char *cupsGetPPD2(http_t *http, const char *name) _CUPS_API_1_1_21;
+extern const char *cupsGetPPD2(http_t *http, const char *name)
+ _CUPS_API_1_1_21;
extern int cupsPrintFile2(http_t *http, const char *name,
const char *filename,
const char *title, int num_options,
@@ -259,7 +424,8 @@ extern int cupsPrintFile2(http_t *http, const char *name,
extern int cupsPrintFiles2(http_t *http, const char *name,
int num_files, const char **files,
const char *title, int num_options,
- cups_option_t *options) _CUPS_API_1_1_21;
+ cups_option_t *options)
+ _CUPS_API_1_1_21;
extern int cupsSetDests2(http_t *http, int num_dests,
cups_dest_t *dests) _CUPS_API_1_1_21;
@@ -272,8 +438,10 @@ extern void cupsEncodeOptions2(ipp_t *ipp, int num_options,
cups_option_t *options,
ipp_tag_t group_tag) _CUPS_API_1_2;
extern const char *cupsLastErrorString(void) _CUPS_API_1_2;
-extern char *cupsNotifySubject(cups_lang_t *lang, ipp_t *event) _CUPS_API_1_2;
-extern char *cupsNotifyText(cups_lang_t *lang, ipp_t *event) _CUPS_API_1_2;
+extern char *cupsNotifySubject(cups_lang_t *lang, ipp_t *event)
+ _CUPS_API_1_2;
+extern char *cupsNotifyText(cups_lang_t *lang, ipp_t *event)
+ _CUPS_API_1_2;
extern int cupsRemoveOption(const char *name, int num_options,
cups_option_t **options) _CUPS_API_1_2;
extern cups_file_t *cupsTempFile2(char *filename, int len) _CUPS_API_1_2;
@@ -282,10 +450,12 @@ extern cups_file_t *cupsTempFile2(char *filename, int len) _CUPS_API_1_2;
extern ipp_t *cupsDoIORequest(http_t *http, ipp_t *request,
const char *resource, int infile,
int outfile) _CUPS_API_1_3;
-extern char *cupsGetServerPPD(http_t *http, const char *name) _CUPS_API_1_3;
+extern char *cupsGetServerPPD(http_t *http, const char *name)
+ _CUPS_API_1_3;
extern int cupsRemoveDest(const char *name,
const char *instance,
- int num_dests, cups_dest_t **dests) _CUPS_API_1_3;
+ int num_dests, cups_dest_t **dests)
+ _CUPS_API_1_3;
extern void cupsSetDefaultDest(const char *name,
const char *instance,
int num_dests,
@@ -336,11 +506,86 @@ extern void cupsSetServerCertCB(cups_server_cert_cb_t cb,
void *user_data) _CUPS_API_1_5;
/**** New in CUPS 1.6 ****/
-extern http_t *cupsConnectDest(cups_dest_t *dest);
-extern int cupsEnumDests(cups_dest_cb_t cb, void *user_data) _CUPS_API_1_6;
+extern ipp_status_t cupsCancelDestJob(http_t *http, cups_dest_t *dest,
+ int job_id) _CUPS_API_1_6;
+extern int cupsCheckDestSupported(http_t *http, cups_dest_t *dest,
+ cups_dinfo_t *info,
+ const char *option,
+ const char *value) _CUPS_API_1_6;
+extern ipp_status_t cupsCloseDestJob(http_t *http, cups_dest_t *dest,
+ int job_id) _CUPS_API_1_6;
+extern http_t *cupsConnectDest(cups_dest_t *dest, unsigned flags,
+ int msec, int *cancel,
+ char *resource, size_t resourcesize,
+ cups_dest_cb_t cb, void *user_data)
+ _CUPS_API_1_6;
+# ifdef __BLOCKS__
+extern http_t *cupsConnectDestBlock(cups_dest_t *dest,
+ unsigned flags, int msec,
+ int *cancel, char *resource,
+ size_t resourcesize,
+ cups_dest_block_t block)
+ _CUPS_API_1_6;
+# endif /* __BLOCKS__ */
+extern int cupsCopyDest(cups_dest_t *dest, int num_dests,
+ cups_dest_t **dests) _CUPS_API_1_6;
+extern cups_dinfo_t *cupsCopyDestInfo(http_t *http, cups_dest_t *dest)
+ _CUPS_API_1_6;
+extern int cupsCopyDestConflicts(http_t *http, cups_dest_t *dest,
+ cups_dinfo_t *info,
+ int num_options,
+ cups_option_t *options,
+ const char *new_option,
+ const char *new_value,
+ int *num_conflicts,
+ cups_option_t **conflicts,
+ int *num_resolved,
+ cups_option_t **resolved)
+ _CUPS_API_1_6;
+extern ipp_status_t cupsCreateDestJob(http_t *http, cups_dest_t *dest,
+ cups_dinfo_t *info, int *job_id,
+ const char *title, int num_options,
+ cups_option_t *options) _CUPS_API_1_6;
+extern int cupsEnumDests(unsigned flags, int msec, int *cancel,
+ cups_ptype_t type, cups_ptype_t mask,
+ cups_dest_cb_t cb, void *user_data)
+ _CUPS_API_1_6;
# ifdef __BLOCKS__
-extern int cupsEnumDestsBlock(cups_dest_block_t block) _CUPS_API_1_6;
+extern int cupsEnumDestsBlock(unsigned flags, int msec,
+ int *cancel, cups_ptype_t type,
+ cups_ptype_t mask,
+ cups_dest_block_t block)
+ _CUPS_API_1_6;
# endif /* __BLOCKS__ */
+extern ipp_status_t cupsFinishDestDocument(http_t *http,
+ cups_dest_t *dest) _CUPS_API_1_6;
+extern void cupsFreeDestInfo(cups_dinfo_t *dinfo) _CUPS_API_1_6;
+extern int cupsGetDestMediaByName(http_t *http, cups_dest_t *dest,
+ cups_dinfo_t *dinfo,
+ const char *media,
+ unsigned flags,
+ cups_size_t *size) _CUPS_API_1_6;
+extern int cupsGetDestMediaBySize(http_t *http, cups_dest_t *dest,
+ cups_dinfo_t *dinfo,
+ int width, int length,
+ unsigned flags,
+ cups_size_t *size) _CUPS_API_1_6;
+extern const char *cupsLocalizeDestOption(http_t *http, cups_dest_t *dest,
+ cups_dinfo_t *info,
+ const char *option)
+ _CUPS_API_1_6;
+extern const char *cupsLocalizeDestValue(http_t *http, cups_dest_t *dest,
+ cups_dinfo_t *info,
+ const char *option,
+ const char *value)
+ _CUPS_API_1_6;
+extern http_status_t cupsStartDestDocument(http_t *http, cups_dest_t *dest,
+ cups_dinfo_t *info, int job_id,
+ const char *docname,
+ const char *format,
+ int num_options,
+ cups_option_t *options,
+ int last_document) _CUPS_API_1_6;
# ifdef __cplusplus
}
diff --git a/cups/dest-job.c b/cups/dest-job.c
new file mode 100644
index 000000000..31cac7903
--- /dev/null
+++ b/cups/dest-job.c
@@ -0,0 +1,145 @@
+/*
+ * "$Id$"
+ *
+ * Destination job support for CUPS.
+ *
+ * Copyright 2012 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ *
+ * Contents:
+ *
+ * cupsCancelDestJob() - Cancel a job on a destination.
+ * cupsCloseDestJob() - Close a job and start printing.
+ * cupsCreateDestJob() - Create a job on a destination.
+ * cupsFinishDestDocument() - Finish the current document.
+ * cupsStartDestDocument() - Start a new document.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include "cups-private.h"
+
+
+/*
+ * 'cupsCancelDestJob()' - Cancel a job on a destination.
+ *
+ * The "job_id" is the number returned by cupsCreateDestJob.
+ *
+ * Returns IPP_OK on success and IPP_NOT_AUTHORIZED or IPP_FORBIDDEN on
+ * failure.
+ *
+ * @since CUPS 1.6@
+ */
+
+ipp_status_t
+cupsCancelDestJob(http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ int job_id) /* I - Job ID */
+{
+ return (IPP_NOT_FOUND);
+}
+
+
+/*
+ * 'cupsCloseDestJob()' - Close a job and start printing.
+ *
+ * Use when the last call to cupsStartDocument passed 0 for "last_document".
+ * "job_id" is the job ID returned by cupsCreateDestJob. Returns IPP_OK on
+ * success.
+ *
+ * @since CUPS 1.6@
+ */
+
+ipp_status_t
+cupsCloseDestJob(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ int job_id) /* I - Job ID */
+{
+ return (IPP_NOT_FOUND);
+}
+
+
+/*
+ * 'cupsCreateDestJob()' - Create a job on a destination.
+ *
+ * Returns IPP_OK or IPP_OK_SUBST on success, saving the job ID in the variable
+ * pointed to by "job_id".
+ *
+ * @since CUPS 1.6@
+ */
+
+ipp_status_t /* O - IPP status code */
+cupsCreateDestJob(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *info, /* I - Destination information */
+ int *job_id, /* O - Job ID or 0 on error */
+ const char *title, /* I - Job name */
+ int num_options, /* I - Number of job options */
+ cups_option_t *options) /* I - Job options */
+{
+ *job_id = 0;
+
+ return (IPP_NOT_POSSIBLE);
+}
+
+
+/*
+ * 'cupsFinishDestDocument()' - Finish the current document.
+ *
+ * Returns IPP_OK on success.
+ *
+ * @since CUPS 1.6@
+ */
+
+ipp_status_t
+cupsFinishDestDocument(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest) /* I - Destination */
+{
+ return (IPP_NOT_FOUND);
+}
+
+
+/*
+ * 'cupsStartDestDocument()' - Start a new document.
+ *
+ * "job_id" is the job ID returned by cupsCreateDestJob. "docname" is the name
+ * of the document/file being printed, "format" is the MIME media type for the
+ * document (see CUPS_FORMAT_xxx constants), and "num_options" and "options"
+ * are the options do be applied to the document. "last_document" should be 1
+ * if this is the last document to be submitted in the job. Returns
+ * HTTP_CONTINUE on success.
+ *
+ * @since CUPS 1.6@
+ */
+
+http_status_t
+cupsStartDestDocument(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *info, /* I - Destination information */
+ int job_id, /* I - Job ID */
+ const char *docname, /* I - Document name */
+ const char *format, /* I - Document format */
+ int num_options, /* I - Number of document options */
+ cups_option_t *options, /* I - Document options */
+ int last_document) /* I - 1 if this is the last document */
+{
+ return (HTTP_CONTINUE);
+}
+
+
+/*
+ * End of "$Id$".
+ */
diff --git a/cups/dest-localization.c b/cups/dest-localization.c
new file mode 100644
index 000000000..9d0d8b1d7
--- /dev/null
+++ b/cups/dest-localization.c
@@ -0,0 +1,76 @@
+/*
+ * "$Id$"
+ *
+ * Destination localization support for CUPS.
+ *
+ * Copyright 2012 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ *
+ * Contents:
+ *
+ * cupsLocalizeDestOption() - Get the localized string for a destination
+ * option.
+ * cupsLocalizeDestValue() - Get the localized string for a destination
+ * option+value pair.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include "cups-private.h"
+
+
+/*
+ * 'cupsLocalizeDestOption()' - Get the localized string for a destination
+ * option.
+ *
+ * The returned string is stored in the localization array and will become
+ * invalid if the localization array is deleted.
+ *
+ * @since CUPS 1.6@
+ */
+
+const char * /* O - Localized string */
+cupsLocalizeDestOption(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ const char *option) /* I - Option to localize */
+{
+ return (option);
+}
+
+
+/*
+ * 'cupsLocalizeDestValue()' - Get the localized string for a destination
+ * option+value pair.
+ *
+ * The returned string is stored in the localization array and will become
+ * invalid if the localization array is deleted.
+ *
+ * @since CUPS 1.6@
+ */
+
+const char * /* O - Localized string */
+cupsLocalizeDestValue(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ const char *option, /* I - Option to localize */
+ const char *value) /* I - Value to localize */
+{
+ return (value);
+}
+
+
+/*
+ * End of "$Id$".
+ */
diff --git a/cups/dest-options.c b/cups/dest-options.c
new file mode 100644
index 000000000..eff70dcb0
--- /dev/null
+++ b/cups/dest-options.c
@@ -0,0 +1,1164 @@
+/*
+ * "$Id$"
+ *
+ * Destination option/media support for CUPS.
+ *
+ * Copyright 2012 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ *
+ * Contents:
+ *
+ * cupsCheckDestSupported() - Check that the option and value are supported
+ * by the destination.
+ * cupsCopyDestConflicts() - Get conflicts and resolutions for a new
+ * option/value pair.
+ * cupsCopyDestInfo() - Get the supported values/capabilities for the
+ * destination.
+ * cupsFreeDestInfo() - Free destination information obtained using
+ * @link cupsCopyDestInfo@.
+ * cupsGetDestMediaByName() - Get media names, dimensions, and margins.
+ * cupsGetDestMediaBySize() - Get media names, dimensions, and margins.
+ * cups_compare_media_db() - Compare two media entries.
+ * cups_copy_media_db() - Copy a media entry.
+ * cups_create_media_db() - Create the media database.
+ * cups_free_media_cb() - Free a media entry.
+ * cups_get_media_db() - Lookup the media entry for a given size.
+ * cups_is_close_media_db() - Compare two media entries to see if they are
+ * close to the same size.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include "cups-private.h"
+
+
+/*
+ * Local functions...
+ */
+
+static int cups_compare_media_db(_cups_media_db_t *a,
+ _cups_media_db_t *b);
+static _cups_media_db_t *cups_copy_media_db(_cups_media_db_t *mdb);
+static void cups_create_media_db(cups_dinfo_t *dinfo);
+static void cups_free_media_db(_cups_media_db_t *mdb);
+static int cups_get_media_db(cups_dinfo_t *dinfo,
+ _pwg_media_t *pwg, unsigned flags,
+ cups_size_t *size);
+static int cups_is_close_media_db(_cups_media_db_t *a,
+ _cups_media_db_t *b);
+
+/*
+ * 'cupsCheckDestSupported()' - Check that the option and value are supported
+ * by the destination.
+ *
+ * Returns 1 if supported, 0 otherwise.
+ *
+ * @since CUPS 1.6@
+ */
+
+int /* O - 1 if supported, 0 otherwise */
+cupsCheckDestSupported(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ const char *option, /* I - Option */
+ const char *value) /* I - Value */
+{
+ int i; /* Looping var */
+ char temp[1024]; /* Temporary string */
+ int int_value; /* Integer value */
+ int xres_value, /* Horizontal resolution */
+ yres_value; /* Vertical resolution */
+ ipp_res_t units_value; /* Resolution units */
+ ipp_attribute_t *attr; /* Attribute */
+ _ipp_value_t *attrval; /* Current attribute value */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!http || !dest || !dinfo || !option || !value)
+ return (0);
+
+ /*
+ * Lookup the attribute...
+ */
+
+ if (strstr(option, "-supported"))
+ attr = ippFindAttribute(dinfo->attrs, option, IPP_TAG_ZERO);
+ else
+ {
+ snprintf(temp, sizeof(temp), "%s-supported", option);
+ attr = ippFindAttribute(dinfo->attrs, temp, IPP_TAG_ZERO);
+ }
+
+ if (!attr)
+ return (0);
+
+ /*
+ * Compare values...
+ */
+
+ if (!strcmp(option, "media") && !strncmp(value, "custom_", 7))
+ {
+ /*
+ * Check range of custom media sizes...
+ */
+
+ _pwg_media_t *pwg; /* Current PWG media size info */
+ int min_width, /* Minimum width */
+ min_length, /* Minimum length */
+ max_width, /* Maximum width */
+ max_length; /* Maximum length */
+
+ /*
+ * Get the minimum and maximum size...
+ */
+
+ min_width = min_length = INT_MAX;
+ max_width = max_length = 0;
+
+ for (i = attr->num_values, attrval = attr->values;
+ i > 0;
+ i --, attrval ++)
+ {
+ if (!strncmp(attrval->string.text, "custom_min_", 11) &&
+ (pwg = _pwgMediaForPWG(attrval->string.text)) != NULL)
+ {
+ min_width = pwg->width;
+ min_length = pwg->length;
+ }
+ else if (!strncmp(attrval->string.text, "custom_max_", 11) &&
+ (pwg = _pwgMediaForPWG(attrval->string.text)) != NULL)
+ {
+ max_width = pwg->width;
+ max_length = pwg->length;
+ }
+ }
+
+ /*
+ * Check the range...
+ */
+
+ if (min_width < INT_MAX && max_width > 0 &&
+ (pwg = _pwgMediaForPWG(value)) != NULL &&
+ pwg->width >= min_width && pwg->width <= max_width &&
+ pwg->length >= min_length && pwg->length <= max_length)
+ return (1);
+ }
+ else
+ {
+ /*
+ * Check literal values...
+ */
+
+ switch (attr->value_tag)
+ {
+ case IPP_TAG_INTEGER :
+ case IPP_TAG_ENUM :
+ int_value = atoi(value);
+
+ for (i = 0; i < attr->num_values; i ++)
+ if (attr->values[i].integer == int_value)
+ return (1);
+ break;
+
+ case IPP_TAG_BOOLEAN :
+ return (attr->values[0].boolean);
+
+ case IPP_TAG_RESOLUTION :
+ if (sscanf(value, "%dx%d%15s", &xres_value, &yres_value, temp) != 3)
+ {
+ if (sscanf(value, "%d%15s", &xres_value, temp) != 2)
+ return (0);
+
+ yres_value = xres_value;
+ }
+
+ if (!strcmp(temp, "dpi"))
+ units_value = IPP_RES_PER_INCH;
+ else if (!strcmp(temp, "dpc"))
+ units_value = IPP_RES_PER_CM;
+ else
+ return (0);
+
+ for (i = attr->num_values, attrval = attr->values;
+ i > 0;
+ i --, attrval ++)
+ {
+ if (attrval->resolution.xres == xres_value &&
+ attrval->resolution.yres == yres_value &&
+ attrval->resolution.units == units_value)
+ return (1);
+ }
+ break;
+
+ case IPP_TAG_TEXT :
+ case IPP_TAG_NAME :
+ case IPP_TAG_KEYWORD :
+ case IPP_TAG_CHARSET :
+ case IPP_TAG_URI :
+ case IPP_TAG_URISCHEME :
+ case IPP_TAG_MIMETYPE :
+ case IPP_TAG_LANGUAGE :
+ case IPP_TAG_TEXTLANG :
+ case IPP_TAG_NAMELANG :
+ for (i = 0; i < attr->num_values; i ++)
+ if (!strcmp(attr->values[i].string.text, value))
+ return (1);
+ break;
+
+ default :
+ break;
+ }
+ }
+
+ /*
+ * If we get there the option+value is not supported...
+ */
+
+ return (0);
+}
+
+
+/*
+ * 'cupsCopyDestConflicts()' - Get conflicts and resolutions for a new
+ * option/value pair.
+ *
+ * "num_options" and "options" represent the currently selected options by the
+ * user. "new_option" and "new_value" are the setting the user has just
+ * changed.
+ *
+ * Returns 1 if there is a conflict and 0 otherwise.
+ *
+ * If "num_conflicts" and "conflicts" are not NULL, they are set to contain the
+ * list of conflicting option/value pairs. Similarly, if "num_resolved" and
+ * "resolved" are not NULL they will be set to the list of changes needed to
+ * resolve the conflict.
+ *
+ * If cupsCopyDestConflicts returns 1 but "num_resolved" and "resolved" are set
+ * to 0 and NULL, respectively, then the conflict cannot be resolved.
+ *
+ * @since CUPS 1.6@
+ */
+
+int /* O - 1 if there is a conflict */
+cupsCopyDestConflicts(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ int num_options, /* I - Number of current options */
+ cups_option_t *options, /* I - Current options */
+ const char *new_option, /* I - New option */
+ const char *new_value, /* I - New value */
+ int *num_conflicts, /* O - Number of conflicting options */
+ cups_option_t **conflicts, /* O - Conflicting options */
+ int *num_resolved, /* O - Number of options to resolve */
+ cups_option_t **resolved) /* O - Resolved options */
+{
+ /*
+ * Clear returned values...
+ */
+
+ if (num_conflicts)
+ *num_conflicts = 0;
+
+ if (conflicts)
+ *conflicts = NULL;
+
+ if (num_resolved)
+ *num_resolved = 0;
+
+ if (resolved)
+ *resolved = NULL;
+
+ /*
+ * Range check input...
+ */
+
+ if (!http || !dest || !dinfo || !new_option || !new_value ||
+ (num_conflicts != NULL) != (conflicts != NULL) ||
+ (num_resolved != NULL) != (resolved != NULL))
+ return (0);
+
+ /*
+ * Check for an resolve any conflicts...
+ */
+
+ /* TODO: implement me! */
+
+ return (0);
+}
+
+
+/*
+ * 'cupsCopyDestInfo()' - Get the supported values/capabilities for the
+ * destination.
+ *
+ * The caller is responsible for calling @link cupsFreeDestInfo@ on the return
+ * value. @code NULL@ is returned on error.
+ *
+ * @since CUPS 1.6@
+ */
+
+cups_dinfo_t * /* O - Destination information */
+cupsCopyDestInfo(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest) /* I - Destination */
+{
+ cups_dinfo_t *dinfo; /* Destination information */
+ ipp_t *request, /* Get-Printer-Attributes request */
+ *response; /* Supported attributes */
+ const char *uri; /* Printer URI */
+ char resource[1024]; /* Resource path */
+ int version; /* IPP version */
+ ipp_status_t status; /* Status of request */
+ static const char * const requested_attrs[] =
+ { /* Requested attributes */
+ "job-template",
+ "media-col-database",
+ "printer-description"
+ };
+
+
+ DEBUG_printf(("cupsCopyDestSupported(http=%p, dest=%p(%s))", http, dest,
+ dest ? dest->name : ""));
+
+ /*
+ * Range check input...
+ */
+
+ if (!http || !dest)
+ return (NULL);
+
+ /*
+ * Get the printer URI and resource path...
+ */
+
+ if ((uri = _cupsGetDestResource(dest, resource, sizeof(resource))) == NULL)
+ return (NULL);
+
+ /*
+ * Get the supported attributes...
+ */
+
+ version = 20;
+
+ do
+ {
+ /*
+ * Send a Get-Printer-Attributes request...
+ */
+
+ request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
+ uri);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
+ NULL, cupsUser());
+ ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
+ "requested-attributes",
+ (int)(sizeof(requested_attrs) / sizeof(requested_attrs[0])),
+ NULL, requested_attrs);
+ response = cupsDoRequest(http, request, resource);
+ status = cupsLastError();
+
+ if (status > IPP_OK_SUBST)
+ {
+ DEBUG_printf(("cupsCopyDestSupported: Get-Printer-Attributes for '%s' "
+ "returned %s (%s)", dest->name, ippErrorString(status),
+ cupsLastErrorString()));
+
+ ippDelete(response);
+ response = NULL;
+
+ if (status == IPP_VERSION_NOT_SUPPORTED && version > 11)
+ version = 11;
+ else
+ return (NULL);
+ }
+ }
+ while (!response);
+
+ /*
+ * Allocate a cups_dinfo_t structure and return it...
+ */
+
+ if ((dinfo = calloc(1, sizeof(cups_dinfo_t))) == NULL)
+ {
+ _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+ ippDelete(response);
+ return (NULL);
+ }
+
+ dinfo->uri = uri;
+ dinfo->resource = _cupsStrAlloc(resource);
+ dinfo->attrs = response;
+
+ return (dinfo);
+}
+
+
+/*
+ * 'cupsFreeDestInfo()' - Free destination information obtained using
+ * @link cupsCopyDestInfo@.
+ */
+
+void
+cupsFreeDestInfo(cups_dinfo_t *dinfo) /* I - Destination information */
+{
+ /*
+ * Range check input...
+ */
+
+ if (!dinfo)
+ return;
+
+ /*
+ * Free memory and return...
+ */
+
+ _cupsStrFree(dinfo->resource);
+
+ ippDelete(dinfo->attrs);
+
+ cupsArrayDelete(dinfo->constraints);
+
+ cupsArrayDelete(dinfo->localizations);
+
+ cupsArrayDelete(dinfo->media_db);
+
+ free(dinfo);
+}
+
+
+/*
+ * 'cupsGetDestMediaByName()' - Get media names, dimensions, and margins.
+ *
+ * The "media" string is a PWG media name, while "width" and "length" are the
+ * dimensions in hundredths of millimeters. "flags" provides some matching
+ * guidance (multiple flags can be combined):
+ *
+ * CUPS_MEDIA_FLAGS_DEFAULT = find the closest size supported by the printer
+ * CUPS_MEDIA_FLAGS_BORDERLESS = find a borderless size
+ * CUPS_MEDIA_FLAGS_DUPLEX = find a size compatible with 2-sided printing
+ * CUPS_MEDIA_FLAGS_EXACT = find an exact match for the size
+ * CUPS_MEDIA_FLAGS_READY = if the printer supports media sensing, find the
+ * size amongst the "ready" media.
+ *
+ * The matching result (if any) is returned in the "cups_size_t" structure.
+ *
+ * Returns 1 when there is a match and 0 if there is not a match.
+ *
+ * @since CUPS 1.6@
+ */
+
+int /* O - 1 on match, 0 on failure */
+cupsGetDestMediaByName(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ const char *media, /* I - Media name */
+ unsigned flags, /* I - Media matching flags */
+ cups_size_t *size) /* O - Media size information */
+{
+ _pwg_media_t *pwg; /* PWG media info */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (size)
+ memset(size, 0, sizeof(cups_size_t));
+
+ if (!http || !dest || !dinfo || !media || !size)
+ {
+ _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ return (0);
+ }
+
+ /*
+ * Lookup the media size name...
+ */
+
+ if ((pwg = _pwgMediaForPWG(media)) == NULL)
+ if ((pwg = _pwgMediaForLegacy(media)) == NULL)
+ {
+ DEBUG_printf(("1cupsGetDestMediaByName: Unknown size '%s'.", media));
+ _cupsSetError(IPP_INTERNAL_ERROR, _("Unknown media size name."), 1);
+ return (0);
+ }
+
+ /*
+ * Lookup the size...
+ */
+
+ return (cups_get_media_db(dinfo, pwg, flags, size));
+}
+
+
+/*
+ * 'cupsGetDestMediaBySize()' - Get media names, dimensions, and margins.
+ *
+ * The "media" string is a PWG media name, while "width" and "length" are the
+ * dimensions in hundredths of millimeters. "flags" provides some matching
+ * guidance (multiple flags can be combined):
+ *
+ * CUPS_MEDIA_FLAGS_DEFAULT = find the closest size supported by the printer
+ * CUPS_MEDIA_FLAGS_BORDERLESS = find a borderless size
+ * CUPS_MEDIA_FLAGS_DUPLEX = find a size compatible with 2-sided printing
+ * CUPS_MEDIA_FLAGS_EXACT = find an exact match for the size
+ * CUPS_MEDIA_FLAGS_READY = if the printer supports media sensing, find the
+ * size amongst the "ready" media.
+ *
+ * The matching result (if any) is returned in the "cups_size_t" structure.
+ *
+ * Returns 1 when there is a match and 0 if there is not a match.
+ *
+ * @since CUPS 1.6@
+ */
+
+int /* O - 1 on match, 0 on failure */
+cupsGetDestMediaBySize(
+ http_t *http, /* I - Connection to destination */
+ cups_dest_t *dest, /* I - Destination */
+ cups_dinfo_t *dinfo, /* I - Destination information */
+ int width, /* I - Media width in hundredths of
+ * of millimeters */
+ int length, /* I - Media length in hundredths of
+ * of millimeters */
+ unsigned flags, /* I - Media matching flags */
+ cups_size_t *size) /* O - Media size information */
+{
+ _pwg_media_t *pwg; /* PWG media info */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (size)
+ memset(size, 0, sizeof(cups_size_t));
+
+ if (!http || !dest || !dinfo || width <= 0 || length <= 0 || !size)
+ {
+ _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ return (0);
+ }
+
+ /*
+ * Lookup the media size name...
+ */
+
+ if ((pwg = _pwgMediaForSize(width, length)) == NULL)
+ {
+ DEBUG_printf(("1cupsGetDestMediaBySize: Invalid size %dx%d.", width,
+ length));
+ _cupsSetError(IPP_INTERNAL_ERROR, _("Invalid media size."), 1);
+ return (0);
+ }
+
+ /*
+ * Lookup the size...
+ */
+
+ return (cups_get_media_db(dinfo, pwg, flags, size));
+}
+
+
+/*
+ * 'cups_compare_media_db()' - Compare two media entries.
+ */
+
+static int /* O - Result of comparison */
+cups_compare_media_db(
+ _cups_media_db_t *a, /* I - First media entries */
+ _cups_media_db_t *b) /* I - Second media entries */
+{
+ int result; /* Result of comparison */
+
+
+ if ((result = a->width - b->width) == 0)
+ result = a->length - b->length;
+
+ return (result);
+}
+
+
+/*
+ * 'cups_copy_media_db()' - Copy a media entry.
+ */
+
+static _cups_media_db_t * /* O - New media entry */
+cups_copy_media_db(
+ _cups_media_db_t *mdb) /* I - Media entry to copy */
+{
+ _cups_media_db_t *temp; /* New media entry */
+
+
+ if ((temp = calloc(1, sizeof(_cups_media_db_t))) == NULL)
+ return (NULL);
+
+ if (mdb->color)
+ temp->color = _cupsStrAlloc(mdb->color);
+ if (mdb->key)
+ temp->key = _cupsStrAlloc(mdb->key);
+ if (mdb->info)
+ temp->info = _cupsStrAlloc(mdb->info);
+ if (mdb->size_name)
+ temp->size_name = _cupsStrAlloc(mdb->size_name);
+ if (mdb->source)
+ temp->source = _cupsStrAlloc(mdb->source);
+ if (mdb->type)
+ temp->type = _cupsStrAlloc(mdb->type);
+
+ temp->width = mdb->width;
+ temp->length = mdb->length;
+ temp->bottom = mdb->bottom;
+ temp->left = mdb->left;
+ temp->right = mdb->right;
+ temp->top = mdb->top;
+
+ return (temp);
+}
+
+
+/*
+ * 'cups_create_media_db()' - Create the media database.
+ */
+
+static void
+cups_create_media_db(
+ cups_dinfo_t *dinfo) /* I - Destination information */
+{
+ int i; /* Looping var */
+ _ipp_value_t *val; /* Current value */
+ ipp_attribute_t *media_col_db, /* media-col-database */
+ *media_attr, /* media-xxx */
+ *x_dimension, /* x-dimension */
+ *y_dimension; /* y-dimension */
+ _pwg_media_t *pwg; /* PWG media info */
+ _cups_media_db_t mdb; /* Media entry */
+
+
+ dinfo->media_db = cupsArrayNew3((cups_array_func_t)cups_compare_media_db,
+ NULL, NULL, 0,
+ (cups_acopy_func_t)cups_copy_media_db,
+ (cups_afree_func_t)cups_free_media_db);
+ dinfo->min_size.width = INT_MAX;
+ dinfo->min_size.length = INT_MAX;
+ dinfo->max_size.width = 0;
+ dinfo->max_size.length = 0;
+
+ if ((media_col_db = ippFindAttribute(dinfo->attrs, "media-col-database",
+ IPP_TAG_BEGIN_COLLECTION)) != NULL)
+ {
+ _ipp_value_t *custom = NULL; /* Custom size range value */
+
+ for (i = media_col_db->num_values, val = media_col_db->values;
+ i > 0;
+ i --, val ++)
+ {
+ memset(&mdb, 0, sizeof(mdb));
+
+ if ((media_attr = ippFindAttribute(val->collection, "media-size",
+ IPP_TAG_BEGIN_COLLECTION)) != NULL)
+ {
+ ipp_t *media_size = media_attr->values[0].collection;
+ /* media-size collection value */
+
+ if ((x_dimension = ippFindAttribute(media_size, "x-dimension",
+ IPP_TAG_INTEGER)) != NULL &&
+ (y_dimension = ippFindAttribute(media_size, "y-dimension",
+ IPP_TAG_INTEGER)) != NULL)
+ {
+ mdb.width = x_dimension->values[0].integer;
+ mdb.length = y_dimension->values[0].integer;
+ }
+ else if ((x_dimension = ippFindAttribute(media_size, "x-dimension",
+ IPP_TAG_RANGE)) != NULL &&
+ (y_dimension = ippFindAttribute(media_size, "y-dimension",
+ IPP_TAG_RANGE)) != NULL)
+ {
+ /*
+ * Custom size range; save this as the custom size value with default
+ * margins, then continue; we'll capture the real margins below...
+ */
+
+ custom = val;
+
+ dinfo->min_size.width = x_dimension->values[0].range.lower;
+ dinfo->min_size.length = y_dimension->values[0].range.lower;
+ dinfo->min_size.left =
+ dinfo->min_size.right = 635; /* Default 1/4" side margins */
+ dinfo->min_size.top =
+ dinfo->min_size.bottom = 1270; /* Default 1/2" top/bottom margins */
+
+ dinfo->max_size.width = x_dimension->values[0].range.upper;
+ dinfo->max_size.length = y_dimension->values[0].range.upper;
+ dinfo->max_size.left =
+ dinfo->max_size.right = 635; /* Default 1/4" side margins */
+ dinfo->max_size.top =
+ dinfo->max_size.bottom = 1270; /* Default 1/2" top/bottom margins */
+
+ continue;
+ }
+ }
+
+ if ((media_attr = ippFindAttribute(val->collection, "media-color",
+ IPP_TAG_ZERO)) != NULL &&
+ (media_attr->value_tag == IPP_TAG_NAME ||
+ media_attr->value_tag == IPP_TAG_NAMELANG ||
+ media_attr->value_tag == IPP_TAG_KEYWORD))
+ mdb.color = media_attr->values[0].string.text;
+
+ if ((media_attr = ippFindAttribute(val->collection, "media-info",
+ IPP_TAG_TEXT)) != NULL)
+ mdb.info = media_attr->values[0].string.text;
+
+ if ((media_attr = ippFindAttribute(val->collection, "media-key",
+ IPP_TAG_ZERO)) != NULL &&
+ (media_attr->value_tag == IPP_TAG_NAME ||
+ media_attr->value_tag == IPP_TAG_NAMELANG ||
+ media_attr->value_tag == IPP_TAG_KEYWORD))
+ mdb.key = media_attr->values[0].string.text;
+
+ if ((media_attr = ippFindAttribute(val->collection, "media-size-name",
+ IPP_TAG_ZERO)) != NULL &&
+ (media_attr->value_tag == IPP_TAG_NAME ||
+ media_attr->value_tag == IPP_TAG_NAMELANG ||
+ media_attr->value_tag == IPP_TAG_KEYWORD))
+ mdb.size_name = media_attr->values[0].string.text;
+
+ if ((media_attr = ippFindAttribute(val->collection, "media-source",
+ IPP_TAG_ZERO)) != NULL &&
+ (media_attr->value_tag == IPP_TAG_NAME ||
+ media_attr->value_tag == IPP_TAG_NAMELANG ||
+ media_attr->value_tag == IPP_TAG_KEYWORD))
+ mdb.source = media_attr->values[0].string.text;
+
+ if ((media_attr = ippFindAttribute(val->collection, "media-type",
+ IPP_TAG_ZERO)) != NULL &&
+ (media_attr->value_tag == IPP_TAG_NAME ||
+ media_attr->value_tag == IPP_TAG_NAMELANG ||
+ media_attr->value_tag == IPP_TAG_KEYWORD))
+ mdb.type = media_attr->values[0].string.text;
+
+ if ((media_attr = ippFindAttribute(val->collection, "media-bottom-margin",
+ IPP_TAG_INTEGER)) != NULL)
+ mdb.bottom = media_attr->values[0].integer;
+
+ if ((media_attr = ippFindAttribute(val->collection, "media-left-margin",
+ IPP_TAG_INTEGER)) != NULL)
+ mdb.left = media_attr->values[0].integer;
+
+ if ((media_attr = ippFindAttribute(val->collection, "media-right-margin",
+ IPP_TAG_INTEGER)) != NULL)
+ mdb.right = media_attr->values[0].integer;
+
+ if ((media_attr = ippFindAttribute(val->collection, "media-top-margin",
+ IPP_TAG_INTEGER)) != NULL)
+ mdb.top = media_attr->values[0].integer;
+
+ cupsArrayAdd(dinfo->media_db, &mdb);
+ }
+
+ if (custom)
+ {
+ if ((media_attr = ippFindAttribute(custom->collection,
+ "media-bottom-margin",
+ IPP_TAG_INTEGER)) != NULL)
+ {
+ dinfo->min_size.top =
+ dinfo->max_size.top = media_attr->values[0].integer;
+ }
+
+ if ((media_attr = ippFindAttribute(custom->collection,
+ "media-left-margin",
+ IPP_TAG_INTEGER)) != NULL)
+ {
+ dinfo->min_size.left =
+ dinfo->max_size.left = media_attr->values[0].integer;
+ }
+
+ if ((media_attr = ippFindAttribute(custom->collection,
+ "media-right-margin",
+ IPP_TAG_INTEGER)) != NULL)
+ {
+ dinfo->min_size.right =
+ dinfo->max_size.right = media_attr->values[0].integer;
+ }
+
+ if ((media_attr = ippFindAttribute(custom->collection,
+ "media-top-margin",
+ IPP_TAG_INTEGER)) != NULL)
+ {
+ dinfo->min_size.top =
+ dinfo->max_size.top = media_attr->values[0].integer;
+ }
+ }
+ }
+ else if ((media_attr = ippFindAttribute(dinfo->attrs, "media-supported",
+ IPP_TAG_ZERO)) != NULL &&
+ (media_attr->value_tag == IPP_TAG_NAME ||
+ media_attr->value_tag == IPP_TAG_NAMELANG ||
+ media_attr->value_tag == IPP_TAG_KEYWORD))
+ {
+ memset(&mdb, 0, sizeof(mdb));
+
+ mdb.left =
+ mdb.right = 635; /* Default 1/4" side margins */
+ mdb.top =
+ mdb.bottom = 1270; /* Default 1/2" top/bottom margins */
+
+ for (i = media_col_db->num_values, val = media_col_db->values;
+ i > 0;
+ i --, val ++)
+ {
+ if ((pwg = _pwgMediaForPWG(val->string.text)) == NULL)
+ if ((pwg = _pwgMediaForLegacy(val->string.text)) == NULL)
+ {
+ DEBUG_printf(("3cups_create_media_db: Ignoring unknown size '%s'.",
+ val->string.text));
+ continue;
+ }
+
+ mdb.width = pwg->width;
+ mdb.length = pwg->length;
+
+ if (!strncmp(val->string.text, "custom_min_", 11))
+ {
+ mdb.size_name = NULL;
+ dinfo->min_size = mdb;
+ }
+ else if (!strncmp(val->string.text, "custom_max_", 11))
+ {
+ mdb.size_name = NULL;
+ dinfo->max_size = mdb;
+ }
+ else
+ {
+ mdb.size_name = val->string.text;
+
+ cupsArrayAdd(dinfo->media_db, &mdb);
+ }
+ }
+ }
+}
+
+
+/*
+ * 'cups_free_media_cb()' - Free a media entry.
+ */
+
+static void
+cups_free_media_db(
+ _cups_media_db_t *mdb) /* I - Media entry to free */
+{
+ if (mdb->color)
+ _cupsStrFree(mdb->color);
+ if (mdb->key)
+ _cupsStrFree(mdb->key);
+ if (mdb->info)
+ _cupsStrFree(mdb->info);
+ if (mdb->size_name)
+ _cupsStrFree(mdb->size_name);
+ if (mdb->source)
+ _cupsStrFree(mdb->source);
+ if (mdb->type)
+ _cupsStrFree(mdb->type);
+
+ free(mdb);
+}
+
+
+/*
+ * 'cups_get_media_db()' - Lookup the media entry for a given size.
+ */
+
+static int /* O - 1 on match, 0 on failure */
+cups_get_media_db(cups_dinfo_t *dinfo, /* I - Destination information */
+ _pwg_media_t *pwg, /* I - PWG media info */
+ unsigned flags, /* I - Media matching flags */
+ cups_size_t *size) /* O - Media size/margin/name info */
+{
+ _cups_media_db_t *mdb, /* Current media database entry */
+ *best = NULL, /* Best matching entry */
+ key; /* Search key */
+
+
+ /*
+ * Create the media database as needed...
+ */
+
+ if (!dinfo->media_db)
+ cups_create_media_db(dinfo);
+
+ /*
+ * Find a match...
+ */
+
+ memset(&key, 0, sizeof(key));
+ key.width = pwg->width;
+ key.length = pwg->length;
+
+ if ((mdb = cupsArrayFind(dinfo->media_db, &key)) != NULL)
+ {
+ /*
+ * Found an exact match, let's figure out the best margins for the flags
+ * supplied...
+ */
+
+ best = mdb;
+
+ if (flags & CUPS_MEDIA_FLAGS_BORDERLESS)
+ {
+ /*
+ * Look for the smallest margins...
+ */
+
+ if (best->left != 0 || best->right != 0 || best->top != 0 ||
+ best->bottom != 0)
+ {
+ for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+ mdb && !cups_compare_media_db(mdb, &key);
+ mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+ {
+ if (mdb->left <= best->left && mdb->right <= best->right &&
+ mdb->top <= best->top && mdb->bottom <= best->bottom)
+ {
+ best = mdb;
+ if (mdb->left == 0 && mdb->right == 0 && mdb->bottom == 0 &&
+ mdb->top == 0)
+ break;
+ }
+ }
+ }
+
+ /*
+ * If we need an exact match, return no-match if the size is not
+ * borderless.
+ */
+
+ if ((flags & CUPS_MEDIA_FLAGS_EXACT) &&
+ (best->left || best->right || best->top || best->bottom))
+ return (0);
+ }
+ else if (flags & CUPS_MEDIA_FLAGS_DUPLEX)
+ {
+ /*
+ * Look for the largest margins...
+ */
+
+ for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+ mdb && !cups_compare_media_db(mdb, &key);
+ mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+ {
+ if (mdb->left >= best->left && mdb->right >= best->right &&
+ mdb->top >= best->top && mdb->bottom >= best->bottom)
+ best = mdb;
+ }
+ }
+ else
+ {
+ /*
+ * Look for the smallest non-zero margins...
+ */
+
+ for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+ mdb && !cups_compare_media_db(mdb, &key);
+ mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+ {
+ if (((mdb->left > 0 && mdb->left <= best->left) || best->left == 0) &&
+ ((mdb->right > 0 && mdb->right <= best->right) ||
+ best->right == 0) &&
+ ((mdb->top > 0 && mdb->top <= best->top) || best->top == 0) &&
+ ((mdb->bottom > 0 && mdb->bottom <= best->bottom) ||
+ best->bottom == 0))
+ best = mdb;
+ }
+ }
+ }
+ else if (flags & CUPS_MEDIA_FLAGS_EXACT)
+ {
+ /*
+ * See if we can do this as a custom size...
+ */
+
+ if (pwg->width < dinfo->min_size.width ||
+ pwg->width > dinfo->max_size.width ||
+ pwg->length < dinfo->min_size.length ||
+ pwg->length > dinfo->max_size.length)
+ return (0); /* Out of range */
+
+ if ((flags & CUPS_MEDIA_FLAGS_BORDERLESS) &&
+ (dinfo->min_size.left > 0 || dinfo->min_size.right > 0 ||
+ dinfo->min_size.top > 0 || dinfo->min_size.bottom > 0))
+ return (0); /* Not borderless */
+
+ key.size_name = (char *)pwg->pwg;
+ key.bottom = dinfo->min_size.bottom;
+ key.left = dinfo->min_size.left;
+ key.right = dinfo->min_size.right;
+ key.top = dinfo->min_size.top;
+
+ best = &key;
+ }
+ else if (pwg->width >= dinfo->min_size.width &&
+ pwg->width <= dinfo->max_size.width &&
+ pwg->length >= dinfo->min_size.length &&
+ pwg->length <= dinfo->max_size.length)
+ {
+ /*
+ * Map to custom size...
+ */
+
+ key.size_name = (char *)pwg->pwg;
+ key.bottom = dinfo->min_size.bottom;
+ key.left = dinfo->min_size.left;
+ key.right = dinfo->min_size.right;
+ key.top = dinfo->min_size.top;
+
+ best = &key;
+ }
+ else
+ {
+ /*
+ * Find a close size...
+ */
+
+ for (mdb = (_cups_media_db_t *)cupsArrayFirst(dinfo->media_db);
+ mdb;
+ mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+ if (cups_is_close_media_db(mdb, &key))
+ break;
+
+ if (!mdb)
+ return (0);
+
+ best = mdb;
+
+ if (flags & CUPS_MEDIA_FLAGS_BORDERLESS)
+ {
+ /*
+ * Look for the smallest margins...
+ */
+
+ if (best->left != 0 || best->right != 0 || best->top != 0 ||
+ best->bottom != 0)
+ {
+ for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+ mdb && cups_is_close_media_db(mdb, &key);
+ mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+ {
+ if (mdb->left <= best->left && mdb->right <= best->right &&
+ mdb->top <= best->top && mdb->bottom <= best->bottom)
+ {
+ best = mdb;
+ if (mdb->left == 0 && mdb->right == 0 && mdb->bottom == 0 &&
+ mdb->top == 0)
+ break;
+ }
+ }
+ }
+ }
+ else if (flags & CUPS_MEDIA_FLAGS_DUPLEX)
+ {
+ /*
+ * Look for the largest margins...
+ */
+
+ for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+ mdb && cups_is_close_media_db(mdb, &key);
+ mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+ {
+ if (mdb->left >= best->left && mdb->right >= best->right &&
+ mdb->top >= best->top && mdb->bottom >= best->bottom)
+ best = mdb;
+ }
+ }
+ else
+ {
+ /*
+ * Look for the smallest non-zero margins...
+ */
+
+ for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+ mdb && cups_is_close_media_db(mdb, &key);
+ mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+ {
+ if (((mdb->left > 0 && mdb->left <= best->left) || best->left == 0) &&
+ ((mdb->right > 0 && mdb->right <= best->right) ||
+ best->right == 0) &&
+ ((mdb->top > 0 && mdb->top <= best->top) || best->top == 0) &&
+ ((mdb->bottom > 0 && mdb->bottom <= best->bottom) ||
+ best->bottom == 0))
+ best = mdb;
+ }
+ }
+ }
+
+ if (best)
+ {
+ /*
+ * Return the matching size...
+ */
+
+ if (best->size_name)
+ strlcpy(size->media, best->size_name, sizeof(size->media));
+ else if (best->key)
+ strlcpy(size->media, best->key, sizeof(size->media));
+ else
+ strlcpy(size->media, pwg->pwg, sizeof(size->media));
+
+ size->width = best->width;
+ size->length = best->length;
+ size->bottom = best->bottom;
+ size->left = best->left;
+ size->right = best->right;
+ size->top = best->top;
+
+ return (1);
+ }
+
+ return (0);
+}
+
+
+/*
+ * 'cups_is_close_media_db()' - Compare two media entries to see if they are
+ * close to the same size.
+ *
+ * Currently we use 5 points (from PostScript) as the matching range...
+ */
+
+static int /* O - 1 if the sizes are close */
+cups_is_close_media_db(
+ _cups_media_db_t *a, /* I - First media entries */
+ _cups_media_db_t *b) /* I - Second media entries */
+{
+ int dwidth, /* Difference in width */
+ dlength; /* Difference in length */
+
+
+ dwidth = a->width - b->width;
+ dlength = a->length - b->length;
+
+ return (dwidth >= -176 && dwidth <= 176 &&
+ dlength >= -176 && dlength <= 176);
+}
+
+
+/*
+ * End of "$Id$".
+ */
diff --git a/cups/dest.c b/cups/dest.c
index 4ba18f41b..d8ed05581 100644
--- a/cups/dest.c
+++ b/cups/dest.c
@@ -3,7 +3,7 @@
*
* User-defined destination (and option) support for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
+ * Copyright 2007-2012 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -16,33 +16,6 @@
*
* Contents:
*
- * cupsdDeregisterPrinter() - Stop sending broadcast information for a local
- * printer and remove any pending references to
- * remote printers.
- * cupsdRegisterPrinter() - Start sending broadcast information for a
- * printer or update the broadcast contents.
- * cupsdStartBrowsing() - Start sending and receiving broadcast
- * information.
- * cupsdStopBrowsing() - Stop sending and receiving broadcast
- * information.
- * cupsdUpdateDNSSDName() - Update the computer name we use for browsing...
- * dequote() - Remote quotes from a string.
- * dnssdAddAlias() - Add a DNS-SD alias name.
- * dnssdBuildTxtRecord() - Build a TXT record from printer info.
- * dnssdComparePrinters() - Compare the registered names of two printers.
- * dnssdDeregisterPrinter() - Stop sending broadcast information for a
- * printer.
- * dnssdPackTxtRecord() - Pack an array of key/value pairs into the TXT
- * record format.
- * dnssdRegisterCallback() - DNSServiceRegister callback.
- * dnssdRegisterPrinter() - Start sending broadcast information for a
- * printer or update the broadcast contents.
- * dnssdStop() - Stop all DNS-SD registrations.
- * dnssdUpdate() - Handle DNS-SD queries.
- * get_auth_info_required() - Get the auth-info-required value to advertise.
- * get_hostconfig() - Get an /etc/hostconfig service setting.
- * update_lpd() - Update the LPD configuration as needed.
- * update_smb() - Update the SMB configuration as needed.
* cupsAddDest() - Add a destination to the list of
* destinations.
* _cupsAppleCopyDefaultPaperID() - Get the default paper ID.
@@ -53,6 +26,8 @@
* location.
* _cupsAppleSetUseLastPrinter() - Set whether to use the last used printer.
* cupsConnectDest() - Connect to the server for a destination.
+ * cupsConnectDestBlock() - Connect to the server for a destination.
+ * cupsCopyDest() - Copy a destination.
* cupsEnumDests() - Enumerate available destinations with a
* callback function.
* cupsEnumDestsBlock() - Enumerate available destinations with a
@@ -60,6 +35,8 @@
* cupsFreeDests() - Free the memory used by the list of
* destinations.
* cupsGetDest() - Get the named destination from the list.
+ * _cupsGetDestResource() - Get the resource path and URI for a
+ * destination.
* _cupsGetDests() - Get destinations from a server.
* cupsGetDests() - Get the list of destinations from the
* default server.
@@ -84,6 +61,15 @@
* cups_add_dest() - Add a destination to the array.
* cups_block_cb() - Enumeration callback for block API.
* cups_compare_dests() - Compare two destinations.
+ * cups_dnssd_browse_cb() - Browse for printers.
+ * cups_dnssd_compare_device() - Compare two devices.
+ * cups_dnssd_free_device() - Free the memory used by a device.
+ * cups_dnssd_get_device() - Lookup a device and create it as needed.
+ * cups_dnssd_local_cb() - Browse for local printers.
+ * cups_dnssd_query_cb() - Process query data.
+ * cups_dnssd_resolve() - Resolve a Bonjour printer URI.
+ * cups_dnssd_resolve_cb() - See if we should continue resolving.
+ * cups_dnssd_unquote() - Unquote a name string.
* cups_find_dest() - Find a destination using a binary search.
* cups_get_default() - Get the default destination from an
* lpoptions file.
@@ -103,6 +89,19 @@
# include
#endif /* HAVE_NOTIFY_H */
+#ifdef HAVE_POLL
+# include
+#endif /* HAVE_POLL */
+
+#ifdef HAVE_DNSSD
+# include
+#endif /* HAVE_DNSSD */
+
+
+/*
+ * Constants...
+ */
+
#ifdef __APPLE__
# include
# define kCUPSPrintingPrefs CFSTR("org.cups.PrintingPrefs")
@@ -114,6 +113,50 @@
#endif /* __APPLE__ */
+/*
+ * Types...
+ */
+
+#ifdef HAVE_DNSSD
+typedef enum _cups_dnssd_state_e /* Enumerated device state */
+{
+ _CUPS_DNSSD_NEW,
+ _CUPS_DNSSD_QUERY,
+ _CUPS_DNSSD_PENDING,
+ _CUPS_DNSSD_ACTIVE,
+ _CUPS_DNSSD_LOCAL,
+ _CUPS_DNSSD_ERROR
+} _cups_dnssd_state_t;
+
+typedef struct _cups_dnssd_data_s /* Enumeration data */
+{
+ DNSServiceRef main_ref; /* Main service reference */
+ cups_dest_cb_t cb; /* Callback */
+ void *user_data; /* User data pointer */
+ cups_ptype_t type, /* Printer type filter */
+ mask; /* Printer type mask */
+ cups_array_t *devices; /* Devices found so far */
+} _cups_dnssd_data_t;
+
+typedef struct _cups_dnssd_device_s /* Enumerated device */
+{
+ _cups_dnssd_state_t state; /* State of device listing */
+ DNSServiceRef ref; /* Service reference for query */
+ char *domain, /* Domain name */
+ *fullName, /* Full name */
+ *regtype; /* Registration type */
+ cups_ptype_t type; /* Device registration type */
+ cups_dest_t dest; /* Destination record */
+} _cups_dnssd_device_t;
+
+typedef struct _cups_dnssd_resolve_s /* Data for resolving URI */
+{
+ int *cancel; /* Pointer to "cancel" variable */
+ struct timeval end_time; /* Ending time */
+} _cups_dnssd_resolve_t;
+#endif /* HAVE_DNSSD */
+
+
/*
* Local functions...
*/
@@ -128,11 +171,51 @@ static CFStringRef appleGetPrinter(CFArrayRef locations, CFStringRef network,
static cups_dest_t *cups_add_dest(const char *name, const char *instance,
int *num_dests, cups_dest_t **dests);
#ifdef __BLOCKS__
-static int cups_block_cb(cups_dest_block_t block, const char *name,
- const char *instance, int num_options,
- cups_option_t *options);
+static int cups_block_cb(cups_dest_block_t block, unsigned flags,
+ cups_dest_t *dest);
#endif /* __BLOCKS__ */
static int cups_compare_dests(cups_dest_t *a, cups_dest_t *b);
+#ifdef HAVE_DNSSD
+static void cups_dnssd_browse_cb(DNSServiceRef sdRef,
+ DNSServiceFlags flags,
+ uint32_t interfaceIndex,
+ DNSServiceErrorType errorCode,
+ const char *serviceName,
+ const char *regtype,
+ const char *replyDomain,
+ void *context);
+static int cups_dnssd_compare_devices(_cups_dnssd_device_t *a,
+ _cups_dnssd_device_t *b);
+static void cups_dnssd_free_device(_cups_dnssd_device_t *device,
+ _cups_dnssd_data_t *data);
+static _cups_dnssd_device_t *
+ cups_dnssd_get_device(_cups_dnssd_data_t *data,
+ const char *serviceName,
+ const char *regtype,
+ const char *replyDomain);
+static void cups_dnssd_local_cb(DNSServiceRef sdRef,
+ DNSServiceFlags flags,
+ uint32_t interfaceIndex,
+ DNSServiceErrorType errorCode,
+ const char *serviceName,
+ const char *regtype,
+ const char *replyDomain,
+ void *context);
+static void cups_dnssd_query_cb(DNSServiceRef sdRef,
+ DNSServiceFlags flags,
+ uint32_t interfaceIndex,
+ DNSServiceErrorType errorCode,
+ const char *fullName,
+ uint16_t rrtype, uint16_t rrclass,
+ uint16_t rdlen, const void *rdata,
+ uint32_t ttl, void *context);
+static const char *cups_dnssd_resolve(cups_dest_t *dest, const char *uri,
+ int msec, int *cancel,
+ cups_dest_cb_t cb, void *user_data);
+static int cups_dnssd_resolve_cb(void *context);
+static void cups_dnssd_unquote(char *dst, const char *src,
+ size_t dstsize);
+#endif /* HAVE_DNSSD */
static int cups_find_dest(const char *name, const char *instance,
int num_dests, cups_dest_t *dests, int prev,
int *rdiff);
@@ -460,35 +543,476 @@ _cupsAppleSetUseLastPrinter(
/*
* 'cupsConnectDest()' - Connect to the server for a destination.
*
+ * Connect to the destination, returning a new http_t connection object and
+ * optionally the resource path to use for the destination. These calls will
+ * block until a connection is made, the timeout expires, the integer pointed
+ * to by "cancel" is non-zero, or the callback function (or block) returns 0,
+ * The caller is responsible for calling httpClose() on the returned object.
+ *
* @since CUPS 1.6@
*/
http_t * /* O - Connection to server or @code NULL@ */
-cupsConnectDest(cups_dest_t *dest) /* I - Destination */
+cupsConnectDest(
+ cups_dest_t *dest, /* I - Destination */
+ unsigned flags, /* I - Connection flags */
+ int msec, /* I - Timeout in milliseconds */
+ int *cancel, /* I - Pointer to "cancel" variable */
+ char *resource, /* I - Resource buffer */
+ size_t resourcesize, /* I - Size of resource buffer */
+ cups_dest_cb_t cb, /* I - Callback function */
+ void *user_data) /* I - User data pointer */
{
- return (NULL);
+ const char *uri; /* Printer URI */
+ char scheme[32], /* URI scheme */
+ userpass[256], /* Username and password (unused) */
+ hostname[256], /* Hostname */
+ tempresource[1024]; /* Temporary resource buffer */
+ int port; /* Port number */
+ char portstr[16]; /* Port number string */
+ http_encryption_t encrypt; /* Encryption to use */
+ http_addrlist_t *addrlist; /* Address list for server */
+ http_t *http; /* Connection to server */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!dest)
+ {
+ if (resource)
+ *resource = '\0';
+
+ _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ return (NULL);
+ }
+
+ if (!resource || resourcesize < 1)
+ {
+ resource = tempresource;
+ resourcesize = sizeof(tempresource);
+ }
+
+ /*
+ * Grab the printer URI...
+ */
+
+ if ((uri = cupsGetOption("printer-uri-supported", dest->num_options,
+ dest->options)) == NULL)
+ {
+ _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOENT), 0);
+
+ if (cb)
+ (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_ERROR,
+ dest);
+
+ return (NULL);
+ }
+
+#ifdef HAVE_DNSSD
+ if (strstr(uri, "._tcp"))
+ {
+ if ((uri = cups_dnssd_resolve(dest, uri, msec, cancel, cb,
+ user_data)) == NULL)
+ return (NULL);
+ }
+#endif /* HAVE_DNSSD */
+
+ if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme),
+ userpass, sizeof(userpass), hostname, sizeof(hostname),
+ &port, resource, resourcesize) < HTTP_URI_OK)
+ {
+ _cupsSetError(IPP_INTERNAL_ERROR, _("Bad printer URI."), 1);
+
+ if (cb)
+ (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_ERROR,
+ dest);
+
+ return (NULL);
+ }
+
+ /*
+ * Lookup the address for the server...
+ */
+
+ if (cb)
+ (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_RESOLVING,
+ dest);
+
+ snprintf(portstr, sizeof(portstr), "%d", port);
+
+ if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portstr)) == NULL)
+ {
+ if (cb)
+ (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_ERROR,
+ dest);
+
+ return (NULL);
+ }
+
+ if (cancel && *cancel)
+ {
+ httpAddrFreeList(addrlist);
+
+ if (cb)
+ (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_CANCELED,
+ dest);
+
+ return (NULL);
+ }
+
+ /*
+ * Create the HTTP object pointing to the server referenced by the URI...
+ */
+
+ if (!strcmp(scheme, "ipps") || port == 443)
+ encrypt = HTTP_ENCRYPT_ALWAYS;
+ else
+ encrypt = HTTP_ENCRYPT_IF_REQUESTED;
+
+ http = _httpCreate(hostname, port, addrlist, encrypt, AF_UNSPEC);
+
+ /*
+ * Connect if requested...
+ */
+
+ if (flags & CUPS_DEST_FLAGS_UNCONNECTED)
+ {
+ if (cb)
+ (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED, dest);
+ }
+ else
+ {
+ if (cb)
+ (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_CONNECTING,
+ dest);
+
+ if (!httpReconnect2(http, msec, cancel) && cb)
+ {
+ if (cancel && *cancel)
+ (*cb)(user_data,
+ CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_CONNECTING, dest);
+ else
+ (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_ERROR,
+ dest);
+ }
+ else if (cb)
+ (*cb)(user_data, CUPS_DEST_FLAGS_NONE, dest);
+ }
+
+ return (http);
+}
+
+
+#ifdef __BLOCKS__
+/*
+ * 'cupsConnectDestBlock()' - Connect to the server for a destination.
+ *
+ * Connect to the destination, returning a new http_t connection object and
+ * optionally the resource path to use for the destination. These calls will
+ * block until a connection is made, the timeout expires, the integer pointed
+ * to by "cancel" is non-zero, or the callback function (or block) returns 0,
+ * The caller is responsible for calling httpClose() on the returned object.
+ *
+ * @since CUPS 1.6@
+ */
+
+http_t * /* O - Connection to server or @code NULL@ */
+cupsConnectDestBlock(
+ cups_dest_t *dest, /* I - Destination */
+ unsigned flags, /* I - Connection flags */
+ int msec, /* I - Timeout in milliseconds */
+ int *cancel, /* I - Pointer to "cancel" variable */
+ char *resource, /* I - Resource buffer */
+ size_t resourcesize, /* I - Size of resource buffer */
+ cups_dest_block_t block) /* I - Callback block */
+{
+ return (cupsConnectDest(dest, flags, msec, cancel, resource, resourcesize,
+ (cups_dest_cb_t)cups_block_cb, (void *)block));
+}
+#endif /* __BLOCKS__ */
+
+
+/*
+ * 'cupsCopyDest()' - Copy a destination.
+ *
+ * Make a copy of the destination to an array of destinations (or just a single
+ * copy) - for use with the cupsEnumDests* functions. The caller is responsible
+ * for calling cupsFreeDests() on the returned object(s).
+ *
+ * @since CUPS 1.6@
+ */
+
+int
+cupsCopyDest(cups_dest_t *dest,
+ int num_dests,
+ cups_dest_t **dests)
+{
+ int i; /* Looping var */
+ cups_dest_t *new_dest; /* New destination pointer */
+ cups_option_t *new_option, /* Current destination option */
+ *option; /* Current parent option */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!dest || num_dests < 0 || !dests)
+ return (num_dests);
+
+ /*
+ * See if the destination already exists...
+ */
+
+ if ((new_dest = cupsGetDest(dest->name, dest->instance, num_dests,
+ *dests)) != NULL)
+ {
+ /*
+ * Protect against copying destination to itself...
+ */
+
+ if (new_dest == dest)
+ return (num_dests);
+
+ /*
+ * Otherwise, free the options...
+ */
+
+ cupsFreeOptions(new_dest->num_options, new_dest->options);
+
+ new_dest->num_options = 0;
+ new_dest->options = NULL;
+ }
+ else
+ new_dest = cups_add_dest(dest->name, dest->instance, &num_dests, dests);
+
+ if (new_dest)
+ {
+ if ((new_dest->options = calloc(sizeof(cups_option_t),
+ dest->num_options)) == NULL)
+ return (cupsRemoveDest(dest->name, dest->instance, num_dests, dests));
+
+ new_dest->num_options = dest->num_options;
+
+ for (i = dest->num_options, option = dest->options,
+ new_option = new_dest->options;
+ i > 0;
+ i --, option ++, new_option ++)
+ {
+ new_option->name = _cupsStrRetain(option->name);
+ new_option->value = _cupsStrRetain(option->value);
+ }
+ }
+
+ return (num_dests);
}
/*
* 'cupsEnumDests()' - Enumerate available destinations with a callback function.
*
- * Destinations are enumerated from one or more sources. The callback function receives
- * the @code user_data@ pointer, destination name, instance, number of options, and
- * options which can be used as input to the @link cupsAddDest@ function. The function
- * must return 1 to continue enumeration or 0 to stop.
+ * Destinations are enumerated from one or more sources. The callback function
+ * receives the @code user_data@ pointer, destination name, instance, number of
+ * options, and options which can be used as input to the @link cupsAddDest@
+ * function. The function must return 1 to continue enumeration or 0 to stop.
*
- * Enumeration happens on the current thread and does not return until all destinations
- * have been enumerated or the callback function returns 0.
+ * Enumeration happens on the current thread and does not return until all
+ * destinations have been enumerated or the callback function returns 0.
*
* @since CUPS 1.6@
*/
int /* O - 1 on success, 0 on failure */
-cupsEnumDests(cups_dest_cb_t cb, /* I - Callback function */
- void *user_data)/* I - User data */
+cupsEnumDests(
+ unsigned flags, /* I - Enumeration flags */
+ int msec, /* I - Timeout in milliseconds,
+ * -1 for indefinite */
+ int *cancel, /* I - Pointer to "cancel" variable */
+ cups_ptype_t type, /* I - Printer type bits */
+ cups_ptype_t mask, /* I - Mask for printer type bits */
+ cups_dest_cb_t cb, /* I - Callback function */
+ void *user_data) /* I - User data */
{
- return (0);
+ int i, /* Looping var */
+ num_dests; /* Number of destinations */
+ cups_dest_t *dests, /* Destinations */
+ *dest; /* Current destination */
+#ifdef HAVE_DNSSD
+ int nfds, /* Number of files responded */
+ count, /* Number of queries started */
+ remaining; /* Remainder of timeout */
+ _cups_dnssd_data_t data; /* Data for callback */
+ _cups_dnssd_device_t *device; /* Current device */
+ int main_fd; /* File descriptor for lookups */
+ DNSServiceRef ipp_ref, /* IPP browser */
+ local_ipp_ref; /* Local IPP browser */
+# ifdef HAVE_SSL
+ DNSServiceRef ipps_ref, /* IPPS browser */
+ local_ipps_ref; /* Local IPPS browser */
+# endif /* HAVE_SSL */
+# ifdef HAVE_POLL
+ struct pollfd pfd; /* Polling data */
+# else
+ fd_set input; /* Input set for select() */
+ struct timeval timeout; /* Timeout for select() */
+# endif /* HAVE_POLL */
+#endif /* HAVE_DNSSD */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!cb)
+ return (0);
+
+ /*
+ * Get the list of local printers and pass them to the callback function...
+ */
+
+ num_dests = _cupsGetDests(CUPS_HTTP_DEFAULT, CUPS_GET_PRINTERS, NULL, &dests,
+ type, mask);
+
+ for (i = num_dests, dest = dests;
+ i > 0 && (!cancel || !*cancel);
+ i --, dest ++)
+ if (!(*cb)(user_data, i > 1 ? CUPS_DEST_FLAGS_MORE : CUPS_DEST_FLAGS_NONE,
+ dest))
+ break;
+
+ cupsFreeDests(num_dests, dests);
+
+ if (i > 0 || msec == 0)
+ return (1);
+
+#ifdef HAVE_DNSSD
+ /*
+ * Get Bonjour-shared printers...
+ */
+
+ data.type = type;
+ data.mask = mask;
+ data.devices = cupsArrayNew3((cups_array_func_t)cups_dnssd_compare_devices,
+ NULL, NULL, 0, NULL,
+ (cups_afree_func_t)cups_dnssd_free_device);
+
+ if (DNSServiceCreateConnection(&data.main_ref) != kDNSServiceErr_NoError)
+ return (0);
+
+ main_fd = DNSServiceRefSockFD(data.main_ref);
+
+ ipp_ref = data.main_ref;
+ DNSServiceBrowse(&ipp_ref, kDNSServiceFlagsShareConnection, 0,
+ "_ipp._tcp,_cups", NULL, cups_dnssd_browse_cb, &data);
+
+ local_ipp_ref = data.main_ref;
+ DNSServiceBrowse(&local_ipp_ref, kDNSServiceFlagsShareConnection,
+ kDNSServiceInterfaceIndexLocalOnly,
+ "_ipp._tcp,_cups", NULL, cups_dnssd_local_cb, &data);
+
+# ifdef HAVE_SSL
+ ipps_ref = data.main_ref;
+ DNSServiceBrowse(&ipps_ref, kDNSServiceFlagsShareConnection, 0,
+ "_ipps._tcp,_cups", NULL, cups_dnssd_browse_cb, &data);
+
+ local_ipps_ref = data.main_ref;
+ DNSServiceBrowse(&local_ipps_ref, kDNSServiceFlagsShareConnection,
+ kDNSServiceInterfaceIndexLocalOnly,
+ "_ipps._tcp,_cups", NULL, cups_dnssd_local_cb, &data);
+# endif /* HAVE_SSL */
+
+ if (msec < 0)
+ remaining = INT_MAX;
+ else
+ remaining = msec;
+
+ while (remaining > 0 && (!cancel || !*cancel))
+ {
+ /*
+ * Check for input...
+ */
+
+# ifdef HAVE_POLL
+ pfd.fd = main_fd;
+ pfd.events = POLLIN;
+
+ nfds = poll(&pfd, 1, remaining > 250 ? 250 : remaining);
+
+# else
+ FD_ZERO(&input);
+ FD_SET(main_fd, &input);
+
+ timeout.tv_sec = 0;
+ timeout.tv_usec = remaining > 250 ? 250000 : remaining * 1000;
+
+ nfds = select(main_fd + 1, &input, NULL, NULL, &timeout);
+# endif /* HAVE_POLL */
+
+ if (nfds > 0)
+ DNSServiceProcessResult(data.main_ref);
+ else if (nfds == 0)
+ remaining -= 250;
+
+ for (device = (_cups_dnssd_device_t *)cupsArrayFirst(data.devices),
+ count = 0;
+ device;
+ device = (_cups_dnssd_device_t *)cupsArrayNext(data.devices))
+ {
+ if (device->ref)
+ count ++;
+
+ if (!device->ref && device->state == _CUPS_DNSSD_NEW)
+ {
+ device->ref = data.main_ref;
+
+ DEBUG_printf(("1cupsEnumDests: Querying '%s'.", device->fullName));
+
+ if (DNSServiceQueryRecord(&(device->ref),
+ kDNSServiceFlagsShareConnection,
+ 0, device->fullName,
+ kDNSServiceType_TXT,
+ kDNSServiceClass_IN, cups_dnssd_query_cb,
+ &data) == kDNSServiceErr_NoError)
+ {
+ count ++;
+ }
+ else
+ {
+ device->ref = 0;
+ device->state = _CUPS_DNSSD_ERROR;
+
+ DEBUG_puts("1cupsEnumDests: Query failed.");
+ }
+ }
+ else if (device->ref && device->state == _CUPS_DNSSD_PENDING)
+ {
+ if (!(*cb)(user_data, CUPS_DEST_FLAGS_NONE, &device->dest))
+ {
+ remaining = -1;
+ break;
+ }
+
+ device->state = _CUPS_DNSSD_ACTIVE;
+ }
+ }
+ }
+
+ cupsArrayDelete(data.devices);
+
+ DNSServiceRefDeallocate(ipp_ref);
+ DNSServiceRefDeallocate(local_ipp_ref);
+
+# ifdef HAVE_SSL
+ DNSServiceRefDeallocate(ipp_ref);
+ DNSServiceRefDeallocate(local_ipp_ref);
+# endif /* HAVE_SSL */
+
+ DNSServiceRefDeallocate(data.main_ref);
+#endif /* HAVE_DNSSD */
+
+ return (1);
}
@@ -497,21 +1021,27 @@ cupsEnumDests(cups_dest_cb_t cb, /* I - Callback function */
* 'cupsEnumDestsBlock()' - Enumerate available destinations with a block.
*
* Destinations are enumerated from one or more sources. The block receives the
- * destination name, instance, number of options, and options which can be used as input
- * to the @link cupsAddDest@ function. The block must return 1 to continue enumeration or
- * 0 to stop.
+ * destination name, instance, number of options, and options which can be used
+ * as input to the @link cupsAddDest@ function. The block must return 1 to
+ * continue enumeration or 0 to stop.
*
- * Enumeration happens on the current thread and does not return until all destinations
- * have been enumerated or the block returns 0.
+ * Enumeration happens on the current thread and does not return until all
+ * destinations have been enumerated or the block returns 0.
*
* @since CUPS 1.6@
*/
int /* O - 1 on success, 0 on failure */
cupsEnumDestsBlock(
+ unsigned flags, /* I - Enumeration flags */
+ int timeout, /* I - Timeout in milliseconds, 0 for indefinite */
+ int *cancel, /* I - Pointer to "cancel" variable */
+ cups_ptype_t type, /* I - Printer type bits */
+ cups_ptype_t mask, /* I - Mask for printer type bits */
cups_dest_block_t block) /* I - Block */
{
- return (cupsEnumDests((cups_dest_cb_t)cups_block_cb, (void *)block));
+ return (cupsEnumDests(flags, timeout, cancel, type, mask,
+ (cups_dest_cb_t)cups_block_cb, (void *)block));
}
# endif /* __BLOCKS__ */
@@ -594,6 +1124,72 @@ cupsGetDest(const char *name, /* I - Destination name or @code NULL@ for the d
}
+/*
+ * '_cupsGetDestResource()' - Get the resource path and URI for a destination.
+ */
+
+const char * /* O - Printer URI */
+_cupsGetDestResource(
+ cups_dest_t *dest, /* I - Destination */
+ char *resource, /* I - Resource buffer */
+ size_t resourcesize) /* I - Size of resource buffer */
+{
+ const char *uri; /* Printer URI */
+ char scheme[32], /* URI scheme */
+ userpass[256], /* Username and password (unused) */
+ hostname[256]; /* Hostname */
+ int port; /* Port number */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!dest || !resource || resourcesize < 1)
+ {
+ if (resource)
+ *resource = '\0';
+
+ _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+ return (NULL);
+ }
+
+ /*
+ * Grab the printer URI...
+ */
+
+ if ((uri = cupsGetOption("printer-uri-supported", dest->num_options,
+ dest->options)) == NULL)
+ {
+ if (resource)
+ *resource = '\0';
+
+ _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOENT), 0);
+
+ return (NULL);
+ }
+
+#ifdef HAVE_DNSSD
+ if (strstr(uri, "._tcp"))
+ {
+ if ((uri = cups_dnssd_resolve(dest, uri, 5000, NULL, NULL, NULL)) == NULL)
+ return (NULL);
+ }
+#endif /* HAVE_DNSSD */
+
+ if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme),
+ userpass, sizeof(userpass), hostname, sizeof(hostname),
+ &port, resource, resourcesize) < HTTP_URI_OK)
+ {
+ _cupsSetError(IPP_INTERNAL_ERROR, _("Bad printer URI."), 1);
+
+ return (NULL);
+ }
+
+ return (uri);
+}
+
+
/*
* '_cupsGetDests()' - Get destinations from a server.
*
@@ -617,11 +1213,14 @@ cupsGetDest(const char *name, /* I - Destination name or @code NULL@ for the d
* options array for each destination that supports it.
*/
-int /* O - Number of destinations */
-_cupsGetDests(http_t *http, /* I - Connection to server or CUPS_HTTP_DEFAULT */
- ipp_op_t op, /* I - IPP operation */
- const char *name, /* I - Name of destination */
- cups_dest_t **dests) /* IO - Destinations */
+int /* O - Number of destinations */
+_cupsGetDests(http_t *http, /* I - Connection to server or
+ * @code CUPS_HTTP_DEFAULT@ */
+ ipp_op_t op, /* I - IPP operation */
+ const char *name, /* I - Name of destination */
+ cups_dest_t **dests, /* IO - Destinations */
+ cups_ptype_t type, /* I - Printer type bits */
+ cups_ptype_t mask) /* I - Printer type mask */
{
int num_dests = 0; /* Number of destinations */
cups_dest_t *dest; /* Current destination */
@@ -704,6 +1303,13 @@ _cupsGetDests(http_t *http, /* I - Connection to server or CUPS_HTTP_DEFAUL
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
uri);
}
+ else if (mask)
+ {
+ ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type",
+ type);
+ ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type-mask",
+ mask);
+ }
/*
* Do the request and get back a response...
@@ -931,7 +1537,7 @@ cupsGetDests2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_
*/
*dests = (cups_dest_t *)0;
- num_dests = _cupsGetDests(http, CUPS_GET_PRINTERS, NULL, dests);
+ num_dests = _cupsGetDests(http, CUPS_GET_PRINTERS, NULL, dests, 0, 0);
if (cupsLastError() >= IPP_REDIRECTION_OTHER_SITE)
{
@@ -1153,7 +1759,7 @@ cupsGetNamedDest(http_t *http, /* I - Connection to server or @code CUPS_HTT
* Get the printer's attributes...
*/
- if (!_cupsGetDests(http, op, name, &dest))
+ if (!_cupsGetDests(http, op, name, &dest, 0, 0))
{
if (op == CUPS_GET_DEFAULT || (name && !set_as_default))
return (NULL);
@@ -1163,7 +1769,7 @@ cupsGetNamedDest(http_t *http, /* I - Connection to server or @code CUPS_HTT
* configuration file does not exist. Find out the real default.
*/
- if (!_cupsGetDests(http, CUPS_GET_DEFAULT, NULL, &dest))
+ if (!_cupsGetDests(http, CUPS_GET_DEFAULT, NULL, &dest, 0, 0))
return (NULL);
}
@@ -1340,7 +1946,7 @@ cupsSetDests2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_
* Get the server destinations...
*/
- num_temps = _cupsGetDests(http, CUPS_GET_PRINTERS, NULL, &temps);
+ num_temps = _cupsGetDests(http, CUPS_GET_PRINTERS, NULL, &temps, 0, 0);
if (cupsLastError() >= IPP_REDIRECTION_OTHER_SITE)
{
@@ -1837,12 +2443,10 @@ cups_add_dest(const char *name, /* I - Name of destination */
static int /* O - 1 to continue, 0 to stop */
cups_block_cb(
cups_dest_block_t block, /* I - Block */
- const char *name, /* I - Destination name */
- const char *instance, /* I - Instance or @code NULL@ */
- int num_options, /* I - Number of options */
- cups_option_t *options) /* I - Options */
+ unsigned flags, /* I - Destination flags */
+ cups_dest_t *dest) /* I - Destination */
{
- return ((block)(name, instance, num_options, options));
+ return ((block)(flags, dest));
}
# endif /* __BLOCKS__ */
@@ -1867,6 +2471,588 @@ cups_compare_dests(cups_dest_t *a, /* I - First destination */
}
+#ifdef HAVE_DNSSD
+/*
+ * 'cups_dnssd_browse_cb()' - Browse for printers.
+ */
+
+static void
+cups_dnssd_browse_cb(
+ DNSServiceRef sdRef, /* I - Service reference */
+ DNSServiceFlags flags, /* I - Option flags */
+ uint32_t interfaceIndex, /* I - Interface number */
+ DNSServiceErrorType errorCode, /* I - Error, if any */
+ const char *serviceName, /* I - Name of service/device */
+ const char *regtype, /* I - Type of service */
+ const char *replyDomain, /* I - Service domain */
+ void *context) /* I - Enumeration data */
+{
+ _cups_dnssd_data_t *data = (_cups_dnssd_data_t *)context;
+ /* Enumeration data */
+
+
+ DEBUG_printf(("5cups_dnssd_browse_cb(sdRef=%p, flags=%x, "
+ "interfaceIndex=%d, errorCode=%d, serviceName=\"%s\", "
+ "regtype=\"%s\", replyDomain=\"%s\", context=%p)",
+ sdRef, flags, interfaceIndex, errorCode, serviceName, regtype,
+ replyDomain, context));
+
+ /*
+ * Don't do anything on error...
+ */
+
+ if (errorCode != kDNSServiceErr_NoError)
+ return;
+
+ /*
+ * Get the device...
+ */
+
+ cups_dnssd_get_device(data, serviceName, regtype, replyDomain);
+}
+
+
+/*
+ * 'cups_dnssd_compare_device()' - Compare two devices.
+ */
+
+static int /* O - Result of comparison */
+cups_dnssd_compare_devices(
+ _cups_dnssd_device_t *a, /* I - First device */
+ _cups_dnssd_device_t *b) /* I - Second device */
+{
+ return (strcmp(a->dest.name, b->dest.name));
+}
+
+
+/*
+ * 'cups_dnssd_free_device()' - Free the memory used by a device.
+ */
+
+static void
+cups_dnssd_free_device(
+ _cups_dnssd_device_t *device, /* I - Device */
+ _cups_dnssd_data_t *data) /* I - Enumeration data */
+{
+ DEBUG_printf(("5cups_dnssd_free_device(device=%p(%s), data=%p)", device,
+ device->dest.name, data));
+
+ if (device->ref)
+ DNSServiceRefDeallocate(device->ref);
+
+ _cupsStrFree(device->domain);
+ _cupsStrFree(device->fullName);
+ _cupsStrFree(device->regtype);
+ _cupsStrFree(device->dest.name);
+
+ cupsFreeOptions(device->dest.num_options, device->dest.options);
+
+ free(device);
+}
+
+
+/*
+ * 'cups_dnssd_get_device()' - Lookup a device and create it as needed.
+ */
+
+static _cups_dnssd_device_t * /* O - Device */
+cups_dnssd_get_device(
+ _cups_dnssd_data_t *data, /* I - Enumeration data */
+ const char *serviceName, /* I - Service name */
+ const char *regtype, /* I - Registration type */
+ const char *replyDomain) /* I - Domain name */
+{
+ _cups_dnssd_device_t key, /* Search key */
+ *device; /* Device */
+ char fullName[kDNSServiceMaxDomainName];
+ /* Full name for query */
+
+
+ DEBUG_printf(("5cups_dnssd_get_device(data=%p, serviceName=\"%s\", "
+ "regtype=\"%s\", replyDomain=\"%s\")", data, serviceName,
+ regtype, replyDomain));
+
+ /*
+ * See if this is an existing device...
+ */
+
+ key.dest.name = (char *)serviceName;
+
+ if ((device = cupsArrayFind(data->devices, &key)) != NULL)
+ {
+ /*
+ * Yes, see if we need to do anything with this...
+ */
+
+ int update = 0; /* Non-zero if we need to update */
+
+ if (!_cups_strcasecmp(replyDomain, "local.") &&
+ _cups_strcasecmp(device->domain, replyDomain))
+ {
+ /*
+ * Update the "global" listing to use the .local domain name instead.
+ */
+
+ _cupsStrFree(device->domain);
+ device->domain = _cupsStrAlloc(replyDomain);
+
+ DEBUG_printf(("6cups_dnssd_get_device: Updating '%s' to use local "
+ "domain.", device->dest.name));
+
+ update = 1;
+ }
+
+ if (!_cups_strcasecmp(regtype, "_ipps._tcp") &&
+ _cups_strcasecmp(device->regtype, regtype))
+ {
+ /*
+ * Prefer IPPS over IPP.
+ */
+
+ _cupsStrFree(device->regtype);
+ device->regtype = _cupsStrAlloc(regtype);
+
+ DEBUG_printf(("6cups_dnssd_get_device: Updating '%s' to use IPPS.",
+ device->dest.name));
+
+ update = 1;
+ }
+
+ if (!update)
+ {
+ DEBUG_printf(("6cups_dnssd_get_device: No changes to '%s'.",
+ device->dest.name));
+ return (device);
+ }
+ }
+ else
+ {
+ /*
+ * No, add the device...
+ */
+
+ DEBUG_printf(("6cups_dnssd_get_device: Adding '%s' for %s with domain "
+ "'%s'.", serviceName,
+ !strcmp(regtype, "_ipps._tcp") ? "IPPS" : "IPP",
+ replyDomain));
+
+ device = calloc(sizeof(_cups_dnssd_device_t), 1);
+ device->dest.name = _cupsStrAlloc(serviceName);
+ device->domain = _cupsStrAlloc(replyDomain);
+ device->regtype = _cupsStrAlloc(regtype);
+
+ cupsArrayAdd(data->devices, device);
+ }
+
+ /*
+ * Set the "full name" of this service, which is used for queries...
+ */
+
+ DNSServiceConstructFullName(fullName, device->dest.name, device->regtype,
+ device->domain);
+ _cupsStrFree(device->fullName);
+ device->fullName = _cupsStrAlloc(fullName);
+
+ if (device->ref)
+ {
+ DNSServiceRefDeallocate(device->ref);
+ device->ref = 0;
+ }
+
+ if (device->state == _CUPS_DNSSD_ACTIVE)
+ {
+ (*data->cb)(data->user_data, CUPS_DEST_FLAGS_REMOVED, &device->dest);
+ device->state = _CUPS_DNSSD_NEW;
+ }
+
+ return (device);
+}
+
+
+/*
+ * 'cups_dnssd_local_cb()' - Browse for local printers.
+ */
+
+static void
+cups_dnssd_local_cb(
+ DNSServiceRef sdRef, /* I - Service reference */
+ DNSServiceFlags flags, /* I - Option flags */
+ uint32_t interfaceIndex, /* I - Interface number */
+ DNSServiceErrorType errorCode, /* I - Error, if any */
+ const char *serviceName, /* I - Name of service/device */
+ const char *regtype, /* I - Type of service */
+ const char *replyDomain, /* I - Service domain */
+ void *context) /* I - Devices array */
+{
+ _cups_dnssd_data_t *data = (_cups_dnssd_data_t *)context;
+ /* Enumeration data */
+ _cups_dnssd_device_t *device; /* Device */
+
+
+ DEBUG_printf(("5cups_dnssd_local_cb(sdRef=%p, flags=%x, "
+ "interfaceIndex=%d, errorCode=%d, serviceName=\"%s\", "
+ "regtype=\"%s\", replyDomain=\"%s\", context=%p)",
+ sdRef, flags, interfaceIndex, errorCode, serviceName,
+ regtype, replyDomain, context));
+
+ /*
+ * Only process "add" data...
+ */
+
+ if (errorCode != kDNSServiceErr_NoError || !(flags & kDNSServiceFlagsAdd))
+ return;
+
+ /*
+ * Get the device...
+ */
+
+ device = cups_dnssd_get_device(data, serviceName, regtype, replyDomain);
+
+ /*
+ * Hide locally-registered devices...
+ */
+
+ DEBUG_printf(("6cups_dnssd_local_cb: Hiding local printer '%s'.",
+ serviceName));
+
+ if (device->ref)
+ {
+ DNSServiceRefDeallocate(device->ref);
+ device->ref = 0;
+ }
+
+ if (device->state == _CUPS_DNSSD_ACTIVE)
+ (*data->cb)(data->user_data, CUPS_DEST_FLAGS_REMOVED, &device->dest);
+
+ device->state = _CUPS_DNSSD_LOCAL;
+}
+
+
+/*
+ * 'cups_dnssd_query_cb()' - Process query data.
+ */
+
+static void
+cups_dnssd_query_cb(
+ DNSServiceRef sdRef, /* I - Service reference */
+ DNSServiceFlags flags, /* I - Data flags */
+ uint32_t interfaceIndex, /* I - Interface */
+ DNSServiceErrorType errorCode, /* I - Error, if any */
+ const char *fullName, /* I - Full service name */
+ uint16_t rrtype, /* I - Record type */
+ uint16_t rrclass, /* I - Record class */
+ uint16_t rdlen, /* I - Length of record data */
+ const void *rdata, /* I - Record data */
+ uint32_t ttl, /* I - Time-to-live */
+ void *context) /* I - Enumeration data */
+{
+ _cups_dnssd_data_t *data = (_cups_dnssd_data_t *)context;
+ /* Enumeration data */
+ char name[1024], /* Service name */
+ *ptr; /* Pointer into string */
+ _cups_dnssd_device_t dkey, /* Search key */
+ *device; /* Device */
+
+
+ DEBUG_printf(("5cups_dnssd_query_cb(sdRef=%p, flags=%x, "
+ "interfaceIndex=%d, errorCode=%d, fullName=\"%s\", "
+ "rrtype=%u, rrclass=%u, rdlen=%u, rdata=%p, ttl=%u, "
+ "context=%p)", sdRef, flags, interfaceIndex, errorCode,
+ fullName, rrtype, rrclass, rdlen, rdata, ttl, context));
+
+ /*
+ * Only process "add" data...
+ */
+
+ if (errorCode != kDNSServiceErr_NoError || !(flags & kDNSServiceFlagsAdd))
+ return;
+
+ /*
+ * Lookup the service in the devices array.
+ */
+
+ dkey.dest.name = name;
+
+ cups_dnssd_unquote(name, fullName, sizeof(name));
+
+ if ((ptr = strstr(name, "._")) != NULL)
+ *ptr = '\0';
+
+ if ((device = cupsArrayFind(data->devices, &dkey)) != NULL)
+ {
+ /*
+ * Found it, pull out the priority and make and model from the TXT
+ * record and save it...
+ */
+
+ const uint8_t *txt, /* Pointer into data */
+ *txtnext, /* Next key/value pair */
+ *txtend; /* End of entire TXT record */
+ uint8_t txtlen; /* Length of current key/value pair */
+ char key[256], /* Key string */
+ value[256], /* Value string */
+ make_and_model[512],
+ /* Manufacturer and model */
+ model[256], /* Model */
+ uriname[1024], /* Name for URI */
+ uri[1024]; /* Printer URI */
+ cups_ptype_t type; /* Device type */
+
+ device->state = _CUPS_DNSSD_PENDING;
+ make_and_model[0] = '\0';
+ type = CUPS_PRINTER_REMOTE;
+
+ strcpy(model, "Unknown");
+
+ for (txt = rdata, txtend = txt + rdlen;
+ txt < txtend;
+ txt = txtnext)
+ {
+ /*
+ * Read a key/value pair starting with an 8-bit length. Since the
+ * length is 8 bits and the size of the key/value buffers is 256, we
+ * don't need to check for overflow...
+ */
+
+ txtlen = *txt++;
+
+ if (!txtlen || (txt + txtlen) > txtend)
+ break;
+
+ txtnext = txt + txtlen;
+
+ for (ptr = key; txt < txtnext && *txt != '='; txt ++)
+ *ptr++ = *txt;
+ *ptr = '\0';
+
+ if (txt < txtnext && *txt == '=')
+ {
+ txt ++;
+
+ if (txt < txtnext)
+ memcpy(value, txt, txtnext - txt);
+ value[txtnext - txt] = '\0';
+
+ DEBUG_printf(("6cups_dnssd_query_cb: %s=%s", key, value));
+ }
+ else
+ {
+ DEBUG_printf(("6cups_dnssd_query_cb: '%s' with no value.", key));
+ continue;
+ }
+
+ if (!_cups_strcasecmp(key, "usb_MFG") ||
+ !_cups_strcasecmp(key, "usb_MANU") ||
+ !_cups_strcasecmp(key, "usb_MANUFACTURER"))
+ strcpy(make_and_model, value);
+ else if (!_cups_strcasecmp(key, "usb_MDL") ||
+ !_cups_strcasecmp(key, "usb_MODEL"))
+ strcpy(model, value);
+ else if (!_cups_strcasecmp(key, "product") && !strstr(value, "Ghostscript"))
+ {
+ if (value[0] == '(')
+ {
+ /*
+ * Strip parenthesis...
+ */
+
+ if ((ptr = value + strlen(value) - 1) > value && *ptr == ')')
+ *ptr = '\0';
+
+ strcpy(model, value + 1);
+ }
+ else
+ strcpy(model, value);
+ }
+ else if (!_cups_strcasecmp(key, "ty"))
+ {
+ strcpy(model, value);
+
+ if ((ptr = strchr(model, ',')) != NULL)
+ *ptr = '\0';
+ }
+ else if (!_cups_strcasecmp(key, "printer-type"))
+ {
+ device->dest.num_options = cupsAddOption("printer-type", value,
+ device->dest.num_options,
+ &device->dest.options);
+ type = strtol(value, NULL, 0);
+ }
+ }
+
+ /*
+ * Save the make-and-model...
+ */
+
+ if (make_and_model[0])
+ {
+ strlcat(make_and_model, " ", sizeof(make_and_model));
+ strlcat(make_and_model, model, sizeof(make_and_model));
+
+ device->dest.num_options = cupsAddOption("printer-make-and-model",
+ make_and_model,
+ device->dest.num_options,
+ &device->dest.options);
+ }
+ else
+ device->dest.num_options = cupsAddOption("printer-make-and-model",
+ model,
+ device->dest.num_options,
+ &device->dest.options);
+
+ /*
+ * Save the URI...
+ */
+
+ cups_dnssd_unquote(uriname, device->fullName, sizeof(uriname));
+ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri),
+ !strcmp(device->regtype, "_ipps._tcp") ? "ipps" : "ipp",
+ NULL, uriname, 0, "/cups");
+
+ DEBUG_printf(("6cups_dnssd_query: printer-uri-supported=\"%s\"", uri));
+
+ device->dest.num_options = cupsAddOption("printer-uri-supported", uri,
+ device->dest.num_options,
+ &device->dest.options);
+ }
+ else
+ DEBUG_printf(("6cups_dnssd_query: Ignoring TXT record for '%s'.",
+ fullName));
+}
+
+
+/*
+ * 'cups_dnssd_resolve()' - Resolve a Bonjour printer URI.
+ */
+
+static const char * /* O - Resolved URI or NULL */
+cups_dnssd_resolve(
+ cups_dest_t *dest, /* I - Destination */
+ const char *uri, /* I - Current printer URI */
+ int msec, /* I - Time in milliseconds */
+ int *cancel, /* I - Pointer to "cancel" variable */
+ cups_dest_cb_t cb, /* I - Callback */
+ void *user_data) /* I - User data for callback */
+{
+ char tempuri[1024]; /* Temporary URI buffer */
+ _cups_dnssd_resolve_t resolve; /* Resolve data */
+
+
+ /*
+ * Resolve the URI...
+ */
+
+ resolve.cancel = cancel;
+ gettimeofday(&resolve.end_time, NULL);
+ if (msec > 0)
+ {
+ resolve.end_time.tv_sec += msec / 1000;
+ resolve.end_time.tv_usec += (msec % 1000) * 1000;
+
+ while (resolve.end_time.tv_usec >= 1000000)
+ {
+ resolve.end_time.tv_sec ++;
+ resolve.end_time.tv_usec -= 1000000;
+ }
+ }
+ else
+ resolve.end_time.tv_sec += 75;
+
+ if (cb)
+ (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_RESOLVING,
+ dest);
+
+ if ((uri = _httpResolveURI(uri, tempuri, sizeof(tempuri),
+ _HTTP_RESOLVE_FQDN, cups_dnssd_resolve_cb,
+ &resolve)) == NULL)
+ {
+ _cupsSetError(IPP_INTERNAL_ERROR, _("Unable to resolve printer URI."), 1);
+
+ if (cb)
+ (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_ERROR,
+ dest);
+
+ return (NULL);
+ }
+
+ /*
+ * Save the resolved URI...
+ */
+
+ dest->num_options = cupsAddOption("printer-uri-supported", uri,
+ dest->num_options, &dest->options);
+
+ return (cupsGetOption("printer-uri-supported", dest->num_options,
+ dest->options));
+}
+
+
+/*
+ * 'cups_dnssd_resolve_cb()' - See if we should continue resolving.
+ */
+
+static int /* O - 1 to continue, 0 to stop */
+cups_dnssd_resolve_cb(void *context) /* I - Resolve data */
+{
+ _cups_dnssd_resolve_t *resolve = (_cups_dnssd_resolve_t *)context;
+ /* Resolve data */
+ struct timeval curtime; /* Current time */
+
+
+ /*
+ * If the cancel variable is set, return immediately.
+ */
+
+ if (*resolve->cancel)
+ return (0);
+
+ /*
+ * Otherwise check the end time...
+ */
+
+ gettimeofday(&curtime, NULL);
+
+ return (curtime.tv_sec > resolve->end_time.tv_sec ||
+ (curtime.tv_sec == resolve->end_time.tv_sec &&
+ curtime.tv_usec > resolve->end_time.tv_usec));
+}
+
+
+/*
+ * 'cups_dnssd_unquote()' - Unquote a name string.
+ */
+
+static void
+cups_dnssd_unquote(char *dst, /* I - Destination buffer */
+ const char *src, /* I - Source string */
+ size_t dstsize) /* I - Size of destination buffer */
+{
+ char *dstend = dst + dstsize - 1; /* End of destination buffer */
+
+
+ while (*src && dst < dstend)
+ {
+ if (*src == '\\')
+ {
+ src ++;
+ if (isdigit(src[0] & 255) && isdigit(src[1] & 255) &&
+ isdigit(src[2] & 255))
+ {
+ *dst++ = ((((src[0] - '0') * 10) + src[1] - '0') * 10) + src[2] - '0';
+ src += 3;
+ }
+ else
+ *dst++ = *src++;
+ }
+ else
+ *dst++ = *src ++;
+ }
+
+ *dst = '\0';
+}
+#endif /* HAVE_DNSSD */
+
+
/*
* 'cups_find_dest()' - Find a destination using a binary search.
*/
diff --git a/cups/encode.c b/cups/encode.c
index e2c092232..91a37ecd8 100644
--- a/cups/encode.c
+++ b/cups/encode.c
@@ -47,15 +47,22 @@ static const _ipp_option_t ipp_options[] =
{ 0, "columns", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "columns-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "compression", IPP_TAG_KEYWORD, IPP_TAG_OPERATION },
- { 0, "copies", IPP_TAG_INTEGER, IPP_TAG_JOB },
+ { 0, "copies", IPP_TAG_INTEGER, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
{ 0, "copies-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "device-uri", IPP_TAG_URI, IPP_TAG_PRINTER },
+ { 1, "document-copies", IPP_TAG_RANGE, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
{ 0, "document-format", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION },
{ 0, "document-format-default", IPP_TAG_MIMETYPE, IPP_TAG_PRINTER },
+ { 1, "document-numbers", IPP_TAG_RANGE, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
{ 1, "exclude-schemes", IPP_TAG_NAME, IPP_TAG_OPERATION },
- { 1, "finishings", IPP_TAG_ENUM, IPP_TAG_JOB },
+ { 1, "finishings", IPP_TAG_ENUM, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
{ 1, "finishings-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
- { 0, "fit-to-page", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
+ { 0, "fit-to-page", IPP_TAG_BOOLEAN, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
{ 0, "fit-to-page-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
{ 0, "fitplot", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ 0, "fitplot-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
@@ -81,14 +88,20 @@ static const _ipp_option_t ipp_options[] =
{ 0, "marker-message", IPP_TAG_TEXT, IPP_TAG_PRINTER },
{ 1, "marker-names", IPP_TAG_NAME, IPP_TAG_PRINTER },
{ 1, "marker-types", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
- { 1, "media", IPP_TAG_KEYWORD, IPP_TAG_JOB },
- { 0, "media-col", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB },
+ { 1, "media", IPP_TAG_KEYWORD, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
+ { 0, "media-col", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
{ 0, "media-col-default", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_PRINTER },
- { 0, "media-color", IPP_TAG_KEYWORD, IPP_TAG_JOB },
+ { 0, "media-color", IPP_TAG_KEYWORD, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
{ 1, "media-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
- { 0, "media-key", IPP_TAG_KEYWORD, IPP_TAG_JOB },
- { 0, "media-size", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB },
- { 0, "media-type", IPP_TAG_KEYWORD, IPP_TAG_JOB },
+ { 0, "media-key", IPP_TAG_KEYWORD, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
+ { 0, "media-size", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
+ { 0, "media-type", IPP_TAG_KEYWORD, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
{ 0, "mirror", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ 0, "mirror-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
{ 0, "natural-scaling", IPP_TAG_INTEGER, IPP_TAG_JOB },
@@ -103,20 +116,27 @@ static const _ipp_option_t ipp_options[] =
{ 0, "notify-recipient-uri", IPP_TAG_URI, IPP_TAG_SUBSCRIPTION },
{ 0, "notify-time-interval", IPP_TAG_INTEGER, IPP_TAG_SUBSCRIPTION },
{ 0, "notify-user-data", IPP_TAG_STRING, IPP_TAG_SUBSCRIPTION },
- { 0, "number-up", IPP_TAG_INTEGER, IPP_TAG_JOB },
+ { 0, "number-up", IPP_TAG_INTEGER, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
{ 0, "number-up-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
- { 0, "orientation-requested", IPP_TAG_ENUM, IPP_TAG_JOB },
+ { 0, "orientation-requested", IPP_TAG_ENUM, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
{ 0, "orientation-requested-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
+ { 1, "overrides", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
{ 0, "page-bottom", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "page-bottom-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "page-left", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "page-left-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
- { 1, "page-ranges", IPP_TAG_RANGE, IPP_TAG_JOB },
+ { 1, "page-ranges", IPP_TAG_RANGE, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
{ 1, "page-ranges-default", IPP_TAG_RANGE, IPP_TAG_PRINTER },
{ 0, "page-right", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "page-right-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "page-top", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "page-top-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
+ { 1, "pages", IPP_TAG_RANGE, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
{ 0, "penwidth", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "penwidth-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "port-monitor", IPP_TAG_NAME, IPP_TAG_PRINTER },
@@ -125,7 +145,8 @@ static const _ipp_option_t ipp_options[] =
{ 0, "ppi-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "prettyprint", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ 0, "prettyprint-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
- { 0, "print-quality", IPP_TAG_ENUM, IPP_TAG_JOB },
+ { 0, "print-quality", IPP_TAG_ENUM, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
{ 0, "print-quality-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
{ 1, "printer-commands", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
{ 0, "printer-error-policy", IPP_TAG_NAME, IPP_TAG_PRINTER },
@@ -136,7 +157,8 @@ static const _ipp_option_t ipp_options[] =
{ 0, "printer-make-and-model", IPP_TAG_TEXT, IPP_TAG_PRINTER },
{ 0, "printer-more-info", IPP_TAG_URI, IPP_TAG_PRINTER },
{ 0, "printer-op-policy", IPP_TAG_NAME, IPP_TAG_PRINTER },
- { 0, "printer-resolution", IPP_TAG_RESOLUTION, IPP_TAG_JOB },
+ { 0, "printer-resolution", IPP_TAG_RESOLUTION, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
{ 0, "printer-state", IPP_TAG_ENUM, IPP_TAG_PRINTER },
{ 0, "printer-state-change-time", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 1, "printer-state-reasons", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
@@ -154,12 +176,15 @@ static const _ipp_option_t ipp_options[] =
{ 0, "saturation-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "scaling", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "scaling-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
- { 0, "sides", IPP_TAG_KEYWORD, IPP_TAG_JOB },
+ { 0, "sides", IPP_TAG_KEYWORD, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
{ 0, "sides-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
{ 0, "wrap", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ 0, "wrap-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
- { 0, "x-dimension", IPP_TAG_INTEGER, IPP_TAG_JOB },
- { 0, "y-dimension", IPP_TAG_INTEGER, IPP_TAG_JOB }
+ { 0, "x-dimension", IPP_TAG_INTEGER, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT },
+ { 0, "y-dimension", IPP_TAG_INTEGER, IPP_TAG_JOB,
+ IPP_TAG_DOCUMENT }
};
@@ -282,7 +307,7 @@ cupsEncodeOptions2(
if ((match = _ippFindOption(option->name)) != NULL)
{
- if (match->group_tag != group_tag)
+ if (match->group_tag != group_tag && match->alt_group_tag != group_tag)
continue;
value_tag = match->value_tag;
@@ -294,9 +319,11 @@ cupsEncodeOptions2(
namelen = (int)strlen(option->name);
- if (namelen < 9 || strcmp(option->name + namelen - 8, "-default"))
+ if (namelen < 10 ||
+ (strcmp(option->name + namelen - 8, "-default") &&
+ strcmp(option->name + namelen - 10, "-supported")))
{
- if (group_tag != IPP_TAG_JOB)
+ if (group_tag != IPP_TAG_JOB && group_tag != IPP_TAG_DOCUMENT)
continue;
}
else if (group_tag != IPP_TAG_PRINTER)
diff --git a/cups/getdevices.c b/cups/getdevices.c
index a74a593c7..a0744ac89 100644
--- a/cups/getdevices.c
+++ b/cups/getdevices.c
@@ -3,7 +3,7 @@
*
* cupsGetDevices implementation for CUPS.
*
- * Copyright 2008-2010 by Apple Inc.
+ * Copyright 2008-2011 by Apple Inc.
*
* These coded instructions, statements, and computer programs are the
* property of Apple Inc. and are protected by Federal copyright
@@ -258,7 +258,7 @@ cupsGetDevices(
httpFlush(http);
if (status == HTTP_ERROR)
- _cupsSetError(IPP_ERROR, NULL, 0);
+ _cupsSetError(IPP_INTERNAL_ERROR, strerror(http->error), 0);
else
{
attr = ippFindAttribute(response, "status-message", IPP_TAG_TEXT);
diff --git a/cups/globals.c b/cups/globals.c
index 93985e0e9..d38ffaff9 100644
--- a/cups/globals.c
+++ b/cups/globals.c
@@ -301,14 +301,14 @@ cups_globals_alloc(void)
static void
cups_globals_free(_cups_globals_t *cg) /* I - Pointer to global data */
{
- _ipp_buffer_t *buffer, /* Current IPP read/write buffer */
+ _cups_buffer_t *buffer, /* Current read/write buffer */
*next; /* Next buffer */
if (cg->last_status_message)
_cupsStrFree(cg->last_status_message);
- for (buffer = cg->ipp_buffers; buffer; buffer = next)
+ for (buffer = cg->cups_buffers; buffer; buffer = next)
{
next = buffer->next;
free(buffer);
diff --git a/cups/http-addrlist.c b/cups/http-addrlist.c
index f0658d213..4e1a423b7 100644
--- a/cups/http-addrlist.c
+++ b/cups/http-addrlist.c
@@ -3,7 +3,7 @@
*
* HTTP address list routines for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
+ * Copyright 2007-2012 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -15,6 +15,8 @@
* Contents:
*
* httpAddrConnect() - Connect to any of the addresses in the list.
+ * httpAddrConnect2() - Connect to any of the addresses in the list with a
+ * timeout and optional cancel.
* httpAddrFreeList() - Free an address list.
* httpAddrGetList() - Get a list of addresses for a hostname.
*/
@@ -27,6 +29,9 @@
#ifdef HAVE_RESOLV_H
# include
#endif /* HAVE_RESOLV_H */
+#ifdef HAVE_POLL
+# include
+#endif /* HAVE_POLL */
/*
@@ -39,24 +44,62 @@ http_addrlist_t * /* O - Connected address or NULL on failure */
httpAddrConnect(
http_addrlist_t *addrlist, /* I - List of potential addresses */
int *sock) /* O - Socket */
+{
+ DEBUG_printf(("httpAddrConnect(addrlist=%p, sock=%p)", addrlist, sock));
+
+ return (httpAddrConnect2(addrlist, sock, 30000, NULL));
+}
+
+
+/*
+ * 'httpAddrConnect2()' - Connect to any of the addresses in the list with a
+ * timeout and optional cancel.
+ *
+ * @since CUPS 1.6@
+ */
+
+http_addrlist_t * /* O - Connected address or NULL on failure */
+httpAddrConnect2(
+ http_addrlist_t *addrlist, /* I - List of potential addresses */
+ int *sock, /* O - Socket */
+ int msec, /* I - Timeout in milliseconds */
+ int *cancel) /* I - Pointer to "cancel" variable */
{
int val; /* Socket option value */
-#ifdef __APPLE__
- struct timeval timeout; /* Socket timeout value */
-#endif /* __APPLE__ */
+#ifdef O_NONBLOCK
+ socklen_t len; /* Length of value */
+ int flags, /* Socket flags */
+ remaining; /* Remaining timeout */
+#endif /* O_NONBLOCK */
+#ifdef HAVE_POLL
+ struct pollfd pfd; /* Polled file descriptor */
+#else
+ fd_set input_set, /* select() input set */
+ output_set; /* select() output set */
+ struct timeval timeout; /* Timeout */
+#endif /* HAVE_POLL */
+ int nfds; /* Result from select()/poll() */
#ifdef DEBUG
char temp[256]; /* Temporary address string */
#endif /* DEBUG */
- DEBUG_printf(("httpAddrConnect(addrlist=%p, sock=%p)", addrlist, sock));
+ DEBUG_printf(("httpAddrConnect2(addrlist=%p, sock=%p, msec=%d, cancel=%p)",
+ addrlist, sock, msec, cancel));
if (!sock)
{
errno = EINVAL;
+ _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
return (NULL);
}
+ if (cancel && *cancel)
+ return (NULL);
+
+ if (msec <= 0)
+ msec = INT_MAX;
+
/*
* Loop through each address until we connect or run out of addresses...
*/
@@ -105,17 +148,6 @@ httpAddrConnect(
setsockopt(*sock, SOL_SOCKET, SO_NOSIGPIPE, &val, sizeof(val));
#endif /* SO_NOSIGPIPE */
-#ifdef __APPLE__
- /*
- * Use a 30-second read timeout when connecting to limit the amount of time
- * we block...
- */
-
- timeout.tv_sec = 30;
- timeout.tv_usec = 0;
- setsockopt(*sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
-#endif /* __APPLE__ */
-
/*
* Using TCP_NODELAY improves responsiveness, especially on systems
* with a slow loopback interface...
@@ -137,6 +169,16 @@ httpAddrConnect(
fcntl(*sock, F_SETFD, FD_CLOEXEC);
#endif /* FD_CLOEXEC */
+#ifdef O_NONBLOCK
+ /*
+ * Do an asynchronous connect by setting the socket non-blocking...
+ */
+
+ flags = fcntl(*sock, F_GETFL, 0);
+ if (msec > 0)
+ fcntl(*sock, F_SETFL, flags | O_NONBLOCK);
+#endif /* O_NONBLOCK */
+
/*
* Then connect...
*/
@@ -147,8 +189,85 @@ httpAddrConnect(
DEBUG_printf(("1httpAddrConnect: Connected to %s:%d...",
httpAddrString(&(addrlist->addr), temp, sizeof(temp)),
_httpAddrPort(&(addrlist->addr))));
- break;
+
+#ifdef O_NONBLOCK
+ fcntl(*sock, F_SETFL, flags);
+#endif /* O_NONBLOCK */
+
+ return (addrlist);
+ }
+
+#ifdef O_NONBLOCK
+# ifdef WIN32
+ if (errno == WSAEINPROGRESS)
+# else
+ if (errno == EINPROGRESS)
+# endif /* WIN32 */
+ {
+ for (remaining = msec; remaining > 0; remaining -= 250)
+ {
+# ifdef HAVE_POLL
+ pfd.fd = *sock;
+ pfd.events = POLLIN | POLLOUT;
+
+ while ((nfds = poll(&pfd, 1, remaining > 250 ? 250 : remaining)) < 0 &&
+ (errno == EINTR || errno == EAGAIN));
+
+# else
+ do
+ {
+ if (cancel && *cancel)
+ {
+ /*
+ * Close this socket and return...
+ */
+
+#ifdef WIN32
+ closesocket(*sock);
+#else
+ close(*sock);
+#endif /* WIN32 */
+
+ *sock = -1;
+
+ return (NULL);
+ }
+
+ FD_ZERO(&input_set);
+ FD_SET(*sock, &input_set);
+ output_set = input_set;
+
+ timeout.tv_sec = 0;
+ timeout.tv_usec = (remaining > 250 ? 250 : remaining) * 1000;
+
+ nfds = select(*sock + 1, &input_set, &output_set, NULL, &timeout);
+ }
+# ifdef WIN32
+ while (nfds < 0 && (WSAGetLastError() == WSAEINTR ||
+ WSAGetLastError() == WSAEWOULDBLOCK));
+# else
+ while (nfds < 0 && (errno == EINTR || errno == EAGAIN));
+# endif /* WIN32 */
+# endif /* HAVE_POLL */
+
+ if (nfds > 0)
+ {
+ len = sizeof(val);
+ if (getsockopt(*sock, SOL_SOCKET, SO_ERROR, &val, &len) >= 0)
+ {
+ DEBUG_printf(("1httpAddrConnect: Connected to %s:%d...",
+ httpAddrString(&(addrlist->addr), temp, sizeof(temp)),
+ _httpAddrPort(&(addrlist->addr))));
+
+ fcntl(*sock, F_SETFL, flags);
+ return (addrlist);
+ }
+
+ break;
+ }
+ }
}
+#endif /* O_NONBLOCK */
DEBUG_printf(("1httpAddrConnect: Unable to connect to %s:%d: %s",
httpAddrString(&(addrlist->addr), temp, sizeof(temp)),
@@ -256,7 +375,6 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
}
#endif /* HAVE_RES_INIT */
-
/*
* Lookup the address the best way we can...
*/
@@ -357,6 +475,7 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
if (!temp)
{
httpAddrFreeList(first);
+ _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
return (NULL);
}
@@ -386,8 +505,13 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
freeaddrinfo(results);
}
- else if (error == EAI_FAIL)
- cg->need_res_init = 1;
+ else
+ {
+ if (error == EAI_FAIL)
+ cg->need_res_init = 1;
+
+ _cupsSetError(IPP_INTERNAL_ERROR, gai_strerror(error), 0);
+ }
#else
if (hostname)
@@ -505,8 +629,13 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
addr = temp;
}
}
- else if (h_errno == NO_RECOVERY)
- cg->need_res_init = 1;
+ else
+ {
+ if (h_errno == NO_RECOVERY)
+ cg->need_res_init = 1;
+
+ _cupsSetError(IPP_INTERNAL_ERROR, hstrerror(h_errno), 0);
+ }
}
#endif /* HAVE_GETADDRINFO */
}
@@ -544,6 +673,8 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
else
{
httpAddrFreeList(first);
+
+ _cupsSetError(IPP_INTERNAL_ERROR, _("Unknown service name."), 1);
return (NULL);
}
@@ -566,6 +697,7 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
if (!temp)
{
+ _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
httpAddrFreeList(first);
return (NULL);
}
@@ -594,6 +726,7 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
if (!temp)
{
+ _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
httpAddrFreeList(first);
return (NULL);
}
@@ -625,6 +758,7 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
if (!temp)
{
+ _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
httpAddrFreeList(first);
return (NULL);
}
@@ -648,6 +782,7 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
if (!temp)
{
+ _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
httpAddrFreeList(first);
return (NULL);
}
diff --git a/cups/http.c b/cups/http.c
index 2ea99bee1..8b047278d 100644
--- a/cups/http.c
+++ b/cups/http.c
@@ -3,7 +3,7 @@
*
* HTTP routines for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
+ * Copyright 2007-2012 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* This file contains Kerberos support code, copyright 2006 by
@@ -75,6 +75,8 @@
* _httpReadCDSA() - Read function for the CDSA library.
* _httpReadGNUTLS() - Read function for the GNU TLS library.
* httpReconnect() - Reconnect to a HTTP server.
+ * httpReconnect2() - Reconnect to a HTTP server with timeout and
+ * optional cancel.
* httpSetAuthString() - Set the current authorization string.
* httpSetCredentials() - Set the credentials associated with an
* encrypted connection.
@@ -133,20 +135,10 @@
# include
#endif /* WIN32 */
#ifdef HAVE_POLL
-# include
+# include
#endif /* HAVE_POLL */
-/*
- * Some operating systems have done away with the Fxxxx constants for
- * the fcntl() call; this works around that "feature"...
- */
-
-#ifndef FNONBLK
-# define FNONBLK O_NONBLOCK
-#endif /* !FNONBLK */
-
-
/*
* Local functions...
*/
@@ -606,6 +598,7 @@ _httpCreate(
if ((http = calloc(sizeof(http_t), 1)) == NULL)
{
+ _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
httpAddrFreeList(addrlist);
return (NULL);
}
@@ -2275,6 +2268,22 @@ _httpReadGNUTLS(
int /* O - 0 on success, non-zero on failure */
httpReconnect(http_t *http) /* I - Connection to server */
+{
+ DEBUG_printf(("httpReconnect(http=%p)", http));
+
+ return (httpReconnect2(http, 30, NULL));
+}
+
+
+/*
+ * 'httpReconnect2()' - Reconnect to a HTTP server with timeout and optional
+ * cancel.
+ */
+
+int /* O - 0 on success, non-zero on failure */
+httpReconnect2(http_t *http, /* I - Connection to server */
+ int msec, /* I - Timeout in milliseconds */
+ int *cancel) /* I - Pointer to "cancel" variable */
{
http_addrlist_t *addr; /* Connected address */
#ifdef DEBUG
@@ -2283,10 +2292,14 @@ httpReconnect(http_t *http) /* I - Connection to server */
#endif /* DEBUG */
- DEBUG_printf(("httpReconnect(http=%p)", http));
+ DEBUG_printf(("httpReconnect(http=%p, msec=%d, cancel=%p)", http, msec,
+ cancel));
if (!http)
+ {
+ _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
return (-1);
+ }
#ifdef HAVE_SSL
if (http->tls)
@@ -2324,7 +2337,8 @@ httpReconnect(http_t *http) /* I - Connection to server */
_httpAddrPort(&(current->addr))));
#endif /* DEBUG */
- if ((addr = httpAddrConnect(http->addrlist, &(http->fd))) == NULL)
+ if ((addr = httpAddrConnect2(http->addrlist, &(http->fd), msec,
+ cancel)) == NULL)
{
/*
* Unable to connect...
@@ -3855,6 +3869,7 @@ http_setup_ssl(http_t *http) /* I - Connection to server */
_cups_globals_t *cg = _cupsGlobals();
/* Pointer to library globals */
int any_root; /* Allow any root */
+ char *hostname; /* Hostname */
# ifdef HAVE_LIBSSL
SSL_CTX *context; /* Context for encryption */
@@ -3866,7 +3881,6 @@ http_setup_ssl(http_t *http) /* I - Connection to server */
/* TLS credentials */
# elif defined(HAVE_CDSASSL)
OSStatus error; /* Error code */
- char *hostname; /* Hostname */
const char *message = NULL;/* Error message */
# ifdef HAVE_SECCERTIFICATECOPYDATA
cups_array_t *credentials; /* Credentials array */
@@ -3895,6 +3909,8 @@ http_setup_ssl(http_t *http) /* I - Connection to server */
else
any_root = cg->any_root;
+ hostname = httpAddrLocalhost(http->hostaddr) ? "localhost" : http->hostname;
+
# ifdef HAVE_LIBSSL
(void)any_root;
@@ -3908,6 +3924,8 @@ http_setup_ssl(http_t *http) /* I - Connection to server */
http->tls = SSL_new(context);
SSL_set_bio(http->tls, bio, bio);
+ SSL_set_tlsext_host_name(http->tls, hostname);
+
if (SSL_connect(http->tls) != 1)
{
unsigned long error; /* Error code */
@@ -3957,7 +3975,8 @@ http_setup_ssl(http_t *http) /* I - Connection to server */
gnutls_init(&http->tls, GNUTLS_CLIENT);
gnutls_set_default_priority(http->tls);
- gnutls_server_name_set(http->tls, GNUTLS_NAME_DNS, http->hostname, strlen(http->hostname));
+ gnutls_server_name_set(http->tls, GNUTLS_NAME_DNS, hostname,
+ strlen(hostname));
gnutls_credentials_set(http->tls, GNUTLS_CRD_CERTIFICATE, *credentials);
gnutls_transport_set_ptr(http->tls, (gnutls_transport_ptr)http);
gnutls_transport_set_pull_function(http->tls, _httpReadGNUTLS);
@@ -4086,8 +4105,7 @@ http_setup_ssl(http_t *http) /* I - Connection to server */
if (!error)
{
- hostname = httpAddrLocalhost(http->hostaddr) ? "localhost" : http->hostname;
- error = SSLSetPeerDomainName(http->tls, hostname, strlen(hostname));
+ error = SSLSetPeerDomainName(http->tls, hostname, strlen(hostname));
DEBUG_printf(("4http_setup_ssl: SSLSetPeerDomainName, error=%d",
(int)error));
@@ -4275,7 +4293,7 @@ http_setup_ssl(http_t *http) /* I - Connection to server */
_sspiSetAllowsAnyRoot(http->tls_credentials, any_root);
_sspiSetAllowsExpiredCerts(http->tls_credentials, TRUE);
- if (!_sspiConnect(http->tls_credentials, http->hostname))
+ if (!_sspiConnect(http->tls_credentials, hostname))
{
_sspiFree(http->tls_credentials);
http->tls_credentials = NULL;
diff --git a/cups/http.h b/cups/http.h
index a70e85cf5..fc83209d9 100644
--- a/cups/http.h
+++ b/cups/http.h
@@ -3,7 +3,7 @@
*
* Hyper-Text Transport Protocol definitions for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
+ * Copyright 2007-2012 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -463,8 +463,13 @@ extern void httpSetTimeout(http_t *http, double timeout,
_CUPS_API_1_5;
/**** New in CUPS 1.6 ****/
+extern http_addrlist_t *httpAddrConnect2(http_addrlist_t *addrlist, int *sock,
+ int msec, int *cancel)
+ _CUPS_API_1_6;
extern http_state_t httpGetState(http_t *http) _CUPS_API_1_6;
extern http_version_t httpGetVersion(http_t *http) _CUPS_API_1_6;
+extern int httpReconnect2(http_t *http, int msec, int *cancel)
+ _CUPS_API_1_6;
/*
diff --git a/cups/ipp-private.h b/cups/ipp-private.h
index 1fcea0f4e..70729cf59 100644
--- a/cups/ipp-private.h
+++ b/cups/ipp-private.h
@@ -143,19 +143,14 @@ struct _ipp_s /**** IPP Request/Response/Notification ****/
int use; /* Use count @since CUPS 1.4.4/Mac OS X 10.6.?@ */
};
-typedef struct _ipp_buffer_s /**** Read/write buffer ****/
-{
- unsigned char d[IPP_BUF_SIZE];/* Data buffer */
- struct _ipp_buffer_s *next; /* Next buffer in list */
- int used; /* Is this buffer used? */
-} _ipp_buffer_t;
-
typedef struct /**** Attribute mapping data ****/
{
int multivalue; /* Option has multiple values? */
const char *name; /* Option/attribute name */
ipp_tag_t value_tag; /* Value tag for this attribute */
ipp_tag_t group_tag; /* Group tag for this attribute */
+ ipp_tag_t alt_group_tag; /* Alternate group tag for this
+ * attribute */
} _ipp_option_t;
diff --git a/cups/ipp.c b/cups/ipp.c
index 36f8a53bf..96361abdc 100644
--- a/cups/ipp.c
+++ b/cups/ipp.c
@@ -16,6 +16,8 @@
*
* Contents:
*
+ * _cupsBufferGet() - Get a read/write buffer.
+ * _cupsBufferRelease() - Release a read/write buffer.
* ippAddBoolean() - Add a boolean attribute to an IPP message.
* ippAddBooleans() - Add an array of boolean values.
* ippAddCollection() - Add a collection value.
@@ -90,8 +92,6 @@
* ippWriteFile() - Write data for an IPP message to a file.
* ippWriteIO() - Write data for an IPP message.
* ipp_add_attr() - Add a new attribute to the message.
- * ipp_buffer_get() - Get a read/write buffer.
- * ipp_buffer_release() - Release a read/write buffer.
* ipp_free_values() - Free attribute values.
* ipp_get_code() - Convert a C locale/charset name into an IPP
* language/charset code.
@@ -122,8 +122,6 @@
static ipp_attribute_t *ipp_add_attr(ipp_t *ipp, const char *name, ipp_tag_t group_tag,
ipp_tag_t value_tag, int num_values);
-static unsigned char *ipp_buffer_get(void);
-static void ipp_buffer_release(unsigned char *b);
static void ipp_free_values(ipp_attribute_t *attr, int element, int count);
static char *ipp_get_code(const char *locale, char *buffer, size_t bufsize);
static char *ipp_lang_code(const char *locale, char *buffer, size_t bufsize);
@@ -137,6 +135,57 @@ static ssize_t ipp_write_file(int *fd, ipp_uchar_t *buffer,
size_t length);
+/*
+ * '_cupsBufferGet()' - Get a read/write buffer.
+ */
+
+char * /* O - Buffer */
+_cupsBufferGet(size_t size) /* I - Size required */
+{
+ _cups_buffer_t *buffer; /* Current buffer */
+ _cups_globals_t *cg = _cupsGlobals();
+ /* Global data */
+
+
+ for (buffer = cg->cups_buffers; buffer; buffer = buffer->next)
+ if (!buffer->used && buffer->size >= size)
+ break;
+
+ if (!buffer)
+ {
+ if ((buffer = malloc(sizeof(_cups_buffer_t) + size - 1)) == NULL)
+ return (NULL);
+
+ buffer->next = cg->cups_buffers;
+ buffer->size = size;
+ cg->cups_buffers = buffer;
+ }
+
+ buffer->used = 1;
+
+ return (buffer->d);
+}
+
+
+/*
+ * '_cupsBufferRelease()' - Release a read/write buffer.
+ */
+
+void
+_cupsBufferRelease(char *b) /* I - Buffer to release */
+{
+ _cups_buffer_t *buffer; /* Buffer */
+
+
+ /*
+ * Mark this buffer as unused...
+ */
+
+ buffer = (_cups_buffer_t *)(b - offsetof(_cups_buffer_t, d));
+ buffer->used = 0;
+}
+
+
/*
* 'ippAddBoolean()' - Add a boolean attribute to an IPP message.
*
@@ -2423,7 +2472,7 @@ ippReadIO(void *src, /* I - Data source */
if (!src || !ipp)
return (IPP_ERROR);
- if ((buffer = ipp_buffer_get()) == NULL)
+ if ((buffer = (unsigned char *)_cupsBufferGet(IPP_BUF_SIZE)) == NULL)
{
DEBUG_puts("1ippReadIO: Unable to get read buffer.");
return (IPP_ERROR);
@@ -2444,7 +2493,7 @@ ippReadIO(void *src, /* I - Data source */
if ((*cb)(src, buffer, 8) < 8)
{
DEBUG_puts("1ippReadIO: Unable to read header.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2483,7 +2532,7 @@ ippReadIO(void *src, /* I - Data source */
if ((*cb)(src, buffer, 1) < 1)
{
DEBUG_puts("1ippReadIO: Callback returned EOF/error");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2504,7 +2553,7 @@ ippReadIO(void *src, /* I - Data source */
if ((*cb)(src, buffer, 4) < 1)
{
DEBUG_puts("1ippReadIO: Callback returned EOF/error");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2517,9 +2566,9 @@ ippReadIO(void *src, /* I - Data source */
* Fail if the high bit is set in the tag...
*/
- _cupsSetError(IPP_ERROR, _("IPP extension tag larger than 0x7FFFFFFF."), 1);
+ _cupsSetError(IPP_INTERNAL_ERROR, _("IPP extension tag larger than 0x7FFFFFFF."), 1);
DEBUG_printf(("1ippReadIO: bad name length %d.", n));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
}
@@ -2563,7 +2612,7 @@ ippReadIO(void *src, /* I - Data source */
if ((*cb)(src, buffer, 2) < 2)
{
DEBUG_puts("1ippReadIO: unable to read name length.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2571,9 +2620,9 @@ ippReadIO(void *src, /* I - Data source */
if (n >= IPP_BUF_SIZE)
{
- _cupsSetError(IPP_ERROR, _("IPP name larger than 32767 bytes."), 1);
+ _cupsSetError(IPP_INTERNAL_ERROR, _("IPP name larger than 32767 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad name length %d.", n));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2588,9 +2637,9 @@ ippReadIO(void *src, /* I - Data source */
if (ipp->current == NULL)
{
- _cupsSetError(IPP_ERROR, _("IPP attribute has no name."), 1);
+ _cupsSetError(IPP_INTERNAL_ERROR, _("IPP attribute has no name."), 1);
DEBUG_puts("1ippReadIO: Attribute without name and no current.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2624,13 +2673,13 @@ ippReadIO(void *src, /* I - Data source */
(tag < IPP_TAG_TEXT || tag > IPP_TAG_MIMETYPE) &&
tag != IPP_TAG_NOVALUE)
{
- _cupsSetError(IPP_ERROR,
+ _cupsSetError(IPP_INTERNAL_ERROR,
_("IPP 1setOf attribute with incompatible value "
"tags."), 1);
DEBUG_printf(("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)",
value_tag, ippTagString(value_tag), tag,
ippTagString(tag)));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2651,13 +2700,13 @@ ippReadIO(void *src, /* I - Data source */
if (tag != IPP_TAG_INTEGER && tag != IPP_TAG_RANGE)
{
- _cupsSetError(IPP_ERROR,
+ _cupsSetError(IPP_INTERNAL_ERROR,
_("IPP 1setOf attribute with incompatible value "
"tags."), 1);
DEBUG_printf(("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)",
value_tag, ippTagString(value_tag), tag,
ippTagString(tag)));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2674,13 +2723,13 @@ ippReadIO(void *src, /* I - Data source */
}
else if (value_tag != tag)
{
- _cupsSetError(IPP_ERROR,
+ _cupsSetError(IPP_INTERNAL_ERROR,
_("IPP 1setOf attribute with incompatible value "
"tags."), 1);
DEBUG_printf(("1ippReadIO: value tag %x(%s) != %x(%s)",
value_tag, ippTagString(value_tag), tag,
ippTagString(tag)));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2690,7 +2739,7 @@ ippReadIO(void *src, /* I - Data source */
if ((value = ipp_set_value(ipp, &attr, attr->num_values)) == NULL)
{
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
}
@@ -2702,9 +2751,9 @@ ippReadIO(void *src, /* I - Data source */
if (n)
{
- _cupsSetError(IPP_ERROR, _("IPP member name is not empty."), 1);
+ _cupsSetError(IPP_INTERNAL_ERROR, _("IPP member name is not empty."), 1);
DEBUG_puts("1ippReadIO: member name not empty.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2727,7 +2776,7 @@ ippReadIO(void *src, /* I - Data source */
if ((*cb)(src, buffer, n) < n)
{
DEBUG_puts("1ippReadIO: unable to read name.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2741,7 +2790,7 @@ ippReadIO(void *src, /* I - Data source */
{
_cupsSetHTTPError(HTTP_ERROR);
DEBUG_puts("1ippReadIO: unable to allocate attribute.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2759,7 +2808,7 @@ ippReadIO(void *src, /* I - Data source */
if ((*cb)(src, buffer, 2) < 2)
{
DEBUG_puts("1ippReadIO: unable to read value length.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2768,10 +2817,10 @@ ippReadIO(void *src, /* I - Data source */
if (n >= IPP_BUF_SIZE)
{
- _cupsSetError(IPP_ERROR,
+ _cupsSetError(IPP_INTERNAL_ERROR,
_("IPP value larger than 32767 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad value length %d.", n));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2782,20 +2831,20 @@ ippReadIO(void *src, /* I - Data source */
if (n != 4)
{
if (tag == IPP_TAG_INTEGER)
- _cupsSetError(IPP_ERROR,
+ _cupsSetError(IPP_INTERNAL_ERROR,
_("IPP integer value not 4 bytes."), 1);
else
- _cupsSetError(IPP_ERROR,
+ _cupsSetError(IPP_INTERNAL_ERROR,
_("IPP enum value not 4 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad value length %d.", n));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
if ((*cb)(src, buffer, 4) < 4)
{
DEBUG_puts("1ippReadIO: Unable to read integer value.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2811,17 +2860,17 @@ ippReadIO(void *src, /* I - Data source */
case IPP_TAG_BOOLEAN :
if (n != 1)
{
- _cupsSetError(IPP_ERROR, _("IPP boolean value not 1 byte."),
+ _cupsSetError(IPP_INTERNAL_ERROR, _("IPP boolean value not 1 byte."),
1);
DEBUG_printf(("1ippReadIO: bad value length %d.", n));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
if ((*cb)(src, buffer, 1) < 1)
{
DEBUG_puts("1ippReadIO: Unable to read boolean value.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2857,7 +2906,7 @@ ippReadIO(void *src, /* I - Data source */
if ((*cb)(src, buffer, n) < n)
{
DEBUG_puts("1ippReadIO: unable to read string value.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2869,16 +2918,16 @@ ippReadIO(void *src, /* I - Data source */
case IPP_TAG_DATE :
if (n != 11)
{
- _cupsSetError(IPP_ERROR, _("IPP date value not 11 bytes."), 1);
+ _cupsSetError(IPP_INTERNAL_ERROR, _("IPP date value not 11 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad value length %d.", n));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
if ((*cb)(src, value->date, 11) < 11)
{
DEBUG_puts("1ippReadIO: Unable to read date value.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
break;
@@ -2886,17 +2935,17 @@ ippReadIO(void *src, /* I - Data source */
case IPP_TAG_RESOLUTION :
if (n != 9)
{
- _cupsSetError(IPP_ERROR,
+ _cupsSetError(IPP_INTERNAL_ERROR,
_("IPP resolution value not 9 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad value length %d.", n));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
if ((*cb)(src, buffer, 9) < 9)
{
DEBUG_puts("1ippReadIO: Unable to read resolution value.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2913,17 +2962,17 @@ ippReadIO(void *src, /* I - Data source */
case IPP_TAG_RANGE :
if (n != 8)
{
- _cupsSetError(IPP_ERROR,
+ _cupsSetError(IPP_INTERNAL_ERROR,
_("IPP rangeOfInteger value not 8 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad value length %d.", n));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
if ((*cb)(src, buffer, 8) < 8)
{
DEBUG_puts("1ippReadIO: Unable to read range value.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2940,15 +2989,15 @@ ippReadIO(void *src, /* I - Data source */
if (n < 4)
{
if (tag == IPP_TAG_TEXTLANG)
- _cupsSetError(IPP_ERROR,
+ _cupsSetError(IPP_INTERNAL_ERROR,
_("IPP textWithLanguage value less than "
"minimum 4 bytes."), 1);
else
- _cupsSetError(IPP_ERROR,
+ _cupsSetError(IPP_INTERNAL_ERROR,
_("IPP nameWithLanguage value less than "
"minimum 4 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad value length %d.", n));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2956,7 +3005,7 @@ ippReadIO(void *src, /* I - Data source */
{
DEBUG_puts("1ippReadIO: Unable to read string w/language "
"value.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2977,10 +3026,10 @@ ippReadIO(void *src, /* I - Data source */
if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE) ||
n >= sizeof(string))
{
- _cupsSetError(IPP_ERROR,
+ _cupsSetError(IPP_INTERNAL_ERROR,
_("IPP language length overflows value."), 1);
DEBUG_printf(("1ippReadIO: bad value length %d.", n));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -2994,10 +3043,10 @@ ippReadIO(void *src, /* I - Data source */
if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE))
{
- _cupsSetError(IPP_ERROR,
+ _cupsSetError(IPP_INTERNAL_ERROR,
_("IPP string length overflows value."), 1);
DEBUG_printf(("1ippReadIO: bad value length %d.", n));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -3014,28 +3063,28 @@ ippReadIO(void *src, /* I - Data source */
if (n > 0)
{
- _cupsSetError(IPP_ERROR,
+ _cupsSetError(IPP_INTERNAL_ERROR,
_("IPP begCollection value not 0 bytes."), 1);
DEBUG_puts("1ippReadIO: begCollection tag with value length "
"> 0.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
if (ippReadIO(src, cb, 1, ipp, value->collection) == IPP_ERROR)
{
DEBUG_puts("1ippReadIO: Unable to read collection value.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
break;
case IPP_TAG_END_COLLECTION :
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
if (n > 0)
{
- _cupsSetError(IPP_ERROR,
+ _cupsSetError(IPP_INTERNAL_ERROR,
_("IPP endCollection value not 0 bytes."), 1);
DEBUG_puts("1ippReadIO: endCollection tag with value length "
"> 0.");
@@ -3054,7 +3103,7 @@ ippReadIO(void *src, /* I - Data source */
if ((*cb)(src, buffer, n) < n)
{
DEBUG_puts("1ippReadIO: Unable to read member name value.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -3080,14 +3129,14 @@ ippReadIO(void *src, /* I - Data source */
{
_cupsSetHTTPError(HTTP_ERROR);
DEBUG_puts("1ippReadIO: Unable to allocate value");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
if ((*cb)(src, value->unknown.data, n) < n)
{
DEBUG_puts("1ippReadIO: Unable to read unsupported value.");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
}
@@ -3113,7 +3162,7 @@ ippReadIO(void *src, /* I - Data source */
}
DEBUG_printf(("1ippReadIO: returning ipp->state=%d.", ipp->state));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (ipp->state);
}
@@ -3967,7 +4016,7 @@ ippWriteIO(void *dst, /* I - Destination */
if (!dst || !ipp)
return (IPP_ERROR);
- if ((buffer = ipp_buffer_get()) == NULL)
+ if ((buffer = (unsigned char *)_cupsBufferGet(IPP_BUF_SIZE)) == NULL)
{
DEBUG_puts("1ippWriteIO: Unable to get write buffer");
return (IPP_ERROR);
@@ -4010,7 +4059,7 @@ ippWriteIO(void *dst, /* I - Destination */
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP header...");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
}
@@ -4089,7 +4138,7 @@ ippWriteIO(void *dst, /* I - Destination */
if ((n = (int)strlen(attr->name)) > (IPP_BUF_SIZE - 8))
{
DEBUG_printf(("1ippWriteIO: Attribute name too long (%d)", n));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4128,7 +4177,7 @@ ippWriteIO(void *dst, /* I - Destination */
if ((n = (int)strlen(attr->name)) > (IPP_BUF_SIZE - 12))
{
DEBUG_printf(("1ippWriteIO: Attribute name too long (%d)", n));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4197,7 +4246,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4243,7 +4292,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4304,7 +4353,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4324,7 +4373,7 @@ ippWriteIO(void *dst, /* I - Destination */
if (n > (IPP_BUF_SIZE - 2))
{
DEBUG_printf(("1ippWriteIO: String too long (%d)", n));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4337,7 +4386,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4376,7 +4425,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4421,7 +4470,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4474,7 +4523,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4533,7 +4582,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4567,7 +4616,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_printf(("1ippWriteIO: text/nameWithLanguage value "
"too long (%d)", n));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4577,7 +4626,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4640,7 +4689,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4670,7 +4719,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4686,7 +4735,7 @@ ippWriteIO(void *dst, /* I - Destination */
value->collection) == IPP_ERROR)
{
DEBUG_puts("1ippWriteIO: Unable to write collection value");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
}
@@ -4710,7 +4759,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4735,7 +4784,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_printf(("1ippWriteIO: Data length too long (%d)",
n));
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4745,7 +4794,7 @@ ippWriteIO(void *dst, /* I - Destination */
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4775,7 +4824,7 @@ ippWriteIO(void *dst, /* I - Destination */
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP attribute...");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4816,7 +4865,7 @@ ippWriteIO(void *dst, /* I - Destination */
if ((*cb)(dst, buffer, n) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP end-tag...");
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (IPP_ERROR);
}
@@ -4831,7 +4880,7 @@ ippWriteIO(void *dst, /* I - Destination */
break; /* anti-compiler-warning-code */
}
- ipp_buffer_release(buffer);
+ _cupsBufferRelease((char *)buffer);
return (ipp->state);
}
@@ -4906,47 +4955,6 @@ ipp_add_attr(ipp_t *ipp, /* I - IPP message */
}
-/*
- * 'ipp_buffer_get()' - Get a read/write buffer.
- */
-
-static unsigned char * /* O - Buffer */
-ipp_buffer_get(void)
-{
- _ipp_buffer_t *buffer; /* Current buffer */
- _cups_globals_t *cg = _cupsGlobals();
- /* Global data */
-
-
- for (buffer = cg->ipp_buffers; buffer; buffer = buffer->next)
- if (!buffer->used)
- {
- buffer->used = 1;
- return (buffer->d);
- }
-
- if ((buffer = malloc(sizeof(_ipp_buffer_t))) == NULL)
- return (NULL);
-
- buffer->used = 1;
- buffer->next = cg->ipp_buffers;
- cg->ipp_buffers = buffer;
-
- return (buffer->d);
-}
-
-
-/*
- * 'ipp_buffer_release()' - Release a read/write buffer.
- */
-
-static void
-ipp_buffer_release(unsigned char *b) /* I - Buffer to release */
-{
- ((_ipp_buffer_t *)b)->used = 0;
-}
-
-
/*
* 'ipp_free_values()' - Free attribute values.
*/
@@ -5503,7 +5511,7 @@ ipp_set_value(ipp_t *ipp, /* IO - IPP message */
*/
*attr = temp;
- _cupsSetError(IPP_ERROR,
+ _cupsSetError(IPP_INTERNAL_ERROR,
_("IPP attribute is not a member of the message."), 1);
DEBUG_puts("4ipp_set_value: Unable to find attribute in message.");
return (NULL);
diff --git a/cups/ipp.h b/cups/ipp.h
index c35ee79a8..950e4005c 100644
--- a/cups/ipp.h
+++ b/cups/ipp.h
@@ -130,6 +130,7 @@ typedef enum ipp_jstate_e /**** Job states ****/
typedef enum ipp_op_e /**** IPP operations ****/
{
+ IPP_OP_CUPS_INVALID = -1, /* Invalid operation name for @link ippOpValue@ */
IPP_PRINT_JOB = 0x0002, /* Print a single file */
IPP_PRINT_URI, /* Print a single URL @private@ */
IPP_VALIDATE_JOB, /* Validate job options */
@@ -249,6 +250,7 @@ typedef enum ipp_state_e /**** IPP states ****/
typedef enum ipp_status_e /**** IPP status codes ****/
{
+ IPP_STATUS_CUPS_INVALID = -1, /* Invalid status name for @link ippErrorValue@ */
IPP_OK = 0x0000, /* successful-ok */
IPP_OK_SUBST, /* successful-ok-ignored-or-substituted-attributes */
IPP_OK_CONFLICT, /* successful-ok-conflicting-attributes */
@@ -313,6 +315,7 @@ typedef enum ipp_status_e /**** IPP status codes ****/
typedef enum ipp_tag_e /**** Format tags for attributes ****/
{
+ IPP_TAG_CUPS_INVALID = -1, /* Invalid tag name for @link ippTagValue@ */
IPP_TAG_ZERO = 0x00, /* Zero tag - used for separators */
IPP_TAG_OPERATION, /* Operation group */
IPP_TAG_JOB, /* Job group */
diff --git a/cups/libcups2.def b/cups/libcups2.def
index 7b1dbe4e4..a8799ff6a 100644
--- a/cups/libcups2.def
+++ b/cups/libcups2.def
@@ -1,6 +1,8 @@
LIBRARY libcups2
VERSION 2.9
EXPORTS
+_cupsBufferGet
+_cupsBufferRelease
_cupsGet1284Values
_cupsGetDests
_cupsGetPassword
@@ -38,10 +40,7 @@ _httpEncodeURI
_httpPeek
_httpResolveURI
_httpWait
-_ippAddAttr
-_ippAttrString
_ippFindOption
-_ippFreeAttr
_ppdCacheCreateWithFile
_ppdCacheCreateWithPPD
_ppdCacheDestroy
@@ -274,6 +273,7 @@ ippAddDate
ippAddInteger
ippAddIntegers
ippAddOctetString
+ippAddOutOfBand
ippAddRange
ippAddRanges
ippAddResolution
@@ -281,16 +281,40 @@ ippAddResolutions
ippAddSeparator
ippAddString
ippAddStrings
+ippAttributeString
+ippCopyAttribute
+ippCopyAttributes
ippDateToTime
ippDelete
ippDeleteAttribute
+ippDeleteValues
+ippEnumString
+ippEnumValue
ippErrorString
ippErrorValue
ippFindAttribute
ippFindNextAttribute
+ippFirstAttribute
+ippGetBoolean
+ippGetCollection
+ippGetCount
+ippGetDate
+ippGetGroupTag
+ippGetInteger
+ippGetName
+ippGetOperation
+ippGetRange
+ippGetRequestId
+ippGetResolution
+ippGetState
+ippGetStatusCode
+ippGetString
+ippGetValueTag
+ippGetVersion
ippLength
ippNew
ippNewRequest
+ippNextAttribute
ippOpString
ippOpValue
ippPort
@@ -298,6 +322,21 @@ ippRead
ippReadFile
ippReadIO
ippSetPort
+ippSetBoolean
+ippSetCollection
+ippSetDate
+ippSetGroupTag
+ippSetInteger
+ippSetName
+ippSetOperation
+ippSetRange
+ippSetRequestId
+ippSetResolution
+ippSetState
+ippSetStatusCode
+ippSetString
+ippSetValueTag
+ippSetVersion
ippTagString
ippTagValue
ippTimeToDate
diff --git a/cups/libcups_s.exp b/cups/libcups_s.exp
index f7a5c3f0f..b8b22072d 100644
--- a/cups/libcups_s.exp
+++ b/cups/libcups_s.exp
@@ -1,4 +1,6 @@
_cups_debug_fd
+_cupsBufferGet
+_cupsBufferRelease
_cupsGet1284Values
_cupsGetDests
_cupsGetPassword
diff --git a/cups/localize.c b/cups/localize.c
index 74c4c3c01..c1d7ec562 100644
--- a/cups/localize.c
+++ b/cups/localize.c
@@ -332,9 +332,9 @@ ppdLocalizeIPPReason(
else if (!strncmp(reason, "output-area-full", 16))
message = _("The output bin is full.");
else if (!strncmp(reason, "marker-supply-low", 17))
- message = _("The printer is almost out of ink.");
+ message = _("The printer is low on ink.");
else if (!strncmp(reason, "marker-supply-empty", 19))
- message = _("The printer is out of ink.");
+ message = _("The printer may be out of ink.");
else if (!strncmp(reason, "marker-waste-almost-full", 24))
message = _("The printer's waste bin is almost full.");
else if (!strncmp(reason, "marker-waste-full", 17))
diff --git a/cups/ppd-cache.c b/cups/ppd-cache.c
index c40214823..481546307 100644
--- a/cups/ppd-cache.c
+++ b/cups/ppd-cache.c
@@ -65,6 +65,9 @@
* Local functions...
*/
+static int pwg_compare_finishings(_pwg_finishings_t *a,
+ _pwg_finishings_t *b);
+static void pwg_free_finishings(_pwg_finishings_t *f);
static void pwg_ppdize_name(const char *ipp, char *name, size_t namesize);
static void pwg_unppdize_name(const char *ppd, char *name, size_t namesize);
@@ -86,6 +89,7 @@ _ppdCacheCreateWithFile(
_ppd_cache_t *pc; /* PWG mapping data */
_pwg_size_t *size; /* Current size */
_pwg_map_t *map; /* Current map */
+ _pwg_finishings_t *finishings; /* Current finishings option */
int linenum, /* Current line number */
num_bins, /* Number of bins in file */
num_sizes, /* Number of sizes in file */
@@ -532,6 +536,23 @@ _ppdCacheCreateWithFile(
pc->sides_2sided_long = _cupsStrAlloc(value);
else if (!_cups_strcasecmp(line, "Sides2SidedShort"))
pc->sides_2sided_short = _cupsStrAlloc(value);
+ else if (!_cups_strcasecmp(line, "Finishings"))
+ {
+ if (!pc->finishings)
+ pc->finishings =
+ cupsArrayNew3((cups_array_func_t)pwg_compare_finishings,
+ NULL, NULL, 0, NULL,
+ (cups_afree_func_t)pwg_free_finishings);
+
+ if ((finishings = calloc(1, sizeof(_pwg_finishings_t))) == NULL)
+ goto create_error;
+
+ finishings->value = strtol(value, &valueptr, 10);
+ finishings->num_options = cupsParseOptions(valueptr, 0,
+ &(finishings->options));
+
+ cupsArrayAdd(pc->finishings, finishings);
+ }
else
{
DEBUG_printf(("_ppdCacheCreateWithFile: Unknown %s on line %d.", line,
@@ -633,6 +654,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
new_known_pwg; /* New PWG name is well-known */
_pwg_size_t *new_size; /* New size to add, if any */
const char *filter; /* Current filter */
+ _pwg_finishings_t *finishings; /* Current finishings value */
DEBUG_printf(("_ppdCacheCreateWithPPD(ppd=%p)", ppd));
@@ -731,8 +753,10 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
* want to keep it if it has a larger imageable area length.
*/
- new_width = _PWG_FROMPTS(ppd_size->width);
- new_length = _PWG_FROMPTS(ppd_size->length);
+ pwg_media = _pwgMediaForSize(_PWG_FROMPTS(ppd_size->width),
+ _PWG_FROMPTS(ppd_size->length));
+ new_width = pwg_media->width;
+ new_length = pwg_media->length;
new_left = _PWG_FROMPTS(ppd_size->left);
new_bottom = _PWG_FROMPTS(ppd_size->bottom);
new_right = _PWG_FROMPTS(ppd_size->width - ppd_size->right);
@@ -1298,6 +1322,32 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
if (ppd->product)
pc->product = _cupsStrAlloc(ppd->product);
+ /*
+ * Copy finishings mapping data...
+ */
+
+ if ((ppd_attr = ppdFindAttr(ppd, "cupsIPPFinishings", NULL)) != NULL)
+ {
+ pc->finishings = cupsArrayNew3((cups_array_func_t)pwg_compare_finishings,
+ NULL, NULL, 0, NULL,
+ (cups_afree_func_t)pwg_free_finishings);
+
+ do
+ {
+ if ((finishings = calloc(1, sizeof(_pwg_finishings_t))) == NULL)
+ goto create_error;
+
+ finishings->value = atoi(ppd_attr->spec);
+ finishings->num_options = _ppdParseOptions(ppd_attr->value, 0,
+ &(finishings->options),
+ _PPD_PARSE_OPTIONS);
+
+ cupsArrayAdd(pc->finishings, finishings);
+ }
+ while ((ppd_attr = ppdFindNextAttr(ppd, "cupsIPPFinishings",
+ NULL)) != NULL);
+ }
+
/*
* Return the cache data...
*/
@@ -1396,6 +1446,7 @@ _ppdCacheDestroy(_ppd_cache_t *pc) /* I - PPD cache and mapping data */
_cupsStrFree(pc->product);
cupsArrayDelete(pc->filters);
cupsArrayDelete(pc->prefilters);
+ cupsArrayDelete(pc->finishings);
free(pc);
}
@@ -1434,6 +1485,127 @@ _ppdCacheGetBin(
}
+/*
+ * '_ppdCacheGetFinishingOptions()' - Get PPD finishing options for the given
+ * IPP finishings value(s).
+ */
+
+int /* O - New number of options */
+_ppdCacheGetFinishingOptions(
+ _ppd_cache_t *pc, /* I - PPD cache and mapping data */
+ ipp_t *job, /* I - Job attributes or NULL */
+ ipp_finish_t value, /* I - IPP finishings value of IPP_FINISHINGS_NONE */
+ int num_options, /* I - Number of options */
+ cups_option_t **options) /* IO - Options */
+{
+ int i; /* Looping var */
+ _pwg_finishings_t *f, /* PWG finishings options */
+ key; /* Search key */
+ ipp_attribute_t *attr; /* Finishings attribute */
+ cups_option_t *option; /* Current finishings option */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!pc || cupsArrayCount(pc->finishings) == 0 || !options ||
+ (!job && value == IPP_FINISHINGS_NONE))
+ return (num_options);
+
+ /*
+ * Apply finishing options...
+ */
+
+ if (job && (attr = ippFindAttribute(job, "finishings", IPP_TAG_ENUM)) != NULL)
+ {
+ int num_values = ippGetCount(attr); /* Number of values */
+
+ for (i = 0; i < num_values; i ++)
+ {
+ key.value = ippGetInteger(attr, i);
+
+ if ((f = cupsArrayFind(pc->finishings, &key)) != NULL)
+ {
+ int j; /* Another looping var */
+
+ for (j = f->num_options, option = f->options; j > 0; j --, option ++)
+ num_options = cupsAddOption(option->name, option->value,
+ num_options, options);
+ }
+ }
+ }
+ else if (value != IPP_FINISHINGS_NONE)
+ {
+ key.value = value;
+
+ if ((f = cupsArrayFind(pc->finishings, &key)) != NULL)
+ {
+ int j; /* Another looping var */
+
+ for (j = f->num_options, option = f->options; j > 0; j --, option ++)
+ num_options = cupsAddOption(option->name, option->value,
+ num_options, options);
+ }
+ }
+
+ return (num_options);
+}
+
+
+/*
+ * '_ppdCacheGetFinishingValues()' - Get IPP finishings value(s) from the given
+ * PPD options.
+ */
+
+int /* O - Number of finishings values */
+_ppdCacheGetFinishingValues(
+ _ppd_cache_t *pc, /* I - PPD cache and mapping data */
+ int num_options, /* I - Number of options */
+ cups_option_t *options, /* I - Options */
+ int max_values, /* I - Maximum number of finishings values */
+ int *values) /* O - Finishings values */
+{
+ int i, /* Looping var */
+ num_values = 0; /* Number of values */
+ _pwg_finishings_t *f; /* Current finishings option */
+ cups_option_t *option; /* Current option */
+ const char *val; /* Value for option */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!pc || !pc->finishings || num_options < 1 || max_values < 1 || !values)
+ return (0);
+
+ /*
+ * Go through the finishings options and see what is set...
+ */
+
+ for (f = (_pwg_finishings_t *)cupsArrayFirst(pc->finishings);
+ f;
+ f = (_pwg_finishings_t *)cupsArrayNext(pc->finishings))
+ {
+ for (i = f->num_options, option = f->options; i > 0; i --, option ++)
+ if ((val = cupsGetOption(option->name, num_options, options)) == NULL ||
+ _cups_strcasecmp(option->value, val))
+ break;
+
+ if (i == 0)
+ {
+ values[num_values ++] = f->value;
+
+ if (num_values >= max_values)
+ break;
+ }
+ }
+
+ return (num_values);
+}
+
+
/*
* '_ppdCacheGetInputSlot()' - Get the PPD InputSlot associated with the job
* attributes or a keyword string.
@@ -1465,7 +1637,7 @@ _ppdCacheGetInputSlot(
media_col = ippFindAttribute(job, "media-col", IPP_TAG_BEGIN_COLLECTION);
if (media_col &&
- (media_source = ippFindAttribute(media_col->values[0].collection,
+ (media_source = ippFindAttribute(ippGetCollection(media_col, 0),
"media-source",
IPP_TAG_KEYWORD)) != NULL)
{
@@ -1473,7 +1645,7 @@ _ppdCacheGetInputSlot(
* Use the media-source value from media-col...
*/
- keyword = media_source->values[0].string.text;
+ keyword = ippGetString(media_source, 0, NULL);
}
else if (_pwgInitSize(&size, job, &margins_set))
{
@@ -1835,7 +2007,8 @@ _ppdCacheGetSize(
_ppd_cache_t *pc, /* I - PPD cache and mapping data */
const char *page_size) /* I - PPD PageSize */
{
- int i;
+ int i; /* Looping var */
+ _pwg_media_t *media; /* Media */
_pwg_size_t *size; /* Current size */
@@ -1914,9 +2087,26 @@ _ppdCacheGetSize(
*/
for (i = pc->num_sizes, size = pc->sizes; i > 0; i --, size ++)
- if (!_cups_strcasecmp(page_size, size->map.ppd))
+ if (!_cups_strcasecmp(page_size, size->map.ppd) ||
+ !_cups_strcasecmp(page_size, size->map.pwg))
return (size);
+ /*
+ * Look up standard sizes...
+ */
+
+ if ((media = _pwgMediaForPPD(page_size)) == NULL)
+ if ((media = _pwgMediaForLegacy(page_size)) == NULL)
+ media = _pwgMediaForPWG(page_size);
+
+ if (media)
+ {
+ pc->custom_size.width = media->width;
+ pc->custom_size.length = media->length;
+
+ return (&(pc->custom_size));
+ }
+
return (NULL);
}
@@ -1989,13 +2179,14 @@ _ppdCacheWriteFile(
const char *filename, /* I - File to write */
ipp_t *attrs) /* I - Attributes to write, if any */
{
- int i, j, k; /* Looping vars */
- cups_file_t *fp; /* Output file */
- _pwg_size_t *size; /* Current size */
- _pwg_map_t *map; /* Current map */
- cups_option_t *option; /* Current option */
- const char *value; /* Filter/pre-filter value */
- char newfile[1024]; /* New filename */
+ int i, j, k; /* Looping vars */
+ cups_file_t *fp; /* Output file */
+ _pwg_size_t *size; /* Current size */
+ _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 */
+ char newfile[1024]; /* New filename */
/*
@@ -2128,6 +2319,20 @@ _ppdCacheWriteFile(
cupsFilePrintf(fp, "SingleFile %s\n", pc->single_file ? "true" : "false");
+ /*
+ * Finishing options...
+ */
+
+ for (f = (_pwg_finishings_t *)cupsArrayFirst(pc->finishings);
+ f;
+ f = (_pwg_finishings_t *)cupsArrayNext(pc->finishings))
+ {
+ cupsFilePrintf(fp, "Finishings %d", f->value);
+ for (i = f->num_options, option = f->options; i > 0; i --, option ++)
+ cupsFilePrintf(fp, " %s=%s", option->name, option->value);
+ cupsFilePutChar(fp, '\n');
+ }
+
/*
* IPP attributes, if any...
*/
@@ -2310,6 +2515,32 @@ _pwgPageSizeForMedia(
}
+/*
+ * 'pwg_compare_finishings()' - Compare two finishings values.
+ */
+
+static int /* O- Result of comparison */
+pwg_compare_finishings(
+ _pwg_finishings_t *a, /* I - First finishings value */
+ _pwg_finishings_t *b) /* I - Second finishings value */
+{
+ return (b->value - a->value);
+}
+
+
+/*
+ * 'pwg_free_finishings()' - Free a finishings value.
+ */
+
+static void
+pwg_free_finishings(
+ _pwg_finishings_t *f) /* I - Finishings value */
+{
+ cupsFreeOptions(f->num_options, f->options);
+ free(f);
+}
+
+
/*
* 'pwg_ppdize_name()' - Convert an IPP keyword to a PPD keyword.
*/
diff --git a/cups/ppd-private.h b/cups/ppd-private.h
index 038190cf4..bc6a0f8b9 100644
--- a/cups/ppd-private.h
+++ b/cups/ppd-private.h
@@ -49,7 +49,7 @@ extern "C" {
* Constants...
*/
-# define _PPD_CACHE_VERSION 1 /* Version number in cache file */
+# define _PPD_CACHE_VERSION 2 /* Version number in cache file */
/*
@@ -94,7 +94,7 @@ typedef enum _pwg_print_color_mode_e /**** PWG print-color-mode indices ****/
_PWG_PRINT_COLOR_MODE_MAX
} _pwg_print_color_mode_t;
-typedef enum _pwg_print_quality_e /**** PWG print-quality indices ****/
+typedef enum _pwg_print_quality_e /**** PWG print-quality values ****/
{
_PWG_PRINT_QUALITY_DRAFT = 0, /* print-quality=3 */
_PWG_PRINT_QUALITY_NORMAL, /* print-quality=4 */
@@ -102,6 +102,13 @@ typedef enum _pwg_print_quality_e /**** PWG print-quality indices ****/
_PWG_PRINT_QUALITY_MAX
} _pwg_print_quality_t;
+typedef struct _pwg_finishings_s /**** PWG finishings mapping data ****/
+{
+ ipp_finish_t value; /* finishings value */
+ int num_options; /* Number of options to apply */
+ cups_option_t *options; /* Options to apply */
+} _pwg_finishings_t;
+
struct _ppd_cache_s /**** PPD cache and PWG conversion data ****/
{
int num_bins; /* Number of output bins */
@@ -133,6 +140,7 @@ struct _ppd_cache_s /**** PPD cache and PWG conversion data ****/
cups_array_t *filters, /* cupsFilter/cupsFilter2 values */
*prefilters; /* cupsPreFilter values */
int single_file; /* cupsSingleFile value */
+ cups_array_t *finishings; /* cupsIPPFinishings values */
};
@@ -146,6 +154,12 @@ extern _ppd_cache_t *_ppdCacheCreateWithPPD(ppd_file_t *ppd);
extern void _ppdCacheDestroy(_ppd_cache_t *pc);
extern const char *_ppdCacheGetBin(_ppd_cache_t *pc,
const char *output_bin);
+extern int _ppdCacheGetFinishingOptions(_ppd_cache_t *pc, ipp_t *job,
+ ipp_finish_t value, int num_options,
+ cups_option_t **options);
+extern int _ppdCacheGetFinishingValues(_ppd_cache_t *pc, int num_options,
+ cups_option_t *options,
+ int max_values, int *values);
extern const char *_ppdCacheGetInputSlot(_ppd_cache_t *pc, ipp_t *job,
const char *keyword);
extern const char *_ppdCacheGetMediaType(_ppd_cache_t *pc, ipp_t *job,
diff --git a/cups/pwg-media.c b/cups/pwg-media.c
index 7cc55b44b..db2e635db 100644
--- a/cups/pwg-media.c
+++ b/cups/pwg-media.c
@@ -66,7 +66,7 @@ static _pwg_media_t const cups_pwg_media[] =
_PWG_MEDIA_IN("na_number-9_3.875x8.875in", "na-number-9-envelope", "Env9", 3.875, 8.875),
_PWG_MEDIA_IN("na_index-4x6_4x6in", NULL, "4x6", 4, 6),
_PWG_MEDIA_IN("na_number-10_4.125x9.5in", "na-number-10-envelope", "Env10", 4.125, 9.5),
- _PWG_MEDIA_IN("na_a2_4.375x5.75in", NULL, NULL, 4.375, 5.75),
+ _PWG_MEDIA_IN("na_a2_4.375x5.75in", NULL, "EnvA2", 4.375, 5.75),
_PWG_MEDIA_IN("na_number-11_4.5x10.375in", NULL, "Env11", 4.5, 10.375),
_PWG_MEDIA_IN("na_number-12_4.75x11in", NULL, "Env12", 4.75, 11),
_PWG_MEDIA_IN("na_5x7_5x7in", NULL, "5x7", 5, 7),
@@ -230,7 +230,7 @@ static _pwg_media_t const cups_pwg_media[] =
_PWG_MEDIA_IN("oe_photo-l_3.5x5in", NULL, "3.5x5", 3.5, 5),
/* Other Metric Standard Sheet Media Sizes */
- _PWG_MEDIA_MM("om_small-photo_100x150mm", NULL, NULL, 100, 150),
+ _PWG_MEDIA_MM("om_small-photo_100x150mm", NULL, "om_small-photo", 100, 150),
_PWG_MEDIA_MM("om_italian_110x230mm", NULL, "EnvItalian", 110, 230),
_PWG_MEDIA_MM("om_postfix_114x229mm", NULL, NULL, 114, 229),
_PWG_MEDIA_MM("om_large-photo_200x300", NULL, NULL, 200, 300),
diff --git a/cups/pwg-private.h b/cups/pwg-private.h
index 41849b48c..13eedf62d 100644
--- a/cups/pwg-private.h
+++ b/cups/pwg-private.h
@@ -3,7 +3,7 @@
*
* Private PWG media API definitions for CUPS.
*
- * Copyright 2009-2010 by Apple Inc.
+ * Copyright 2009-2012 by Apple Inc.
*
* These coded instructions, statements, and computer programs are the
* property of Apple Inc. and are protected by Federal copyright
@@ -39,7 +39,7 @@ extern "C" {
*/
/* Convert from points to 2540ths */
-# define _PWG_FROMPTS(n) (int)((n) * 2540 / 72)
+# define _PWG_FROMPTS(n) (int)(((n) * 2540 + 36) / 72)
/* Convert from 2540ths to points */
# define _PWG_TOPTS(n) ((n) * 72.0 / 2540.0)
diff --git a/cups/sidechannel.c b/cups/sidechannel.c
index 460eae351..da2f77a2b 100644
--- a/cups/sidechannel.c
+++ b/cups/sidechannel.c
@@ -29,8 +29,7 @@
*/
#include "sidechannel.h"
-#include "string-private.h"
-#include "debug-private.h"
+#include "cups-private.h"
#ifdef WIN32
# include
#else
@@ -45,10 +44,18 @@
# include
#endif /* !WIN32 */
#ifdef HAVE_POLL
-# include
+# include
#endif /* HAVE_POLL */
+/*
+ * Buffer size for side-channel requests...
+ */
+
+#define _CUPS_SC_MAX_DATA 65535
+#define _CUPS_SC_MAX_BUFFER 65540
+
+
/*
* 'cupsSideChannelDoRequest()' - Send a side-channel command to a backend and wait for a response.
*
@@ -112,7 +119,7 @@ cupsSideChannelRead(
int *datalen, /* IO - Size of data buffer on entry, number of bytes in buffer on return */
double timeout) /* I - Timeout in seconds */
{
- char buffer[16388]; /* Message buffer */
+ char *buffer; /* Message buffer */
int bytes; /* Bytes read */
int templen; /* Data length from message */
int nfds; /* Number of file descriptors */
@@ -164,7 +171,8 @@ cupsSideChannelRead(
if (nfds < 1)
{
- *status = nfds==0 ? CUPS_SC_STATUS_TIMEOUT : CUPS_SC_STATUS_IO_ERROR;
+ *command = CUPS_SC_CMD_NONE;
+ *status = nfds==0 ? CUPS_SC_STATUS_TIMEOUT : CUPS_SC_STATUS_IO_ERROR;
return (-1);
}
@@ -175,16 +183,28 @@ cupsSideChannelRead(
* ------- -------------------------------------------
* 0 Command code
* 1 Status code
- * 2-3 Data length (network byte order) <= 16384
+ * 2-3 Data length (network byte order)
* 4-N Data
*/
- while ((bytes = read(CUPS_SC_FD, buffer, sizeof(buffer))) < 0)
+ if ((buffer = _cupsBufferGet(_CUPS_SC_MAX_BUFFER)) == NULL)
+ {
+ *command = CUPS_SC_CMD_NONE;
+ *status = CUPS_SC_STATUS_TOO_BIG;
+
+ return (-1);
+ }
+
+ while ((bytes = read(CUPS_SC_FD, buffer, _CUPS_SC_MAX_BUFFER)) < 0)
if (errno != EINTR && errno != EAGAIN)
{
DEBUG_printf(("1cupsSideChannelRead: Read error: %s", strerror(errno)));
+
+ _cupsBufferRelease(buffer);
+
*command = CUPS_SC_CMD_NONE;
*status = CUPS_SC_STATUS_IO_ERROR;
+
return (-1);
}
@@ -195,8 +215,12 @@ cupsSideChannelRead(
if (bytes < 4)
{
DEBUG_printf(("1cupsSideChannelRead: Short read of %d bytes", bytes));
+
+ _cupsBufferRelease(buffer);
+
*command = CUPS_SC_CMD_NONE;
*status = CUPS_SC_STATUS_BAD_MESSAGE;
+
return (-1);
}
@@ -208,8 +232,12 @@ cupsSideChannelRead(
buffer[0] >= CUPS_SC_CMD_MAX)
{
DEBUG_printf(("1cupsSideChannelRead: Bad command %d!", buffer[0]));
+
+ _cupsBufferRelease(buffer);
+
*command = CUPS_SC_CMD_NONE;
*status = CUPS_SC_STATUS_BAD_MESSAGE;
+
return (-1);
}
@@ -252,6 +280,8 @@ cupsSideChannelRead(
memcpy(data, buffer + 4, templen);
}
+ _cupsBufferRelease(buffer);
+
DEBUG_printf(("1cupsSideChannelRead: Returning status=%d", *status));
return (0);
@@ -290,7 +320,7 @@ cupsSideChannelSNMPGet(
{
cups_sc_status_t status; /* Status of command */
cups_sc_command_t rcommand; /* Response command */
- char real_data[2048];/* Real data buffer for response */
+ char *real_data; /* Real data buffer for response */
int real_datalen, /* Real length of data buffer */
real_oidlen; /* Length of returned OID string */
@@ -316,12 +346,21 @@ cupsSideChannelSNMPGet(
(int)strlen(oid) + 1, timeout))
return (CUPS_SC_STATUS_TIMEOUT);
- real_datalen = sizeof(real_data);
+ if ((real_data = _cupsBufferGet(_CUPS_SC_MAX_BUFFER)) == NULL)
+ return (CUPS_SC_STATUS_TOO_BIG);
+
+ real_datalen = _CUPS_SC_MAX_BUFFER;
if (cupsSideChannelRead(&rcommand, &status, real_data, &real_datalen, timeout))
+ {
+ _cupsBufferRelease(real_data);
return (CUPS_SC_STATUS_TIMEOUT);
+ }
if (rcommand != CUPS_SC_CMD_SNMP_GET)
+ {
+ _cupsBufferRelease(real_data);
return (CUPS_SC_STATUS_BAD_MESSAGE);
+ }
if (status == CUPS_SC_STATUS_OK)
{
@@ -333,7 +372,10 @@ cupsSideChannelSNMPGet(
real_datalen -= real_oidlen;
if ((real_datalen + 1) > *datalen)
+ {
+ _cupsBufferRelease(real_data);
return (CUPS_SC_STATUS_TOO_BIG);
+ }
memcpy(data, real_data + real_oidlen, real_datalen);
data[real_datalen] = '\0';
@@ -341,6 +383,8 @@ cupsSideChannelSNMPGet(
*datalen = real_datalen;
}
+ _cupsBufferRelease(real_data);
+
return (status);
}
@@ -382,7 +426,7 @@ cupsSideChannelSNMPWalk(
{
cups_sc_status_t status; /* Status of command */
cups_sc_command_t rcommand; /* Response command */
- char real_data[2048];/* Real data buffer for response */
+ char *real_data; /* Real data buffer for response */
int real_datalen, /* Real length of data buffer */
real_oidlen, /* Length of returned OID string */
oidlen; /* Length of first OID */
@@ -400,6 +444,9 @@ cupsSideChannelSNMPWalk(
if (!oid || !*oid || !cb)
return (CUPS_SC_STATUS_BAD_MESSAGE);
+ if ((real_data = _cupsBufferGet(_CUPS_SC_MAX_BUFFER)) == NULL)
+ return (CUPS_SC_STATUS_TOO_BIG);
+
/*
* Loop until the OIDs don't match...
*/
@@ -416,15 +463,24 @@ cupsSideChannelSNMPWalk(
if (cupsSideChannelWrite(CUPS_SC_CMD_SNMP_GET_NEXT, CUPS_SC_STATUS_NONE,
current_oid, (int)strlen(current_oid) + 1, timeout))
+ {
+ _cupsBufferRelease(real_data);
return (CUPS_SC_STATUS_TIMEOUT);
+ }
- real_datalen = sizeof(real_data);
+ real_datalen = _CUPS_SC_MAX_BUFFER;
if (cupsSideChannelRead(&rcommand, &status, real_data, &real_datalen,
timeout))
+ {
+ _cupsBufferRelease(real_data);
return (CUPS_SC_STATUS_TIMEOUT);
+ }
if (rcommand != CUPS_SC_CMD_SNMP_GET_NEXT)
+ {
+ _cupsBufferRelease(real_data);
return (CUPS_SC_STATUS_BAD_MESSAGE);
+ }
if (status == CUPS_SC_STATUS_OK)
{
@@ -439,6 +495,7 @@ cupsSideChannelSNMPWalk(
* Done with this set of OIDs...
*/
+ _cupsBufferRelease(real_data);
return (CUPS_SC_STATUS_OK);
}
@@ -464,6 +521,8 @@ cupsSideChannelSNMPWalk(
}
while (status == CUPS_SC_STATUS_OK);
+ _cupsBufferRelease(real_data);
+
return (status);
}
@@ -485,7 +544,7 @@ cupsSideChannelWrite(
int datalen, /* I - Number of bytes of data */
double timeout) /* I - Timeout in seconds */
{
- char buffer[16388]; /* Message buffer */
+ char *buffer; /* Message buffer */
int bytes; /* Bytes written */
#ifdef HAVE_POLL
struct pollfd pfd; /* Poll structure for poll() */
@@ -500,7 +559,7 @@ cupsSideChannelWrite(
*/
if (command < CUPS_SC_CMD_SOFT_RESET || command >= CUPS_SC_CMD_MAX ||
- datalen < 0 || datalen > 16384 || (datalen > 0 && !data))
+ datalen < 0 || datalen > _CUPS_SC_MAX_DATA || (datalen > 0 && !data))
return (-1);
/*
@@ -549,6 +608,9 @@ cupsSideChannelWrite(
* 4-N Data
*/
+ if ((buffer = _cupsBufferGet(datalen + 4)) == NULL)
+ return (-1);
+
buffer[0] = command;
buffer[1] = status;
buffer[2] = datalen >> 8;
@@ -564,7 +626,12 @@ cupsSideChannelWrite(
while (write(CUPS_SC_FD, buffer, bytes) < 0)
if (errno != EINTR && errno != EAGAIN)
+ {
+ _cupsBufferRelease(buffer);
return (-1);
+ }
+
+ _cupsBufferRelease(buffer);
return (0);
}
diff --git a/cups/snmp.c b/cups/snmp.c
index 69858b17d..29b47d77e 100644
--- a/cups/snmp.c
+++ b/cups/snmp.c
@@ -61,7 +61,7 @@
#include "cups-private.h"
#include "snmp-private.h"
#ifdef HAVE_POLL
-# include
+# include
#endif /* HAVE_POLL */
diff --git a/cups/testcups.c b/cups/testcups.c
index e7dc9ea6d..d25a78e55 100644
--- a/cups/testcups.c
+++ b/cups/testcups.c
@@ -3,7 +3,7 @@
*
* CUPS API test program for CUPS.
*
- * Copyright 2007-2011 by Apple Inc.
+ * Copyright 2007-2012 by Apple Inc.
* Copyright 2007 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -35,6 +35,7 @@
*/
static int dests_equal(cups_dest_t *a, cups_dest_t *b);
+static int enum_cb(void *user_data, unsigned flags, cups_dest_t *dest);
static void show_diffs(cups_dest_t *a, cups_dest_t *b);
@@ -57,69 +58,106 @@ main(int argc, /* I - Number of command-line arguments */
int num_jobs; /* Number of jobs for queue */
cups_job_t *jobs; /* Jobs for queue */
-
if (argc > 1)
{
- /*
- * ./testcups printer file interval
- */
-
- int interval, /* Interval between writes */
- job_id; /* Job ID */
- cups_file_t *fp; /* Print file */
- char buffer[16384]; /* Read/write buffer */
- ssize_t bytes; /* Bytes read/written */
+ if (!strcmp(argv[1], "enum"))
+ {
+ int msec; /* Timeout in milliseconds */
+ if (argc >= 3)
+ msec = atoi(argv[2]) * 1000;
+ else
+ msec = 0;
- if (argc != 4)
- {
- puts("Usage: ./testcups");
- puts(" ./testcups printer file interval");
- return (1);
+ cupsEnumDests(CUPS_DEST_FLAGS_NONE, msec, NULL, 0, 0, enum_cb, NULL);
}
-
- if ((fp = cupsFileOpen(argv[2], "r")) == NULL)
+ else if (!strcmp(argv[1], "password"))
{
- printf("Unable to open \"%s\": %s\n", argv[2], strerror(errno));
- return (1);
- }
+ const char *pass = cupsGetPassword("Password:");
+ /* Password string */
- if ((job_id = cupsCreateJob(CUPS_HTTP_DEFAULT, argv[1], "testcups", 0,
- NULL)) <= 0)
- {
- printf("Unable to create print job on %s: %s\n", argv[1],
- cupsLastErrorString());
- return (1);
+ if (pass)
+ printf("Password entered: %s\n", pass);
+ else
+ puts("No password entered.");
}
+ else if (!strcmp(argv[1], "print") && argc == 5)
+ {
+ /*
+ * ./testcups printer file interval
+ */
- interval = atoi(argv[3]);
+ int interval, /* Interval between writes */
+ job_id; /* Job ID */
+ cups_file_t *fp; /* Print file */
+ char buffer[16384]; /* Read/write buffer */
+ ssize_t bytes; /* Bytes read/written */
- if (cupsStartDocument(CUPS_HTTP_DEFAULT, argv[1], job_id, argv[2],
- CUPS_FORMAT_AUTO, 1) != HTTP_CONTINUE)
- {
- puts("Unable to start document!");
- return (1);
- }
+ if ((fp = cupsFileOpen(argv[3], "r")) == NULL)
+ {
+ printf("Unable to open \"%s\": %s\n", argv[2], strerror(errno));
+ return (1);
+ }
- while ((bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0)
- {
- printf("Writing %d bytes...\n", (int)bytes);
+ if ((job_id = cupsCreateJob(CUPS_HTTP_DEFAULT, argv[2], "testcups", 0,
+ NULL)) <= 0)
+ {
+ printf("Unable to create print job on %s: %s\n", argv[1],
+ cupsLastErrorString());
+ return (1);
+ }
+
+ interval = atoi(argv[4]);
- if (cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer,
- bytes) != HTTP_CONTINUE)
+ if (cupsStartDocument(CUPS_HTTP_DEFAULT, argv[1], job_id, argv[2],
+ CUPS_FORMAT_AUTO, 1) != HTTP_CONTINUE)
{
- puts("Unable to write bytes!");
+ puts("Unable to start document!");
return (1);
}
- sleep(interval);
- }
+ while ((bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0)
+ {
+ printf("Writing %d bytes...\n", (int)bytes);
+
+ if (cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer,
+ bytes) != HTTP_CONTINUE)
+ {
+ puts("Unable to write bytes!");
+ return (1);
+ }
- cupsFileClose(fp);
+ if (interval > 0)
+ sleep(interval);
+ }
+
+ cupsFileClose(fp);
- if (cupsFinishDocument(CUPS_HTTP_DEFAULT, argv[1]) > IPP_OK_SUBST)
+ if (cupsFinishDocument(CUPS_HTTP_DEFAULT, argv[1]) > IPP_OK_SUBST)
+ {
+ puts("Unable to finish document!");
+ return (1);
+ }
+ }
+ else
{
- puts("Unable to finish document!");
+ puts("Usage:");
+ puts("");
+ puts("Run basic unit tests:");
+ puts("");
+ puts(" ./testcups");
+ puts("");
+ puts("Enumerate printers (for N seconds, -1 for indefinitely):");
+ puts("");
+ puts(" ./testcups enum [seconds]");
+ puts("");
+ puts("Ask for a password:");
+ puts("");
+ puts(" ./testcups password");
+ puts("");
+ puts("Print a file (interval controls delay between buffers in seconds):");
+ puts("");
+ puts(" ./testcups print printer file interval");
return (1);
}
@@ -369,6 +407,24 @@ dests_equal(cups_dest_t *a, /* I - First destination */
}
+/*
+ * 'enum_cb()' - Report additions and removals.
+ */
+
+static int /* O - 1 to continue, 0 to stop */
+enum_cb(void *user_data, /* I - User data (unused) */
+ unsigned flags, /* I - Destination flags */
+ cups_dest_t *dest) /* I - Destination */
+{
+ if (flags & CUPS_DEST_FLAGS_REMOVED)
+ printf("Removed '%s'.\n", dest->name);
+ else
+ printf("Added '%s'.\n", dest->name);
+
+ return (1);
+}
+
+
/*
* 'show_diffs()' - Show differences between two destinations.
*/
diff --git a/cups/testppd.c b/cups/testppd.c
index 31bbb3115..5e291ce83 100644
--- a/cups/testppd.c
+++ b/cups/testppd.c
@@ -470,6 +470,26 @@ main(int argc, /* I - Number of command-line arguments */
else
puts("PASS");
+ /*
+ * Custom sizes...
+ */
+
+ fputs("cupsMarkOptions(media=Custom.8x10in): ", stdout);
+ num_options = cupsAddOption("media", "Custom.8x10in", 0, &options);
+ cupsMarkOptions(ppd, num_options, options);
+ cupsFreeOptions(num_options, options);
+
+ size = ppdPageSize(ppd, NULL);
+ if (!size || strcmp(size->name, "Custom") ||
+ size->width != 576 || size->length != 720)
+ {
+ printf("FAIL (%s - %gx%g)\n", size ? size->name : "unknown",
+ size ? size->width : 0.0, size ? size->length : 0.0);
+ status ++;
+ }
+ else
+ puts("PASS");
+
/*
* Test localization...
*/
diff --git a/cups/usersys.c b/cups/usersys.c
index a8784d8a5..c65d1e544 100644
--- a/cups/usersys.c
+++ b/cups/usersys.c
@@ -47,9 +47,17 @@
# include
#else
# include
+# include
#endif /* WIN32 */
+/*
+ * Local constants...
+ */
+
+#define _CUPS_PASSCHAR '*' /* Character that is echoed for password */
+
+
/*
* Local functions...
*/
@@ -485,29 +493,270 @@ cupsUser(void)
* '_cupsGetPassword()' - Get a password from the user.
*/
-const char * /* O - Password */
+const char * /* O - Password or @code NULL@ if none */
_cupsGetPassword(const char *prompt) /* I - Prompt string */
{
#ifdef WIN32
+ HANDLE tty; /* Console handle */
+ DWORD mode; /* Console mode */
+ char passch, /* Current key press */
+ *passptr, /* Pointer into password string */
+ *passend; /* End of password string */
+ ssize_t passbytes; /* Bytes read */
+ _cups_globals_t *cg = _cupsGlobals();
+ /* Thread globals */
+
+
+ /*
+ * Disable input echo and set raw input...
+ */
+
+ if ((tty = GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE)
+ return (NULL);
+
+ if (!GetConsoleMode(tty, &mode))
+ return (NULL);
+
+ if (!SetConsoleMode(tty, 0))
+ return (NULL);
+
+ /*
+ * Display the prompt...
+ */
+
+ printf("%s ", prompt);
+ fflush(stdout);
+
/*
- * Currently no console password support is provided on Windows.
+ * Read the password string from /dev/tty until we get interrupted or get a
+ * carriage return or newline...
*/
- return (NULL);
+ passptr = cg->password;
+ passend = cg->password + sizeof(cg->password) - 1;
+
+ while ((passbytes = read(tty, &passch, 1)) == 1)
+ {
+ if (passch == 0x0A || passch == 0x0D)
+ {
+ /*
+ * Enter/return...
+ */
+
+ break;
+ }
+ else if (passch == 0x08 || passch == 0x7F)
+ {
+ /*
+ * Backspace/delete (erase character)...
+ */
+
+ if (passptr > cg->password)
+ {
+ passptr --;
+ fputs("\010 \010", stdout);
+ }
+ else
+ putchar(0x07);
+ }
+ else if (passch == 0x15)
+ {
+ /*
+ * CTRL+U (erase line)
+ */
+
+ if (passptr > cg->password)
+ {
+ while (passptr > cg->password)
+ {
+ passptr --;
+ fputs("\010 \010", stdout);
+ }
+ }
+ else
+ putchar(0x07);
+ }
+ else if (passch == 0x03)
+ {
+ /*
+ * CTRL+C...
+ */
+
+ passptr = cg->password;
+ break;
+ }
+ else if ((passch & 255) < 0x20 || passptr >= passend)
+ putchar(0x07);
+ else
+ {
+ *passptr++ = passch;
+ putchar(_CUPS_PASSCHAR);
+ }
+
+ fflush(stdout);
+ }
+
+ putchar('\n');
+ fflush(stdout);
+
+ /*
+ * Cleanup...
+ */
+
+ SetConsoleMode(tty, mode);
+
+ /*
+ * Return the proper value...
+ */
+
+ if (passbytes == 1 && passptr > cg->password)
+ {
+ *passptr = '\0';
+ return (cg->password);
+ }
+ else
+ {
+ memset(cg->password, 0, sizeof(cg->password));
+ return (NULL);
+ }
#else
+ int tty; /* /dev/tty - never read from stdin */
+ struct termios original, /* Original input mode */
+ noecho; /* No echo input mode */
+ char passch, /* Current key press */
+ *passptr, /* Pointer into password string */
+ *passend; /* End of password string */
+ ssize_t passbytes; /* Bytes read */
+ _cups_globals_t *cg = _cupsGlobals();
+ /* Thread globals */
+
+
/*
- * Use the standard getpass function to get a password from the console. An
- * empty password is treated as canceling the authentication request.
+ * Disable input echo and set raw input...
*/
- const char *password = getpass(prompt);
- /* Password string */
+ if ((tty = open("/dev/tty", O_RDONLY)) < 0)
+ return (NULL);
+
+ if (tcgetattr(tty, &original))
+ {
+ close(tty);
+ return (NULL);
+ }
+
+ noecho = original;
+ noecho.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
- if (!password || !password[0])
+ if (tcsetattr(tty, TCSAFLUSH, &noecho))
+ {
+ close(tty);
return (NULL);
+ }
+
+ /*
+ * Display the prompt...
+ */
+
+ printf("%s ", prompt);
+ fflush(stdout);
+
+ /*
+ * Read the password string from /dev/tty until we get interrupted or get a
+ * carriage return or newline...
+ */
+
+ passptr = cg->password;
+ passend = cg->password + sizeof(cg->password) - 1;
+
+ while ((passbytes = read(tty, &passch, 1)) == 1)
+ {
+ if (passch == noecho.c_cc[VEOL] || passch == noecho.c_cc[VEOL2] ||
+ passch == 0x0A || passch == 0x0D)
+ {
+ /*
+ * Enter/return...
+ */
+
+ break;
+ }
+ else if (passch == noecho.c_cc[VERASE] ||
+ passch == 0x08 || passch == 0x7F)
+ {
+ /*
+ * Backspace/delete (erase character)...
+ */
+
+ if (passptr > cg->password)
+ {
+ passptr --;
+ fputs("\010 \010", stdout);
+ }
+ else
+ putchar(0x07);
+ }
+ else if (passch == noecho.c_cc[VKILL])
+ {
+ /*
+ * CTRL+U (erase line)
+ */
+
+ if (passptr > cg->password)
+ {
+ while (passptr > cg->password)
+ {
+ passptr --;
+ fputs("\010 \010", stdout);
+ }
+ }
+ else
+ putchar(0x07);
+ }
+ else if (passch == noecho.c_cc[VINTR] || passch == noecho.c_cc[VQUIT] ||
+ passch == noecho.c_cc[VEOF])
+ {
+ /*
+ * CTRL+C, CTRL+D, or CTRL+Z...
+ */
+
+ passptr = cg->password;
+ break;
+ }
+ else if ((passch & 255) < 0x20 || passptr >= passend)
+ putchar(0x07);
+ else
+ {
+ *passptr++ = passch;
+ putchar(_CUPS_PASSCHAR);
+ }
+
+ fflush(stdout);
+ }
+
+ putchar('\n');
+ fflush(stdout);
+
+ /*
+ * Cleanup...
+ */
+
+ tcsetattr(tty, TCSAFLUSH, &original);
+ close(tty);
+
+ /*
+ * Return the proper value...
+ */
+
+ if (passbytes == 1 && passptr > cg->password)
+ {
+ *passptr = '\0';
+ return (cg->password);
+ }
else
- return (password);
+ {
+ memset(cg->password, 0, sizeof(cg->password));
+ return (NULL);
+ }
#endif /* WIN32 */
}
diff --git a/doc/de/index.html.in b/doc/de/index.html.in
index a73d77179..40e2fb0d9 100644
--- a/doc/de/index.html.in
+++ b/doc/de/index.html.in
@@ -50,7 +50,7 @@ HEIGHT="128" ALT="CUPS">
Kommandozeilendruck und Einstellungen
-Neues in CUPS 1.4
+Neues in CUPS 1.6
Benutzerforum
diff --git a/doc/es/index.html.in b/doc/es/index.html.in
index 5afb0d0c0..820a90599 100644
--- a/doc/es/index.html.in
+++ b/doc/es/index.html.in
@@ -50,7 +50,7 @@ HEIGHT="128" ALT="CUPS">
Impresión desde la línea de comandos y opciones
-Qué hay de nuevo en CUPS 1.4
+Qué hay de nuevo en CUPS 1.6
Foro de usuarios
diff --git a/doc/eu/index.html.in b/doc/eu/index.html.in
index 5b79b6ae2..5a7494180 100644
--- a/doc/eu/index.html.in
+++ b/doc/eu/index.html.in
@@ -50,7 +50,7 @@ HEIGHT="128" ALT="CUPS">
Komando-lerroaren bidez inprimatzea eta aukerak
-CUPS 1.4 bertsioak dakartzan berrikuntza.
+CUPS 1.6 bertsioak dakartzan berrikuntza.
Erabiltzaileen foroa
diff --git a/doc/help/ref-client-conf.html b/doc/help/ref-client-conf.html
index 0229b0040..5b4e7e772 100644
--- a/doc/help/ref-client-conf.html
+++ b/doc/help/ref-client-conf.html
@@ -34,6 +34,20 @@ encryption settings for the client.
The default setting is IfRequested.
+
+
+Examples
+
+
+GSSServiceName http
+GSSServiceName ipp
+
+
+Description
+
+The GSSServiceName
directive sets the Kerberos service name to use. The default is http
for compatibility with Microsoft Windows.
+
+
Examples
@@ -52,5 +66,10 @@ ServerName foo.bar.com:8631
The default is to use the local server ("localhost") or domain socket, if so configured.
+Note:
+Only one ServerName
directive may appear. If multiple names are
+present, only the last one is used. This directive is not supported on Mac OS X 10.7 or later.
+
+