]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Merge changes from CUPS 1.4svn-r8252.
authormsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
Wed, 14 Jan 2009 19:55:19 +0000 (19:55 +0000)
committermsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
Wed, 14 Jan 2009 19:55:19 +0000 (19:55 +0000)
git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@1123 a1ca3aef-8c08-0410-bb20-df032aa958be

47 files changed:
CHANGES-1.3.txt
CHANGES.txt
backend/usb-libusb.c
cgi-bin/admin.c
cgi-bin/cgi.h
cgi-bin/html.c
cgi-bin/ipp-var.c
cgi-bin/libcupscgi.exp
config-scripts/cups-manpages.m4
cups/conflicts.c
cups/cups.h
cups/encode.c
cups/http-addr.c
cups/http-addrlist.c
cups/ipp.c
cups/libcups.exp
cups/mark.c
cups/testipp.c
cups/testppd.c
doc/Makefile
doc/help/api-array.html
doc/help/api-ppd.html
doc/help/ref-cupsd-conf.html.in
doc/help/sharing.html [new file with mode: 0644]
doc/help/spec-ipp.html
locale/cups_es.po
packaging/cups.list.in
packaging/cups.spec.in
ppdc/ppdc-driver.cxx
ppdc/ppdc-source.cxx
ppdc/ppdpo.cxx
scheduler/ipp.c
scheduler/job.c
scheduler/printers.c
scheduler/type.c
templates/es/add-rss-subscription.tmpl
templates/es/admin.tmpl
templates/es/error-op.tmpl
templates/es/error.tmpl
templates/es/printer-configured.tmpl
templates/es/printer.tmpl
templates/es/test-page.tmpl
test/4.1-requests.test
test/4.2-cups-printer-ops.test
test/get-printer-attributes-2.0.test [new file with mode: 0644]
test/ipptest.c
test/run-stp-tests.sh

index 42e447283e17e56e1b47b970219d5f36547f83a3..b57dbf20cbb6b809a2d2fa9b7b8a9acc24938ed9 100644 (file)
@@ -3,7 +3,11 @@ CHANGES-1.3.txt
 
 CHANGES IN CUPS V1.3.10
 
-       - Documentation fixes (STR #2994, STR #2995, STR #3008, STR #3056)
+       - Documentation fixes (STR #2994, STR #2995, STR #3008, STR #3056,
+         STR #3057)
+       - The scheduler did not always load MIME type rules correctly
+         (STR #3059)
+       - The test page did not format correctly on A4 paper (STR #3060)
        - The web interface sometimes incorrectly redirected users to
          127.0.0.1 (STR #3022)
        - cupsPrintFile*() did not send the document filename for single
index 4c35ec79d2d13164cdc4487b427d7edf06075f73..262c7e471b0a9fb3a25206b127d2022b3111429d 100644 (file)
@@ -1,9 +1,21 @@
-CHANGES.txt - 2009-01-09
+CHANGES.txt - 2009-01-14
 ------------------------
 
 CHANGES IN CUPS V1.4b3
 
+       - Documentation fixes (STR #3044, STR #3057)
+       - The libusb-based USB backend did not work.
+       - The scheduler did not set the printer-commands attribute correctly
+         for some PPDs.
+       - The ppdi utility did not work.
+       - The web interface no longer uses multi-part output with old or broken
+         web browsers (STR #3049)
        - CUPS now conforms to the draft IPP/2.0 and IPP/2.1 specification.
+       - Added a new cupsGetConflicts() API to get a list of conflicting
+         options.
+       - The PPD compiler didn't localize options or choices that did not
+         have associated translation text (STR #3045)
+       - Updated the Spanish localization (STR #3043)
        - Fixed build problems (STR #3040, STR #3047)
        - cupsResolveConflicts() did not resolve using the default option
          choice in some cases due to the mirror UIConstraints that are
index 6e6494c491cc02da59879c77ee5b50ec7ce3ba05..3cb61e395a1df8ea6809f03991a95ca4e17d5791 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Libusb interface code for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *
  *   These coded instructions, statements, and computer programs are the
  *   property of Apple Inc. and are protected by Federal copyright
@@ -156,13 +156,13 @@ print_device(const char *uri,             /* I - Device URI */
     * TODO: Add back-channel support, along with better write error handling.
     */
 
-    if (poll(pfds, 2, -1) > 0)
+    while (poll(pfds, 2, -1) > 0)
     {
       if (pfds[0].revents & POLLIN)
       {
        if ((bytes = read(print_fd, buffer, sizeof(buffer))) > 0)
        {
-         while (usb_bulk_write(printer->handle, printer->write_endp, buffer,
+         if (usb_bulk_write(printer->handle, printer->write_endp, buffer,
                                bytes, 45000) < 0)
          {
            _cupsLangPrintf(stderr,
@@ -174,7 +174,7 @@ print_device(const char *uri,               /* I - Device URI */
 
          tbytes += bytes;
        }
-       else if (bytes < 0 && errno != EAGAIN && errno != EINTR)
+       else if (bytes == 0 || (bytes < 0 && errno != EAGAIN && errno != EINTR))
          break;
       }
 
index 1601ef7c830657ca097a0b018d159c05dd8c522b..b0b3ae23e350cbc15a03fbb4e6cb70b7460488ea 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Administration CGI 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.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -261,7 +261,7 @@ choose_device_cb(
 
   current_device ++;
 
-  if (time(NULL) > last_device_time)
+  if (time(NULL) > last_device_time && cgiSupportsMultipart())
   {
    /*
     * Update the page...
@@ -921,7 +921,21 @@ do_am_printer(http_t *http,                /* I - HTTP connection */
     if (cupsGetDevices(http, 30, CUPS_INCLUDE_ALL, CUPS_EXCLUDE_NONE,
                        (cups_device_cb_t)choose_device_cb,
                       (void *)title) == IPP_OK)
+    {
       fputs("DEBUG: Got device list!\n", stderr);
+
+      if (!cgiSupportsMultipart())
+      {
+       /*
+        * Non-modern browsers that don't support multi-part documents get
+       * everything at the end...
+       */
+
+       cgiStartHTML(title);
+       cgiCopyTemplateLang("choose-device.tmpl");
+       cgiEndHTML();
+      }
+    }
     else
     {
       fprintf(stderr,
index 66de5110a6dd05ceda1a74c3b904f229700832dd..5546d7ac5c12c3c3e7973987c91875f3ea45af22 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   CGI support library definitions.
  *
- *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *   Copyright 1997-2006 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -95,6 +95,7 @@ extern void           cgiShowIPPError(const char *message);
 extern void            cgiShowJobs(http_t *http, const char *dest);
 extern void            cgiStartHTML(const char *title);
 extern void            cgiStartMultipart(void);
+extern int             cgiSupportsMultipart(void);
 extern const char      *cgiText(const char *message);
 
 #endif /* !_CUPS_CGI_H_ */
index e992458688db23e503d83ca1c2999a97482fc2f9..2db9bdd25344daaa07177dc9216e71cb6f1a117d 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   HTML support functions for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *   Copyright 1997-2006 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
  *
  * Contents:
  *
- *   cgiEndHTML()        - End a HTML page.
- *   cgiEndMultipart()   - End the delivery of a multipart web page.
- *   cgiFormEncode()     - Encode a string as a form variable...
- *   cgiStartHTML()      - Start a HTML page.
- *   cgiStartMultipart() - Start a multipart delivery of a web page...
- *   cgi_null_passwd()   - Return a NULL password for authentication.
+ *   cgiEndHTML()           - End a HTML page.
+ *   cgiEndMultipart()      - End the delivery of a multipart web page.
+ *   cgiFormEncode()        - Encode a string as a form variable.
+ *   cgiStartHTML()         - Start a HTML page.
+ *   cgiStartMultipart()    - Start a multipart delivery of a web page.
+ *   cgiSupportsMultipart() - Does the browser support multi-part documents?
+ *   cgi_null_passwd()      - Return a NULL password for authentication.
  */
 
 /*
@@ -72,7 +73,7 @@ cgiEndMultipart(void)
 
 
 /*
- * 'cgiFormEncode()' - Encode a string as a form variable...
+ * 'cgiFormEncode()' - Encode a string as a form variable.
  */
 
 char *                                 /* O - Destination string */
@@ -183,7 +184,7 @@ cgiStartHTML(const char *title)             /* I - Title of page */
 
 
 /*
- * 'cgiStartMultipart()' - Start a multipart delivery of a web page...
+ * 'cgiStartMultipart()' - Start a multipart delivery of a web page.
  */
 
 void
@@ -195,6 +196,41 @@ cgiStartMultipart(void)
 }
 
 
+/*
+ * 'cgiSupportsMultipart()' - Does the browser support multi-part documents?
+ */
+
+int                                    /* O - 1 if multi-part supported, 0 otherwise */
+cgiSupportsMultipart(void)
+{
+  const char   *user_agent;            /* User-Agent string */
+  static int   supports_multipart = -1;/* Cached value */
+
+
+  if (supports_multipart < 0)
+  {
+   /*
+    * CUPS STR #3049: Apparently some browsers don't support multi-part
+    * documents, which makes them useless for many web sites.  Rather than
+    * abandoning those users, we'll offer a degraded single-part mode...
+    *
+    * Currently we know that anything based on Gecko, MSIE, and Safari all
+    * work.  We'll add more as they are reported/tested.
+    */
+
+    if ((user_agent = getenv("HTTP_USER_AGENT")) != NULL &&
+        (strstr(user_agent, " Gecko/") != NULL ||
+        strstr(user_agent, " MSIE ") != NULL ||
+        strstr(user_agent, " Safari/") != NULL))
+      supports_multipart = 1;
+    else
+      supports_multipart = 0;
+  }
+
+  return (supports_multipart);
+}
+
+
 /*
  * 'cgi_null_passwd()' - Return a NULL password for authentication.
  */
index 90c90cf74a8daf0249aef38a0a3b74e7b7669507..842268b672daf471fd5923c16fdddf49342a3150 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   CGI <-> IPP variable routines 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.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -548,11 +548,14 @@ cgiPrintCommand(http_t     *http, /* I - Connection to server */
   * Show status...
   */
 
-  cgiStartMultipart();
-  cgiStartHTML(title);
-  cgiCopyTemplateLang("command.tmpl");
-  cgiEndHTML();
-  fflush(stdout);
+  if (cgiSupportsMultipart())
+  {
+    cgiStartMultipart();
+    cgiStartHTML(title);
+    cgiCopyTemplateLang("command.tmpl");
+    cgiEndHTML();
+    fflush(stdout);
+  }
 
  /*
   * Send the command file job...
@@ -574,7 +577,9 @@ cgiPrintCommand(http_t     *http,   /* I - Connection to server */
     cgiStartHTML(title);
     cgiCopyTemplateLang("error.tmpl");
     cgiEndHTML();
-    cgiEndMultipart();
+
+    if (cgiSupportsMultipart())
+      cgiEndMultipart();
     return;
   }
 
@@ -592,7 +597,9 @@ cgiPrintCommand(http_t     *http,   /* I - Connection to server */
     cgiStartHTML(title);
     cgiCopyTemplateLang("error.tmpl");
     cgiEndHTML();
-    cgiEndMultipart();
+
+    if (cgiSupportsMultipart())
+      cgiEndMultipart();
 
     cupsCancelJob(dest, job_id);
     return;
@@ -602,44 +609,47 @@ cgiPrintCommand(http_t     *http, /* I - Connection to server */
   * Wait for the job to complete...
   */
 
-  for (;;)
+  if (cgiSupportsMultipart())
   {
-   /*
-    * Get the current job state...
-    */
+    for (;;)
+    {
+     /*
+      * Get the current job state...
+      */
 
-    snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id);
-    request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES);
-    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri",
-                NULL, uri);
-    if (user)
-      ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
-                  "requesting-user-name", NULL, user);
-    ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
-                 "requested-attributes", 2, NULL, job_attrs);
+      snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id);
+      request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES);
+      ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri",
+                  NULL, uri);
+      if (user)
+       ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
+                    "requesting-user-name", NULL, user);
+      ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
+                   "requested-attributes", 2, NULL, job_attrs);
 
-    if ((response = cupsDoRequest(http, request, "/")) != NULL)
-      cgiSetIPPVars(response, NULL, NULL, NULL, 0);
+      if ((response = cupsDoRequest(http, request, "/")) != NULL)
+       cgiSetIPPVars(response, NULL, NULL, NULL, 0);
 
-    attr = ippFindAttribute(response, "job-state", IPP_TAG_ENUM);
-    if (!attr || attr->values[0].integer >= IPP_JOB_STOPPED)
-    {
-      ippDelete(response);
-      break;
-    }
+      attr = ippFindAttribute(response, "job-state", IPP_TAG_ENUM);
+      if (!attr || attr->values[0].integer >= IPP_JOB_STOPPED)
+      {
+       ippDelete(response);
+       break;
+      }
 
-   /*
-    * Job not complete, so update the status...
-    */
+     /*
+      * Job not complete, so update the status...
+      */
 
-    ippDelete(response);
+      ippDelete(response);
 
-    cgiStartHTML(title);
-    cgiCopyTemplateLang("command.tmpl");
-    cgiEndHTML();
-    fflush(stdout);
+      cgiStartHTML(title);
+      cgiCopyTemplateLang("command.tmpl");
+      cgiEndHTML();
+      fflush(stdout);
 
-    sleep(5);
+      sleep(5);
+    }
   }
 
  /*
@@ -655,7 +665,9 @@ cgiPrintCommand(http_t     *http,   /* I - Connection to server */
   cgiStartHTML(title);
   cgiCopyTemplateLang("command.tmpl");
   cgiEndHTML();
-  cgiEndMultipart();
+
+  if (cgiSupportsMultipart())
+    cgiEndMultipart();
 }
 
 
index efe0ac7e396d827fdfe0c5538c17be7e76a13d5b..73e309e965a6a60568ce81a340210e2aaf3086e7 100644 (file)
@@ -30,6 +30,7 @@ _cgiShowIPPError
 _cgiShowJobs
 _cgiStartHTML
 _cgiStartMultipart
+_cgiSupportsMultipart
 _cgiText
 _helpDeleteIndex
 _helpFindNode
index 13881c5bfd93f3340db976d7cc8e4618ccb7de14..44d31369ba1b13dc0b3947e18a7d1fdc4e57cc92 100644 (file)
@@ -51,14 +51,6 @@ AC_SUBST(PMANDIR)
 
 dnl Setup manpage extensions...
 case "$uname" in
-       *BSD* | Darwin*)
-               # *BSD
-               MAN1EXT=1
-               MAN5EXT=5
-               MAN7EXT=7
-               MAN8EXT=8
-               MAN8DIR=8
-               ;;
        IRIX*)
                # SGI IRIX
                MAN1EXT=1
@@ -75,8 +67,8 @@ case "$uname" in
                MAN8EXT=1m
                MAN8DIR=1m
                ;;
-       Linux* | GNU*)
-               # Linux and GNU Hurd
+       Linux* | GNU* | Darwin*)
+               # Linux, GNU Hurd, and Mac OS X
                MAN1EXT=1.gz
                MAN5EXT=5.gz
                MAN7EXT=7.gz
index a99810cd90f1f38e855b68e422626585f926457f..6376f69ef8b2732c517d0c5f908614214c7a97aa 100644 (file)
@@ -18,6 +18,8 @@
  *
  * Contents:
  *
+ *   cupsGetConflicts()       - Get a list of conflicting options in a marked
+ *                              PPD.
  *   cupsResolveConflicts()   - Resolve conflicts in a marked PPD.
  *   ppdConflicts()           - Check to see if there are any conflicts among
  *                              the marked option choices.
@@ -65,6 +67,74 @@ static cups_array_t  *ppd_test_constraints(ppd_file_t *ppd,
                                              int which);
 
 
+/*
+ * 'cupsGetConflicts()' - Get a list of conflicting options in a marked PPD.
+ *
+ * This function gets a list of options that would conflict if "option" and
+ * "choice" were marked in the PPD.  You would typically call this function
+ * after marking the currently selected options in the PPD in order to
+ * determine whether a new option selection would cause a conflict.
+ *
+ * The number of conflicting options are returned with "options" pointing to
+ * the conflicting options.  The returned option array must be freed using
+ * @link cupsFreeOptions@.
+ *
+ * @since CUPS 1.4@
+ */
+
+int                                    /* O - Number of conflicting options */
+cupsGetConflicts(
+    ppd_file_t    *ppd,                        /* I - PPD file */
+    const char    *option,             /* I - Option to test */
+    const char    *choice,             /* I - Choice to test */
+    cups_option_t **options)           /* O - Conflicting options */
+{
+  int                  i,              /* Looping var */
+                       num_options;    /* Number of conflicting options */
+  cups_array_t         *active;        /* Active conflicts */
+  _ppd_cups_uiconsts_t *c;             /* Current constraints */
+  _ppd_cups_uiconst_t  *cptr;          /* Current constraint */
+
+
+ /*
+  * Range check input...
+  */
+
+  if (options)
+    *options = NULL;
+
+  if (!ppd || !option || !choice || !options)
+    return (0);
+
+ /*
+  * Test for conflicts...
+  */
+
+  active = ppd_test_constraints(ppd, option, choice, 0, NULL,
+                                _PPD_ALL_CONSTRAINTS);
+
+ /*
+  * Loop through all of the UI constraints and add any options that conflict...
+  */
+
+  for (num_options = 0, c = (_ppd_cups_uiconsts_t *)cupsArrayFirst(active);
+       c;
+       c = (_ppd_cups_uiconsts_t *)cupsArrayNext(active))
+  {
+    for (i = c->num_constraints, cptr = c->constraints;
+         i > 0;
+        i --, cptr ++)
+      if (strcasecmp(cptr->option->keyword, option))
+        num_options = cupsAddOption(cptr->option->keyword, cptr->choice->choice,
+                                   num_options, options);
+  }
+
+  cupsArrayDelete(active);
+
+  return (num_options);
+}
+
+
 /*
  * 'cupsResolveConflicts()' - Resolve conflicts in a marked PPD.
  *
index 6d3ca29a468859293213ad9b416f333a8fd01bfb..153ceb4999d095968450a44ed16f5ba67760b423 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   API definitions 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.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -281,6 +281,10 @@ extern int         cupsCreateJob(http_t *http, const char *name,
                                      cups_option_t *options) _CUPS_API_1_4;
 extern ipp_status_t    cupsFinishDocument(http_t *http,
                                           const char *name) _CUPS_API_1_4;
+extern int             cupsGetConflicts(ppd_file_t *ppd, const char *option,
+                                        const char *choice,
+                                        cups_option_t **options)
+                                            _CUPS_API_1_4;
 extern ipp_status_t    cupsGetDevices(http_t *http, int timeout,
                                       const char *exclude_schemes,
                                       const char *include_schemes,
index 7d9198ea7e2e32b310de645bb4b4fd7a7915271e..16762aa0c4cf27b0c8219a51549806e849abe1de 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Option encoding routines 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.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -86,6 +86,13 @@ static const _ipp_option_t ipp_options[] =
   { 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 },
+  { 0, "media-col-default",    IPP_TAG_BEGIN_COLLECTION, IPP_TAG_PRINTER },
+  { 0, "media-color",          IPP_TAG_KEYWORD,        IPP_TAG_JOB },
+  { 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, "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 },
@@ -152,7 +159,9 @@ static const _ipp_option_t ipp_options[] =
   { 0, "sides",                        IPP_TAG_KEYWORD,        IPP_TAG_JOB },
   { 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, "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 }
 };
 
 
@@ -215,6 +224,9 @@ cupsEncodeOptions2(
   ipp_attribute_t *attr;               /* IPP attribute */
   ipp_tag_t    value_tag;              /* IPP value tag */
   cups_option_t        *option;                /* Current option */
+  ipp_t                *collection;            /* Collection value */
+  int          num_cols;               /* Number of collection values */
+  cups_option_t        *cols;                  /* Collection values */
 
 
   DEBUG_printf(("cupsEncodeOptions2(ipp=%p, num_options=%d, options=%p, "
@@ -369,6 +381,7 @@ cupsEncodeOptions2(
        */
 
        DEBUG_puts("cupsEncodeOptions2: Ran out of memory for value copy!");
+       ippDeleteAttribute(ipp, attr);
        return;
       }
 
@@ -534,6 +547,28 @@ cupsEncodeOptions2(
                          "\"%s\"...\n", (char *)attr->values[j].unknown.data));
             break;
 
+        case IPP_TAG_BEGIN_COLLECTION :
+          /*
+           * Collection value
+           */
+
+           num_cols   = cupsParseOptions(val, 0, &cols);
+           if ((collection = ippNew()) == NULL)
+           {
+             cupsFreeOptions(num_cols, cols);
+
+             if (copy)
+               free(copy);
+
+             ippDeleteAttribute(ipp, attr);
+             return;
+            }
+
+           attr->values[j].collection = collection;
+           cupsEncodeOptions2(collection, num_cols, cols, IPP_TAG_JOB);
+            cupsFreeOptions(num_cols, cols);
+           break;
+
        default :
            if ((attr->values[j].string.text = _cupsStrAlloc(val)) == NULL)
            {
@@ -542,6 +577,11 @@ cupsEncodeOptions2(
              */
 
              DEBUG_puts("cupsEncodeOptions2: Ran out of memory for string!");
+
+             if (copy)
+               free(copy);
+
+             ippDeleteAttribute(ipp, attr);
              return;
            }
 
index 9a39292eb08343473196f8f5b06df3043f1ef54c..52e828525c86ab694bf59e8bc86d5e652535405f 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   HTTP address routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -207,6 +207,16 @@ httpAddrLookup(
   }
 #endif /* AF_LOCAL */
 
+ /*
+  * Optimize lookups for localhost/loopback addresses...
+  */
+
+  if (httpAddrLocalhost(addr))
+  {
+    strlcpy(name, "localhost", namelen);
+    return (name);
+  }
+
 #ifdef HAVE_RES_INIT
  /*
   * STR #2920: Initialize resolver after failure in cups-polld
index b44acc6368cb5bcb44f4f18d494cefe3402755fb..a5b2e1f5884117e0351a14a896bbfc37afaf41d9 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   HTTP address list routines 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
@@ -265,6 +265,7 @@ httpAddrGetList(const char *hostname,       /* I - Hostname, IP address, or NULL for p
   }
   else
 #endif /* AF_LOCAL */
+  if (!hostname || strcasecmp(hostname, "localhost"))
   {
 #ifdef HAVE_GETADDRINFO
     struct addrinfo    hints,          /* Address lookup hints */
@@ -501,7 +502,7 @@ httpAddrGetList(const char *hostname,       /* I - Hostname, IP address, or NULL for p
   * Detect some common errors and handle them sanely...
   */
 
-  if (!addr && (!hostname || !strcmp(hostname, "localhost")))
+  if (!addr && (!hostname || !strcasecmp(hostname, "localhost")))
   {
     struct servent     *port;          /* Port number for service */
     int                        portnum;        /* Port number */
@@ -530,7 +531,7 @@ httpAddrGetList(const char *hostname,       /* I - Hostname, IP address, or NULL for p
     else
       return (NULL);
 
-    if (hostname && !strcmp(hostname, "localhost"))
+    if (hostname && !strcasecmp(hostname, "localhost"))
     {
      /*
       * Unfortunately, some users ignore all of the warnings in the
index de0f12c400134d5a8ce8d547889932668af9f05d..f8e7dafa6136ce6580471d28fe4be392f5e85d59 100644 (file)
@@ -1108,18 +1108,6 @@ ippReadIO(void       *src,               /* I - Data source */
            return (IPP_ERROR);
          }
 
-        /*
-          * Verify the major version number...
-         */
-
-         if (buffer[0] != 1 && buffer[0] != 2)
-         {
-           DEBUG_printf(("ippReadIO: version number (%d.%d) is bad.\n",
-                         buffer[0], buffer[1]));
-           ipp_buffer_release(buffer);
-           return (IPP_ERROR);
-         }
-
         /*
           * Then copy the request header over...
          */
index 32803d6b6f5c45ea32b3e3524b19d6e8d47891ee..74914ae44acd48d1c659aed4997e6601814c635b 100644 (file)
@@ -140,6 +140,7 @@ _cupsFreeDests
 _cupsFreeJobs
 _cupsFreeOptions
 _cupsGetClasses
+_cupsGetConflicts
 _cupsGetDefault
 _cupsGetDefault2
 _cupsGetDest
index 4466ec1ce936ebae8f66133cfb413008a9142003..b2cef1f2d522ece1b1099ee64bf52e9352758889 100644 (file)
@@ -79,10 +79,12 @@ cupsMarkOptions(
     cups_option_t *options)            /* I - Options */
 {
   int          i, j, k;                /* Looping vars */
-  char         *val,                   /* Pointer into value */
-               *ptr,                   /* Pointer into string */
+  char         *ptr,                   /* Pointer into string */
                s[255];                 /* Temporary string */
-  const char   *page_size;             /* PageSize option */
+  const char   *val,                   /* Pointer into value */
+               *media,                 /* media option */
+               *media_col,             /* media-col option */
+               *page_size;             /* PageSize option */
   cups_option_t        *optptr;                /* Current option */
   ppd_option_t *option;                /* PPD option */
   ppd_attr_t   *attr;                  /* PPD attribute */
@@ -123,61 +125,124 @@ cupsMarkOptions(
   debug_marked(ppd, "Before...");
 
  /*
-  * Mark options...
+  * Do special handling for media, media-col, and PageSize...
   */
 
-  for (i = num_options, optptr = options; i > 0; i --, optptr ++)
-    if (!strcasecmp(optptr->name, "media"))
+  media     = cupsGetOption("media", num_options, options);
+  media_col = cupsGetOption("media-col", num_options, options);
+  page_size = cupsGetOption("PageSize", num_options, options);
+
+  if (media_col && (!page_size || !page_size[0]))
+  {
+   /*
+    * Pull out the corresponding media size from the media-col value...
+    */
+
+    int                        num_media_cols, /* Number of media-col values */
+                       num_media_sizes;/* Number of media-size values */
+    cups_option_t      *media_cols,    /* media-col values */
+                       *media_sizes;   /* media-size values */
+
+
+    num_media_cols = cupsParseOptions(media_col, 0, &media_cols);
+
+    if ((val = cupsGetOption("media-key", num_media_cols, media_cols)) != NULL)
+      media = val;
+    else if ((val = cupsGetOption("media-size", num_media_cols,
+                                  media_cols)) != NULL)
     {
      /*
-      * Loop through the option string, separating it at commas and
-      * marking each individual option as long as the corresponding
-      * PPD option (PageSize, InputSlot, etc.) is not also set.
-      *
-      * For PageSize, we also check for an empty option value since
-      * some versions of MacOS X use it to specify auto-selection
-      * of the media based solely on the size.
+      * Lookup by dimensions...
       */
 
-      page_size = cupsGetOption("PageSize", num_options, options);
+      double           width,          /* Width in points */
+                       length;         /* Length in points */
+      struct lconv     *loc;           /* Locale data */
+      _cups_pwg_media_t        *pwgmedia;      /* PWG media name */
 
-      for (val = optptr->value; *val;)
-      {
-       /*
-        * Extract the sub-option from the string...
-       */
 
-        for (ptr = s; *val && *val != ',' && (ptr - s) < (sizeof(s) - 1);)
-         *ptr++ = *val++;
-       *ptr++ = '\0';
+      num_media_sizes = cupsParseOptions(val, 0, &media_sizes);
+      loc             = localeconv();
 
-       if (*val == ',')
-         val ++;
+      if ((val = cupsGetOption("x-dimension", num_media_sizes,
+                               media_sizes)) != NULL)
+        width = _cupsStrScand(val, NULL, loc) * 2540.0 / 72.0;
+      else
+        width = 0.0;
 
-       /*
-        * Mark it...
-       */
+      if ((val = cupsGetOption("y-dimension", num_media_sizes,
+                               media_sizes)) != NULL)
+        length = _cupsStrScand(val, NULL, loc) * 2540.0 / 72.0;
+      else
+        length = 0.0;
 
-        if (!page_size || !page_size[0])
-         ppd_mark_size(ppd, s);
+      if ((pwgmedia = _cupsPWGMediaBySize(width, length)) != NULL)
+        media = pwgmedia->pwg;
 
-        if (cupsGetOption("InputSlot", num_options, options) == NULL)
-         ppd_mark_option(ppd, "InputSlot", s);
+      cupsFreeOptions(num_media_sizes, media_sizes);
+    }
 
-        if (cupsGetOption("MediaType", num_options, options) == NULL)
-         ppd_mark_option(ppd, "MediaType", s);
+    cupsFreeOptions(num_media_cols, media_cols);
+  }
 
-        if (cupsGetOption("EFMediaType", num_options, options) == NULL)
-         ppd_mark_option(ppd, "EFMediaType", s);               /* EFI */
+  if (media)
+  {
+   /*
+    * Loop through the option string, separating it at commas and
+    * marking each individual option as long as the corresponding
+    * PPD option (PageSize, InputSlot, etc.) is not also set.
+    *
+    * For PageSize, we also check for an empty option value since
+    * some versions of MacOS X use it to specify auto-selection
+    * of the media based solely on the size.
+    */
 
-        if (cupsGetOption("EFMediaQualityMode", num_options, options) == NULL)
-         ppd_mark_option(ppd, "EFMediaQualityMode", s);        /* EFI */
+    for (val = media; *val;)
+    {
+     /*
+      * Extract the sub-option from the string...
+      */
 
-       if (!strcasecmp(s, "manual") &&
-           !cupsGetOption("ManualFeed", num_options, options))
-          ppd_mark_option(ppd, "ManualFeed", "True");
-      }
+      for (ptr = s; *val && *val != ',' && (ptr - s) < (sizeof(s) - 1);)
+       *ptr++ = *val++;
+      *ptr++ = '\0';
+
+      if (*val == ',')
+       val ++;
+
+     /*
+      * Mark it...
+      */
+
+      if (!page_size || !page_size[0])
+       ppd_mark_size(ppd, s);
+
+      if (cupsGetOption("InputSlot", num_options, options) == NULL)
+       ppd_mark_option(ppd, "InputSlot", s);
+
+      if (cupsGetOption("MediaType", num_options, options) == NULL)
+       ppd_mark_option(ppd, "MediaType", s);
+
+      if (cupsGetOption("EFMediaType", num_options, options) == NULL)
+       ppd_mark_option(ppd, "EFMediaType", s);         /* EFI */
+
+      if (cupsGetOption("EFMediaQualityMode", num_options, options) == NULL)
+       ppd_mark_option(ppd, "EFMediaQualityMode", s);  /* EFI */
+
+      if (!strcasecmp(s, "manual") &&
+         !cupsGetOption("ManualFeed", num_options, options))
+       ppd_mark_option(ppd, "ManualFeed", "True");
     }
+  }
+
+ /*
+  * Mark other options...
+  */
+
+  for (i = num_options, optptr = options; i > 0; i --, optptr ++)
+    if (!strcasecmp(optptr->name, "media") ||
+        !strcasecmp(optptr->name, "media-col"))
+      continue;
     else if (!strcasecmp(optptr->name, "sides"))
     {
       for (j = 0;
index aa119ace90176d30b3ce1219f3b1aa837ef9c3ef..972c6474dbfcf3f190e257875af4ef667fff38a8 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   IPP test program for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *   Copyright 1997-2005 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -488,7 +488,7 @@ print_attributes(ipp_t *ipp,                /* I - IPP request */
 
   for (group = IPP_TAG_ZERO, attr = ipp->attrs; attr; attr = attr->next)
   {
-    if ((attr->group_tag == IPP_TAG_ZERO && indent <= 8) || !attr->name)
+    if (!attr->name && indent == 4)
     {
       group = IPP_TAG_ZERO;
       putchar('\n');
@@ -499,17 +499,10 @@ print_attributes(ipp_t *ipp,              /* I - IPP request */
     {
       group = attr->group_tag;
 
-      putchar('\n');
-      for (i = 4; i < indent; i ++)
-        putchar(' ');
-
-      printf("%s:\n\n", tags[group]);
+      printf("\n%*s%s:\n\n", indent - 4, "", tags[group]);
     }
 
-    for (i = 0; i < indent; i ++)
-      putchar(' ');
-
-    printf("%s (", attr->name);
+    printf("%*s%s (", indent, "", attr->name ? attr->name : "(null)");
     if (attr->num_values > 1)
       printf("1setOf ");
     printf("%s):", tags[attr->value_tag]);
index 97337ccac53c0e0ebded3744ddb4fa811adaf460..44c43b55b7a1651f6e02b2d146d03e03c83af55b 100644 (file)
@@ -113,7 +113,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
   int          conflicts;              /* Number of conflicts */
   char         *s;                     /* String */
   char         buffer[8192];           /* String buffer */
-  const char   *text;                  /* Localized text */
+  const char   *text,                  /* Localized text */
+               *val;                   /* Option value */
   int          num_options;            /* Number of options */
   cups_option_t        *options;               /* Options */
   ppd_size_t   minsize,                /* Minimum size */
@@ -265,8 +266,26 @@ main(int  argc,                            /* I - Number of command-line arguments */
     * Test constraints...
     */
 
-    fputs("ppdConflicts(): ", stdout);
+    fputs("cupsGetConflicts(InputSlot=Envelope): ", stdout);
     ppdMarkOption(ppd, "PageSize", "Letter");
+
+    num_options = cupsGetConflicts(ppd, "InputSlot", "Envelope", &options);
+    if (num_options != 2 ||
+        (val = cupsGetOption("PageRegion", num_options, options)) == NULL ||
+       strcasecmp(val, "Letter") ||
+       (val = cupsGetOption("PageSize", num_options, options)) == NULL ||
+       strcasecmp(val, "Letter"))
+    {
+      printf("FAIL (%d options:", num_options);
+      for (i = 0; i < num_options; i ++)
+        printf(" %s=%s", options[i].name, options[i].value);
+      puts(")");
+      status ++;
+    }
+    else
+      puts("PASS");
+
+    fputs("ppdConflicts(): ", stdout);
     ppdMarkOption(ppd, "InputSlot", "Envelope");
 
     if ((conflicts = ppdConflicts(ppd)) == 2)
index bf8bca0d1bc178ddeb9461ece1498a7c8e851fe9..0c894afaaeb43f02c5b4d037b0f78cb26d6bec91 100644 (file)
@@ -104,6 +104,7 @@ HELPFILES   =       \
                        help/ref-snmp-conf.html \
                        help/ref-subscriptions-conf.html \
                        help/security.html \
+                       help/sharing.html \
                        help/spec-banner.html \
                        help/spec-browsing.html \
                        help/spec-cmp.html \
index f7373e3b690eb57175ee601c3fed3a591977fd19..1916f3d59527444dee5f90780312cb1569d2ea3f 100644 (file)
@@ -388,8 +388,8 @@ div.contents ul.subcontents li {
 <li><a href="#cupsArrayNext" title="Get the next element in the array.">cupsArrayNext</a></li>
 <li><a href="#cupsArrayPrev" title="Get the previous element in the array.">cupsArrayPrev</a></li>
 <li><a href="#cupsArrayRemove" title="Remove an element from the array.">cupsArrayRemove</a></li>
-<li><a href="#cupsArrayRestore" title="Reset the current element to the last <a href="#cupsArraySave"><code>cupsArraySave</code></a>.">cupsArrayRestore</a></li>
-<li><a href="#cupsArraySave" title="Mark the current element for a later <a href="#cupsArrayRestore"><code>cupsArrayRestore</code></a>.">cupsArraySave</a></li>
+<li><a href="#cupsArrayRestore" title="Reset the current element to the last cupsArraySave.">cupsArrayRestore</a></li>
+<li><a href="#cupsArraySave" title="Mark the current element for a later cupsArrayRestore.">cupsArraySave</a></li>
 <li><a href="#cupsArrayUserData" title="Return the user data for an array.">cupsArrayUserData</a></li>
 </ul></li>
 <li><a href="#TYPES">Data Types</a><ul class="code">
index 3da1d965ec0754232b9a1a61b731d588f53a6098..98b81f3e4002f1391a0bce4a863a433a8c346fb5 100644 (file)
@@ -375,6 +375,7 @@ div.contents ul.subcontents li {
 <li><a href="#ATTRIBUTES">Attributes</a></li>
 </ul></li>
 <li><a href="#FUNCTIONS">Functions</a><ul class="code">
+<li><a href="#cupsGetConflicts" title="Get a list of conflicting options in a marked PPD.">cupsGetConflicts</a></li>
 <li><a href="#cupsMarkOptions" title="Mark command-line options in a PPD file.">cupsMarkOptions</a></li>
 <li><a href="#cupsResolveConflicts" title="Resolve conflicts in a marked PPD.">cupsResolveConflicts</a></li>
 <li><a href="#ppdClose" title="Free all memory used by the PPD file.">ppdClose</a></li>
@@ -689,6 +690,39 @@ for (attr = <a href="#ppdFindAttr">ppdFindAttr</a>(ppd, "Product", NULL);
   puts(attr->value);
 </pre>
 <h2 class="title"><a name="FUNCTIONS">Functions</a></h2>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.4&nbsp;</span><a name="cupsGetConflicts">cupsGetConflicts</a></h3>
+<p class="description">Get a list of conflicting options in a marked PPD.</p>
+<p class="code">
+int cupsGetConflicts (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ppd_file_t">ppd_file_t</a> *ppd,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *option,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *choice,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;cups_option_t **options<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>ppd</dt>
+<dd class="description">PPD file</dd>
+<dt>option</dt>
+<dd class="description">Option to test</dd>
+<dt>choice</dt>
+<dd class="description">Choice to test</dd>
+<dt>options</dt>
+<dd class="description">Conflicting options</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of conflicting options</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function gets a list of options that would conflict if &quot;option&quot; and
+&quot;choice&quot; were marked in the PPD.  You would typically call this function
+after marking the currently selected options in the PPD in order to
+determine whether a new option selection would cause a conflict.<br>
+<br>
+The number of conflicting options are returned with &quot;options&quot; pointing to
+the conflicting options.  The returned option array must be freed using
+<a href="#cupsFreeOptions"><code>cupsFreeOptions</code></a>.
+
+</p>
 <h3 class="function"><a name="cupsMarkOptions">cupsMarkOptions</a></h3>
 <p class="description">Mark command-line options in a PPD file.</p>
 <p class="code">
index 33b669349102ca7f39f4a8cbfcc3273a24a2ab29..6c51b9d99d4c1c011f88b85a2dabe1e3df00482f 100644 (file)
@@ -559,7 +559,9 @@ BrowseLocalProtocols none
 BrowseLocalProtocols cups
 BrowseLocalProtocols dnssd
 BrowseLocalProtocols ldap
+BrowseLocalProtocols lpd
 BrowseLocalProtocols slp
+BrowseLocalProtocols smb
 BrowseLocalProtocols cups dnssd
 </PRE>
 
@@ -568,7 +570,7 @@ BrowseLocalProtocols cups dnssd
 <P>The <CODE>BrowseLocalProtocols</CODE> directive specifies the
 protocols to use when advertising local shared printers on the
 network. Multiple protocols can be specified by separating them
-with spaces. The default is <CODE>@CUPS_BROWSE_REMOTE_PROTOCOLS@</CODE>.</P>
+with spaces. The default is "<CODE>@CUPS_BROWSE_LOCAL_PROTOCOLS@</CODE>".</P>
 
 
 <H2 CLASS="title"><A NAME="BrowseOrder">BrowseOrder</A></H2>
@@ -652,7 +654,9 @@ BrowseProtocols none
 BrowseProtocols cups
 BrowseProtocols dnssd
 BrowseProtocols ldap
+BrowseProtocols lpd
 BrowseProtocols slp
+BrowseProtocols smb
 BrowseProtocols cups dnssd
 </PRE>
 
@@ -662,9 +666,9 @@ BrowseProtocols cups dnssd
 protocols to use when showing and advertising shared printers on
 the local network. Multiple protocols can be specified by
 separating them with spaces. The default protocol is
-<CODE>@CUPS_BROWSE_LOCAL_PROTOCOLS@</CODE> for
+"<CODE>@CUPS_BROWSE_LOCAL_PROTOCOLS@</CODE>" for
 <A HREF="#BrowseLocalProtocols"><CODE>BrowseLocalProtocols</CODE></A> and
-<CODE>@CUPS_BROWSE_REMOTE_PROTOCOLS@</CODE> for
+"<CODE>@CUPS_BROWSE_REMOTE_PROTOCOLS@</CODE>" for
 <A HREF="#BrowseRemoteProtocols"><CODE>BrowseRemoteProtocols</CODE></A>.</P>
 
 <BLOCKQUOTE><B>Note:</B>
@@ -736,10 +740,8 @@ The default is to not include any options.</P>
 BrowseRemoteProtocols all
 BrowseRemoteProtocols none
 BrowseRemoteProtocols cups
-BrowseRemoteProtocols dnssd
 BrowseRemoteProtocols ldap
 BrowseRemoteProtocols slp
-BrowseRemoteProtocols cups dnssd
 </PRE>
 
 <H3>Description</H3>
@@ -747,7 +749,7 @@ BrowseRemoteProtocols cups dnssd
 <P>The <CODE>BrowseRemoteProtocols</CODE> directive specifies the
 protocols to use when finding remote shared printers on the
 network. Multiple protocols can be specified by separating them
-with spaces. The default is <CODE>@CUPS_BROWSE_REMOTE_PROTOCOLS@</CODE>.</P>
+with spaces. The default is "<CODE>@CUPS_BROWSE_REMOTE_PROTOCOLS@</CODE>".</P>
 
 
 <H2 CLASS="title"><A NAME="BrowseShortNames">BrowseShortNames</A></H2>
diff --git a/doc/help/sharing.html b/doc/help/sharing.html
new file mode 100644 (file)
index 0000000..29bb757
--- /dev/null
@@ -0,0 +1,181 @@
+<html>
+<!-- SECTION: Getting Started -->
+<head>
+       <title>Printer Sharing</title>
+</head>
+<body>
+
+<p>This document discusses several ways to configure printer sharing.</p>
+
+<h2><a name="BASICS">The Basics</h2>
+
+<p>A "server" is any machine that communicates directly to a printer. A "client"
+is any machine that sends print jobs to a server for final printing. Clients can
+also be servers if they communicate directly with any printers of their own.</p>
+
+<p>By default, CUPS uses the Internet Printing Protocol (IPP) to send jobs from
+a client to a server. When printing to legacy print servers you may also use the
+Line Printer Daemon (LPD) when printing to older UNIX-based servers or Server
+Message Block (SMB) when printing to Windows<sup>&reg;</sup> servers.</p>
+
+<p>Clients can automatically discover and access shared printers via CUPS
+browsing, IPP, Service Location Protocol (SLP), and Lightweight Directory Access
+Protocol (LDAP). DNS Service Discovery (DNS-SD a.k.a. Bonjour<sup>&reg;</sup>)
+and SMB browsing can also be used to manually discover and access shared
+printers.</p>
+
+
+<h2><a name="SERVER_CONFIG">Configuring the Server</a></h2>
+
+<p>You must enable printer sharing on the server before clients can print
+through it. The simplest way to do this is to use the
+<a href="man-cupsctl.html">cupsctl(8)</a> command on the server:</p>
+
+<pre class="command">
+cupsctl --share-printers
+</pre>
+
+<p>By default, the above command will allow printing from other clients on the
+same subnet as your server. To allow printing from any subnet, use the following
+command instead:</p>
+
+<pre class="command">
+cupsctl --share-printers --remote-any
+</pre>
+
+<p>Next, you need to choose which protocols to use for printer sharing. The
+default is CUPS browsing and DNS-SD on Mac OS X and CUPS browsing alone on
+other platforms. To set the sharing protocols, run the <b>cupsctl</b> command
+to set the
+<a href="ref-cupsd-conf.html#BrowseLocalProtocols">BrowseLocalProtocols</a>
+value. For example, run the following command to allow shared printing via
+CUPS, DNS-SD, LPD, and SMB:</p>
+
+<pre class="command">
+cupsctl 'BrowseLocalProtocols="cups dnssd lpd smb"'
+</pre>
+
+
+<h2><a name="AUTO_CUPS">Automatic Configuration using CUPS Browsing</a></h2>
+
+<p>CUPS browsing works by periodically broadcasting information about printers
+that are being shared to client systems on the same subnet. Each client
+maintains its own list of shared printers, and when more than one server shares
+the same printer (or the same kind of printer) the client uses all of the
+servers and printers to provide high-availability and failsafe printing.</p>
+
+<p>To configure printers on the same subnet, <em>do nothing</em>. Each client
+should see the available printers within 30 seconds automatically. The printer
+and class lists are updated automatically as printers and servers are added or
+removed.</p>
+
+<blockquote><b>Note:</b>
+
+<p>Due to user interface changes in Mac OS X 10.5, CUPS shared printers will not
+automatically appear in the print dialog. Instead, you must first run the
+following command to enable CUPS browsing on your system:</p>
+
+<pre class="command">
+cupsctl BrowseRemoteProtocols=cups
+</pre>
+
+<p>Then choose each of the CUPS shared printers you want to see in the print
+dialog by adding them, either from the <var>Add Printer...</var> item in the
+print dialog or from the <var>Print &amp; Fax</var> preference pane in the
+<var>System Preferences</var> window.</p>
+
+</blockquote>
+
+<h3><a name="BROWSE_POLL">Seeing Printers on Other Subnets</a></h3>
+
+<p>You can automatically access printers on other subnets by adding
+<a href="ref-cupsd-conf.html#BrowsePoll"><code>BrowsePoll</code></a> lines
+to the <var>cupsd.conf</var> file on your local system. For a single
+server you can use the <b>cupsctl</b> command:</p>
+
+<pre class="command">
+cupsctl BrowsePoll=server:port
+</pre>
+
+<p>For multiple servers, use the CUPS web interface (http://localhost:631/admin)
+to edit the configuration file instead. Enter one <code>BrowsePoll</code> line
+per server at the bottom of the file, as follows:</p>
+
+<pre class="example">
+BrowsePoll server1:port
+BrowsePoll server2:port
+BrowsePoll server3:port
+</pre>
+
+<p>If you have more than one client on your subnet that wants to see the
+printers on those servers, add a
+<a href="ref-cupsd-conf.html#BrowseRelay"><code>BrowseRely</code></a> line
+to the <var>cupsd.conf</var> file on your local system using the <b>cupsctl</b>
+command:</p>
+
+<pre class="command">
+cupsctl 'BrowseRelay="127.0.0.1 @LOCAL"'
+</pre>
+
+<p>or CUPS web interface (again, at the bottom of the file):</p>
+
+<pre class="example">
+BrowseRelay 127.0.0.1 @LOCAL
+</pre>
+
+
+<h2><a name="AUTO_IPP">Automatic Configuration using IPP</a></h2>
+
+<p>CUPS can be configured to run without a local spooler and send all jobs to a
+single server. However, if that server goes down then all printing will be
+disabled. Use this configuration only as absolutely necessary.</p>
+
+<p>The default server is normally the local system ("localhost"). To override
+the default server create a file named <var>/etc/cups/client.conf</var> with a
+line as follows:</p>
+
+<pre class='example'>
+ServerName <em>server</em>
+</pre>
+
+<p>The <var>server</var> name can be the hostname or IP address of the default
+server. If the server is not using the default IPP port (631), you can add the
+port number at the end like this:</p>
+
+<pre class='example'>
+ServerName <em>server:port</em>
+</pre>
+
+<p>The default server can also be customized on a per-user basis. To set a
+user-specific server create a file named <var>~/.cups/client.conf</var> instead.
+The user <var>client.conf</var> file takes precedence over the system one.</p>
+
+<p>Finally, you can set the <code>CUPS_SERVER</code> environment variable to
+override the default server for a single process, for example:</p>
+
+<pre class='command'>
+CUPS_SERVER=server:port firefox http://www.cups.org
+</pre>
+
+<p>will run the Firefox web browser pointed to the specified server and
+port. The environment variable overrides both the user and system
+<var>client.conf</var> files, if any.</p>
+
+
+<h2><a name="MANUAL">Manual Configuration of Print Queues</a></h2>
+
+<p>The most tedious method of configuring client machines is to configure
+each remote queue by hand using the <a href="man-lpadmin.html">lpadmin(8)</a>
+command:</p>
+
+<pre class='command'>
+lpadmin -p <em>printer</em> -E -v ipp://<em>server</em>/printers/<em>printer</em>
+</pre>
+
+<p>The <var>printer</var> name is the name of the printer on the server machine.
+The <var>server</var> name is the hostname or IP address of the server machine.
+Repeat the <b>lpadmin</b> command for each remote printer you wish to use.</p>
+
+
+</body>
+</html>
index 70db037656a8129a7b35fe828b59d36d169a5343..70a30319b478b511fb8765e7649a513f8e0db756 100644 (file)
@@ -438,7 +438,7 @@ Response:
 
        <dd>The required authentication information.
 
-</dl
+</dl>
 
 <h3 class='title'><span class='info'>CUPS 1.1</span><a name='CREATE_JOB'>Create-Job Operation</a></h3>
 
@@ -543,7 +543,7 @@ Create-Job Response:
 
        <dd>The required authentication information.
 
-</dl
+</dl>
 
 <h3 class='title'><a name='CANCEL_JOB'>Cancel Job Operation</a></h3>
 
@@ -1867,7 +1867,7 @@ CUPS-Authenticate-Job Response:
 
        <dd>The required authentication information.
 
-</dl
+</dl>
 
 <h3 class='title'><span class='info'>CUPS 1.3</span><a name='CUPS_GET_PPD'>CUPS-Get-PPD Operation</a></h3>
 
index 230de93ed2629e48ebc33e9f111c6e6a1d43e57b..49d10ca4b7abdedf35cb8b9dab4370f82172942f 100644 (file)
@@ -17,7 +17,7 @@ msgstr ""
 "Project-Id-Version: CUPS 1.4\n"
 "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
 "POT-Creation-Date: 2008-12-15 09:29-0800\n"
-"PO-Revision-Date: 2008-11-12 16:53+0100\n"
+"PO-Revision-Date: 2008-12-17 17:32+0100\n"
 "Last-Translator: Juan Pablo González Riopedre <riopedre13@yahoo.es>\n"
 "Language-Team: Spanish\n"
 "MIME-Version: 1.0\n"
@@ -245,31 +245,24 @@ msgstr ""
 "                REF: Página 15, sección 3.2.\n"
 
 msgid "        WARN    Default choices conflicting!\n"
-msgstr ""
-"        ADVERTENCIA    Las preferencias predeterminadas están en conflicto.\n"
+msgstr "        ADVERTENCIA    Las preferencias predeterminadas están en conflicto.\n"
 
 #, c-format
 msgid ""
-"        WARN    Duplex option keyword %s may not work as expected and should "
-"be named Duplex!\n"
+"        WARN    Duplex option keyword %s may not work as expected and should be named Duplex!\n"
 "                REF: Page 122, section 5.17\n"
 msgstr ""
-"        ADVERTENCIA    La clave de opción Duplex %s puede que no funcione "
-"como se espera y debería llamarse Duplex.\n"
+"        ADVERTENCIA    La clave de opción Duplex %s puede que no funcione como se espera y debería llamarse Duplex.\n"
 "                REF: Página 122, sección 5.17\n"
 
-msgid ""
-"        WARN    File contains a mix of CR, LF, and CR LF line endings!\n"
-msgstr ""
-"        ADVERTENCIA    El archivo contiene una mezcla de líneas acabadas en "
-"CR, LF y CR LF.\n"
+msgid "        WARN    File contains a mix of CR, LF, and CR LF line endings!\n"
+msgstr "        ADVERTENCIA    El archivo contiene una mezcla de líneas acabadas en CR, LF y CR LF.\n"
 
 msgid ""
 "        WARN    LanguageEncoding required by PPD 4.3 spec.\n"
 "                REF: Pages 56-57, section 5.3.\n"
 msgstr ""
-"        ADVERTENCIA    Se necesita LanguageEncoding por especificación de "
-"PPD 4.3.\n"
+"        ADVERTENCIA    Se necesita LanguageEncoding por especificación de PPD 4.3.\n"
 "                REF: Páginas 56-57, sección 5.3.\n"
 
 #, c-format
@@ -280,8 +273,7 @@ msgid ""
 "        WARN    Manufacturer required by PPD 4.3 spec.\n"
 "                REF: Pages 58-59, section 5.3.\n"
 msgstr ""
-"        ADVERTENCIA    Se necesita Manufacturer por especificación de PPD "
-"4.3.\n"
+"        ADVERTENCIA    Se necesita Manufacturer por especificación de PPD 4.3.\n"
 "                REF: Páginas 58-59, sección 5.3.\n"
 
 #, c-format
@@ -292,12 +284,8 @@ msgstr "        ADVERTENCIA    Falta el archivo APDialogExtension \"%s\"\n"
 msgid "        WARN    Missing APPrinterIconPath file \"%s\"\n"
 msgstr "        ADVERTENCIA    Falta el archivo APPrinterIconPath \"%s\"\n"
 
-msgid ""
-"        WARN    Non-Windows PPD files should use lines ending with only LF, "
-"not CR LF!\n"
-msgstr ""
-"        ADVERTENCIA    Los archivos PPD que no sean de Windows deben tener "
-"líneas que acaben sólo en LF, no en CR LF.\n"
+msgid "        WARN    Non-Windows PPD files should use lines ending with only LF, not CR LF!\n"
+msgstr "        ADVERTENCIA    Los archivos PPD que no sean de Windows deben tener líneas que acaben sólo en LF, no en CR LF.\n"
 
 #, c-format
 msgid ""
@@ -311,32 +299,28 @@ msgid ""
 "        WARN    PCFileName longer than 8.3 in violation of PPD spec.\n"
 "                REF: Pages 61-62, section 5.3.\n"
 msgstr ""
-"        ADVERTENCIA    PCFileName es mas largo que 8.3 violando la "
-"especificación PPD.\n"
+"        ADVERTENCIA    PCFileName es mas largo que 8.3 violando la especificación PPD.\n"
 "                REF: Páginas 61-62, sección 5.3.\n"
 
 msgid ""
 "        WARN    Protocols contains PJL but JCL attributes are not set.\n"
 "                REF: Pages 78-79, section 5.7.\n"
 msgstr ""
-"        ADVERTENCIA    Los protocolos contienen PJL pero no se especifican "
-"los atributos JCL.\n"
+"        ADVERTENCIA    Los protocolos contienen PJL pero no se especifican los atributos JCL.\n"
 "                REF: Páginas 78-79, sección 5.7.\n"
 
 msgid ""
 "        WARN    Protocols contains both PJL and BCP; expected TBCP.\n"
 "                REF: Pages 78-79, section 5.7.\n"
 msgstr ""
-"        ADVERTENCIA    Los protocolos contienen a ambos, PJL y BCP; se "
-"esperaba TBCP.\n"
+"        ADVERTENCIA    Los protocolos contienen a ambos, PJL y BCP; se esperaba TBCP.\n"
 "                REF: Páginas 78-79, sección 5.7.\n"
 
 msgid ""
 "        WARN    ShortNickName required by PPD 4.3 spec.\n"
 "                REF: Pages 64-65, section 5.3.\n"
 msgstr ""
-"        ADVERTENCIA    Se necesita ShortNickName por especificación de PPD "
-"4.3.\n"
+"        ADVERTENCIA    Se necesita ShortNickName por especificación de PPD 4.3.\n"
 "                REF: Páginas 64-65, sección 5.3.\n"
 
 #, c-format
@@ -353,15 +337,11 @@ msgstr ""
 
 #, c-format
 msgid "      %s  Bad UTF-8 \"%s\" translation string for option %s!\n"
-msgstr ""
-"      %s  Cadena de traducción UTF-8 \"%s\" incorrecta para opción %s.\n"
+msgstr "      %s  Cadena de traducción UTF-8 \"%s\" incorrecta para opción %s.\n"
 
 #, c-format
-msgid ""
-"      %s  Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n"
-msgstr ""
-"      %s  Cadena de traducción UTF-8 \"%s\" incorrecta para opción %s, "
-"preferencia %s.\n"
+msgid "      %s  Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n"
+msgstr "      %s  Cadena de traducción UTF-8 \"%s\" incorrecta para opción %s, preferencia %s.\n"
 
 #, c-format
 msgid "      %s  Bad cupsFilter value \"%s\"!\n"
@@ -393,18 +373,15 @@ msgstr "      %s  Falta cadena de traducción \"%s\" para opción %s.\n"
 
 #, c-format
 msgid "      %s  Missing \"%s\" translation string for option %s, choice %s!\n"
-msgstr ""
-"      %s  Falta cadena de traducción \"%s\" para opción %s, preferencia %s.\n"
+msgstr "      %s  Falta cadena de traducción \"%s\" para opción %s, preferencia %s.\n"
 
 #, c-format
 msgid "      %s  Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n"
-msgstr ""
-"      %s  Falta la preferencia *%s %s en UIConstraint \"*%s %s *%s %s\".\n"
+msgstr "      %s  Falta la preferencia *%s %s en UIConstraint \"*%s %s *%s %s\".\n"
 
 #, c-format
 msgid "      %s  Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n"
-msgstr ""
-"      %s  Falta la preferencia *%s %s en cupsUIConstraints %s: \"%s\".\n"
+msgstr "      %s  Falta la preferencia *%s %s en cupsUIConstraints %s: \"%s\".\n"
 
 #, c-format
 msgid "      %s  Missing cupsFilter file \"%s\"\n"
@@ -412,7 +389,7 @@ msgstr "      %s  Falta archivo cupsFilter \"%s\"\n"
 
 #, c-format
 msgid "      %s  Missing cupsICCProfile file \"%s\"!\n"
-msgstr "      %s Falta el archivo cupsICCProfile \"%s\".\n"
+msgstr "      %s  Falta el archivo cupsICCProfile \"%s\".\n"
 
 #, c-format
 msgid "      %s  Missing cupsPreFilter file \"%s\"\n"
@@ -439,7 +416,7 @@ msgid ""
 "      %s  REQUIRED %s does not define choice None!\n"
 "                REF: Page 122, section 5.17\n"
 msgstr ""
-"      %s  SE NECESITA %s no define preferencia Ninguna.\n"
+"      %s  NECESARIA %s no define la opción None.\n"
 "                REF: Página 122, sección 5.17\n"
 
 #, c-format
@@ -452,9 +429,7 @@ msgstr "      %s  cupsUIResolver %s genera un bucle.\n"
 
 #, c-format
 msgid "      **FAIL**  %s choice names %s and %s differ only by case!\n"
-msgstr ""
-"      **FALLO**  %s nombres de opción %s y %s se diferencian sólo en la "
-"capitalización.\n"
+msgstr "      **FALLO**  %s nombres de opción %s y %s se diferencian sólo en la capitalización.\n"
 
 #, c-format
 msgid ""
@@ -469,7 +444,7 @@ msgid ""
 "      **FAIL**  BAD Default%s %s\n"
 "                REF: Page 40, section 4.5.\n"
 msgstr ""
-"      **FALLO**  Default%s %s incorrecto\n"
+"      **FALLO**  Default%s %s INCORRECTO\n"
 "                REF: Página 40, sección 4.5.\n"
 
 #, c-format
@@ -477,7 +452,7 @@ msgid ""
 "      **FAIL**  BAD DefaultImageableArea %s!\n"
 "                REF: Page 102, section 5.15.\n"
 msgstr ""
-"      **FALLO**  DefaultImageableArea %s incorrecto\n"
+"      **FALLO**  DefaultImageableArea %s INCORRECTO\n"
 "                REF: Página 102, sección 5.15.\n"
 
 #, c-format
@@ -485,14 +460,14 @@ msgid ""
 "      **FAIL**  BAD DefaultPaperDimension %s!\n"
 "                REF: Page 103, section 5.15.\n"
 msgstr ""
-"      **FALLO**  DefaultPaperDimension %s incorrecto.\n"
+"      **FALLO**  DefaultPaperDimension %s INCORRECTO.\n"
 "                REF: Página 103, sección 5.15.\n"
 
 msgid ""
 "      **FAIL**  BAD JobPatchFile attribute in file\n"
 "                REF: Page 24, section 3.4.\n"
 msgstr ""
-"      **FALLO**  Atributo JobPatchFile en archivo, incorrecto\n"
+"      **FALLO**  Atributo JobPatchFile en archivo, INCORRECTO\n"
 "                REF: Página 24, sección 3.4.\n"
 
 msgid ""
@@ -514,28 +489,28 @@ msgid ""
 "      **FAIL**  BAD ModelName - \"%c\" not allowed in string.\n"
 "                REF: Pages 59-60, section 5.3.\n"
 msgstr ""
-"      **FALLO**  ModelName - \"%c\" incorrecto no permitido en la cadena.\n"
+"      **FALLO**  ModelName - \"%c\" INCORRECTO no permitido en la cadena.\n"
 "                REF: Páginas 59-60, sección 5.3.\n"
 
 msgid ""
 "      **FAIL**  BAD PSVersion - not \"(string) int\".\n"
 "                REF: Pages 62-64, section 5.3.\n"
 msgstr ""
-"      **FALLO**  PSVersion incorrecto- no es \"(string) int\".\n"
+"      **FALLO**  PSVersion INCORRECTO - no es \"(string) int\".\n"
 "                REF: Páginas 62-64, sección 5.3.\n"
 
 msgid ""
 "      **FAIL**  BAD Product - not \"(string)\".\n"
 "                REF: Page 62, section 5.3.\n"
 msgstr ""
-"      **FALLO**  Product incorrecto - no es \"(string)\".\n"
+"      **FALLO**  Product INCORRECTO - no es \"(string)\".\n"
 "                REF: Página 62, sección 5.3.\n"
 
 msgid ""
 "      **FAIL**  BAD ShortNickName - longer than 31 chars.\n"
 "                REF: Pages 64-65, section 5.3.\n"
 msgstr ""
-"      **FALLO**  ShortNickName incorrecto - mayor de 31 caracteres.\n"
+"      **FALLO**  ShortNickName INCORRECTO - mayor de 31 caracteres.\n"
 "                REF: Páginas 64-65, sección 5.3.\n"
 
 #, c-format
@@ -551,17 +526,20 @@ msgid ""
 "      **FAIL**  Bad FileVersion \"%s\"\n"
 "                REF: Page 56, section 5.3.\n"
 msgstr ""
+"      **FALLO**  FileVersion \"%s\" incorrecto\n"
+"                REF: Página 56, sección 5.3.\n"
 
 #, c-format
 msgid ""
 "      **FAIL**  Bad FormatVersion \"%s\"\n"
 "                REF: Page 56, section 5.3.\n"
 msgstr ""
+"      **FALLO**  FormatVersion \"%s\" incorrecto\n"
+"                REF: Página 56, sección 5.3.\n"
 
 #, c-format
 msgid "      **FAIL**  Bad LanguageEncoding %s - must be ISOLatin1!\n"
-msgstr ""
-"      **FALLO**  LanguageEncoding %s incorrecto: debería ser ISOLatin1.\n"
+msgstr "      **FALLO**  LanguageEncoding %s incorrecto: debería ser ISOLatin1.\n"
 
 #, c-format
 msgid "      **FAIL**  Bad LanguageVersion %s - must be English!\n"
@@ -569,31 +547,19 @@ msgstr "      **FALLO**  LanguageVersion %s incorrecto: debería ser Inglés.\n"
 
 #, c-format
 msgid "      **FAIL**  Default option code cannot be interpreted: %s\n"
-msgstr ""
-"      **FALLO**  El código de opción predeterminado no puede ser "
-"interpretado: %s\n"
+msgstr "      **FALLO**  El código de opción predeterminado no puede ser interpretado: %s\n"
 
 #, c-format
-msgid ""
-"      **FAIL**  Default translation string for option %s choice %s contains "
-"8-bit characters!\n"
-msgstr ""
-"      **FALLO**  Cadena de traducción predeterminada para opción %s "
-"preferencia %s contiene caracteres de 8-bits.\n"
+msgid "      **FAIL**  Default translation string for option %s choice %s contains 8-bit characters!\n"
+msgstr "      **FALLO**  Cadena de traducción predeterminada para opción %s preferencia %s contiene caracteres de 8-bits.\n"
 
 #, c-format
-msgid ""
-"      **FAIL**  Default translation string for option %s contains 8-bit "
-"characters!\n"
-msgstr ""
-"      **FALLO**  Cadena de traducción predeterminada para opción %s contiene "
-"caracteres de 8-bits.\n"
+msgid "      **FAIL**  Default translation string for option %s contains 8-bit characters!\n"
+msgstr "      **FALLO**  Cadena de traducción predeterminada para opción %s contiene caracteres de 8-bits.\n"
 
 #, c-format
 msgid "      **FAIL**  Group names %s and %s differ only by case!\n"
-msgstr ""
-"      **FALLO**  Nombres de grupo %s y %s se diferencian sólo en la "
-"capitalización.\n"
+msgstr "      **FALLO**  Nombres de grupo %s y %s se diferencian sólo en la capitalización.\n"
 
 #, c-format
 msgid "      **FAIL**  Multiple occurrences of %s choice name %s!\n"
@@ -601,9 +567,7 @@ msgstr "      **FALLO**  Múltiples apariciones de %s nombre de opción %s.\n"
 
 #, c-format
 msgid "      **FAIL**  Option names %s and %s differ only by case!\n"
-msgstr ""
-"      **FALLO**  Nombres de opción %s y %s se diferencian sólo en la "
-"capitalización.\n"
+msgstr "      **FALLO**  Nombres de opción %s y %s se diferencian sólo en la capitalización.\n"
 
 #, c-format
 msgid ""
@@ -970,11 +934,8 @@ msgid "%s: Don't know what to do!\n"
 msgstr "%s: No sé que hay que hacer.\n"
 
 #, c-format
-msgid ""
-"%s: Error - %s environment variable names non-existent destination \"%s\"!\n"
-msgstr ""
-"%s: Error - %s nombres de variables de entorno no existen en destino \"%s"
-"\".\n"
+msgid "%s: Error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "%s: Error - %s nombres de variables de entorno no existen en destino \"%s\".\n"
 
 #, c-format
 msgid "%s: Error - bad job ID!\n"
@@ -982,16 +943,11 @@ msgstr "%s: Error - ID de trabajo incorrecta.\n"
 
 #, c-format
 msgid "%s: Error - cannot print files and alter jobs simultaneously!\n"
-msgstr ""
-"%s: Error - no se pueden imprimir archivos y alterar trabajos al mismo "
-"tiempo.\n"
+msgstr "%s: Error - no se pueden imprimir archivos y alterar trabajos al mismo tiempo.\n"
 
 #, c-format
-msgid ""
-"%s: Error - cannot print from stdin if files or a job ID are provided!\n"
-msgstr ""
-"%s: Error - no se puede imprimir desde stdin si se proporcionan archivos o "
-"una ID de trabajo.\n"
+msgid "%s: Error - cannot print from stdin if files or a job ID are provided!\n"
+msgstr "%s: Error - no se puede imprimir desde stdin si se proporcionan archivos o una ID de trabajo.\n"
 
 #, c-format
 msgid "%s: Error - expected character set after '-S' option!\n"
@@ -1078,12 +1034,8 @@ msgid "%s: Error - expected value after '-%c' option!\n"
 msgstr "%s: Error - se esperaba un valor tras la opción '%c'.\n"
 
 #, c-format
-msgid ""
-"%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' "
-"option!\n"
-msgstr ""
-"%s: Error - se necesita \"completed\", \"not completed\", o \"all\" tras la "
-"opción '-W'.\n"
+msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' option!\n"
+msgstr "%s: Error - se necesita \"completed\", \"not completed\", o \"all\" tras la opción '-W'.\n"
 
 #, c-format
 msgid "%s: Error - no default destination available.\n"
@@ -1143,8 +1095,7 @@ msgstr "%s: Cadena de filtro \"%s\" inválida\n"
 
 #, c-format
 msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n"
-msgstr ""
-"%s: Se necesita un ID de trabajo ('-i id_trabajo') antes de '-H restart'.\n"
+msgstr "%s: Se necesita un ID de trabajo ('-i id_trabajo') antes de '-H restart'.\n"
 
 #, c-format
 msgid "%s: No filter to convert from %s/%s to %s/%s!\n"
@@ -1207,12 +1158,8 @@ msgid "%s: Unknown source MIME type %s/%s!\n"
 msgstr "%s: Tipo MIME de origen %s/%s desconocido.\n"
 
 #, c-format
-msgid ""
-"%s: Warning - '%c' format modifier not supported - output may not be "
-"correct!\n"
-msgstr ""
-"%s: Advertencia - no se admite el uso del modificador de formato '%c' - la "
-"salida puede no ser correcta.\n"
+msgid "%s: Warning - '%c' format modifier not supported - output may not be correct!\n"
+msgstr "%s: Advertencia - no se admite el uso del modificador de formato '%c' - la salida puede no ser correcta.\n"
 
 #, c-format
 msgid "%s: Warning - character set option ignored!\n"
@@ -1231,11 +1178,8 @@ msgid "%s: Warning - mode option ignored!\n"
 msgstr "%s: Advertencia - opción de modo no tenida en cuenta.\n"
 
 #, c-format
-msgid ""
-"%s: error - %s environment variable names non-existent destination \"%s\"!\n"
-msgstr ""
-"%s: error - %s nombres de variables de entorno no existen en destino \"%s"
-"\".\n"
+msgid "%s: error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "%s: error - %s nombres de variables de entorno no existen en destino \"%s\".\n"
 
 #, c-format
 msgid "%s: error - expected option=value after '-o' option!\n"
@@ -1840,14 +1784,10 @@ msgid "?Invalid help command unknown\n"
 msgstr "?Comando de ayuda inválido desconocido\n"
 
 msgid "A Samba password is required to export printer drivers!"
-msgstr ""
-"Se requiere una contraseña Samba para exportar los controladores de "
-"impresora."
+msgstr "Se requiere una contraseña Samba para exportar los controladores de impresora."
 
 msgid "A Samba username is required to export printer drivers!"
-msgstr ""
-"Se requiere un nombre de usuario Samba para exportar los controladores de "
-"impresora."
+msgstr "Se requiere un nombre de usuario Samba para exportar los controladores de impresora."
 
 #, c-format
 msgid "A class named \"%s\" already exists!"
@@ -1960,16 +1900,14 @@ msgid "Always"
 msgstr "Siempre"
 
 msgid "AppSocket/HP JetDirect"
-msgstr ""
+msgstr "AppSocket/HP JetDirect"
 
 msgid "Applicator"
 msgstr "Aplicador"
 
 #, c-format
 msgid "Attempt to set %s printer-state to bad value %d!"
-msgstr ""
-"Se ha intentado cambiar el valor printer-state de %s a un valor incorrecto %"
-"d."
+msgstr "Se ha intentado cambiar el valor printer-state de %s a un valor incorrecto %d."
 
 #, c-format
 msgid "Attribute groups are out of order (%x < %x)!"
@@ -2115,7 +2053,7 @@ msgid "Banners"
 msgstr "Rótulos"
 
 msgid "Billing Information: "
-msgstr "Información de facturación:"
+msgstr "Información de facturación: "
 
 msgid "Bond Paper"
 msgstr "Papel de cartas"
@@ -2219,7 +2157,7 @@ msgid "Created"
 msgstr "Creado"
 
 msgid "Created On: "
-msgstr "Creado en:"
+msgstr "Creado en: "
 
 msgid "Custom"
 msgstr "A medida"
@@ -2255,7 +2193,7 @@ msgid "Delete Printer"
 msgstr "Borrar impresora"
 
 msgid "Description: "
-msgstr "Descripción:"
+msgstr "Descripción: "
 
 msgid "DeskJet Series"
 msgstr "DeskJet Series"
@@ -2303,10 +2241,10 @@ msgid "Double Postcard"
 msgstr "Postal doble"
 
 msgid "Driver Name: "
-msgstr "Nombre de controlador:"
+msgstr "Nombre del controlador: "
 
 msgid "Driver Version: "
-msgstr "Versión de controlador:"
+msgstr "Versión del controlador: "
 
 msgid "Duplexer"
 msgstr "Unidad de impresión dúplex"
@@ -2316,13 +2254,11 @@ msgstr "Dymo"
 
 #, c-format
 msgid "EMERG: Unable to allocate memory for page info: %s\n"
-msgstr ""
-"EMERG: No se ha podido asignar memoria para la información de página: %s\n"
+msgstr "EMERG: No se ha podido asignar memoria para la información de página: %s\n"
 
 #, c-format
 msgid "EMERG: Unable to allocate memory for pages array: %s\n"
-msgstr ""
-"EMERG: No se ha podido asignar memoria para la secuencia de páginas: %s\n"
+msgstr "EMERG: No se ha podido asignar memoria para la secuencia de páginas: %s\n"
 
 msgid "EPL1 Label Printer"
 msgstr "Impresora de etiquetas EPL1"
@@ -2411,9 +2347,7 @@ msgid "ERROR: Fatal USB error!\n"
 msgstr "ERROR: Error fatal de USB.\n"
 
 msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n"
-msgstr ""
-"ERROR: Se ha detectado un comando HP-GL/2 no válido; no se puede imprimir el "
-"archivo.\n"
+msgstr "ERROR: Se ha detectado un comando HP-GL/2 no válido; no se puede imprimir el archivo.\n"
 
 #, c-format
 msgid "ERROR: Missing %%EndProlog!\n"
@@ -2423,23 +2357,16 @@ msgstr "ERROR: Falta %%EndProlog.\n"
 msgid "ERROR: Missing %%EndSetup!\n"
 msgstr "ERROR: Falta %%EndSetup.\n"
 
-msgid ""
-"ERROR: Missing device URI on command-line and no DEVICE_URI environment "
-"variable!\n"
-msgstr ""
-"ERROR: Falta URI del dispositivo en la línea de comandos y no hay variable "
-"de entorno DEVICE_URI.\n"
+msgid "ERROR: Missing device URI on command-line and no DEVICE_URI environment variable!\n"
+msgstr "ERROR: Falta URI del dispositivo en la línea de comandos y no hay variable de entorno DEVICE_URI.\n"
 
 #, c-format
 msgid "ERROR: Missing value on line %d of banner file!\n"
 msgstr "ERROR: Falta el valor en la línea %d del archivo de rótulo.\n"
 
 #, c-format
-msgid ""
-"ERROR: Need a msgid line before any translation strings on line %d of %s!\n"
-msgstr ""
-"ERROR: Se necesita una línea msgid antes de cualquier cadena de traducción "
-"en línea %d de %s.\n"
+msgid "ERROR: Need a msgid line before any translation strings on line %d of %s!\n"
+msgstr "ERROR: Se necesita una línea msgid antes de cualquier cadena de traducción en línea %d de %s.\n"
 
 #, c-format
 msgid "ERROR: No %%BoundingBox: comment in header!\n"
@@ -2449,12 +2376,8 @@ msgstr "ERROR: No hay comentario %%BoundingBox: en la cabecera.\n"
 msgid "ERROR: No %%Pages: comment in header!\n"
 msgstr "ERROR: No hay comentario %%Pages: en la cabecera.\n"
 
-msgid ""
-"ERROR: No device URI found in argv[0] or in DEVICE_URI environment "
-"variable!\n"
-msgstr ""
-"ERROR: No se ha encontrado el URI del dispositivo en argv[0] o en la "
-"variable de entorno DEVICE_URI.\n"
+msgid "ERROR: No device URI found in argv[0] or in DEVICE_URI environment variable!\n"
+msgstr "ERROR: No se ha encontrado el URI del dispositivo en argv[0] o en la variable de entorno DEVICE_URI.\n"
 
 #, c-format
 msgid "ERROR: No fonts in charset file %s\n"
@@ -2491,9 +2414,7 @@ msgid "ERROR: Remote host did not accept data file (%d)\n"
 msgstr "ERROR: El ordenador remoto no ha aceptado el archivo de datos (%d)\n"
 
 msgid "ERROR: There was a timeout error while sending data to the printer\n"
-msgstr ""
-"ERROR: Hay un error de tiempo de espera mientras se enviaban datos a la "
-"impresora\n"
+msgstr "ERROR: Hay un error de tiempo de espera mientras se enviaban datos a la impresora\n"
 
 #, c-format
 msgid "ERROR: Unable to add file %d to job: %s\n"
@@ -2511,9 +2432,7 @@ msgstr "ERROR: No se ha podido crear socket"
 
 #, c-format
 msgid "ERROR: Unable to create temporary compressed print file: %s\n"
-msgstr ""
-"ERROR: No se ha podido crear el archivo de impresión temporal comprimido: %"
-"s\n"
+msgstr "ERROR: No se ha podido crear el archivo de impresión temporal comprimido: %s\n"
 
 msgid "ERROR: Unable to create temporary file"
 msgstr "ERROR: No se ha podido crear el archivo temporal"
@@ -2548,9 +2467,7 @@ msgstr "ERROR: No se ha podido obtener una respuesta PAP"
 
 #, c-format
 msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n"
-msgstr ""
-"ERROR: No se ha podido obtener el archivo PPD para la impresora \"%s\" - %"
-"s.\n"
+msgstr "ERROR: No se ha podido obtener el archivo PPD para la impresora \"%s\" - %s.\n"
 
 msgid "ERROR: Unable to get default AppleTalk zone"
 msgstr "ERROR: No se ha podido conseguir la zona AppleTalk predeterminada"
@@ -2617,9 +2534,7 @@ msgstr "ERROR: No se ha podido abrir el archivo de impresión %s: %s\n"
 
 #, c-format
 msgid "ERROR: Unable to open temporary compressed print file: %s\n"
-msgstr ""
-"ERROR: No se ha podido abrir el archivo de impresión temporal comprimido: %"
-"s\n"
+msgstr "ERROR: No se ha podido abrir el archivo de impresión temporal comprimido: %s\n"
 
 msgid "ERROR: Unable to open temporary file"
 msgstr "ERROR: No se ha podido abrir el archivo temporal"
@@ -2656,8 +2571,7 @@ msgid "ERROR: Unable to send PAP tickle request"
 msgstr "ERROR: No se ha podido enviar una petición PAP"
 
 msgid "ERROR: Unable to send initial PAP send data request"
-msgstr ""
-"ERROR: No se ha podido enviar la petición inicial de datos de envío PAP"
+msgstr "ERROR: No se ha podido enviar la petición inicial de datos de envío PAP"
 
 #, c-format
 msgid "ERROR: Unable to send print data (%d)\n"
@@ -2695,16 +2609,14 @@ msgid "ERROR: Unable to write print data: %s\n"
 msgstr "ERROR: No se han podido escribir los datos de impresión: %s\n"
 
 msgid "ERROR: Unable to write raster data to driver!\n"
-msgstr ""
-"ERROR: No se ha podido escribir la trama de datos (raster) al controlador.\n"
+msgstr "ERROR: No se ha podido escribir la trama de datos (raster) al controlador.\n"
 
 msgid "ERROR: Unable to write to temporary file"
 msgstr "ERROR: No se ha podido escribir al archivo temporal"
 
 #, c-format
 msgid "ERROR: Unable to write uncompressed document data: %s\n"
-msgstr ""
-"ERROR: No se han podido escribir los datos de documento sin comprimir: %s\n"
+msgstr "ERROR: No se han podido escribir los datos de documento sin comprimir: %s\n"
 
 #, c-format
 msgid "ERROR: Unexpected text on line %d of %s!\n"
@@ -2748,28 +2660,19 @@ msgstr "ERROR: Valor gamma %s no permitido; usando gamma=1000.\n"
 
 #, c-format
 msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n"
-msgstr ""
-"ERROR: Valor de number-up (páginas por hoja) %d no permitido; usando number-"
-"up=1.\n"
+msgstr "ERROR: Valor de number-up (páginas por hoja) %d no permitido; usando number-up=1.\n"
 
 #, c-format
-msgid ""
-"ERROR: Unsupported number-up-layout value %s, using number-up-layout=lrtb!\n"
-msgstr ""
-"ERROR: Valor de number-up-layout (disposición de páginas por hoja) %s no "
-"permitido; usando number-up-layout=lrtb.\n"
+msgid "ERROR: Unsupported number-up-layout value %s, using number-up-layout=lrtb!\n"
+msgstr "ERROR: Valor de number-up-layout (disposición de páginas por hoja) %s no permitido; usando number-up-layout=lrtb.\n"
 
 #, c-format
 msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n"
-msgstr ""
-"ERROR: Valor de page-border (borde de página) %s no permitido; usando page-"
-"border=none (ninguno).\n"
+msgstr "ERROR: Valor de page-border (borde de página) %s no permitido; usando page-border=none (ninguno).\n"
 
 #, c-format
 msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n"
-msgstr ""
-"ERROR: Se ha detectado un desbordamiento de doc_printf (%d bytes); "
-"cancelando.\n"
+msgstr "ERROR: Se ha detectado un desbordamiento de doc_printf (%d bytes); cancelando.\n"
 
 #, c-format
 msgid "ERROR: pdftops filter crashed on signal %d!\n"
@@ -2787,12 +2690,8 @@ msgstr "ERROR: pictwpstops se ha cerrado con la señal %d.\n"
 msgid "ERROR: pictwpstops exited with status %d!\n"
 msgstr "ERROR: pictwpstops se ha cerrado con el estado %d.\n"
 
-msgid ""
-"ERROR: recoverable: Unable to connect to printer; will retry in 30 "
-"seconds...\n"
-msgstr ""
-"ERROR: recuperable: No se ha podido establecer conexión con la impresora; "
-"reintento en 30 segundos...\n"
+msgid "ERROR: recoverable: Unable to connect to printer; will retry in 30 seconds...\n"
+msgstr "ERROR: recuperable: No se ha podido establecer conexión con la impresora; reintento en 30 segundos...\n"
 
 msgid "ERROR: select() failed"
 msgstr "ERROR: select() ha fallado"
@@ -2818,14 +2717,8 @@ msgstr "Introduzca nuevamente la contraseña:"
 msgid "Enter password:"
 msgstr "Introduzca la contraseña:"
 
-msgid ""
-"Enter your username and password or the root username and password to access "
-"this page. If you are using Kerberos authentication, make sure you have a "
-"valid Kerberos ticket."
-msgstr ""
-"Introduzca su nombre de usuario y contraseña o el nombre de usuario y "
-"contraseña de root para poder acceder a esta página. Si está usando "
-"autentificación Kerberos, asegúrese de que tiene un ticket Kerberos válido."
+msgid "Enter your username and password or the root username and password to access this page. If you are using Kerberos authentication, make sure you have a valid Kerberos ticket."
+msgstr "Introduzca su nombre de usuario y contraseña o el nombre de usuario y contraseña de root para poder acceder a esta página. Si está usando autentificación Kerberos, asegúrese de que tiene un ticket Kerberos válido."
 
 msgid "Envelope Feed"
 msgstr "Alimentador de sobre"
@@ -2885,12 +2778,8 @@ msgid "File Folder - 9/16 x 3 7/16\""
 msgstr "Carpeta de archivosr - 9/16 x 3 7/16 pulg."
 
 #, c-format
-msgid ""
-"File device URIs have been disabled! To enable, see the FileDevice directive "
-"in \"%s/cupsd.conf\"."
-msgstr ""
-"Los URIs del dispositivo de archivo han sido deshabilitados. Para "
-"habilitarlos, vea la directiva FileDevice en \"%s/cupsd.conf\"."
+msgid "File device URIs have been disabled! To enable, see the FileDevice directive in \"%s/cupsd.conf\"."
+msgstr "Los URIs del dispositivo de archivo han sido deshabilitados. Para habilitarlos, vea la directiva FileDevice en \"%s/cupsd.conf\"."
 
 msgid "Folio"
 msgstr "Folio"
@@ -2947,10 +2836,10 @@ msgid "INFO: Canceling print job...\n"
 msgstr "INFO: Cancelando trabajo de impresión...\n"
 
 msgid "INFO: Connected to printer...\n"
-msgstr ""
+msgstr "INFO: Conectado a la impresora...\n"
 
 msgid "INFO: Connecting to printer...\n"
-msgstr ""
+msgstr "INFO: Conectando a la impresora...\n"
 
 msgid "INFO: Control file sent successfully\n"
 msgstr "INFO: Archivo de control enviado correctamente\n"
@@ -2966,15 +2855,13 @@ msgid "INFO: Loading image file...\n"
 msgstr "INFO: Cargando archivo de imagen...\n"
 
 msgid "INFO: Looking for printer...\n"
-msgstr ""
+msgstr "INFO: Buscando impresora...\n"
 
 msgid "INFO: Opening connection\n"
 msgstr "INFO: Abriendo la conexión\n"
 
 msgid "INFO: Print file sent, waiting for printer to finish...\n"
-msgstr ""
-"INFO: Archivo de impresión enviado; esperando a que finalice la "
-"impresora...\n"
+msgstr "INFO: Archivo de impresión enviado; esperando a que finalice la impresora...\n"
 
 msgid "INFO: Printer busy; will retry in 10 seconds...\n"
 msgstr "INFO: Impresora ocupada; reintento en 10 segundos...\n"
@@ -3052,9 +2939,7 @@ msgid "INFO: Spooling LPR job, %.0f%% complete...\n"
 msgstr "INFO: Guardando trabajo LPR en cola, %.0f%% completado...\n"
 
 msgid "INFO: Unable to contact printer, queuing on next printer in class...\n"
-msgstr ""
-"INFO: No se ha podido contactar con la impresora; poniendo en cola en la "
-"siguiente impresora de la clase...\n"
+msgstr "INFO: No se ha podido contactar con la impresora; poniendo en cola en la siguiente impresora de la clase...\n"
 
 #, c-format
 msgid "INFO: Using default AppleTalk zone \"%s\"\n"
@@ -3169,7 +3054,7 @@ msgid "Internet Postage 3-Part - 2 1/4 x 7\""
 msgstr "Correo por Internet Parte-3 - 2 1/4 x 7 pulg."
 
 msgid "Internet Printing Protocol"
-msgstr ""
+msgstr "Protocolo de Impresión de Internet IPP"
 
 msgid "Invite Envelope"
 msgstr "Sobre de invitación"
@@ -3240,7 +3125,7 @@ msgid "Job Stopped"
 msgstr "Trabajo detenido"
 
 msgid "Job UUID: "
-msgstr "UUID de trabajo:"
+msgstr "UUID del trabajo: "
 
 msgid "Job is completed and cannot be changed."
 msgstr "El trabajo está terminado y no puede ser cambiado."
@@ -3264,7 +3149,7 @@ msgid "Kaku3 Envelope"
 msgstr "Sobre Kaku3"
 
 msgid "LPD/LPR Host or Printer"
-msgstr ""
+msgstr "Equipo o impresora LPD/LPR"
 
 msgid "Label Printer"
 msgstr "Impresora de etiquetas"
@@ -3295,25 +3180,25 @@ msgid "List Available Printers"
 msgstr "Listar impresoras disponibles"
 
 msgid "Location: "
-msgstr "Ubicación:"
+msgstr "Ubicación: "
 
 msgid "Long-Edge (Portrait)"
 msgstr "Lado largo (retrato)"
 
 msgid "Make and Model: "
-msgstr "Marca y modelo:"
+msgstr "Marca y modelo: "
 
 msgid "Manual Feed"
 msgstr "Alimentación manual"
 
 msgid "Media Dimensions: "
-msgstr "Dimensiones del papel:"
+msgstr "Dimensiones del papel: "
 
 msgid "Media Limits: "
-msgstr "Límites del papel:"
+msgstr "Límites del papel: "
 
 msgid "Media Name: "
-msgstr "Nombre del soporte"
+msgstr "Nombre del soporte"
 
 msgid "Media Size"
 msgstr "Tamaño de papel"
@@ -3497,7 +3382,7 @@ msgid "No printer-uri found!"
 msgstr "No se encontró printer-uri."
 
 msgid "No printer-uri in request!"
-msgstr ""
+msgstr "No hay printer-uri en la petición."
 
 msgid "No request-id"
 msgstr "No hay request-id"
@@ -3579,7 +3464,7 @@ msgid "Options Installed"
 msgstr "Opciones instaladas"
 
 msgid "Options: "
-msgstr "Opciones:"
+msgstr "Opciones: "
 
 msgid "Out of toner!"
 msgstr "No hay toner."
@@ -3599,8 +3484,7 @@ msgstr "La salida de la impresora %s se ha enviado a %s\n"
 
 #, c-format
 msgid "Output for printer %s is sent to remote printer %s on %s\n"
-msgstr ""
-"La salida de la impresora %s se ha enviado a la impresora remota %s en %s\n"
+msgstr "La salida de la impresora %s se ha enviado a la impresora remota %s en %s\n"
 
 #, c-format
 msgid "Output for printer %s/%s is sent to %s\n"
@@ -3608,9 +3492,7 @@ msgstr "La salida de la impresora %s/%s se ha enviado a %s\n"
 
 #, c-format
 msgid "Output for printer %s/%s is sent to remote printer %s on %s\n"
-msgstr ""
-"La salida de la impresora %s/%s se ha enviado a la impresora remota %s en %"
-"s\n"
+msgstr "La salida de la impresora %s/%s se ha enviado a la impresora remota %s en %s\n"
 
 msgid "Output tray missing!"
 msgstr "Falta la bandeja de salida."
@@ -3726,7 +3608,7 @@ msgid "Print Rate"
 msgstr "Tasa de impresión"
 
 msgid "Print Self-Test Page"
-msgstr "Iimprimir página de auto-prueba"
+msgstr "Imprimir página de auto-prueba"
 
 msgid "Print Speed"
 msgstr "Velocidad de impresión"
@@ -3741,13 +3623,13 @@ msgid "Print and Tear"
 msgstr "Imprimir y romper"
 
 msgid "Printed For: "
-msgstr "Impreso para:"
+msgstr "Impreso para: "
 
 msgid "Printed From: "
-msgstr "Impreso desde:"
+msgstr "Impreso desde: "
 
 msgid "Printed On: "
-msgstr "Impreso en:"
+msgstr "Impreso en: "
 
 msgid "Printer Added"
 msgstr "Impresora añadida"
@@ -3762,7 +3644,7 @@ msgid "Printer Modified"
 msgstr "Impresora modificada"
 
 msgid "Printer Name: "
-msgstr "Nombre de la impresora:"
+msgstr "Nombre de la impresora: "
 
 msgid "Printer Paused"
 msgstr "Impresora en pausa"
@@ -3791,10 +3673,8 @@ msgstr "Se ha alcanzado el límite de cuota."
 msgid "Rank    Owner   Job     File(s)                         Total Size\n"
 msgstr "Rango  Propiet. Trabajo Archivo(s)                      Tamaño total\n"
 
-msgid ""
-"Rank   Owner      Pri  Job        Files                       Total Size\n"
-msgstr ""
-"Rango  Propiet.   Pri  Trabajo    Archivos                    Tamaño total\n"
+msgid "Rank   Owner      Pri  Job        Files                       Total Size\n"
+msgstr "Rango  Propiet.   Pri  Trabajo    Archivos                    Tamaño total\n"
 
 msgid "Reject Jobs"
 msgstr "Rechazar trabajos"
@@ -3828,7 +3708,7 @@ msgid "Running command: %s %s -N -A %s -c '%s'\n"
 msgstr "Ejecutando comando: %s %s -N -A '%s -c '%s'\n"
 
 msgid "SCSI Printer"
-msgstr ""
+msgstr "Impresora SCSI"
 
 msgid "SEQUENCE uses indefinite length"
 msgstr "SEQUENCE usa una longitud indefinida"
@@ -3838,7 +3718,7 @@ msgstr "Ver otros"
 
 #, c-format
 msgid "Serial Port #%d"
-msgstr ""
+msgstr "Puerto serie #%d"
 
 msgid "Server Restarted"
 msgstr "Servidor reiniciado"
@@ -3932,29 +3812,18 @@ msgstr "No se ha podido encontrar el archivo PPD \"%s\"."
 msgid "The PPD file \"%s\" could not be opened: %s"
 msgstr "No se ha podido abrir el archivo PPD \"%s\": %s"
 
-msgid ""
-"The class name may only contain up to 127 printable characters and may not "
-"contain spaces, slashes (/), or the pound sign (#)."
-msgstr ""
-"El nombre de la clase sólo puede contener hasta 127 caracteres imprimibles y "
-"no puede contener espacios, barras (/), o la almohadilla (#)."
+msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
+msgstr "El nombre de la clase sólo puede contener hasta 127 caracteres imprimibles y no puede contener espacios, barras (/), o la almohadilla (#)."
 
-msgid ""
-"The notify-lease-duration attribute cannot be used with job subscriptions."
-msgstr ""
-"El atributo notify-lease-duration no puede ser usado con subscripciones de "
-"trabajos."
+msgid "The notify-lease-duration attribute cannot be used with job subscriptions."
+msgstr "El atributo notify-lease-duration no puede ser usado con subscripciones de trabajos."
 
 #, c-format
 msgid "The notify-user-data value is too large (%d > 63 octets)!"
 msgstr "El valor notify-user-data es demasiado grande (%d > 63 octetos)."
 
-msgid ""
-"The printer name may only contain up to 127 printable characters and may not "
-"contain spaces, slashes (/), or the pound sign (#)."
-msgstr ""
-"El nombre de la impresora sólo puede contener hasta 127 caracteres "
-"imprimibles y no puede contener espacios, barras (/), o la almohadilla (#)."
+msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
+msgstr "El nombre de la impresora sólo puede contener hasta 127 caracteres imprimibles y no puede contener espacios, barras (/), o la almohadilla (#)."
 
 msgid "The printer or class is not shared!"
 msgstr "La impresora o clase no está compartida."
@@ -3969,33 +3838,23 @@ msgstr "El printer-uri \"%s\" contiene caracteres incorrectos."
 msgid "The printer-uri attribute is required!"
 msgstr "Se necesita el atributo printer-uri."
 
-msgid ""
-"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
-msgstr ""
-"El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/classes/"
-"NOMBRE_CLASE\"."
+msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
+msgstr "El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/classes/NOMBRE_CLASE\"."
 
-msgid ""
-"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
-msgstr ""
-"El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/printers/"
-"NOMBRE_IMPRESORA\"."
+msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
+msgstr "El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/printers/NOMBRE_IMPRESORA\"."
 
-msgid ""
-"The subscription name may not contain spaces, slashes (/), question marks "
-"(?), or the pound sign (#)."
-msgstr ""
-"El nombre de la subscripción no puede contener espacios, barras (/), signos "
-"de interrogación (?), o la almohadilla (#)."
+msgid "The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#)."
+msgstr "El nombre de la subscripción no puede contener espacios, barras (/), signos de interrogación (?), o la almohadilla (#)."
 
 msgid "There are too many subscriptions."
-msgstr ""
+msgstr "Hay demasiadas subscripciones."
 
 msgid "Thermal Transfer Media"
 msgstr "Soporte de transferencia térmica"
 
 msgid "Title: "
-msgstr "Título:"
+msgstr "Título: "
 
 msgid "Toner low."
 msgstr "Toner bajo."
@@ -4058,7 +3917,7 @@ msgstr "Carta EE.UU. (pequeña)"
 
 #, c-format
 msgid "USB Serial Port #%d"
-msgstr ""
+msgstr "Puerto serie USB #%d"
 
 msgid "Unable to access cupsd.conf file:"
 msgstr "No se ha podido acceder al archivo cupsd.conf"
@@ -4096,21 +3955,15 @@ msgstr "No se ha podido conectar al servidor."
 
 #, c-format
 msgid "Unable to copy 64-bit CUPS printer driver files (%d)!"
-msgstr ""
-"No se han podido copiar los archivos del controlador de impresora de 64-bit "
-"de CUPS (%d)."
+msgstr "No se han podido copiar los archivos del controlador de impresora de 64-bit de CUPS (%d)."
 
 #, c-format
 msgid "Unable to copy 64-bit Windows printer driver files (%d)!"
-msgstr ""
-"No se han podido copiar los archivos del controlador de impresora de 64-bit "
-"de Windows (%d)."
+msgstr "No se han podido copiar los archivos del controlador de impresora de 64-bit de Windows (%d)."
 
 #, c-format
 msgid "Unable to copy CUPS printer driver files (%d)!"
-msgstr ""
-"No se han podido copiar los archivos del controlador de impresora de CUPS (%"
-"d)."
+msgstr "No se han podido copiar los archivos del controlador de impresora de CUPS (%d)."
 
 #, c-format
 msgid "Unable to copy PPD file - %s!"
@@ -4121,15 +3974,11 @@ msgstr "No se ha podido copiar el archivo PPD."
 
 #, c-format
 msgid "Unable to copy Windows 2000 printer driver files (%d)!"
-msgstr ""
-"No se han podido copiar los archivos del controlador de impresora de Windows "
-"2000 (%d)."
+msgstr "No se han podido copiar los archivos del controlador de impresora de Windows 2000 (%d)."
 
 #, c-format
 msgid "Unable to copy Windows 9x printer driver files (%d)!"
-msgstr ""
-"No se han podido copiar los archivos del controlador de impresora de Windows "
-"9x (%d)."
+msgstr "No se han podido copiar los archivos del controlador de impresora de Windows 9x (%d)."
 
 #, c-format
 msgid "Unable to copy interface script - %s!"
@@ -4179,15 +4028,11 @@ msgstr "No se ha podido obtener el estado de la impresora"
 
 #, c-format
 msgid "Unable to install Windows 2000 printer driver files (%d)!"
-msgstr ""
-"No se han podido instalar los archivos del controlador de impresora de "
-"Windows 2000 (%d)."
+msgstr "No se han podido instalar los archivos del controlador de impresora de Windows 2000 (%d)."
 
 #, c-format
 msgid "Unable to install Windows 9x printer driver files (%d)!"
-msgstr ""
-"No se han podido instalar los archivos del controlador de impresora de "
-"Windows 9x (%d)."
+msgstr "No se han podido instalar los archivos del controlador de impresora de Windows 9x (%d)."
 
 msgid "Unable to modify class:"
 msgstr "No se ha podido modificar la clase:"
@@ -4226,8 +4071,7 @@ msgstr "No se ha podido enviar un comando al controlador de la impresora."
 
 #, c-format
 msgid "Unable to set Windows printer driver (%d)!"
-msgstr ""
-"No se ha podido configurar el controlador de impresora de Windows (%d)."
+msgstr "No se ha podido configurar el controlador de impresora de Windows (%d)."
 
 msgid "Unable to set options:"
 msgstr "No se han podido cambiar las opciones:"
@@ -4346,14 +4190,10 @@ msgstr ""
 "\n"
 "Opciones:\n"
 "\n"
-"  -f nombrearchivo          Establece el archivo a convertir (de otro modo, "
-"stdin)\n"
-"  -o nombrearchivo          Establece el archivo a generar (de otro modo, "
-"stdout)\n"
-"  -i tipo/mime         Establece el tipo MIME de entrada (de otro modo, auto-"
-"tipado)\n"
-"  -j tipo/mime         Establece el tipo MIME de salida (de otro modo, "
-"application/pdf)\n"
+"  -f nombrearchivo          Establece el archivo a convertir (de otro modo, stdin)\n"
+"  -o nombrearchivo          Establece el archivo a generar (de otro modo, stdout)\n"
+"  -i tipo/mime         Establece el tipo MIME de entrada (de otro modo, auto-tipado)\n"
+"  -j tipo/mime         Establece el tipo MIME de salida (de otro modo, application/pdf)\n"
 "  -P nombrearchivo.ppd      Establece el archivo PPD\n"
 "  -a 'nombre=valor ...'  Establece opcion(es)\n"
 "  -U nombreusuario          Establece el nombre de usuario del trabajo\n"
@@ -4378,8 +4218,7 @@ msgstr ""
 "       cupsaddsmb [opciones] -a\n"
 "\n"
 "Opciones:\n"
-"  -E               Hace que se use encriptación en la conexión con el "
-"servidor\n"
+"  -E               Hace que se use encriptación en la conexión con el servidor\n"
 "  -H servidor_samba  Usa el servidor SAMBA especificado\n"
 "  -U usuario_samba    Autentifica usando el usuario SAMBA especificado\n"
 "  -a               Exporta todas las impresoras\n"
@@ -4414,10 +4253,8 @@ msgstr ""
 "    --[no-]remote-admin     Activar o desactivar la administración remota\n"
 "    --[no-]remote-any       Permitir o impedir el acceso desde Internet\n"
 "    --[no-]remote-printers  Mostrar u ocultar las impresoras remotas\n"
-"    --[no-]share-printers   Activar o desactivar la compartición de "
-"impresoras\n"
-"    --[no-]user-cancel-any  Permitir o impedir a los usuarios cancelar "
-"cualquier trabajo\n"
+"    --[no-]share-printers   Activar o desactivar la compartición de impresoras\n"
+"    --[no-]user-cancel-any  Permitir o impedir a los usuarios cancelar cualquier trabajo\n"
 
 msgid ""
 "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n"
@@ -4453,8 +4290,7 @@ msgstr ""
 "Opciones:\n"
 "\n"
 "  -c cupsd.conf    Establecer el archivo cupsd.conf a usar\n"
-"  -j id-trabajo[,N]    Filtrar el archivo N del trabajo especificado (valor "
-"predeterminado 1)\n"
+"  -j id-trabajo[,N]    Filtrar el archivo N del trabajo especificado (valor predeterminado 1)\n"
 "  -n copias        Establecer el número de copias\n"
 "  -o nombre=valor    Establecer las opciones\n"
 "  -p nombre_archivo.ppd  Especificar el archivo PPD\n"
@@ -4468,8 +4304,7 @@ msgid ""
 "\n"
 "    -h       Show program usage\n"
 "\n"
-"    Note: this program only validates the DSC comments, not the PostScript "
-"itself.\n"
+"    Note: this program only validates the DSC comments, not the PostScript itself.\n"
 msgstr ""
 "Uso: cupstestdsc [opciones] nombre_archivo.ps [... nombre_archivo.ps]\n"
 "       cupstestdsc [opciones] -\n"
@@ -4478,8 +4313,7 @@ msgstr ""
 "\n"
 "    -h       Muestra cómo se usa el programa\n"
 "\n"
-"    Nota: este programa sólo valida los comentarios DSC, no el PostScript en "
-"sí mismo.\n"
+"    Nota: este programa sólo valida los comentarios DSC, no el PostScript en sí mismo.\n"
 
 msgid ""
 "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n"
@@ -4495,8 +4329,7 @@ msgid ""
 "    -v                   Be slightly verbose\n"
 "    -vv                  Be very verbose\n"
 msgstr ""
-"Uso: cupstestppd [opciones] nombre_archivo1.ppd[.gz] [... nombre_archivoN.ppd"
-"[.gz]]\n"
+"Uso: cupstestppd [opciones] nombre_archivo1.ppd[.gz] [... nombre_archivoN.ppd[.gz]]\n"
 "       programa | cupstestppd [opciones] -\n"
 "\n"
 "Opciones:\n"
@@ -4535,11 +4368,8 @@ msgstr ""
 "       lppasswd [-g nombre_grupo] -a [nombre_usuario]\n"
 "       lppasswd [-g nombre_grupo] -x [nombre_usuario]\n"
 
-msgid ""
-"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n"
-msgstr ""
-"Uso: lpq (-P dest) (-U nombre_usuario) (-h nombre_ordenador(:puerto)) (-l) "
-"(+intervalo)\n"
+msgid "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n"
+msgstr "Uso: lpq (-P dest) (-U nombre_usuario) (-h nombre_ordenador(:puerto)) (-l) (+intervalo)\n"
 
 msgid ""
 "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n"
@@ -4610,8 +4440,7 @@ msgid ""
 "  -I include-dir    Add include directory to search path.\n"
 "  -v                Be verbose (more v's for more verbosity).\n"
 msgstr ""
-"Uso: ppdpo [opciones] -o nombre_archivo.po nombre_archivo.drv [ ... "
-"nombre_archivoN.drv ]\n"
+"Uso: ppdpo [opciones] -o nombre_archivo.po nombre_archivo.drv [ ... nombre_archivoN.drv ]\n"
 "Opciones:\n"
 "  -D nombre=valor        Establece la variable nombre al valor.\n"
 "  -I include-dir    Añade el directorio include a la ruta de búsqueda.\n"
@@ -4635,8 +4464,7 @@ msgstr "WARNING: Añadiendo sólo las primeras %d impresoras encontradas"
 
 #, c-format
 msgid "WARNING: Boolean expected for waiteof option \"%s\"\n"
-msgstr ""
-"WARNING: Se esperaba un valor booleano para la opción waiteof \"%s\".\n"
+msgstr "WARNING: Se esperaba un valor booleano para la opción waiteof \"%s\".\n"
 
 msgid "WARNING: Failed to read side-channel request!\n"
 msgstr "WARNING: No se ha podido leer la petición del canal lateral.\n"
@@ -4652,41 +4480,23 @@ msgid "WARNING: Printer sent unexpected EOF\n"
 msgstr "WARNING: La impresora envió un EOF inesperado\n"
 
 #, c-format
-msgid ""
-"WARNING: Remote host did not respond with command status byte after %d "
-"seconds!\n"
-msgstr ""
-"WARNING: El ordenador remoto no ha respondido con el byte de estado del "
-"comando después de %d segundos.\n"
+msgid "WARNING: Remote host did not respond with command status byte after %d seconds!\n"
+msgstr "WARNING: El ordenador remoto no ha respondido con el byte de estado del comando después de %d segundos.\n"
 
 #, c-format
-msgid ""
-"WARNING: Remote host did not respond with control status byte after %d "
-"seconds!\n"
-msgstr ""
-"WARNING: El ordenador remoto no ha respondido con el byte de estado de "
-"control después de %d segundos.\n"
+msgid "WARNING: Remote host did not respond with control status byte after %d seconds!\n"
+msgstr "WARNING: El ordenador remoto no ha respondido con el byte de estado de control después de %d segundos.\n"
 
 #, c-format
-msgid ""
-"WARNING: Remote host did not respond with data status byte after %d "
-"seconds!\n"
-msgstr ""
-"WARNING: El ordenador remoto no ha respondido con el byte de estado de los "
-"datos después de %d segundos.\n"
+msgid "WARNING: Remote host did not respond with data status byte after %d seconds!\n"
+msgstr "WARNING: El ordenador remoto no ha respondido con el byte de estado de los datos después de %d segundos.\n"
 
 #, c-format
 msgid "WARNING: SCSI command timed out (%d); retrying...\n"
-msgstr ""
-"WARNING: Agotado el tiempo de espera para el comando SCSI (%d); "
-"reintentando...\n"
+msgstr "WARNING: Agotado el tiempo de espera para el comando SCSI (%d); reintentando...\n"
 
-msgid ""
-"WARNING: This document does not conform to the Adobe Document Structuring "
-"Conventions and may not print correctly!\n"
-msgstr ""
-"WARNING: Este documento no se ajusta a las Convenciones de Estructuración de "
-"Documentos de Adobe y puede que no se imprima correctamente.\n"
+msgid "WARNING: This document does not conform to the Adobe Document Structuring Conventions and may not print correctly!\n"
+msgstr "WARNING: Este documento no se ajusta a las Convenciones de Estructuración de Documentos de Adobe y puede que no se imprima correctamente.\n"
 
 #, c-format
 msgid "WARNING: Unable to open \"%s:%s\": %s\n"
@@ -4720,28 +4530,18 @@ msgid "WARNING: number expected for status option \"%s\"\n"
 msgstr "WARNING: se esperaba un número para la opción de estado \"%s\"\n"
 
 #, c-format
-msgid ""
-"WARNING: recoverable: Network host '%s' is busy; will retry in %d "
-"seconds...\n"
-msgstr ""
-"WARNING: recuperable: El ordenador de red '%s' está ocupado; reintento en %d "
-"segundos...\n"
+msgid "WARNING: recoverable: Network host '%s' is busy; will retry in %d seconds...\n"
+msgstr "WARNING: recuperable: El ordenador de red '%s' está ocupado; reintento en %d segundos...\n"
 
 msgid "Warning, no Windows 2000 printer drivers are installed!"
-msgstr ""
-"Advertencia, no está instalado ningún controlador de impresora de Windows "
-"2000."
+msgstr "Advertencia, no está instalado ningún controlador de impresora de Windows 2000."
 
 msgid "Yes"
 msgstr "Si"
 
 #, c-format
-msgid ""
-"You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%"
-"s:%d%s</A>."
-msgstr ""
-"Debe acceder a esta página usando el URL <A HREF=\"https://%s:%d%s\">https://"
-"%s:%d%s</A>."
+msgid "You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
+msgstr "Debe acceder a esta página usando el URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
 
 msgid "You4 Envelope"
 msgstr "Sobre You4"
@@ -4787,9 +4587,7 @@ msgid "cupsctl: Unknown option \"-%c\"!\n"
 msgstr "cupsctl: Opción \"-%c\" desconocida.\n"
 
 msgid "cupsd: Expected config filename after \"-c\" option!\n"
-msgstr ""
-"cupsd: Se esperaba un nombre de archivo de configuración tras la opción \"-c"
-"\".\n"
+msgstr "cupsd: Se esperaba un nombre de archivo de configuración tras la opción \"-c\".\n"
 
 msgid "cupsd: Unable to get current directory!\n"
 msgstr "cupsd: No se ha podido obtener el directorio actual.\n"
@@ -4803,9 +4601,7 @@ msgid "cupsd: Unknown option \"%c\" - aborting!\n"
 msgstr "cupsd: Opción \"%c\" desconocida - cancelando.\n"
 
 msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n"
-msgstr ""
-"cupsd: el uso de launchd(8) no ha sido compilado, ejecutándose en modo "
-"normal.\n"
+msgstr "cupsd: el uso de launchd(8) no ha sido compilado, ejecutándose en modo normal.\n"
 
 #, c-format
 msgid "cupsfilter: Invalid document number %d!\n"
@@ -4859,8 +4655,7 @@ msgid "job-printer-uri attribute missing!"
 msgstr "Falta el atributo job-printer-uri."
 
 msgid "lpadmin: Class name can only contain printable characters!\n"
-msgstr ""
-"lpadmin: El nombre de la clase sólo puede contener caracteres imprimibles.\n"
+msgstr "lpadmin: El nombre de la clase sólo puede contener caracteres imprimibles.\n"
 
 msgid "lpadmin: Expected PPD after '-P' option!\n"
 msgstr "lpadmin: Se esperaba un PPD tras la opción '-P'.\n"
@@ -4919,9 +4714,7 @@ msgid "lpadmin: Printer %s is not a member of class %s.\n"
 msgstr "lpadmin: La impresora %s no es miembro de la clase %s.\n"
 
 msgid "lpadmin: Printer name can only contain printable characters!\n"
-msgstr ""
-"lpadmin: El nombre de la impresora sólo puede contener caracteres "
-"imprimibles.\n"
+msgstr "lpadmin: El nombre de la impresora sólo puede contener caracteres imprimibles.\n"
 
 msgid ""
 "lpadmin: Unable to add a printer to the class:\n"
@@ -5019,15 +4812,13 @@ msgid "lpadmin: Unknown option '%c'!\n"
 msgstr "lpadmin: Opción '%c' desconocida.\n"
 
 msgid "lpadmin: Warning - content type list ignored!\n"
-msgstr ""
-"lpadmin: Advertencia - lista de tipo de contenido no tenida en cuenta.\n"
+msgstr "lpadmin: Advertencia - lista de tipo de contenido no tenida en cuenta.\n"
 
 msgid "lpc> "
 msgstr "lpc> "
 
 msgid "lpinfo: Expected 1284 device ID string after --device-id!\n"
-msgstr ""
-"lpinfo: Se esperaba una cadena ID de dispositivo 1284 tras --device-id.\n"
+msgstr "lpinfo: Se esperaba una cadena ID de dispositivo 1284 tras --device-id.\n"
 
 msgid "lpinfo: Expected language after --language!\n"
 msgstr "lpinfo: Se esperaba un idioma tras --language.\n"
@@ -5039,10 +4830,10 @@ msgid "lpinfo: Expected product string after --product!\n"
 msgstr "lpinfo: Se esperaba una cadena de producto tras --product.\n"
 
 msgid "lpinfo: Expected scheme list after --exclude-schemes!\n"
-msgstr ""
+msgstr "lpinfo: Se esperaba una lista de esquemas tras --exclude-schemes.\n"
 
 msgid "lpinfo: Expected scheme list after --include-schemes!\n"
-msgstr ""
+msgstr "lpinfo: Se esperaba una lista de esquemas tras --include-schemes.\n"
 
 msgid "lpinfo: Expected timeout after --timeout!\n"
 msgstr "lpinfo: Se esperaba un tiempo tras --timeout.\n"
@@ -5127,9 +4918,7 @@ msgstr "lppasswd: No se ha podido escribir en el archivo de contraseñas: %s\n"
 
 #, c-format
 msgid "lppasswd: failed to backup old password file: %s\n"
-msgstr ""
-"lppasswd: falló al hacer una copia de seguridad del antiguo archivo de "
-"contraseñas: %s\n"
+msgstr "lppasswd: falló al hacer una copia de seguridad del antiguo archivo de contraseñas: %s\n"
 
 #, c-format
 msgid "lppasswd: failed to rename password file: %s\n"
@@ -5140,12 +4929,8 @@ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n"
 msgstr "lppasswd: el usuario \"%s\" y el grupo \"%s\" no existen.\n"
 
 #, c-format
-msgid ""
-"lpstat: error - %s environment variable names non-existent destination \"%s"
-"\"!\n"
-msgstr ""
-"lpstat: error - Los nombre de variable de entorno %s no existen en el "
-"destino \"%s\".\n"
+msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "lpstat: error - Los nombre de variable de entorno %s no existen en el destino \"%s\".\n"
 
 #, c-format
 msgid "members of class %s:\n"
@@ -5221,8 +5006,7 @@ msgstr "ppdc: Se esperaba un valor lógico en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected charset after Font on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba un juego de caracteres tras Font en la línea %d de %s.\n"
+msgstr "ppdc: Se esperaba un juego de caracteres tras Font en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected choice code on line %d of %s.\n"
@@ -5234,8 +5018,7 @@ msgstr "ppdc: Se esperaba un nombre/texto apropiado en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba un orden de color para ColorModel en la línea %d de %s.\n"
+msgstr "ppdc: Se esperaba un orden de color para ColorModel en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n"
@@ -5247,16 +5030,11 @@ msgstr "ppdc: Se esperaba compresión para ColorModel en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba una cadena de restricciones para UIConstraints en la línea "
-"%d de %s.\n"
+msgstr "ppdc: Se esperaba una cadena de restricciones para UIConstraints en la línea %d de %s.\n"
 
 #, c-format
-msgid ""
-"ppdc: Expected driver type keyword following DriverType on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba una clave de tipo de controlador tras DriverType en la "
-"línea %d de %s.\n"
+msgid "ppdc: Expected driver type keyword following DriverType on line %d of %s!\n"
+msgstr "ppdc: Se esperaba una clave de tipo de controlador tras DriverType en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n"
@@ -5268,8 +5046,7 @@ msgstr "ppdc: Se esperaba una codificación tras Font en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected filename after #po %s on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba un nombre de archivo tras #po %s en la línea %d de %s.\n"
+msgstr "ppdc: Se esperaba un nombre de archivo tras #po %s en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected group name/text on line %d of %s!\n"
@@ -5321,19 +5098,15 @@ msgstr "ppdc: Se esperaba un nombre/texto tras %s en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected name/text after Installable on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba un nombre/texto tras Installable en la línea %d de %s.\n"
+msgstr "ppdc: Se esperaba un nombre/texto tras Installable en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba un nombre/texto tras Resolution en la línea %d de %s.\n"
+msgstr "ppdc: Se esperaba un nombre/texto tras Resolution en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba una combinación nombre/texto para ColorModel en la línea %"
-"d de %s.\n"
+msgstr "ppdc: Se esperaba una combinación nombre/texto para ColorModel en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected option name/text on line %d of %s!\n"
@@ -5349,29 +5122,19 @@ msgstr "ppdc: Se esperaba un tipo de opción en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected override field after Resolution on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba un campo de anulación tras Resolution en la línea %d de %"
-"s.\n"
+msgstr "ppdc: Se esperaba un campo de anulación tras Resolution en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected real number on line %d of %s!\n"
 msgstr "ppdc: Se esperaba un número real en la línea %d de %s.\n"
 
 #, c-format
-msgid ""
-"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %"
-"s!\n"
-msgstr ""
-"ppdc: Se esperaba resolución/tipo de soporte tras ColorProfile en la línea %"
-"d de %s.\n"
+msgid "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s!\n"
+msgstr "ppdc: Se esperaba resolución/tipo de soporte tras ColorProfile en la línea %d de %s.\n"
 
 #, c-format
-msgid ""
-"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d "
-"of %s!\n"
-msgstr ""
-"ppdc: Se esperaba resolución/tipo de soporte tras SimpleColorProfile en la "
-"línea %d de %s.\n"
+msgid "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s!\n"
+msgstr "ppdc: Se esperaba resolución/tipo de soporte tras SimpleColorProfile en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected selector after %s on line %d of %s!\n"
@@ -5411,14 +5174,11 @@ msgstr "ppdc: Coste incorrecto para el filtro en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n"
-msgstr ""
-"ppdc: Tipo MIME vacío incorrecto para el filtro en la línea %d de %s.\n"
+msgstr "ppdc: Tipo MIME vacío incorrecto para el filtro en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n"
-msgstr ""
-"ppdc: Nombre de programa vacío incorrecto para el filtro en la línea %d de %"
-"s.\n"
+msgstr "ppdc: Nombre de programa vacío incorrecto para el filtro en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n"
@@ -5454,8 +5214,7 @@ msgstr "ppdc: No se ha proporcionado catálogo de mensajes para el idioma %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"
+msgstr "ppdc: La 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"
@@ -5483,14 +5242,11 @@ msgstr "ppdc: No se ha podido ejecutar cupstestppd: %s\n"
 
 #, c-format
 msgid "ppdc: Unable to find #po file %s on line %d of %s!\n"
-msgstr ""
-"ppdc: No se ha podido encontrar el archivo #po %s en la línea %d de %s.\n"
+msgstr "ppdc: No se ha podido encontrar el archivo #po %s en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n"
-msgstr ""
-"ppdc: No se ha podido encontrar el archivo include \"%s\" en la línea %d de %"
-"s.\n"
+msgstr "ppdc: No se ha podido encontrar el archivo include \"%s\" en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Unable to find localization for \"%s\" - %s\n"
@@ -5521,11 +5277,8 @@ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n"
 msgstr "ppdc: Elemento desconocido \"%s\" visto en la línea %d de %s.\n"
 
 #, c-format
-msgid ""
-"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s!\n"
-msgstr ""
-"ppdc: Caracteres finales desconocidos en el número real \"%s\" en la línea %"
-"d de %s.\n"
+msgid "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s!\n"
+msgstr "ppdc: Caracteres finales desconocidos en el número real \"%s\" en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n"
@@ -5616,22 +5369,5 @@ msgid "untitled"
 msgstr "sin título"
 
 msgid "variable-bindings uses indefinite length"
-msgstr "Variable-bindings usa una longitud indefinida"
-
-#~ msgid "INFO: Attempting to connect to host %s for printer %s\n"
-#~ msgstr "INFO: Intentando conectar al ordenador %s para la impresora %s\n"
-
-#~ msgid "INFO: Attempting to connect to host %s on port %d\n"
-#~ msgstr "INFO: Intentando conectar al ordenador %s en el puerto %d\n"
-
-#~ msgid "INFO: Connected to %s...\n"
-#~ msgstr "INFO: Conectado a %s...\n"
-
-#~ msgid "INFO: Connecting to %s on port %d...\n"
-#~ msgstr "INFO: Conectando con %s en el puerto %d...\n"
-
-#~ msgid "INFO: Looking for \"%s\"...\n"
-#~ msgstr "INFO: Buscando \"%s\"...\n"
+msgstr "variable-bindings usa una longitud indefinida"
 
-#~ msgid "lpinfo: Unable to connect to server: %s\n"
-#~ msgstr "lpinfo: No se ha podido conectar al servidor: %s\n"
index 27765501cde8bb96ee248925e25a1c8b2ea83547..2116b193009eabdb7029fb6bde1e04db5ed3ea2a 100644 (file)
@@ -4,7 +4,7 @@
 #   ESP Package Manager (EPM) file list 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
@@ -628,6 +628,7 @@ f 0644 root sys $DOCDIR/help/options.html doc/help/options.html
 f 0644 root sys $DOCDIR/help/overview.html doc/help/overview.html
 f 0644 root sys $DOCDIR/help/policies.html doc/help/policies.html
 f 0644 root sys $DOCDIR/help/security.html doc/help/security.html
+f 0644 root sys $DOCDIR/help/sharing.html doc/help/sharing.html
 f 0644 root sys $DOCDIR/help/standard.html doc/help/standard.html
 f 0644 root sys $DOCDIR/help/translation.html doc/help/translation.html
 f 0644 root sys $DOCDIR/help/whatsnew.html doc/help/whatsnew.html
index c9b22430fb1b23d0f59e23f7e9cae1d4b8ae3c56..9dd3885838eba8ca55e6edfebaca3ea030af34a7 100644 (file)
@@ -5,7 +5,7 @@
 #
 #   Original version by Jason McMullan <jmcc@ontv.com>.
 #
-#   Copyright 2007-2008 by Apple Inc.
+#   Copyright 2007-2009 by Apple Inc.
 #   Copyright 1999-2007 by Easy Software Products, all rights reserved.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -259,6 +259,7 @@ rm -rf $RPM_BUILD_ROOT
 /usr/share/doc/cups/help/policies.html
 /usr/share/doc/cups/help/ref-*.html
 /usr/share/doc/cups/help/security.html
+/usr/share/doc/cups/help/sharing.html
 /usr/share/doc/cups/help/standard.html
 /usr/share/doc/cups/help/translation.html
 /usr/share/doc/cups/help/whatsnew.html
index c6e0dda53cd8ed112610561015747a5e5f2f44e7..31c857f060cc43677f0a983c19d41b57d15e7faa 100644 (file)
@@ -3,7 +3,7 @@
 //
 //   PPD file compiler definitions for the CUPS PPD Compiler.
 //
-//   Copyright 2007-2008 by Apple Inc.
+//   Copyright 2007-2009 by Apple Inc.
 //   Copyright 2002-2006 by Easy Software Products.
 //
 //   These coded instructions, statements, and computer programs are the
@@ -945,7 +945,8 @@ ppdcDriver::write_ppd_file(
         continue;
 
       if (!o->text->value || !strcmp(o->name->value, o->text->value))
-       cupsFilePrintf(fp, "*OpenUI *%s: ", o->name->value);
+       cupsFilePrintf(fp, "*OpenUI *%s: ", o->name->value,
+                      catalog->find_message(o->name->value));
       else
        cupsFilePrintf(fp, "*OpenUI *%s/%s: ", o->name->value,
                       catalog->find_message(o->text->value));
@@ -1008,7 +1009,8 @@ ppdcDriver::write_ppd_file(
       {
         // Write this choice...
        if (!c->text->value || !strcmp(c->name->value, c->text->value))
-          cupsFilePrintf(fp, "*%s %s: \"%s\"%s", o->name->value, c->name->value,
+          cupsFilePrintf(fp, "*%s %s: \"%s\"%s", o->name->value,
+                        catalog->find_message(c->name->value),
                         c->code->value, lf);
         else
           cupsFilePrintf(fp, "*%s %s/%s: \"%s\"%s", o->name->value,
index d95f2d6ccc7e385ac181ff06467da946171952e3..b4e31fc52a11e837f23465a3ba29977991b56517 100644 (file)
@@ -3,7 +3,7 @@
 //
 //   Source class for the CUPS PPD Compiler.
 //
-//   Copyright 2007-2008 by Apple Inc.
+//   Copyright 2007-2009 by Apple Inc.
 //   Copyright 2002-2007 by Easy Software Products.
 //
 //   These coded instructions, statements, and computer programs are the
@@ -3422,15 +3422,15 @@ ppdcSource::write_file(const char *f)   // I - File to write
       quotef(fp, "  Copyright \"%s\"\n", st->value);
 
     // Write other strings and values...
-    if (d->manufacturer->value)
+    if (d->manufacturer && d->manufacturer->value)
       quotef(fp, "  Manufacturer \"%s\"\n", d->manufacturer->value);
     if (d->model_name->value)
       quotef(fp, "  ModelName \"%s\"\n", d->model_name->value);
-    if (d->file_name->value)
+    if (d->file_name && d->file_name->value)
       quotef(fp, "  FileName \"%s\"\n", d->file_name->value);
-    if (d->pc_file_name->value)
+    if (d->pc_file_name && d->pc_file_name->value)
       quotef(fp, "  PCFileName \"%s\"\n", d->pc_file_name->value);
-    if (d->version->value)
+    if (d->version && d->version->value)
       quotef(fp, "  Version \"%s\"\n", d->version->value);
 
     cupsFilePrintf(fp, "  DriverType %s\n", driver_types[d->type]);
index fe533ba9fce777221ffa2107e17e1388e9f3c5e3..c32b2acf4199741f19d0850d51ecb3d1e64c122f 100644 (file)
@@ -202,7 +202,7 @@ add_ui_strings(ppdcDriver  *d,              // I - Driver data
       if (!o->choices->count)
         continue;
 
-      if (o->text->value && strcmp(o->name->value, o->text->value))
+      if (o->text->value)
         catalog->add_message(o->text->value);
       else
         catalog->add_message(o->name->value);
@@ -210,7 +210,7 @@ add_ui_strings(ppdcDriver  *d,              // I - Driver data
       for (c = (ppdcChoice *)o->choices->first();
            c;
           c = (ppdcChoice *)o->choices->next())
-       if (c->text->value && strcmp(c->name->value, c->text->value))
+       if (c->text->value)
           catalog->add_message(c->text->value);
         else
           catalog->add_message(c->name->value);
index 668da3ee197f1cf8e8049451ba832a7f9603b60a..e9e3e73f49ba6942011ebe93c0d69151b507b442 100644 (file)
@@ -4714,7 +4714,18 @@ copy_attrs(ipp_t        *to,             /* I - Destination request */
       continue;
 
     if (!ra || cupsArrayFind(ra, fromattr->name))
+    {
+     /*
+      * Don't send collection attributes by default to IPP/1.x clients
+      * since many do not support collections...
+      */
+
+      if (fromattr->value_tag == IPP_TAG_BEGIN_COLLECTION &&
+          !ra && to->request.status.version[0] == 1)
+       continue;
+
       copy_attribute(to, fromattr, quickcopy);
+    }
   }
 }
 
index 9bdacc3266756f151f39020bd3b4579d65efcb2b..d5c1cfe447e1f1acb5b3ed80259ad2b6617d0503 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Job management routines 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
@@ -3874,16 +3874,18 @@ update_job(cupsd_job_t *job)            /* I - Job to check */
 #ifdef __APPLE__
     else if (!strncmp(message, "recoverable:", 12))
     {
-      cupsdSetPrinterReasons(job->printer,
-                             "+com.apple.print.recoverable-warning");
-
       ptr = message + 12;
       while (isspace(*ptr & 255))
         ptr ++;
 
-      cupsdSetString(&job->printer->recoverable, ptr);
-      cupsdAddPrinterHistory(job->printer);
-      event |= CUPSD_EVENT_PRINTER_STATE;
+      if (*ptr)
+      {
+       cupsdSetPrinterReasons(job->printer,
+                              "+com.apple.print.recoverable-warning");
+       cupsdSetString(&job->printer->recoverable, ptr);
+       cupsdAddPrinterHistory(job->printer);
+       event |= CUPSD_EVENT_PRINTER_STATE;
+      }
     }
     else if (!strncmp(message, "recovered:", 10))
     {
@@ -4035,9 +4037,14 @@ update_job_attrs(cupsd_job_t *job,       /* I - Job to update */
                                         "job-printer-state-reasons",
                                         num_reasons, NULL, NULL);
   }
+  else if (job->printer_reasons)
+  {
+    for (i = 0; i < job->printer_reasons->num_values; i ++)
+      _cupsStrFree(job->printer_reasons->values[i].string.text);
+  }
 
   for (i = 0; i < num_reasons; i ++)
-    cupsdSetString(&(job->printer_reasons->values[i].string.text), reasons[i]);
+    job->printer_reasons->values[i].string.text = _cupsStrAlloc(reasons[i]);
 }
 
 
index e4029cd1cf90acab745d487c3841b9235f4039ed..d32a09b8f7939d70ef16fb46e32f34ca14bfa17b 100644 (file)
@@ -359,6 +359,13 @@ cupsdCreateCommonData(void)
                  ,"gzip"
 #endif /* HAVE_LIBZ */
                };
+  static const char * const media_col_supported[] =
+               {                       /* media-col-supported values */
+                 "media-color",
+                 "media-key",
+                 "media-size",
+                 "media-type"
+               };
   static const char * const multiple_document_handling[] =
                {                       /* multiple-document-handling-supported values */
                  "separate-documents-uncollated-copies",
@@ -517,6 +524,13 @@ cupsdCreateCommonData(void)
     ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_NAME | IPP_TAG_COPY,
                  "job-sheets-supported", NULL, "none");
 
+  /* media-col-supported */
+  ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
+                "media-col-supported",
+                sizeof(media_col_supported) /
+                   sizeof(media_col_supported[0]), NULL,
+               media_col_supported);
+
   /* multiple-document-handling-supported */
   ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
                 "multiple-document-handling-supported",
@@ -3522,15 +3536,6 @@ add_printer_filter(
     }
   }
 
- /*
-  * Mark the CUPS_PRINTER_COMMANDS bit if we have a filter for
-  * application/vnd.cups-command...
-  */
-
-  if (!strcasecmp(super, "application") &&
-      !strcasecmp(type, "vnd.cups-command"))
-    p->type |= CUPS_PRINTER_COMMANDS;
-
  /*
   * Add the filter to the MIME database, supporting wildcards as needed...
   */
@@ -3803,6 +3808,8 @@ load_ppd(cupsd_printer_t *p)              /* I - Printer */
   ppd_attr_t   *ppd_attr;              /* PPD attribute */
   _cups_pwg_media_t *pwgmedia;         /* Matching PWG size name */
   ipp_attribute_t *attr;               /* Attribute data */
+  ipp_t                *media_col_default,     /* media-col-default collection value */
+               *media_size;            /* media-size collection value */
   ipp_value_t  *val;                   /* Attribute value */
   int          num_finishings;         /* Number of finishings */
   int          finishings[5];          /* finishings-supported values */
@@ -3965,9 +3972,39 @@ load_ppd(cupsd_printer_t *p)             /* I - Printer */
            }
 
            if (size->marked)
+           {
+            /*
+             * Add media-default...
+             */
+
              ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
-                          "media-default", NULL,
-                          _cupsStrRetain(val->string.text));
+                          "media-default", NULL, val->string.text);
+
+             /*
+             * Add media-col-default...
+             */
+
+             media_size = ippNew();
+             ippAddInteger(media_size, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
+                           "x-dimension", (int)(size->width * 2540.0 / 72.0));
+             ippAddInteger(media_size, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
+                           "y-dimension", (int)(size->length * 2540.0 / 72.0));
+
+             media_col_default = ippNew();
+             ippAddString(media_col_default, IPP_TAG_PRINTER,
+                          IPP_TAG_KEYWORD | IPP_TAG_COPY, "media-color", NULL,
+                          "white");
+             ippAddString(media_col_default, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
+                          "media-key", NULL,val->string.text);
+             ippAddCollection(media_col_default, IPP_TAG_PRINTER, "media-size",
+                              media_size);
+             ippAddString(media_col_default, IPP_TAG_PRINTER,
+                          IPP_TAG_KEYWORD | IPP_TAG_COPY, "media-type", NULL,
+                          "stationary");
+
+              ippAddCollection(p->ppd_attrs, IPP_TAG_PRINTER,
+                              "media-col-default", media_col_default);
+           }
 
             val ++;
          }
@@ -4100,6 +4137,10 @@ load_ppd(cupsd_printer_t *p)             /* I - Printer */
     {
       DEBUG_printf(("ppd->filters[%d] = \"%s\"\n", i, ppd->filters[i]));
       add_string_array(&(p->filters), ppd->filters[i]);
+
+      if (!strncasecmp(ppd->filters[i], "application/vnd.cups-command", 28) &&
+          isspace(ppd->filters[i][28] & 255))
+        p->type |= CUPS_PRINTER_COMMANDS;
     }
 
     if (ppd->num_filters == 0)
@@ -4123,7 +4164,8 @@ load_ppd(cupsd_printer_t *p)              /* I - Printer */
 
       for (i = 0; i < ppd->num_filters; i ++)
        if (!strncasecmp(ppd->filters[i],
-                        "application/vnd.cups-postscript", 31))
+                        "application/vnd.cups-postscript", 31) &&
+            isspace(ppd->filters[i][31] & 255))
          break;
 
       if (i < ppd->num_filters)
index c334e99eb68082a753c93479bef3bc02031eda37..6218b4d6fd0b0eced67853e2b2308ecf33db92db 100644 (file)
@@ -188,8 +188,7 @@ mimeAddTypeRule(mime_type_t *mt,    /* I - Type to add to */
     else if (*rule == '+' && current != NULL)
     {
       if (logic != MIME_MAGIC_AND &&
-          current != NULL && current->prev != NULL &&
-         current->prev->prev != NULL)
+          current != NULL && current->prev != NULL)
       {
        /*
         * OK, we have more than 1 rule in the current tree level...  Make a
index 91c2b06f0aa4cc686bc31f620262e0391f84fc79..89d77ced6744745d2829f1cf09f813ae36b459c7 100644 (file)
@@ -28,7 +28,7 @@
 <TD><INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STARTED" {?EVENT_SERVER_STARTED}>Servidor iniciado<BR>
 <INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STOPPED" {?EVENT_SERVER_STOPPED}>Servidor parado<BR>
 <INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_RESTARTED" {?EVENT_SERVER_RESTARTED}>Servidor reiniciado<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_AUDIT" {?EVENT_SERVER_AUDIT}>Auditoría de seguridad del servidor</TD>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_AUDIT" {?EVENT_SERVER_AUDIT}>Auditor&iacute;a de seguridad del servidor</TD>
 </TR>
 <TR>
 <TH CLASS="label">N&uacute;mero m&aacute;ximo de eventos del canal:</TH>
index e50409e8b7bb43529545671243723e40508a278d..a16eb4ed2a1075b80c9626afc9b0a9026c012d38 100644 (file)
@@ -83,7 +83,7 @@
 <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Guardar informaci&oacute;n de depuraci&oacute;n para b&uacute;squeda de problemas</P>
 
 }
-<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Cambiar configuración"></P>
+<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Cambiar configuraci&oacute;n"></P>
 
 </FORM>}
 
index 80b20fd185b363066a6bc70cb98f20add5f0b0b8..d584108e83664e11a4fb84deee9bb01f13dcedf0 100644 (file)
@@ -1,9 +1,9 @@
 <DIV CLASS="indent">
 
-<H2 CLASS="title">Error {?title} {?printer_name}</H2>
+<H2 CLASS="title">Error en {?printer_name}: {?title}</H2>
 
 <P>Error:</P>
 
-<BLOCKQUOTE>Operaci&oacute;n desconocida "{op}"!</BLOCKQUOTE>
+<BLOCKQUOTE>Operaci&oacute;n desconocida "{op}".</BLOCKQUOTE>
 
 </DIV>
index ff30a4c6c3ffe262eceb392eca1fe6708f2b4f01..650bc32608b610c698d65ec1a49c5ee6896899cf 100644 (file)
@@ -1,6 +1,6 @@
 <DIV CLASS="indent">
 
-<H2 CLASS="title">{?title} {?printer_name} Error</H2>
+<H2 CLASS="title">Error en {?printer_name}: {?title}</H2>
 
 <P>{?message?{message}:Error:}</P>
 
index 22cb3ec862765ddc0813ad689aeeacb47953d266..d382264f9b998abdfc28bfa041ef68d92bbc781f 100644 (file)
@@ -2,7 +2,7 @@
 
 <H2 CLASS="title">Cambiar opciones predeterminadas de {printer_name}</H2>
 
-<P>{OP=set-class-options?Class <A HREF="/classes/{printer_name}">:Printer <A HREF="/printers/{printer_name}">}{printer_name}</A>
-default options have been set successfully.
+<P>Se han establecido con &eacute;xito las opciones predeterminadas de la
+{OP=set-class-options?clase <A HREF="/classes/{printer_name}">:impresora <A HREF="/printers/{printer_name}">}{printer_name}</A>.
 
 </DIV>
index 26344b84b4e99aa49d3cc9cde3e2f571ec8d7c97..2a1ad09559910866031b5d99c3e89e92413da263 100644 (file)
@@ -35,7 +35,7 @@
 <TABLE SUMMARY="{printer_name}">
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Descripci&oacute;n:</TH><TD>{printer_info}</TD></TR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Ubicaci&oacute;n:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Controlador:</TH><TD>{printer_make_and_model} ({color_supported=1?color:escala de grises}{sides_supported?, dúplex:})<BR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Controlador:</TH><TD>{printer_make_and_model} ({color_supported=1?color:escala de grises}{sides_supported?, d&uacute;plex:})<BR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Conexi&oacute;n:</TH><TD>{device_uri}</TD></TR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Opciones predeterminadas:</TH><TD>job-sheets={job_sheets_default}
 media={media_default?{media_default}:desconocido}
index a36ef8ffc7e9190175b184c8c8b8ec92f70afcba..763dab5560f3f85fcc873ea54f9df1db851b6e6a 100644 (file)
@@ -1,6 +1,6 @@
 <DIV CLASS="indent">
 
-<H2 CLASS="title">Imprimir página de prueba en {printer_name}</H2>
+<H2 CLASS="title">Imprimir p&aacute;gina de prueba en {printer_name}</H2>
 
 <P>P&aacute;gina de prueba enviada; el n&uacute;mero del trabajo es el <A HREF="/{SECTION}/{printer_name}">
 {printer_name}-{job_id}</A>.</P>
index fc4697b057ba23c63df4cf6c05bdecb5187aaafa..fbd2a97f500b97adfa53a71117550a5454ba34c8 100644 (file)
        EXPECT attributes-charset
        EXPECT attributes-natural-language
 }
+{
+       # The name of the test...
+       NAME "Bad IPP Version"
+
+       # The operation to use
+       OPERATION get-jobs
+
+       # The version number to use
+       VERSION 0.0
+
+       # The attributes to send
+       GROUP operation
+       ATTR charset attributes-charset utf-8
+       ATTR language attributes-natural-language en
+       ATTR uri printer-uri ipp://localhost/printers
+
+       # What statuses are OK?
+       STATUS server-error-version-not-supported
+}
 #
 # End of "$Id: 4.1-requests.test 8144 2008-11-19 19:23:12Z mike $"
 #
index ab56d9e3695ae50ef7c912f266799fb71f555da5..26035bcfbc7ec3eafbf916a86a222d1c1d91ea2a 100644 (file)
        EXPECT attributes-charset
        EXPECT attributes-natural-language
 }
+{
+       # The name of the test...
+       NAME "Get IPP/2.x Attributes for Printer Test1"
+
+       # The operation to use
+       OPERATION get-printer-attributes
+       RESOURCE /
+
+       # The IPP version to use
+       VERSION 2.0
+
+       # The attributes to send
+       GROUP operation
+       ATTR charset attributes-charset utf-8
+       ATTR language attributes-natural-language en
+       ATTR uri printer-uri $method://$hostname:$port/printers/Test1
+
+       # What statuses are OK?
+       STATUS successful-ok
+
+       # What attributes do we expect?
+       EXPECT media-col-default
+}
 
 #
 # End of "$Id: 4.2-cups-printer-ops.test 6379 2007-03-21 14:57:22Z mike $"
diff --git a/test/get-printer-attributes-2.0.test b/test/get-printer-attributes-2.0.test
new file mode 100644 (file)
index 0000000..664bd6c
--- /dev/null
@@ -0,0 +1,47 @@
+# Get printer attributes using get-printer-attributes
+{
+       # The name of the test...
+       NAME "Get printer attributes using get-printer-attributes"
+
+       # The resource to use for the POST
+       # RESOURCE /admin
+
+       # The operation to use
+       OPERATION get-printer-attributes
+
+       # The version to use
+       VERSION 2.0
+
+       # Attributes, starting in the operation group...
+       GROUP operation
+       ATTR charset attributes-charset utf-8
+       ATTR language attributes-natural-language en
+       ATTR uri printer-uri $uri
+
+       # What statuses are OK?
+       STATUS successful-ok
+
+       # What attributes do we expect?
+       EXPECT charset-configured
+       EXPECT charset-supported
+       EXPECT compression-supported
+       EXPECT document-format-default
+       EXPECT document-format-supported
+       EXPECT generated-natural-language-supported
+       EXPECT ipp-versions-supported
+       EXPECT media-col-default
+       EXPECT natural-language-configured
+       EXPECT operations-supported
+       EXPECT printer-info
+       EXPECT printer-is-accepting-jobs
+       EXPECT printer-location
+       EXPECT printer-make-and-model
+       EXPECT printer-more-info
+       EXPECT printer-name
+       EXPECT printer-state
+       EXPECT printer-state-reasons
+       EXPECT printer-up-time
+       EXPECT printer-uri-supported
+       EXPECT uri-authentication-supported
+       EXPECT uri-security-supported
+}
index dcd17e23cfb4da0d6fea2a596ac5c3a8281c56e2..59f2fb803549f22a897fc29b0fd5cc8ce20103c5 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   IPP test command 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.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -51,6 +51,7 @@ ipp_op_t      ippOpValue(const char *);
 ipp_status_t   ippErrorValue(const char *);
 char           *get_token(FILE *, char *, int, int *linenum);
 void           print_attr(ipp_attribute_t *);
+void           print_col(ipp_t *col);
 void           usage(const char *option);
 
 
@@ -233,7 +234,7 @@ do_tests(const char *uri,           /* I - URI to connect on */
   pass            = 1;
   job_id          = 0;
   subscription_id = 0;
-  version         = 1;
+  version         = 11;
   linenum         = 1;
 
   while (get_token(fp, token, sizeof(token), &linenum) != NULL)
@@ -292,8 +293,21 @@ do_tests(const char *uri,          /* I - URI to connect on */
         * IPP version number for test...
        */
 
+        int major, minor;              /* Major/minor IPP version */
+
+
        get_token(fp, temp, sizeof(temp), &linenum);
-       sscanf(temp, "%*d.%d", &version);
+       if (sscanf(temp, "%d.%d", &major, &minor) == 2 &&
+           major >= 0 && minor >= 0 && minor < 10)
+         version = major * 10 + minor;
+       else
+       {
+         printf("Bad version %s seen on line %d - aborting test!\n", token,
+                linenum);
+         httpClose(http);
+         ippDelete(request);
+         return (0);
+       }
       }
       else if (!strcasecmp(token, "RESOURCE"))
       {
@@ -548,7 +562,8 @@ do_tests(const char *uri,           /* I - URI to connect on */
     * Submit the IPP request...
     */
 
-    request->request.op.version[1]   = version;
+    request->request.op.version[0]   = version / 10;
+    request->request.op.version[1]   = version % 10;
     request->request.op.operation_id = op;
     request->request.op.request_id   = 1;
 
@@ -837,6 +852,16 @@ print_attr(ipp_attribute_t *attr)  /* I - Attribute to print */
                 attr->values[i].string.charset);
        break;
 
+    case IPP_TAG_BEGIN_COLLECTION :
+       for (i = 0; i < attr->num_values; i ++)
+       {
+         if (i)
+           putchar(' ');
+
+         print_col(attr->values[i].collection);
+       }
+       break;
+        
     default :
        break; /* anti-compiler-warning-code */
   }
@@ -845,6 +870,93 @@ print_attr(ipp_attribute_t *attr)  /* I - Attribute to print */
 }
 
 
+/*
+ * 'print_col()' - Print a collection attribute on the screen.
+ */
+
+void
+print_col(ipp_t *col)                  /* I - Collection attribute to print */
+{
+  int                  i;              /* Looping var */
+  ipp_attribute_t      *attr;          /* Current attribute in collection */
+
+
+  putchar('{');
+  for (attr = col->attrs; attr; attr = attr->next)
+  {
+    printf("%s(%s%s)=", attr->name, attr->num_values > 1 ? "1setOf " : "",
+          ippTagString(attr->value_tag));
+
+    switch (attr->value_tag)
+    {
+      case IPP_TAG_INTEGER :
+      case IPP_TAG_ENUM :
+         for (i = 0; i < attr->num_values; i ++)
+           printf("%d ", attr->values[i].integer);
+         break;
+
+      case IPP_TAG_BOOLEAN :
+         for (i = 0; i < attr->num_values; i ++)
+           if (attr->values[i].boolean)
+             printf("true ");
+           else
+             printf("false ");
+         break;
+
+      case IPP_TAG_NOVALUE :
+         printf("novalue");
+         break;
+
+      case IPP_TAG_RANGE :
+         for (i = 0; i < attr->num_values; i ++)
+           printf("%d-%d ", attr->values[i].range.lower,
+                  attr->values[i].range.upper);
+         break;
+
+      case IPP_TAG_RESOLUTION :
+         for (i = 0; i < attr->num_values; i ++)
+           printf("%dx%d%s ", attr->values[i].resolution.xres,
+                  attr->values[i].resolution.yres,
+                  attr->values[i].resolution.units == IPP_RES_PER_INCH ?
+                      "dpi" : "dpc");
+         break;
+
+      case IPP_TAG_STRING :
+      case IPP_TAG_TEXT :
+      case IPP_TAG_NAME :
+      case IPP_TAG_KEYWORD :
+      case IPP_TAG_CHARSET :
+      case IPP_TAG_URI :
+      case IPP_TAG_MIMETYPE :
+      case IPP_TAG_LANGUAGE :
+         for (i = 0; i < attr->num_values; i ++)
+           printf("\"%s\" ", attr->values[i].string.text);
+         break;
+
+      case IPP_TAG_TEXTLANG :
+      case IPP_TAG_NAMELANG :
+         for (i = 0; i < attr->num_values; i ++)
+           printf("\"%s\",%s ", attr->values[i].string.text,
+                  attr->values[i].string.charset);
+         break;
+
+      case IPP_TAG_BEGIN_COLLECTION :
+         for (i = 0; i < attr->num_values; i ++)
+         {
+           print_col(attr->values[i].collection);
+           putchar(' ');
+         }
+         break;
+         
+      default :
+         break; /* anti-compiler-warning-code */
+    }
+  }
+
+  putchar('}');
+}
+
+
 /*
  * 'usage()' - Show program usage.
  */
index bf44c17d542bd508129c5893a8d087f6391df2b0..7a6cdc6a66d0b487be264e45400615715693beff 100755 (executable)
@@ -673,10 +673,10 @@ fi
 
 # Error log messages
 count=`grep '^E ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
-if test $count != 17; then
-       echo "FAIL: $count error messages, expected 17."
+if test $count != 18; then
+       echo "FAIL: $count error messages, expected 18."
        grep '^E ' /tmp/cups-$user/log/error_log
-       echo "<P>FAIL: $count error messages, expected 17.</P>" >>$strfile
+       echo "<P>FAIL: $count error messages, expected 18.</P>" >>$strfile
        echo "<PRE>" >>$strfile
        grep '^E ' /tmp/cups-$user/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
        echo "</PRE>" >>$strfile