diff options
47 files changed, 1148 insertions, 667 deletions
diff --git a/CHANGES-1.3.txt b/CHANGES-1.3.txt index 42e447283..b57dbf20c 100644 --- a/CHANGES-1.3.txt +++ b/CHANGES-1.3.txt @@ -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 diff --git a/CHANGES.txt b/CHANGES.txt index 4c35ec79d..262c7e471 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -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 diff --git a/backend/usb-libusb.c b/backend/usb-libusb.c index 6e6494c49..3cb61e395 100644 --- a/backend/usb-libusb.c +++ b/backend/usb-libusb.c @@ -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; } diff --git a/cgi-bin/admin.c b/cgi-bin/admin.c index 1601ef7c8..b0b3ae23e 100644 --- a/cgi-bin/admin.c +++ b/cgi-bin/admin.c @@ -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, diff --git a/cgi-bin/cgi.h b/cgi-bin/cgi.h index 66de5110a..5546d7ac5 100644 --- a/cgi-bin/cgi.h +++ b/cgi-bin/cgi.h @@ -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_ */ diff --git a/cgi-bin/html.c b/cgi-bin/html.c index e99245868..2db9bdd25 100644 --- a/cgi-bin/html.c +++ b/cgi-bin/html.c @@ -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 @@ -14,12 +14,13 @@ * * 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 @@ -196,6 +197,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. */ diff --git a/cgi-bin/ipp-var.c b/cgi-bin/ipp-var.c index 90c90cf74..842268b67 100644 --- a/cgi-bin/ipp-var.c +++ b/cgi-bin/ipp-var.c @@ -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(); } diff --git a/cgi-bin/libcupscgi.exp b/cgi-bin/libcupscgi.exp index efe0ac7e3..73e309e96 100644 --- a/cgi-bin/libcupscgi.exp +++ b/cgi-bin/libcupscgi.exp @@ -30,6 +30,7 @@ _cgiShowIPPError _cgiShowJobs _cgiStartHTML _cgiStartMultipart +_cgiSupportsMultipart _cgiText _helpDeleteIndex _helpFindNode diff --git a/config-scripts/cups-manpages.m4 b/config-scripts/cups-manpages.m4 index 13881c5bf..44d31369b 100644 --- a/config-scripts/cups-manpages.m4 +++ b/config-scripts/cups-manpages.m4 @@ -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 diff --git a/cups/conflicts.c b/cups/conflicts.c index a99810cd9..6376f69ef 100644 --- a/cups/conflicts.c +++ b/cups/conflicts.c @@ -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. @@ -66,6 +68,74 @@ static cups_array_t *ppd_test_constraints(ppd_file_t *ppd, /* + * '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. * * This function attempts to resolve any conflicts in a marked PPD, returning diff --git a/cups/cups.h b/cups/cups.h index 6d3ca29a4..153ceb499 100644 --- a/cups/cups.h +++ b/cups/cups.h @@ -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, diff --git a/cups/encode.c b/cups/encode.c index 7d9198ea7..16762aa0c 100644 --- a/cups/encode.c +++ b/cups/encode.c @@ -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; } diff --git a/cups/http-addr.c b/cups/http-addr.c index 9a39292eb..52e828525 100644 --- a/cups/http-addr.c +++ b/cups/http-addr.c @@ -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 diff --git a/cups/http-addrlist.c b/cups/http-addrlist.c index b44acc636..a5b2e1f58 100644 --- a/cups/http-addrlist.c +++ b/cups/http-addrlist.c @@ -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 diff --git a/cups/ipp.c b/cups/ipp.c index de0f12c40..f8e7dafa6 100644 --- a/cups/ipp.c +++ b/cups/ipp.c @@ -1109,18 +1109,6 @@ ippReadIO(void *src, /* I - Data source */ } /* - * 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... */ diff --git a/cups/libcups.exp b/cups/libcups.exp index 32803d6b6..74914ae44 100644 --- a/cups/libcups.exp +++ b/cups/libcups.exp @@ -140,6 +140,7 @@ _cupsFreeDests _cupsFreeJobs _cupsFreeOptions _cupsGetClasses +_cupsGetConflicts _cupsGetDefault _cupsGetDefault2 _cupsGetDest diff --git a/cups/mark.c b/cups/mark.c index 4466ec1ce..b2cef1f2d 100644 --- a/cups/mark.c +++ b/cups/mark.c @@ -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; diff --git a/cups/testipp.c b/cups/testipp.c index aa119ace9..972c6474d 100644 --- a/cups/testipp.c +++ b/cups/testipp.c @@ -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]); diff --git a/cups/testppd.c b/cups/testppd.c index 97337ccac..44c43b55b 100644 --- a/cups/testppd.c +++ b/cups/testppd.c @@ -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) diff --git a/doc/Makefile b/doc/Makefile index bf8bca0d1..0c894afaa 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -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 \ diff --git a/doc/help/api-array.html b/doc/help/api-array.html index f7373e3b6..1916f3d59 100644 --- a/doc/help/api-array.html +++ b/doc/help/api-array.html @@ -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"> diff --git a/doc/help/api-ppd.html b/doc/help/api-ppd.html index 3da1d965e..98b81f3e4 100644 --- a/doc/help/api-ppd.html +++ b/doc/help/api-ppd.html @@ -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"> CUPS 1.4 </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> + <a href="#ppd_file_t">ppd_file_t</a> *ppd,<br> + const char *option,<br> + const char *choice,<br> + 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 "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.<br> +<br> +The number of conflicting options are returned with "options" 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"> diff --git a/doc/help/ref-cupsd-conf.html.in b/doc/help/ref-cupsd-conf.html.in index 33b669349..6c51b9d99 100644 --- a/doc/help/ref-cupsd-conf.html.in +++ b/doc/help/ref-cupsd-conf.html.in @@ -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 index 000000000..29bb757ad --- /dev/null +++ b/doc/help/sharing.html @@ -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>®</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>®</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 & 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> diff --git a/doc/help/spec-ipp.html b/doc/help/spec-ipp.html index 70db03765..70a30319b 100644 --- a/doc/help/spec-ipp.html +++ b/doc/help/spec-ipp.html @@ -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> diff --git a/locale/cups_es.po b/locale/cups_es.po index 230de93ed..49d10ca4b 100644 --- a/locale/cups_es.po +++ b/locale/cups_es.po @@ -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" diff --git a/packaging/cups.list.in b/packaging/cups.list.in index 27765501c..2116b1930 100644 --- a/packaging/cups.list.in +++ b/packaging/cups.list.in @@ -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 diff --git a/packaging/cups.spec.in b/packaging/cups.spec.in index c9b22430f..9dd388583 100644 --- a/packaging/cups.spec.in +++ b/packaging/cups.spec.in @@ -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 diff --git a/ppdc/ppdc-driver.cxx b/ppdc/ppdc-driver.cxx index c6e0dda53..31c857f06 100644 --- a/ppdc/ppdc-driver.cxx +++ b/ppdc/ppdc-driver.cxx @@ -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, diff --git a/ppdc/ppdc-source.cxx b/ppdc/ppdc-source.cxx index d95f2d6cc..b4e31fc52 100644 --- a/ppdc/ppdc-source.cxx +++ b/ppdc/ppdc-source.cxx @@ -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]); diff --git a/ppdc/ppdpo.cxx b/ppdc/ppdpo.cxx index fe533ba9f..c32b2acf4 100644 --- a/ppdc/ppdpo.cxx +++ b/ppdc/ppdpo.cxx @@ -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); diff --git a/scheduler/ipp.c b/scheduler/ipp.c index 668da3ee1..e9e3e73f4 100644 --- a/scheduler/ipp.c +++ b/scheduler/ipp.c @@ -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); + } } } diff --git a/scheduler/job.c b/scheduler/job.c index 9bdacc326..d5c1cfe44 100644 --- a/scheduler/job.c +++ b/scheduler/job.c @@ -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]); } diff --git a/scheduler/printers.c b/scheduler/printers.c index e4029cd1c..d32a09b8f 100644 --- a/scheduler/printers.c +++ b/scheduler/printers.c @@ -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", @@ -3523,15 +3537,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) diff --git a/scheduler/type.c b/scheduler/type.c index c334e99eb..6218b4d6f 100644 --- a/scheduler/type.c +++ b/scheduler/type.c @@ -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 diff --git a/templates/es/add-rss-subscription.tmpl b/templates/es/add-rss-subscription.tmpl index 91c2b06f0..89d77ced6 100644 --- a/templates/es/add-rss-subscription.tmpl +++ b/templates/es/add-rss-subscription.tmpl @@ -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ía de seguridad del servidor</TD> </TR> <TR> <TH CLASS="label">Número máximo de eventos del canal:</TH> diff --git a/templates/es/admin.tmpl b/templates/es/admin.tmpl index e50409e8b..a16eb4ed2 100644 --- a/templates/es/admin.tmpl +++ b/templates/es/admin.tmpl @@ -83,7 +83,7 @@ <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Guardar información de depuración para búsqueda de problemas</P> } -<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Cambiar configuración"></P> +<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Cambiar configuración"></P> </FORM>} diff --git a/templates/es/error-op.tmpl b/templates/es/error-op.tmpl index 80b20fd18..d584108e8 100644 --- a/templates/es/error-op.tmpl +++ b/templates/es/error-op.tmpl @@ -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ón desconocida "{op}"!</BLOCKQUOTE> +<BLOCKQUOTE>Operación desconocida "{op}".</BLOCKQUOTE> </DIV> diff --git a/templates/es/error.tmpl b/templates/es/error.tmpl index ff30a4c6c..650bc3260 100644 --- a/templates/es/error.tmpl +++ b/templates/es/error.tmpl @@ -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> diff --git a/templates/es/printer-configured.tmpl b/templates/es/printer-configured.tmpl index 22cb3ec86..d382264f9 100644 --- a/templates/es/printer-configured.tmpl +++ b/templates/es/printer-configured.tmpl @@ -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 é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> diff --git a/templates/es/printer.tmpl b/templates/es/printer.tmpl index 26344b84b..2a1ad0955 100644 --- a/templates/es/printer.tmpl +++ b/templates/es/printer.tmpl @@ -35,7 +35,7 @@ <TABLE SUMMARY="{printer_name}"> <TR><TH ALIGN="RIGHT" VALIGN="TOP">Descripción:</TH><TD>{printer_info}</TD></TR> <TR><TH ALIGN="RIGHT" VALIGN="TOP">Ubicació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úplex:})<BR> <TR><TH ALIGN="RIGHT" VALIGN="TOP">Conexió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} diff --git a/templates/es/test-page.tmpl b/templates/es/test-page.tmpl index a36ef8ffc..763dab556 100644 --- a/templates/es/test-page.tmpl +++ b/templates/es/test-page.tmpl @@ -1,6 +1,6 @@ <DIV CLASS="indent"> -<H2 CLASS="title">Imprimir página de prueba en {printer_name}</H2> +<H2 CLASS="title">Imprimir página de prueba en {printer_name}</H2> <P>Página de prueba enviada; el número del trabajo es el <A HREF="/{SECTION}/{printer_name}"> {printer_name}-{job_id}</A>.</P> diff --git a/test/4.1-requests.test b/test/4.1-requests.test index fc4697b05..fbd2a97f5 100644 --- a/test/4.1-requests.test +++ b/test/4.1-requests.test @@ -135,6 +135,25 @@ 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 $" # diff --git a/test/4.2-cups-printer-ops.test b/test/4.2-cups-printer-ops.test index ab56d9e36..26035bcfb 100644 --- a/test/4.2-cups-printer-ops.test +++ b/test/4.2-cups-printer-ops.test @@ -256,6 +256,29 @@ 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 index 000000000..664bd6c53 --- /dev/null +++ b/test/get-printer-attributes-2.0.test @@ -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 +} diff --git a/test/ipptest.c b/test/ipptest.c index dcd17e23c..59f2fb803 100644 --- a/test/ipptest.c +++ b/test/ipptest.c @@ -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 */ } @@ -846,6 +871,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. */ diff --git a/test/run-stp-tests.sh b/test/run-stp-tests.sh index bf44c17d5..7a6cdc6a6 100755 --- a/test/run-stp-tests.sh +++ b/test/run-stp-tests.sh @@ -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/&/&/g' -e '1,$s/</</g' >>$strfile echo "</PRE>" >>$strfile |