CHANGES IN CUPS V1.3.11
+ - The scheduler did not prevent nested classes (STR #3211)
+ - The scheduler did not reprint processing jobs that were moved to
+ another destination (STR #3222)
+ - The scheduler did not reset the current job file when stopping a
+ printer (STR #3226)
+ - The scheduler did not handle POSTs to custom CGIs properly (STR #3221)
- The pdftops filter did not print landscape PDF pages properly
(STR #2881)
- The scheduler did not handle partial header lines properly from CGI
-CHANGES.txt - 2009-06-08
+CHANGES.txt - 2009-06-18
------------------------
+CHANGES IN CUPS V1.4.0
+
+ - Localization updates (STR #3223)
+ - Documentation updates (STR #3225)
+ - Fixed a HTML error in the add and modify printer web interface templates
+ (STR #3229)
+ - The scheduler did not minimize the number of printer state events that
+ were generated by filter STATE: messages, which could lead to poor
+ performance.
+ - The USB backend on Mac OS X did not cleanly cancel a job.
+ - The network backends now set the connecting-to-device printer-state-
+ reasons value when looking up the address and copying the print data
+ for consistency.
+ - The scheduler now supports the com.apple.print.recoverable-warning
+ reason on all platforms.
+
+
CHANGES IN CUPS V1.4rc1
- The PPD compiler documentation was missing information on localization
int num_options; /* Number of printer options */
cups_option_t *options; /* Printer options */
const char *device_uri; /* Device URI */
- char method[255], /* Method in URI */
+ char scheme[255], /* Scheme in URI */
hostname[1024], /* Hostname */
username[255], /* Username info */
resource[1024], /* Resource info (printer name) */
if ((device_uri = cupsBackendDeviceURI(argv)) == NULL)
return (CUPS_BACKEND_FAILED);
- if (httpSeparateURI(HTTP_URI_CODING_ALL, device_uri,
- method, sizeof(method), username, sizeof(username),
- hostname, sizeof(hostname), &port,
- resource, sizeof(resource)) < HTTP_URI_OK)
- {
- _cupsLangPuts(stderr,
- _("ERROR: Missing device URI on command-line and no "
- "DEVICE_URI environment variable!\n"));
- return (CUPS_BACKEND_STOP);
- }
+ httpSeparateURI(HTTP_URI_CODING_ALL, device_uri, scheme, sizeof(scheme),
+ username, sizeof(username), hostname, sizeof(hostname), &port,
+ resource, sizeof(resource));
if (!port)
port = IPP_PORT; /* Default to port 631 */
- if (!strcmp(method, "https"))
+ if (!strcmp(scheme, "https"))
cupsSetEncryption(HTTP_ENCRYPT_ALWAYS);
else
cupsSetEncryption(HTTP_ENCRYPT_IF_REQUESTED);
off_t tbytes; /* Total bytes copied */
+ fputs("STATE: +connecting-to-device\n", stderr);
+ fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname);
+
if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, "1")) == NULL)
{
_cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"),
do
{
- fprintf(stderr, "DEBUG: Connecting to %s:%d\n",
- hostname, port);
+ fprintf(stderr, "DEBUG: Connecting to %s:%d\n", hostname, port);
_cupsLangPuts(stderr, _("INFO: Connecting to printer...\n"));
if ((http = httpConnectEncrypt(hostname, port, cupsEncryption())) == NULL)
* might contain username:password information...
*/
- snprintf(uri, sizeof(uri), "%s://%s:%d%s", method, hostname, port, resource);
+ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), scheme, NULL, hostname,
+ port, resource);
/*
* First validate the destination and see if the device supports multiple
char *argv[]) /* I - Command-line arguments */
{
const char *device_uri; /* Device URI */
- char method[255], /* Method in URI */
+ char scheme[255], /* Scheme in URI */
hostname[1024], /* Hostname */
username[255], /* Username info */
resource[1024], /* Resource info (printer name) */
if ((device_uri = cupsBackendDeviceURI(argv)) == NULL)
return (CUPS_BACKEND_FAILED);
- httpSeparateURI(HTTP_URI_CODING_ALL, device_uri,
- method, sizeof(method), username, sizeof(username),
- hostname, sizeof(hostname), &port,
+ httpSeparateURI(HTTP_URI_CODING_ALL, device_uri, scheme, sizeof(scheme),
+ username, sizeof(username), hostname, sizeof(hostname), &port,
resource, sizeof(resource));
if (!port)
int bytes; /* Number of bytes read */
+ fputs("STATE: +connecting-to-device\n", stderr);
+ fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname);
+
if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, "1")) == NULL)
{
_cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"),
sprintf(portname, "%d", port);
+ fputs("STATE: +connecting-to-device\n", stderr);
fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname);
if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL)
* First try to reserve a port for this connection...
*/
- fputs("STATE: +connecting-to-device\n", stderr);
- fprintf(stderr, "DEBUG: Connecting to %s:%d for printer %s\n",
- hostname, port, printer);
+ fprintf(stderr, "DEBUG: Connecting to %s:%d for printer %s\n", hostname,
+ port, printer);
_cupsLangPuts(stderr, _("INFO: Connecting to printer...\n"));
for (lport = reserve == RESERVE_RFC1179 ? 732 : 1024, addr = addrlist,
*
* AppSocket backend for the Common UNIX Printing System (CUPS).
*
- * Copyright 2007-2008 by Apple Inc.
+ * Copyright 2007-2009 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
char *argv[]) /* I - Command-line arguments */
{
const char *device_uri; /* Device URI */
- char method[255], /* Method in URI */
+ char scheme[255], /* Scheme in URI */
hostname[1024], /* Hostname */
username[255], /* Username info (not used) */
resource[1024], /* Resource info (not used) */
if ((device_uri = cupsBackendDeviceURI(argv)) == NULL)
return (CUPS_BACKEND_FAILED);
- httpSeparateURI(HTTP_URI_CODING_ALL, device_uri,
- method, sizeof(method), username, sizeof(username),
- hostname, sizeof(hostname), &port,
+ httpSeparateURI(HTTP_URI_CODING_ALL, device_uri, scheme, sizeof(scheme),
+ username, sizeof(username), hostname, sizeof(hostname), &port,
resource, sizeof(resource));
if (port == 0)
sprintf(portname, "%d", port);
+ fputs("STATE: +connecting-to-device\n", stderr);
fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname);
if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL)
return (CUPS_BACKEND_STOP);
}
- fprintf(stderr, "DEBUG: Connecting to %s:%d\n",
- hostname, port);
+ fprintf(stderr, "DEBUG: Connecting to %s:%d\n", hostname, port);
_cupsLangPuts(stderr, _("INFO: Connecting to printer...\n"));
- fputs("STATE: +connecting-to-device\n", stderr);
-
for (delay = 5;;)
{
if ((addr = httpAddrConnect(addrlist, &device_fd)) == NULL)
if (recoverable)
{
/*
- * If we've shown a recoverable error make sure the printer proxies
- * have a chance to see the recovered message. Not pretty but
- * necessary for now...
+ * If we've shown a recoverable error make sure the printer proxies have a
+ * chance to see the recovered message. Not pretty but necessary for now...
*/
fputs("INFO: recovered: \n", stderr);
extern char **environ;
+/*
+ * DEBUG_WRITES, if defined, causes the backend to write data to the printer in
+ * 512 byte increments, up to 8192 bytes, to make debugging with a USB bus
+ * analyzer easier.
+ */
+
+#define DEBUG_WRITES 0
+
/*
* WAIT_EOF_DELAY is number of seconds we'll wait for responses from
* the printer after we've finished sending all the data
int print_fd; /* File descriptor to print */
ssize_t print_bytes; /* Print bytes read */
+#if DEBUG_WRITES
+ ssize_t debug_bytes; /* Current bytes to read */
+#endif /* DEBUG_WRITES */
Boolean wait_eof;
int drain_output; /* Drain all pending output */
{
char serial[1024]; /* Serial number buffer */
OSStatus status; /* Function results */
- IOReturn iostatus, /* Current IO status */
- prev_iostatus = 0; /* Previous IO status */
+ IOReturn iostatus; /* Current IO status */
pthread_t read_thread_id, /* Read thread */
sidechannel_thread_id;/* Side-channel thread */
int have_sidechannel = 0; /* Was the side-channel thread started? */
if (FD_ISSET(print_fd, &input_set))
{
+#if DEBUG_WRITES
+ g.debug_bytes += 512;
+ if (g.debug_bytes > sizeof(print_buffer))
+ g.debug_bytes = 512;
+
+ g.print_bytes = read(print_fd, print_buffer, g.debug_bytes);
+
+#else
g.print_bytes = read(print_fd, print_buffer, sizeof(print_buffer));
+#endif /* DEBUG_WRITES */
if (g.print_bytes < 0)
{
if (g.print_bytes)
{
- bytes = g.print_bytes;
-
+ bytes = g.print_bytes;
iostatus = (*g.classdriver)->WritePipe(g.classdriver, (UInt8*)print_ptr, &bytes, 0);
/*
}
/*
- * Ignore the first stall error we get since we try to clear any stalls
- * in the class driver...
+ * If we've stalled, retry the write...
*/
else if (iostatus == kIOUSBPipeStalled)
{
fputs("DEBUG: Got USB pipe stalled during write!\n", stderr);
- bytes = 0;
-
- if (prev_iostatus != kIOUSBPipeStalled)
- {
- prev_iostatus = iostatus;
- iostatus = 0;
- }
+ bytes = g.print_bytes;
+ iostatus = (*g.classdriver)->WritePipe(g.classdriver, (UInt8*)print_ptr, &bytes, 0);
}
/*
- * Ignore the first "aborted" status we get, since we might have
- * received a signal (<rdar://problem/6860126>)...
+ * Retry a write after an aborted write since we probably just got
+ * SIGTERM (<rdar://problem/6860126>)...
*/
else if (iostatus == kIOReturnAborted)
IOReturn err = (*g.classdriver)->Abort(g.classdriver);
fprintf(stderr, "DEBUG: USB class driver Abort returned %x\n", err);
- bytes = 0;
+#if DEBUG_WRITES
+ sleep(5);
+#endif /* DEBUG_WRITES */
- if (prev_iostatus != kIOReturnAborted)
- {
- prev_iostatus = iostatus;
- iostatus = 0;
- }
+ bytes = g.print_bytes;
+ iostatus = (*g.classdriver)->WritePipe(g.classdriver, (UInt8*)print_ptr, &bytes, 0);
}
- else
- prev_iostatus = iostatus;
if (iostatus || bytes < 0)
{
request = ippNewRequest(CUPS_GET_PRINTERS);
+ ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type",
+ CUPS_PRINTER_LOCAL);
+ ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type-mask",
+ CUPS_PRINTER_CLASS | CUPS_PRINTER_REMOTE |
+ CUPS_PRINTER_IMPLICIT);
+
/*
* Do the request and get back a response...
*/
AC_CONFIG_HEADER(config.h)
dnl Version number information...
-CUPS_VERSION="1.4rc1"
+CUPS_VERSION="1.4.0"
CUPS_REVISION=""
#if test -z "$CUPS_REVISION" -a -d .svn; then
# CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[[a-zA-Z]]*//g'`"
<dl class="code">
- <dt>APPLE_LANGUAGES</dt>
+ <dt>APPLE_LANGUAGE</dt>
<dd>The Apple language identifier associated with the job
(Mac OS X only).</dd>
current queue. Typically this is used to indicate persistent media,
ink, toner, and configuration conditions or errors on a printer.
<a href='#TABLE2'>Table 2</a> lists the standard state keywords -
- use vendor-prefixed ("com.acme.foo") keywords for custom states.</dd>
+ use vendor-prefixed ("com.acme.foo") keywords for custom states.
+
+ <blockquote><b>Note:</b>
+
+ <p>"STATE:" messages often provide visible alerts to the user. For example, on
+ Mac OS X setting a printer-state-reason value with an "-error" or "-warning"
+ suffix will cause the printer's dock item to bounce if the corresponding reason
+ is localized with a cupsIPPReason keyword in the printer's PPD file.</p>
+
+ </blockquote></dd>
<dt>WARNING: message</dt>
<dd>Sets the printer-state-message attribute and adds the specified
<p>Messages without one of these prefixes are treated as if they began with
the "DEBUG:" prefix string.</p>
-
<div class='table'><table width='80%' summary='Table 1: Standard marker-types Values'>
<caption>Table 1: <a name='TABLE1'>Standard marker-types Values</a></caption>
<thead>
#include "debug.h"
#include "globals.h"
#include <stdlib.h>
+#include <errno.h>
#ifdef HAVE_DNSSD
# include <dns_sd.h>
# include <poll.h>
fputs("STATE: +connecting-to-device\n", stderr);
fprintf(stderr, "DEBUG: Resolving \"%s\", regtype=\"%s\", "
"domain=\"local.\"...\n", hostname, regtype);
- _cupsLangPuts(stderr, _("INFO: Looking for printer...\n"));
}
uri = NULL;
hostname, regtype, "local.", resolve_callback,
&uribuf) == kDNSServiceErr_NoError)
{
- if (strcasecmp(domain, "local."))
+ int fds; /* Number of ready descriptors */
+ time_t timeout, /* Poll timeout */
+ start_time = time(NULL);/* Start time */
+
+ for (;;)
{
+ if (logit)
+ _cupsLangPuts(stderr, _("INFO: Looking for printer...\n"));
+
/*
- * Wait 2 seconds for a response to the local resolve; if nothing comes
- * in, do an additional domain resolution...
+ * For the first minute, wakeup every 2 seconds to emit a
+ * "looking for printer" message...
*/
+ timeout = (time(NULL) < (start_time + 60)) ? 2000 : -1;
+
polldata.fd = DNSServiceRefSockFD(ref);
polldata.events = POLLIN;
- if (poll(&polldata, 1, 2000) != 1)
+ fds = poll(&polldata, 1, timeout);
+
+ if (fds < 0)
+ {
+ if (errno != EINTR && errno != EAGAIN)
+ {
+ DEBUG_printf(("5_httpResolveURI: poll error: %s", strerror(errno)));
+ break;
+ }
+ }
+ else if (fds == 0)
{
/*
- * OK, send the domain name resolve...
+ * Wait 2 seconds for a response to the local resolve; if nothing
+ * comes in, do an additional domain resolution...
*/
- if (logit)
- fprintf(stderr, "DEBUG: Resolving \"%s\", regtype=\"%s\", "
- "domain=\"%s\"...\n", hostname, regtype, domain);
-
- domainref = ref;
- if (DNSServiceResolve(&domainref, kDNSServiceFlagsShareConnection, 0,
- hostname, regtype, domain, resolve_callback,
- &uribuf) == kDNSServiceErr_NoError)
- domainsent = 1;
+ if (domainsent == 0 && strcasecmp(domain, "local."))
+ {
+ if (logit)
+ fprintf(stderr,
+ "DEBUG: Resolving \"%s\", regtype=\"%s\", "
+ "domain=\"%s\"...\n", hostname, regtype, domain);
+
+ domainref = ref;
+ if (DNSServiceResolve(&domainref, kDNSServiceFlagsShareConnection, 0,
+ hostname, regtype, domain, resolve_callback,
+ &uribuf) == kDNSServiceErr_NoError)
+ domainsent = 1;
+ }
}
- }
-
- if (DNSServiceProcessResult(ref) == kDNSServiceErr_NoError)
- uri = resolved_uri;
+ else
+ {
+ if (DNSServiceProcessResult(ref) == kDNSServiceErr_NoError)
+ {
+ uri = resolved_uri;
+ break;
+ }
+ }
+ }
if (domainsent)
DNSServiceRefDeallocate(domainref);
<dl class="code">
- <dt>APPLE_LANGUAGES</dt>
+ <dt>APPLE_LANGUAGE</dt>
<dd>The Apple language identifier associated with the job
(Mac OS X only).</dd>
current queue. Typically this is used to indicate persistent media,
ink, toner, and configuration conditions or errors on a printer.
<a href='#TABLE2'>Table 2</a> lists the standard state keywords -
- use vendor-prefixed ("com.acme.foo") keywords for custom states.</dd>
+ use vendor-prefixed ("com.acme.foo") keywords for custom states.
+
+ <blockquote><b>Note:</b>
+
+ <p>"STATE:" messages often provide visible alerts to the user. For example, on
+ Mac OS X setting a printer-state-reason value with an "-error" or "-warning"
+ suffix will cause the printer's dock item to bounce if the corresponding reason
+ is localized with a cupsIPPReason keyword in the printer's PPD file.</p>
+
+ </blockquote></dd>
<dt>WARNING: message</dt>
<dd>Sets the printer-state-message attribute and adds the specified
<p>Messages without one of these prefixes are treated as if they began with
the "DEBUG:" prefix string.</p>
-
<div class='table'><table width='80%' summary='Table 1: Standard marker-types Values'>
<caption>Table 1: <a name='TABLE1'>Standard marker-types Values</a></caption>
<thead>
"Project-Id-Version: CUPS 1.4\n"
"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
"POT-Creation-Date: 2009-06-05 14:00-0700\n"
-"PO-Revision-Date: 2009-05-23 13:15+0100\n"
+"PO-Revision-Date: 2009-06-14 21:00+0100\n"
"Last-Translator: Juan Pablo González Riopedre <riopedre13@yahoo.es>\n"
"Language-Team: Spanish\n"
"MIME-Version: 1.0\n"
msgstr "ERROR: No se ha podido copiar el archivo PDF"
msgid "ERROR: Unable to create pipe"
-msgstr ""
+msgstr "ERROR: No se ha podido crear el canal (pipe)"
msgid "ERROR: Unable to create socket"
msgstr "ERROR: No se ha podido crear socket"
msgstr "ERROR: No se ha podido ejecutar el programa pdftops"
msgid "ERROR: Unable to execute pstops program"
-msgstr ""
+msgstr "ERROR: No se ha podido ejecutar el programa pstops"
#, c-format
msgid "ERROR: Unable to fork pictwpstops: %s\n"
#, c-format
msgid "ppdc: Option %s defined in two different groups on line %d of %s!\n"
msgstr ""
+"ppdc: Opción %s definida en dos diferentes grupos en la línea %d de %s.\n"
#, c-format
msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n"
msgstr ""
-"ppdc: La opción %s redefinida con un tipo diferente en la línea %d de %s.\n"
+"ppdc: Opción %s redefinida con un tipo diferente en la línea %d de %s.\n"
#, c-format
msgid "ppdc: Option constraint must *name on line %d of %s!\n"
msgid "variable-bindings uses indefinite length"
msgstr "variable-bindings usa una longitud indefinida"
-#~ msgid "600 DPI Grayscale"
-#~ msgstr "600 PPP escala de grises"
-
-#~ msgid "ERROR: pdftops filter crashed on signal %d!\n"
-#~ msgstr "ERROR: filtro pdftops se ha colgado con la señal %d.\n"
-
-#~ msgid "ERROR: pdftops filter exited with status %d!\n"
-#~ msgstr "ERROR: filtro pdftops se ha cerrado con el estado %d.\n"
-
-#~ msgid "Unknown printer error (%s)!"
-#~ msgstr "Error de impresión desconocido (%s)."
"%s", con, con->http.fd, filestats, filename, len,
status ? "(null)" : filename);
- if (!status)
- con->http.data_remaining = (int)filestats->st_size;
-
if (status)
return (NULL);
else
char command[1024], /* Command */
*argv[12], /* Command-line arguments */
*envp[MAX_ENV + 1], /* Environment variables */
- home[1024], /* HOME environment variable */
infofile[1024], /* Type-in information for cert */
seedfile[1024]; /* Random number seed file */
int envc, /* Number of environment variables */
cupsdLogMessage(CUPSD_LOG_INFO,
"Seeding the random number generator...");
- snprintf(home, sizeof(home), "HOME=%s", TempDir);
-
/*
* Write the seed file...
*/
argv[5] = NULL;
envc = cupsdLoadEnv(envp, MAX_ENV);
- envp[envc++] = home;
- envp[envc] = NULL;
+ envp[envc] = NULL;
if (!cupsdStartProcess(command, argv, envp, -1, -1, -1, -1, -1, 1, NULL,
NULL, &pid))
cupsdSetEnv("CUPS_SERVERROOT", ServerRoot);
cupsdSetEnv("CUPS_STATEDIR", StateDir);
cupsdSetEnv("DYLD_LIBRARY_PATH", NULL);
+ cupsdSetEnv("HOME", TempDir);
cupsdSetEnv("LD_ASSUME_KERNEL", NULL);
cupsdSetEnv("LD_LIBRARY_PATH", NULL);
cupsdSetEnv("LD_PRELOAD", NULL);
_("The printer or class was not found."));
return;
}
+ else if (dtype & CUPS_PRINTER_CLASS)
+ {
+ send_ipp_status(con, IPP_BAD_REQUEST,
+ _("Nested classes are not allowed!"));
+ return;
+ }
/*
* Add it to the class...
cupsdLogMessage(CUPSD_LOG_DEBUG2, "finalize_job(job=%p(%d))", job, job->id);
/*
- * Clear the "connecting-to-device" reason, which is only valid when a
- * printer is processing...
+ * Clear the "connecting-to-device" and "com.apple.print.recoverable-warning"
+ * reasons, which are only valid when a printer is processing...
*/
cupsdSetPrinterReasons(job->printer, "-connecting-to-device");
+ cupsdSetPrinterReasons(job->printer, "-com.apple.print.recoverable-warning");
/*
* Similarly, clear the "offline-report" reason for non-USB devices since we
cupsdStopPrinter(job->printer, 1);
return;
}
- else
+ else if (cupsdSetPrinterReasons(job->printer, message))
{
- cupsdSetPrinterReasons(job->printer, message);
cupsdAddPrinterHistory(job->printer);
event |= CUPSD_EVENT_PRINTER_STATE;
}
cupsFreeOptions(num_keywords, keywords);
}
-#ifdef __APPLE__
else if (!strncmp(message, "recoverable:", 12))
{
ptr = message + 12;
if (*ptr)
{
- cupsdSetPrinterReasons(job->printer,
- "+com.apple.print.recoverable-warning");
- cupsdSetString(&(job->printer->recoverable), ptr);
- cupsdAddPrinterHistory(job->printer);
- event |= CUPSD_EVENT_PRINTER_STATE;
+ if (cupsdSetPrinterReasons(job->printer,
+ "+com.apple.print.recoverable-warning") ||
+ !job->printer->recoverable ||
+ strcmp(job->printer->recoverable, ptr))
+ {
+ cupsdSetString(&(job->printer->recoverable), ptr);
+ cupsdAddPrinterHistory(job->printer);
+ event |= CUPSD_EVENT_PRINTER_STATE;
+ }
}
}
else if (!strncmp(message, "recovered:", 10))
{
- cupsdSetPrinterReasons(job->printer,
- "-com.apple.print.recoverable-warning");
-
ptr = message + 10;
while (isspace(*ptr & 255))
ptr ++;
- cupsdSetString(&(job->printer->recoverable), ptr);
- cupsdAddPrinterHistory(job->printer);
- event |= CUPSD_EVENT_PRINTER_STATE;
+ if (cupsdSetPrinterReasons(job->printer,
+ "-com.apple.print.recoverable-warning") ||
+ !job->printer->recoverable || strcmp(job->printer->recoverable, ptr))
+ {
+ cupsdSetString(&(job->printer->recoverable), ptr);
+ cupsdAddPrinterHistory(job->printer);
+ event |= CUPSD_EVENT_PRINTER_STATE;
+ }
}
-#endif /* __APPLE__ */
else
{
cupsdLogJob(job, loglevel, "%s", message);
</TR>
<TR>
<TH CLASS="label">Sharing:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}">
+<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
Share This Printer</TD>
</TR>
<TR>
</TR>
<TR>
<TH CLASS="label">Freigabe:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}">
+<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
Diesen Drucker freigeben</TD>
</TR>
<TR>
</TR>
<TR>
<TH CLASS="label">Freigabe:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}">
+<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
Diesen Drucker freigeben</TD>
</TR>
<TR>
</TR>
<TR>
<TH CLASS="label">Compartición:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}">
+<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
Compartir esta impresora</TD>
</TR>
<TR>
</TR>
<TR>
<TH CLASS="label">Compartida:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}">
+<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
Compartir esta impresora</TD>
</TR>
<TR>
</TR>
<TR>
<TH CLASS="label">共有:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}">
+<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
このプリンターを共有する</TD>
</TR>
<TR>
</TR>
<TR>
<TH CLASS="label">共有:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}">
+<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
このプリンターを共有する</TD>
</TR>
<TR>
</TR>
<TR>
<TH CLASS="label">Sharing:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}">
+<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
Share This Printer</TD>
</TR>
<TR>
</TR>
<TR>
<TH CLASS="label">Współdzielenie:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}">
+<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
Współdzielenie tej drukarki</TD>
</TR>
<TR>
</TR>
<TR>
<TH CLASS="label">Współdzielenie:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}">
+<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
Share This Printer</TD>
</TR>
<TR>
</TR>
<TR>
<TH CLASS="label">Совместный доступ:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}">
+<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
Разрешить совместный доступ к этому принтеру</TD>
</TR>
<TR>
</TR>
<TR>
<TH CLASS="label">Совместный доступ:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}">
+<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
Разрешить совместный доступ к этому принтеру</TD>
</TR>
<TR>