Comparar commits

..

1 Commits

Autor SHA1 Mensagem Data
msweet b7d698516c Import cups.org releases
git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/tags/release-1.4.8@4306 a1ca3aef-8c08-0410-bb20-df032aa958be
2013-05-10 18:56:23 +00:00
284 arquivos alterados com 6802 adições e 114883 exclusões
+170 -1
Ver Arquivo
@@ -1,6 +1,175 @@
CHANGES.txt - 2010-06-17
CHANGES.txt - 2011-07-25
------------------------
CHANGES IN CUPS V1.4.8
- The scheduler would delete job data files when restarted (STR #3880)
- The network backends could crash if a printer returned a value of 0
for the maximum capacity for a supply (STR #3875)
CHANGES IN CUPS V1.4.7
- Documentation changes (STR #3710, STR #3720, STR #3745, STR #3750,
STR #3757, STR #3758, STR #3782, STR #3826, STR #3829, STR #3837)
- Web interface fixes (STR #3412, STR #3345, STR #3455, STR #3707,
STR #3755, STR #3769, STR #3783)
- Configure script fixes (STR #3659, STR #3691)
- Compilation fixes (STR #3718, STR #3771, STR #3774)
- The imageto* filters could crash with bad GIF files (STR #3867)
- The scheduler might leave old job data files in the spool directory
(STR #3795)
- CUPS did not work with locales using the ASCII character set
(STR #3832)
- httpAddrString() did not return a URI-style IPv6 numeric address
(STR #3814)
- Fixed an issue when reading compressed CUPS raster streams (STR #3812)
- Fixed an issue with PostScript printer auto-configuration (STR #3443)
- Fixed some compatibility issues with the libusb-based USB backend
(STR #3799)
- The network backends no longer try to collect SNMP supply and status
information for raw queues (STR #3809)
- The DBUS notifier did not report job state changes (STR #3805)
- The scheduler did not always report that the "normal" print-quality
value was supported (STR #3803)
- The gziptoany filter did not report the correct error if it was unable
to write the uncompressed document to the next filter or backend in
the chain (STR #3797)
- The Epson and Oki 9-pin drivers had a bad resolution option
(STR #3798)
- The scheduler did not always register the correct default ICC profile
on Mac OS X.
- The scheduler did not use the job owner when authorizing access for
the CUPS-Get-Document operation, preventing non-admins from accessing
their own jobs.
- CUPS did not work with some printers that incorrectly implemented the
HTTP/1.1 standard (STR #3778, STR #3791)
- The scheduler did not retry fax jobs properly.
- The scheduler now recognizes an empty cupsCommands PPD keyword as
meaning that CUPS commands are not supported for a printer (STR #3773)
- Fixed a crash bug in the scheduler when the application/octet-stream
MIME type was not defined (STR #3690)
- Polled printers were advertised more slowly than necessary (STR #3574)
- cupsResolveConflicts() did not handle resolving multiple UIConstraints
issues (STR #3705)
- The SetEnv and PassEnv directives had no effect (STR #3664)
- The web interface no longer tries to use multi-part delivery when
adding printers (STR #3455)
- The libusb-based USB backend printed slowly to the LaserJet 1300 and
other printers (STR #3405)
- "lp" and "lpr" failed to print with Kerberos enabled (STR #3768)
- The cupsctl program now displays an error if you try to directly set
the Port or Listen directives (STR #3749)
- PPD files with "*JobPatchFile: bla" no longer fail to load in relaxed
conformance mode (STR #3747)
- The scheduler generated a bad notify-text string for printer state
change notifications (STR #3739)
- The scheduler incorrectly updated printers.conf when it really needed
to update classes.conf or remote.cache (STR #3726)
- Hardwired remote printers with options did not work (STR #3717)
- Accessing the CUPS web interface using a CNAME-based hostname would
sometimes fail due to redirection to the actual hostname (STR #3701)
- Subscription events had a misspelled attribute (STR #3693)
- "make check" failed if LC_MESSAGES was set (STR #3765)
- Fixed the configure script to always look for the pkg-config script
(STR #3761)
- The scheduler now only looks up interface hostnames if HostNameLookups
are enabled (STR #3737)
- Fixed a compilation problem on DragonFly BSD (STR #3738)
- The default PageLogFormat value had the username and job ID swapped
from CUPS 1.3.x (STR #3727)
- The scheduler could crash if a browsed printer times out while a job
is printing (STR #3754)
- The scheduler incorrectly mapped custom page sizes to standard sizes
(STR #3764)
- cupsfilter and pstops did not map IPP attributes to PPD options due to
a change in cupsMarkOptions (STR #3756)
- The scheduler did not always show the most recent status message from
the print filters (STR #3731)
- The PostScript filter did not apply the mirror and number-up options
properly, leading to offset and clipped output (STR #3732)
- The network backends always reported "low toner" or "out of toner"
states, even for inkjet printers (STR #3733)
CHANGES IN CUPS V1.4.6
- Fixed a "make check" issue on Solaris (STR #3729)
- Regression: The pstops filter did not support landscape printing of
PostScript files (STR #3722)
- The scheduler killed retried (fax) jobs after restarting them
(STR #3697)
- The cupsAdminSetServerSettings() function disabled sharing when
debug logging was enabled (STR #3712)
CHANGES IN CUPS V1.4.5
- Documentation fixes (STR #3542, STR #3650)
- Localization fixes (STR #3635, STR #3636, STR #3647, STR #3666)
- Security: Fixed a memory corruption bug reported in CVE-2010-2941
(STR #3648)
- The CUPS API incorrectly mapped the HTTP_UNAUTHORIZED status to the
IPP_NOT_AUTHORIZED status code, when IPP_NOT_AUTHENTICATED would be
the correct mapping (STR #3684)
- The scheduler would restart jobs while shutting down (STR #3679)
- Fixed a PPD loader bug that could cause a crash in cupsd (STR #3680)
- Improved the mapping of non-standard PPD and PWG names (STR #3671)
- The scheduler did not initialize Kerberos in all cases (STR #3662)
- cupsAdminSetServerSettings duplicated Listen and Order lines
(STR #3645)
- Added DeviceN colorspace support to the CUPS Raster format (STR #3419)
- ppdMarkDefaults() did not clear the marked field of the previous
choices (STR #3642)
- The serial backend would not allow a raw job to be canceled
(STR #3649)
- The socket backend could go into an infinite loop with certain
printers (STR #3622)
- Setting the PRINTER or LPDEST environment variables to "name/instance"
did not work (STR #3485)
- The scheduler did not handle the JobRetryLimit setting properly
(STR #3466)
- The lpstat command always showed a remote job ID of 0 for shared
printers (STR #3627)
- Increased the write timeout for the libusb-based USB backend to 5
minutes (STR #3595)
- The libusb-base USB backend did not check whether the printer has a
serial number (STR #3590)
- The lpadmin command did not support setting of custom option values
(STR #3631)
- The lpadmin command did not support setting of the location or
description of a class (STR #3613)
- The cupsaddsmb command did not give up after too many failed attempts
(STR #3615)
- The CUPS library no longer uses certain problematic ctype macros that
change based on the locale's character set.
- PJL value substitution of more than 9 values was broken (STR #3621)
- Custom options with missing string values caused ppdEmit* to segfault
(STR #3620)
- Fixed an issue with the Italian version of the web interface
(STR #3624)
- Fixed the Solaris SMF configuration file for cups-lpd (STR #3611)
- The scheduler did not set the notify-subscribed-event attribute when
delivering printer-added or printer-modified events (STR #3608)
- The mailto notifier could get into an infinite loop (STR #3609)
- Date/time information was not shown in banner pages.
- Relational operators were broken in #if/#elif/#else/#endif expressions
for the PPD compiler.
- Moving a job via the web interface failed without asking for
authentication (STR #3559)
- The scheduler now clears the printer-state-reasons when the driver is
changed (STR #3570)
- The web interface did not allow a user to change the driver
(STR #3537, STR #3601)
- The scheduler was not setting the PATH_INFO environment variable when
needed (STR #3600)
- The scheduler incorrectly set the CUPSD_AUTH_TYPE environment
variable instead of AUTH_TYPE (STR #3599)
- Fixed a buffer overrun in the PPD compiler (STR #3594)
- Fixed some additional IPP job template attribute mapping issues in the
scheduler.
CHANGES IN CUPS V1.4.4
- Documentation updates (STR #3453, STR #3527, STR #3528, STR #3529)
+4 -5
Ver Arquivo
@@ -1,14 +1,13 @@
INSTALL - CUPS v1.4.4 - 2010-06-17
INSTALL - CUPS v1.4.8 - 2011-07-25
----------------------------------
This file describes how to compile and install CUPS from source code. For more
information on CUPS see the file called "README.txt". A complete change log can
be found in "CHANGES.txt".
**** IF YOU HAVE A NON-POSTSCRIPT PRINTER AND ARE NOT ****
**** RUNNING MAC OS X, YOU WILL ALSO NEED TO INSTALL GPL ****
**** GHOSTSCRIPT WITH THE "cups" DRIVER AFTER YOU INSTALL ****
**** CUPS. ****
**** IF YOU HAVE A NON-POSTSCRIPT PRINTER AND ARE NOT RUNNING MAC OS X, ****
**** YOU WILL ALSO NEED TO INSTALL GPL GHOSTSCRIPT WITH THE "cups" DRIVER ****
**** AFTER YOU INSTALL CUPS. ****
BEFORE YOU BEGIN
+2 -2
Ver Arquivo
@@ -1,4 +1,4 @@
README - CUPS v1.4.4 - 2010-06-17
README - CUPS v1.4.8 - 2011-07-25
---------------------------------
Looking for compile instructions? Read the file "INSTALL.txt"
@@ -150,7 +150,7 @@ PRINTING FILES
LEGAL STUFF
CUPS is Copyright 2007-2010 by Apple Inc. CUPS and the CUPS logo are
CUPS is Copyright 2007-2011 by Apple Inc. CUPS and the CUPS logo are
trademarks of Apple Inc.
The MD5 Digest code is Copyright 1999 Aladdin Enterprises.
+4 -2
Ver Arquivo
@@ -1,9 +1,9 @@
/*
* "$Id$"
*
* Common run loop APIs for the Common UNIX Printing System (CUPS).
* Common run loop APIs for CUPS.
*
* Copyright 2007-2008 by Apple Inc.
* Copyright 2007-2010 by Apple Inc.
* Copyright 2006-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -299,6 +299,8 @@ backendRunLoop(
strerror(errno));
use_bc = 0;
}
else if (bc_bytes == 0)
use_bc = 0;
}
/*
+1 -1
Ver Arquivo
@@ -502,7 +502,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
* stdin (otherwise you can't cancel raw jobs...)
*/
if (print_fd != 0)
if (!print_fd)
{
#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
sigset(SIGTERM, SIG_IGN);
+115 -11
Ver Arquivo
@@ -1,9 +1,9 @@
/*
* "$Id$"
*
* SNMP supplies functions for the Common UNIX Printing System (CUPS).
* SNMP supplies functions for CUPS.
*
* Copyright 2008-2009 by Apple Inc.
* Copyright 2008-2011 by Apple Inc.
*
* These coded instructions, statements, and computer programs are the
* property of Apple Inc. and are protected by Federal copyright
@@ -36,6 +36,17 @@
#define CUPS_MAX_SUPPLIES 32 /* Maximum number of supplies for a printer */
#define CUPS_SUPPLY_TIMEOUT 2.0 /* Timeout for SNMP lookups */
#define CUPS_DEVELOPER_LOW 1
#define CUPS_DEVELOPER_EMPTY 2
#define CUPS_MARKER_SUPPLY_LOW 4
#define CUPS_MARKER_SUPPLY_EMPTY 8
#define CUPS_MARKER_WASTE_ALMOST_FULL 16
#define CUPS_MARKER_WASTE_FULL 32
#define CUPS_OPC_NEAR_EOL 64
#define CUPS_OPC_LIFE_OVER 128
#define CUPS_TONER_LOW 256
#define CUPS_TONER_EMPTY 512
/*
* Local structures...
@@ -70,6 +81,8 @@ static int num_supplies = 0;
/* Number of supplies found */
static backend_supplies_t supplies[CUPS_MAX_SUPPLIES];
/* Supply information */
static int supply_state = -1;
/* Supply state info */
static const int hrDeviceDescr[] =
{ CUPS_OID_hrDeviceDescr, 1, -1 };
@@ -140,8 +153,8 @@ static const backend_state_t const printer_states[] =
{
{ CUPS_TC_lowPaper, "media-low-report" },
{ CUPS_TC_noPaper | CUPS_TC_inputTrayEmpty, "media-empty-warning" },
{ CUPS_TC_lowToner, "toner-low-report" },
{ CUPS_TC_noToner, "toner-empty-warning" },
/* { CUPS_TC_lowToner, "toner-low-report" }, */ /* now use prtMarkerSupplies */
/* { CUPS_TC_noToner, "toner-empty-warning" }, */ /* now use prtMarkerSupplies */
{ CUPS_TC_doorOpen, "door-open-report" },
{ CUPS_TC_jammed, "media-jam-warning" },
/* { CUPS_TC_offline, "offline-report" }, */ /* unreliable */
@@ -153,6 +166,20 @@ static const backend_state_t const printer_states[] =
{ CUPS_TC_outputFull, "output-area-full-warning" }
};
static const backend_state_t const supply_states[] =
{
{ CUPS_DEVELOPER_LOW, "developer-low-report" },
{ CUPS_DEVELOPER_EMPTY, "developer-empty-warning" },
{ CUPS_MARKER_SUPPLY_LOW, "marker-supply-low-report" },
{ CUPS_MARKER_SUPPLY_EMPTY, "marker-supply-empty-warning" },
{ CUPS_MARKER_WASTE_ALMOST_FULL, "marker-waste-almost-full-report" },
{ CUPS_MARKER_WASTE_FULL, "marker-waste-full-warning" },
{ CUPS_OPC_NEAR_EOL, "opc-near-eol-report" },
{ CUPS_OPC_LIFE_OVER, "opc-life-over-warning" },
{ CUPS_TONER_LOW, "toner-low-report" },
{ CUPS_TONER_EMPTY, "toner-empty-warning" }
};
/*
* Local functions...
@@ -191,13 +218,14 @@ backendSNMPSupplies(
if (num_supplies > 0)
{
int i, /* Looping var */
percent, /* Percent full */
new_state, /* New state value */
change_state; /* State change */
change_state, /* State change */
new_supply_state = 0; /* Supply state */
char value[CUPS_MAX_SUPPLIES * 4],
/* marker-levels value string */
*ptr; /* Pointer into value string */
cups_snmp_t packet; /* SNMP response packet */
/*
* Generate the marker-levels value string...
@@ -205,17 +233,88 @@ backendSNMPSupplies(
for (i = 0, ptr = value; i < num_supplies; i ++, ptr += strlen(ptr))
{
if (supplies[i].max_capacity > 0)
percent = 100 * supplies[i].level / supplies[i].max_capacity;
else
percent = 50;
if (percent <= 10)
{
switch (supplies[i].type)
{
case CUPS_TC_toner :
case CUPS_TC_tonerCartridge :
if (percent <= 1)
new_supply_state |= CUPS_TONER_EMPTY;
else
new_supply_state |= CUPS_TONER_LOW;
break;
case CUPS_TC_wasteToner :
case CUPS_TC_wasteInk :
if (percent <= 1)
new_supply_state |= CUPS_MARKER_WASTE_FULL;
else
new_supply_state |= CUPS_MARKER_WASTE_ALMOST_FULL;
break;
case CUPS_TC_ink :
case CUPS_TC_inkCartridge :
case CUPS_TC_inkRibbon :
case CUPS_TC_solidWax :
case CUPS_TC_ribbonWax :
if (percent <= 1)
new_supply_state |= CUPS_MARKER_SUPPLY_EMPTY;
else
new_supply_state |= CUPS_MARKER_SUPPLY_LOW;
break;
case CUPS_TC_developer :
if (percent <= 1)
new_supply_state |= CUPS_DEVELOPER_EMPTY;
else
new_supply_state |= CUPS_DEVELOPER_LOW;
break;
case CUPS_TC_coronaWire :
case CUPS_TC_fuser :
case CUPS_TC_opc :
case CUPS_TC_transferUnit :
if (percent <= 1)
new_supply_state |= CUPS_OPC_LIFE_OVER;
else
new_supply_state |= CUPS_OPC_NEAR_EOL;
break;
}
}
if (i)
*ptr++ = ',';
if (supplies[i].max_capacity > 0)
sprintf(ptr, "%d", 100 * supplies[i].level / supplies[i].max_capacity);
sprintf(ptr, "%d", percent);
else
strcpy(ptr, "-1");
}
fprintf(stderr, "ATTR: marker-levels=%s\n", value);
if (supply_state < 0)
change_state = 0xffff;
else
change_state = supply_state ^ new_supply_state;
fprintf(stderr, "DEBUG: new_supply_state=%x, change_state=%x\n",
new_supply_state, change_state);
for (i = 0;
i < (int)(sizeof(supply_states) / sizeof(supply_states[0]));
i ++)
if (change_state & supply_states[i].bit)
{
fprintf(stderr, "STATE: %c%s\n",
(new_supply_state & supply_states[i].bit) ? '+' : '-',
supply_states[i].keyword);
}
supply_state = new_supply_state;
/*
* Get the current printer status bits...
*/
@@ -242,13 +341,18 @@ backendSNMPSupplies(
else
change_state = current_state ^ new_state;
fprintf(stderr, "DEBUG: new_state=%x, change_state=%x\n", new_state,
change_state);
for (i = 0;
i < (int)(sizeof(printer_states) / sizeof(printer_states[0]));
i ++)
if (change_state & printer_states[i].bit)
{
fprintf(stderr, "STATE: %c%s\n",
(new_state & printer_states[i].bit) ? '+' : '-',
(new_state & printer_states[i].bit) ? '+' : '-',
printer_states[i].keyword);
}
current_state = new_state;
@@ -373,9 +477,9 @@ backend_init_supplies(
* See if we should be getting supply levels via SNMP...
*/
if ((ppd = ppdOpenFile(getenv("PPD"))) != NULL &&
(ppdattr = ppdFindAttr(ppd, "cupsSNMPSupplies", NULL)) != NULL &&
ppdattr->value && strcasecmp(ppdattr->value, "true"))
if ((ppd = ppdOpenFile(getenv("PPD"))) == NULL ||
((ppdattr = ppdFindAttr(ppd, "cupsSNMPSupplies", NULL)) != NULL &&
ppdattr->value && strcasecmp(ppdattr->value, "true")))
{
ppdClose(ppd);
return;
+4 -2
Ver Arquivo
@@ -72,9 +72,11 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
sep; /* Option separator */
int print_fd; /* Print file */
int copies; /* Number of copies to print */
time_t start_time, /* Time of first connect */
current_time, /* Current time */
time_t start_time; /* Time of first connect */
#ifdef __APPLE__
time_t current_time, /* Current time */
wait_time; /* Time to wait before shutting down socket */
#endif /* __APPLE__ */
int recoverable; /* Recoverable error shown? */
int contimeout; /* Connection timeout */
int waiteof; /* Wait for end-of-file? */
+136 -8
Ver Arquivo
@@ -1,7 +1,7 @@
/*
* "$Id$"
*
* Copyright 2005-2009 Apple Inc. All rights reserved.
* Copyright 2005-2010 Apple Inc. All rights reserved.
*
* IMPORTANT: This Apple software is supplied to you by Apple Computer,
* Inc. ("Apple") in consideration of your agreement to the following
@@ -112,6 +112,12 @@ extern char **environ;
#define DEBUG_WRITES 0
/*
* WAIT_EOF_DELAY is number of seconds we'll wait for responses from
* the printer after we've finished sending all the data
*/
#define WAIT_EOF_DELAY 7
#define WAIT_SIDE_DELAY 3
#define DEFAULT_TIMEOUT 5000L
#define USB_INTERFACE_KIND CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID190)
@@ -241,6 +247,11 @@ typedef struct globals_s
Boolean wait_eof;
int drain_output; /* Drain all pending output */
int bidi_flag; /* 0=unidirectional, 1=bidirectional */
pthread_mutex_t sidechannel_thread_mutex;
pthread_cond_t sidechannel_thread_cond;
int sidechannel_thread_stop;
int sidechannel_thread_done;
} globals_t;
@@ -281,8 +292,8 @@ static void status_timer_cb(CFRunLoopTimerRef timer, void *info);
#if defined(__i386__) || defined(__x86_64__)
static pid_t child_pid; /* Child PID */
static void run_legacy_backend(int argc, char *argv[], int fd); /* Starts child backend process running as a ppc executable */
static void sigterm_handler(int sig); /* SIGTERM handler */
#endif /* __i386__ || __x86_64__ */
static void sigterm_handler(int sig); /* SIGTERM handler */
#ifdef PARSE_PS_ERRORS
static const char *next_line (const char *buffer);
@@ -333,6 +344,7 @@ print_device(const char *uri, /* I - Device URI */
UInt32 bytes; /* Bytes written */
struct timeval *timeout, /* Timeout pointer */
stimeout; /* Timeout for select() */
struct timespec cond_timeout; /* pthread condition timeout */
/*
@@ -476,6 +488,12 @@ print_device(const char *uri, /* I - Device URI */
if (have_sidechannel)
{
g.sidechannel_thread_stop = 0;
g.sidechannel_thread_done = 0;
pthread_cond_init(&g.sidechannel_thread_cond, NULL);
pthread_mutex_init(&g.sidechannel_thread_mutex, NULL);
if (pthread_create(&sidechannel_thread_id, NULL, sidechannel_thread, NULL))
{
_cupsLangPuts(stderr, _("ERROR: Fatal USB error\n"));
@@ -732,6 +750,104 @@ print_device(const char *uri, /* I - Device URI */
fprintf(stderr, "DEBUG: Sent %lld bytes...\n", (off_t)total_bytes);
if (!print_fd)
{
/*
* Re-enable the SIGTERM handler so pthread_kill() will work...
*/
struct sigaction action; /* POSIX signal action */
memset(&action, 0, sizeof(action));
sigemptyset(&action.sa_mask);
sigaddset(&action.sa_mask, SIGTERM);
action.sa_handler = sigterm_handler;
sigaction(SIGTERM, &action, NULL);
}
/*
* Wait for the side channel thread to exit...
*/
if (have_sidechannel)
{
close(CUPS_SC_FD);
pthread_mutex_lock(&g.readwrite_lock_mutex);
g.readwrite_lock = 0;
pthread_cond_signal(&g.readwrite_lock_cond);
pthread_mutex_unlock(&g.readwrite_lock_mutex);
g.sidechannel_thread_stop = 1;
pthread_mutex_lock(&g.sidechannel_thread_mutex);
if (!g.sidechannel_thread_done)
{
/*
* Wait for the side-channel thread to exit...
*/
cond_timeout.tv_sec = time(NULL) + WAIT_SIDE_DELAY;
cond_timeout.tv_nsec = 0;
if (pthread_cond_timedwait(&g.sidechannel_thread_cond,
&g.sidechannel_thread_mutex,
&cond_timeout) != 0)
{
/*
* Force the side-channel thread to exit...
*/
fputs("DEBUG: Force the side-channel thread to exit...\n", stderr);
pthread_kill(sidechannel_thread_id, SIGTERM);
}
}
pthread_mutex_unlock(&g.sidechannel_thread_mutex);
pthread_join(sidechannel_thread_id, NULL);
pthread_cond_destroy(&g.sidechannel_thread_cond);
pthread_mutex_destroy(&g.sidechannel_thread_mutex);
}
pthread_cond_destroy(&g.readwrite_lock_cond);
pthread_mutex_destroy(&g.readwrite_lock_mutex);
/*
* Signal the read thread to stop...
*/
g.read_thread_stop = 1;
/*
* Give the read thread WAIT_EOF_DELAY seconds to complete all the data. If
* we are not signaled in that time then force the thread to exit.
*/
pthread_mutex_lock(&g.read_thread_mutex);
if (!g.read_thread_done)
{
cond_timeout.tv_sec = time(NULL) + WAIT_EOF_DELAY;
cond_timeout.tv_nsec = 0;
if (pthread_cond_timedwait(&g.read_thread_cond, &g.read_thread_mutex,
&cond_timeout) != 0)
{
/*
* Force the read thread to exit...
*/
g.wait_eof = 0;
fputs("DEBUG: Force the read thread to exit...\n", stderr);
pthread_kill(read_thread_id, SIGTERM);
}
}
pthread_mutex_unlock(&g.read_thread_mutex);
pthread_join(read_thread_id, NULL); /* wait for the read thread to return */
pthread_cond_destroy(&g.read_thread_cond);
pthread_mutex_destroy(&g.read_thread_mutex);
/*
* Close the connection and input file and general clean up...
*/
@@ -940,7 +1056,12 @@ sidechannel_thread(void *reference)
break;
}
}
while (1);
while (!g.sidechannel_thread_stop);
pthread_mutex_lock(&g.sidechannel_thread_mutex);
g.sidechannel_thread_done = 1;
pthread_cond_signal(&g.sidechannel_thread_cond);
pthread_mutex_unlock(&g.sidechannel_thread_mutex);
return NULL;
}
@@ -1276,7 +1397,10 @@ static kern_return_t load_classdriver(CFStringRef driverPath,
{
fprintf(stderr, "DEBUG: Unable to load class driver \"%s\": %s\n",
bundlestr, strerror(errno));
return (kr);
if (errno == ENOENT)
return (load_classdriver(NULL, intf, printerDriver));
else
return (kr);
}
else if (bundleinfo.st_mode & S_IWOTH)
{
@@ -1928,6 +2052,8 @@ static void run_legacy_backend(int argc,
exit(exitstatus);
}
#endif /* __i386__ || __x86_64__ */
/*
* 'sigterm_handler()' - SIGTERM handler.
@@ -1936,8 +2062,11 @@ static void run_legacy_backend(int argc,
static void
sigterm_handler(int sig) /* I - Signal */
{
/* If we started a child process pass the signal on to it...
*/
#if defined(__i386__) || defined(__x86_64__)
/*
* If we started a child process pass the signal on to it...
*/
if (child_pid)
{
/*
@@ -1959,9 +2088,8 @@ sigterm_handler(int sig) /* I - Signal */
exit(CUPS_BACKEND_STOP);
}
}
}
#endif /* __i386__ || __x86_64__ */
}
#ifdef PARSE_PS_ERRORS
+10 -7
Ver Arquivo
@@ -1,9 +1,9 @@
/*
* "$Id$"
*
* Libusb interface code for the Common UNIX Printing System (CUPS).
* Libusb interface code for CUPS.
*
* Copyright 2007-2009 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
*
* These coded instructions, statements, and computer programs are the
* property of Apple Inc. and are protected by Federal copyright
@@ -100,7 +100,7 @@ print_device(const char *uri, /* I - Device URI */
usb_printer_t *printer; /* Printer */
ssize_t bytes, /* Bytes read/written */
tbytes; /* Total bytes written */
char buffer[8192]; /* Print data buffer */
char buffer[512]; /* Print data buffer */
struct sigaction action; /* Actions for POSIX signals */
struct pollfd pfds[2]; /* Poll descriptors */
@@ -172,7 +172,7 @@ print_device(const char *uri, /* I - Device URI */
if ((bytes = read(print_fd, buffer, sizeof(buffer))) > 0)
{
if (usb_bulk_write(printer->handle, printer->write_endp, buffer,
bytes, 45000) < 0)
bytes, 3600000) < 0)
{
_cupsLangPrintf(stderr,
_("ERROR: Unable to write %d bytes to printer!\n"),
@@ -411,7 +411,7 @@ get_device_id(usb_printer_t *printer, /* I - Printer */
if (usb_control_msg(printer->handle,
USB_TYPE_CLASS | USB_ENDPOINT_IN | USB_RECIP_INTERFACE,
0, printer->conf, printer->iface,
0, printer->conf, (printer->iface << 8) | printer->altset,
buffer, bufsize, 5000) < 0)
{
*buffer = '\0';
@@ -518,7 +518,8 @@ make_device_uri(
if ((sern = cupsGetOption("SERIALNUMBER", num_values, values)) == NULL)
if ((sern = cupsGetOption("SERN", num_values, values)) == NULL)
if ((sern = cupsGetOption("SN", num_values, values)) == NULL)
if ((sern = cupsGetOption("SN", num_values, values)) == NULL &&
printer->device->descriptor.iSerialNumber)
{
/*
* Try getting the serial number from the device itself...
@@ -674,6 +675,7 @@ open_device(usb_printer_t *printer, /* I - Printer */
goto error;
}
#if 0 /* STR #3801: Claiming interface 0 causes problems with some printers */
if (number != 0)
while (usb_claim_interface(printer->handle, 0) < 0)
{
@@ -684,6 +686,7 @@ open_device(usb_printer_t *printer, /* I - Printer */
goto error;
}
#endif /* 0 */
/*
* Set alternate setting...
@@ -747,7 +750,7 @@ side_cb(usb_printer_t *printer, /* I - Printer */
{
ssize_t bytes, /* Bytes read/written */
tbytes; /* Total bytes written */
char buffer[8192]; /* Print data buffer */
char buffer[512]; /* Print data buffer */
struct pollfd pfd; /* Poll descriptor */
cups_sc_command_t command; /* Request command */
cups_sc_status_t status; /* Request/response status */
+33 -10
Ver Arquivo
@@ -1,9 +1,9 @@
/*
* "$Id$"
*
* Administration CGI for the Common UNIX Printing System (CUPS).
* Administration CGI for CUPS.
*
* Copyright 2007-2010 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -145,7 +145,30 @@ main(int argc, /* I - Number of command-line arguments */
fprintf(stderr, "DEBUG: op=\"%s\"...\n", op);
if (!strcmp(op, "set-allowed-users"))
if (!*op)
{
const char *printer = getenv("PRINTER_NAME"),
/* Printer or class name */
*server_port = getenv("SERVER_PORT");
/* Port number string */
int port = atoi(server_port ? server_port : "0");
/* Port number */
char uri[1024]; /* URL */
if (printer)
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri),
getenv("HTTPS") ? "https" : "http", NULL,
getenv("SERVER_NAME"), port, "/%s/%s",
cgiGetVariable("IS_CLASS") ? "classes" : "printers",
printer);
else
httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri),
getenv("HTTPS") ? "https" : "http", NULL,
getenv("SERVER_NAME"), port, "/admin");
printf("Location: %s\n\n", uri);
}
else if (!strcmp(op, "set-allowed-users"))
do_set_allowed_users(http);
else if (!strcmp(op, "set-as-default"))
do_set_default(http);
@@ -951,8 +974,6 @@ do_am_printer(http_t *http, /* I - HTTP connection */
if (!cgiGetVariable("CURRENT_MAKE"))
cgiSetVariable("CURRENT_MAKE", make);
cgiSetVariable("PPD_MAKE", make);
if (!cgiGetVariable("CURRENT_MAKE_AND_MODEL"))
cgiSetVariable("CURRENT_MAKE_AND_MODEL", uriptr);
@@ -1005,7 +1026,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */
fputs("DEBUG: Getting list of devices...\n", stderr);
current_device = 0;
if (cupsGetDevices(http, 30, CUPS_INCLUDE_ALL, CUPS_EXCLUDE_NONE,
if (cupsGetDevices(http, 5, CUPS_INCLUDE_ALL, CUPS_EXCLUDE_NONE,
(cups_device_cb_t)choose_device_cb,
(void *)title) == IPP_OK)
{
@@ -1042,7 +1063,8 @@ do_am_printer(http_t *http, /* I - HTTP connection */
}
}
}
else if (strchr(var, '/') == NULL)
else if (!strchr(var, '/') ||
(!strncmp(var, "lpd://", 6) && !strchr(var + 6, '/')))
{
if ((attr = ippFindAttribute(oldinfo, "device-uri", IPP_TAG_URI)) != NULL)
{
@@ -1218,8 +1240,8 @@ do_am_printer(http_t *http, /* I - HTTP connection */
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, "ipp://localhost/printers/");
if ((var = cgiGetVariable("CURRENT_MAKE")) == NULL)
var = cgiGetVariable("PPD_MAKE");
if ((var = cgiGetVariable("PPD_MAKE")) == NULL)
var = cgiGetVariable("CURRENT_MAKE");
if (var && !cgiGetVariable("SELECT_MAKE"))
{
const char *make_model; /* Make and model */
@@ -2585,7 +2607,8 @@ do_list_printers(http_t *http) /* I - HTTP connection */
if (isalnum(*ptr & 255) || *ptr == '_' || *ptr == '-' ||
*ptr == '.')
*option_ptr++ = *ptr;
else if ((*ptr == ' ' || *ptr == '/') && option_ptr[-1] != '_')
else if ((*ptr == ' ' || *ptr == '/') && option_ptr > option &&
option_ptr[-1] != '_')
*option_ptr++ = '_';
else if (*ptr == '?' || *ptr == '(')
break;
+17 -3
Ver Arquivo
@@ -1,9 +1,9 @@
/*
* "$Id$"
*
* Class status CGI for the Common UNIX Printing System (CUPS).
* Class status CGI for CUPS.
*
* Copyright 2007-2008 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -147,7 +147,21 @@ main(int argc, /* I - Number of command-line arguments */
}
else if (pclass)
{
if (!strcmp(op, "start-class"))
if (!*op)
{
const char *server_port = getenv("SERVER_PORT");
/* Port number string */
int port = atoi(server_port ? server_port : "0");
/* Port number */
char uri[1024]; /* URL */
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri),
getenv("HTTPS") ? "https" : "http", NULL,
getenv("SERVER_NAME"), port, "/classes/%s", pclass);
printf("Location: %s\n\n", uri);
}
else if (!strcmp(op, "start-class"))
do_class_op(http, pclass, IPP_RESUME_PRINTER, cgiText(_("Resume Class")));
else if (!strcmp(op, "stop-class"))
do_class_op(http, pclass, IPP_PAUSE_PRINTER, cgiText(_("Pause Class")));
+8 -26
Ver Arquivo
@@ -1,9 +1,9 @@
/*
* "$Id$"
*
* HTML support functions for the Common UNIX Printing System (CUPS).
* HTML support functions for CUPS.
*
* Copyright 2007-2009 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -208,31 +208,13 @@ cgiStartMultipart(void)
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 */
/*
* Too many bug reports for browsers that don't support it, and too much pain
* to whitelist known-good browsers, so for now we just punt on multi-part
* support... :(
*/
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);
return (0);
}
+6 -2
Ver Arquivo
@@ -285,10 +285,14 @@ cgiMoveJobs(http_t *http, /* I - Connection to server */
/*
* See who is logged in...
* Make sure we have a username...
*/
user = getenv("REMOTE_USER");
if ((user = getenv("REMOTE_USER")) == NULL)
{
puts("Status: 401\n");
exit(0);
}
/*
* See if the user has already selected a new destination...
+17 -3
Ver Arquivo
@@ -1,9 +1,9 @@
/*
* "$Id$"
*
* Printer status CGI for the Common UNIX Printing System (CUPS).
* Printer status CGI for CUPS.
*
* Copyright 2007-2008 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -148,7 +148,21 @@ main(int argc, /* I - Number of command-line arguments */
}
else if (printer)
{
if (!strcmp(op, "start-printer"))
if (!*op)
{
const char *server_port = getenv("SERVER_PORT");
/* Port number string */
int port = atoi(server_port ? server_port : "0");
/* Port number */
char uri[1024]; /* URL */
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri),
getenv("HTTPS") ? "https" : "http", NULL,
getenv("SERVER_NAME"), port, "/printers/%s", printer);
printf("Location: %s\n\n", uri);
}
else if (!strcmp(op, "start-printer"))
do_printer_op(http, printer, IPP_RESUME_PRINTER,
cgiText(_("Resume Printer")));
else if (!strcmp(op, "stop-printer"))
+5 -1
Ver Arquivo
@@ -46,6 +46,10 @@ DefaultAuthType Basic
# Set the default printer/job policies...
<Policy default>
# Job-related operations must be done by the owner or an administrator...
<Limit Create-Job Print-Job Print-URI Validate-Job>
Order deny,allow
</Limit>
<Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job CUPS-Get-Document>
Require user @OWNER @SYSTEM
Order deny,allow
@@ -79,7 +83,7 @@ DefaultAuthType Basic
# Set the authenticated printer/job policies...
<Policy authenticated>
# Job-related operations must be done by the owner or an administrator...
<Limit Create-Job Print-Job Print-URI>
<Limit Create-Job Print-Job Print-URI Validate-Job>
AuthType Default
Order deny,allow
</Limit>
+33 -24
Ver Arquivo
@@ -1,9 +1,9 @@
dnl
dnl "$Id: cups-common.m4 9160 2010-06-16 20:25:12Z mike $"
dnl "$Id: cups-common.m4 9853 2011-07-06 20:27:31Z mike $"
dnl
dnl Common configuration stuff for CUPS.
dnl
dnl Copyright 2007-2010 by Apple Inc.
dnl Copyright 2007-2011 by Apple Inc.
dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
@@ -20,7 +20,7 @@ dnl Set the name of the config header file...
AC_CONFIG_HEADER(config.h)
dnl Version number information...
CUPS_VERSION="1.4.4"
CUPS_VERSION="1.4.8"
CUPS_REVISION=""
#if test -z "$CUPS_REVISION" -a -d .svn; then
# CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[[a-zA-Z]]*//g'`"
@@ -88,6 +88,9 @@ fi
AC_SUBST(INSTALLSTATIC)
dnl Check for pkg-config, which is used for some other tests later on...
AC_PATH_PROG(PKGCONFIG, pkg-config)
dnl Check for libraries...
AC_SEARCH_LIBS(crypt, crypt)
AC_SEARCH_LIBS(getspent, sec gen)
@@ -133,6 +136,13 @@ AC_CHECK_HEADER(sys/param.h,AC_DEFINE(HAVE_SYS_PARAM_H))
AC_CHECK_HEADER(sys/ucred.h,AC_DEFINE(HAVE_SYS_UCRED_H))
AC_CHECK_HEADER(scsi/sg.h,AC_DEFINE(HAVE_SCSI_SG_H))
dnl Checks for statfs and its many headers...
AC_CHECK_HEADER(sys/mount.h,AC_DEFINE(HAVE_SYS_MOUNT_H))
AC_CHECK_HEADER(sys/statfs.h,AC_DEFINE(HAVE_SYS_STATFS_H))
AC_CHECK_HEADER(sys/statvfs.h,AC_DEFINE(HAVE_SYS_STATVFS_H))
AC_CHECK_HEADER(sys/vfs.h,AC_DEFINE(HAVE_SYS_VFS_H))
AC_CHECK_FUNCS(statfs statvfs)
dnl Checks for string functions.
AC_CHECK_FUNCS(strdup strcasecmp strncasecmp strlcat strlcpy)
if test "$uname" = "HP-UX" -a "$uversion" = "1020"; then
@@ -200,7 +210,7 @@ else
fi
if test $check_libusb = yes; then
AC_CHECK_LIB(usb, usb_init,[
AC_CHECK_LIB(usb, usb_get_string_simple,[
AC_CHECK_HEADER(usb.h,
AC_DEFINE(HAVE_USB_H)
LIBUSB="-lusb")])
@@ -261,24 +271,22 @@ AC_ARG_WITH(dbusdir, [ --with-dbusdir set DBUS configuration directory
DBUS_NOTIFIER=""
DBUS_NOTIFIERLIBS=""
if test "x$enable_dbus" != xno; then
AC_PATH_PROG(PKGCONFIG, pkg-config)
if test "x$PKGCONFIG" != x; then
AC_MSG_CHECKING(for DBUS)
if $PKGCONFIG --exists dbus-1; then
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_DBUS)
CFLAGS="$CFLAGS `$PKGCONFIG --cflags dbus-1` -DDBUS_API_SUBJECT_TO_CHANGE"
CUPSDLIBS="$CUPSDLIBS `$PKGCONFIG --libs dbus-1`"
DBUS_NOTIFIER="dbus"
DBUS_NOTIFIERLIBS="`$PKGCONFIG --libs dbus-1`"
AC_CHECK_LIB(dbus-1,
dbus_message_iter_init_append,
AC_DEFINE(HAVE_DBUS_MESSAGE_ITER_INIT_APPEND),,
`$PKGCONFIG --libs dbus-1`)
else
AC_MSG_RESULT(no)
fi
if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x; then
AC_MSG_CHECKING(for DBUS)
if $PKGCONFIG --exists dbus-1; then
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_DBUS)
CFLAGS="$CFLAGS `$PKGCONFIG --cflags dbus-1` -DDBUS_API_SUBJECT_TO_CHANGE"
CUPSDLIBS="$CUPSDLIBS `$PKGCONFIG --libs dbus-1`"
DBUS_NOTIFIER="dbus"
DBUS_NOTIFIERLIBS="`$PKGCONFIG --libs dbus-1`"
SAVELIBS="$LIBS"
LIBS="$LIBS $DBUS_NOTIFIERLIBS"
AC_CHECK_FUNC(dbus_message_iter_init_append,
AC_DEFINE(HAVE_DBUS_MESSAGE_ITER_INIT_APPEND))
LIBS="$SAVELIBS"
else
AC_MSG_RESULT(no)
fi
fi
@@ -300,6 +308,7 @@ case $uname in
LIBS="-framework SystemConfiguration -framework CoreFoundation -framework Security $LIBS"
dnl Check for framework headers...
AC_CHECK_HEADER(ApplicationServices/ApplicationServices.h,AC_DEFINE(HAVE_APPLICATIONSERVICES_H))
AC_CHECK_HEADER(CoreFoundation/CoreFoundation.h,AC_DEFINE(HAVE_COREFOUNDATION_H))
AC_CHECK_HEADER(CoreFoundation/CFPriv.h,AC_DEFINE(HAVE_CFPRIV_H))
AC_CHECK_HEADER(CoreFoundation/CFBundlePriv.h,AC_DEFINE(HAVE_CFBUNDLEPRIV_H))
@@ -329,7 +338,7 @@ case $uname in
AC_ARG_WITH(operkey, [ --with-operkey set the default operator @AUTHKEY value],
default_operkey="$withval",
default_operkey="default")
AC_CHECK_HEADER(Security/Authorization.h, [
AC_DEFINE(HAVE_AUTHORIZATION_H)
@@ -362,5 +371,5 @@ AC_SUBST(FONTS)
AC_SUBST(LEGACY_BACKENDS)
dnl
dnl End of "$Id: cups-common.m4 9160 2010-06-16 20:25:12Z mike $".
dnl End of "$Id: cups-common.m4 9853 2011-07-06 20:27:31Z mike $".
dnl
+15 -8
Ver Arquivo
@@ -1,5 +1,5 @@
dnl
dnl "$Id: cups-compiler.m4 8655 2009-05-17 00:13:47Z mike $"
dnl "$Id: cups-compiler.m4 9822 2011-06-10 22:59:36Z mike $"
dnl
dnl Compiler stuff for the Common UNIX Printing System (CUPS).
dnl
@@ -146,15 +146,22 @@ if test -n "$GCC"; then
AC_MSG_RESULT(no))
CFLAGS="$OLDCFLAGS"
# The -pie option is available with some versions of GCC and adds
# The -fPIE option is available with some versions of GCC and adds
# randomization of addresses, which avoids another class of exploits
# that depend on a fixed address for common functions.
AC_MSG_CHECKING(if GCC supports -pie)
AC_MSG_CHECKING(if GCC supports -fPIE)
OLDCFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -pie -fPIE"
CFLAGS="$CFLAGS -fPIE"
AC_TRY_COMPILE(,,
PIEFLAGS="-pie -fPIE"
AC_MSG_RESULT(yes),
[case "$CC" in
*clang)
PIEFLAGS="-fPIE -Wl,-pie"
;;
*)
PIEFLAGS="-fPIE -pie"
;;
esac
AC_MSG_RESULT(yes)],
AC_MSG_RESULT(no))
CFLAGS="$OLDCFLAGS"
@@ -175,7 +182,7 @@ if test -n "$GCC"; then
# checking, basically wrapping all string functions
# with buffer-limited ones. Not strictly needed for
# CUPS since we already use buffer-limited calls, but
# this will catch any additions that are broken.
# this will catch any additions that are broken.
CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
if test x$enable_pie = xyes; then
@@ -563,5 +570,5 @@ case $uname in
esac
dnl
dnl End of "$Id: cups-compiler.m4 8655 2009-05-17 00:13:47Z mike $".
dnl End of "$Id: cups-compiler.m4 9822 2011-06-10 22:59:36Z mike $".
dnl
+21 -6
Ver Arquivo
@@ -1,9 +1,9 @@
dnl
dnl "$Id: cups-ssl.m4 9165 2010-06-17 18:20:39Z mike $"
dnl "$Id: cups-ssl.m4 9470 2011-01-11 07:05:58Z mike $"
dnl
dnl OpenSSL/GNUTLS stuff for CUPS.
dnl
dnl Copyright 2007-2010 by Apple Inc.
dnl Copyright 2007-2011 by Apple Inc.
dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
@@ -30,7 +30,7 @@ have_ssl=0
if test x$enable_ssl != xno; then
dnl Look for CDSA...
if test $have_ssl = 0 -a "x${enable_cdsassl}" != "xno"; then
if test $have_ssl = 0 -a "x$enable_cdsassl" != "xno"; then
if test $uname = Darwin; then
AC_CHECK_HEADER(Security/SecureTransport.h, [
have_ssl=1
@@ -38,6 +38,10 @@ if test x$enable_ssl != xno; then
AC_DEFINE(HAVE_CDSASSL)
dnl Check for the various security headers...
AC_CHECK_HEADER(Security/SecItem.h,
AC_DEFINE(HAVE_SECITEM_H))
AC_CHECK_HEADER(Security/SecItemPriv.h,
AC_DEFINE(HAVE_SECITEMPRIV_H))
AC_CHECK_HEADER(Security/SecPolicy.h,
AC_DEFINE(HAVE_SECPOLICY_H))
AC_CHECK_HEADER(Security/SecPolicyPriv.h,
@@ -54,12 +58,21 @@ if test x$enable_ssl != xno; then
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
fi
dnl Check for SecPolicyCreateSSL...
AC_MSG_CHECKING(for SecPolicyCreateSSL)
if test $uversion -ge 110; then
AC_DEFINE(HAVE_SECPOLICYCREATESSL)
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
fi])
fi
fi
dnl Then look for GNU TLS...
if test $have_ssl = 0 -a "x${enable_gnutls}" != "xno" -a "x$PKGCONFIG" != x; then
if test $have_ssl = 0 -a "x$enable_gnutls" != "xno" -a "x$PKGCONFIG" != x; then
AC_PATH_PROG(LIBGNUTLSCONFIG,libgnutls-config)
AC_PATH_PROG(LIBGCRYPTCONFIG,libgcrypt-config)
if $PKGCONFIG --exists gnutls; then
@@ -96,7 +109,7 @@ if test x$enable_ssl != xno; then
fi
dnl Check for the OpenSSL library last...
if test $have_ssl = 0 -a "x${enable_openssl}" != "xno"; then
if test $have_ssl = 0 -a "x$enable_openssl" != "xno"; then
AC_CHECK_HEADER(openssl/ssl.h,
dnl Save the current libraries so the crypto stuff isn't always
dnl included...
@@ -133,6 +146,8 @@ fi
if test $have_ssl = 1; then
AC_MSG_RESULT([ Using SSLLIBS="$SSLLIBS"])
AC_MSG_RESULT([ Using SSLFLAGS="$SSLFLAGS"])
elif test x$enable_cdsa = xyes -o x$enable_gnutls = xyes -o x$enable_openssl = xyes; then
AC_MSG_ERROR([Unable to enable SSL support.])
fi
AC_SUBST(SSLFLAGS)
@@ -143,5 +158,5 @@ AC_SUBST(EXPORT_SSLLIBS)
dnl
dnl End of "$Id: cups-ssl.m4 9165 2010-06-17 18:20:39Z mike $".
dnl End of "$Id: cups-ssl.m4 9470 2011-01-11 07:05:58Z mike $".
dnl
+29 -1
Ver Arquivo
@@ -3,7 +3,7 @@
*
* Configuration file for CUPS.
*
* Copyright 2007-2010 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -289,6 +289,8 @@
*/
#undef HAVE_AUTHORIZATION_H
#undef HAVE_SECITEM_H
#undef HAVE_SECITEMPRIV_H
#undef HAVE_SECPOLICY_H
#undef HAVE_SECPOLICYPRIV_H
#undef HAVE_SECBASEPRIV_H
@@ -302,6 +304,13 @@
#undef HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY
/*
* Do we have the SecPolicyCreateSSL function?
*/
#undef HAVE_SECPOLICYCREATESSL
/*
* Do we have the SLP library?
*/
@@ -488,6 +497,13 @@
#undef HAVE_CFBUNDLEPRIV_H
/*
* Do we have ApplicationServices public headers?
*/
#undef HAVE_APPLICATIONSERVICES_H
/*
* Do we have the SCDynamicStoreCopyComputerName function?
*/
@@ -639,6 +655,18 @@
#undef HAVE_TCPD_H
/*
* Do we have statfs or statvfs and one of the corresponding headers?
*/
#undef HAVE_STATFS
#undef HAVE_STATVFS
#undef HAVE_SYS_MOUNT_H
#undef HAVE_SYS_STATFS_H
#undef HAVE_SYS_STATVFS_H
#undef HAVE_SYS_VFS_H
#endif /* !_CUPS_CONFIG_H_ */
/*
+1 -1
Ver Arquivo
@@ -70,7 +70,7 @@ AC_OUTPUT(Makedefs packaging/cups.list init/cups.sh init/cups-lpd cups-config
init/org.cups.cups-lpd.plist init/cups.xml
man/client.conf.man man/cups-deviced.man man/cups-driverd.man
man/cups-lpd.man man/cupsaddsmb.man man/cupsd.man
man/cupsd.conf.man man/drv.man man/lpoptions.man
man/cupsd.conf.man man/lpoptions.man
templates/header.tmpl
$LANGFILES)
+104 -74
Ver Arquivo
@@ -4,7 +4,7 @@
* Administration utility API definitions for the Common UNIX Printing
* System (CUPS).
*
* Copyright 2007-2010 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 2001-2007 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -17,16 +17,14 @@
*
* Contents:
*
* cupsAdminCreateWindowsPPD() - Create the Windows PPD file for a printer.
* cupsAdminExportSamba() - Export a printer to Samba.
* cupsAdminGetServerSettings() - Get settings from the server.
* _cupsAdminGetServerSettings() - Get settings from the server (private).
* cupsAdminSetServerSettings() - Set settings on the server.
* _cupsAdminSetServerSettings() - Set settings on the server (private).
* do_samba_command() - Do a SAMBA command.
* get_cupsd_conf() - Get the current cupsd.conf file.
* invalidate_cupsd_cache() - Invalidate the cached cupsd.conf settings.
* write_option() - Write a CUPS option to a PPD file.
* cupsAdminCreateWindowsPPD() - Create the Windows PPD file for a printer.
* cupsAdminExportSamba() - Export a printer to Samba.
* cupsAdminGetServerSettings() - Get settings from the server.
* cupsAdminSetServerSettings() - Set settings on the server.
* do_samba_command() - Do a SAMBA command.
* get_cupsd_conf() - Get the current cupsd.conf file.
* invalidate_cupsd_cache() - Invalidate the cached cupsd.conf settings.
* write_option() - Write a CUPS option to a PPD file.
*/
/*
@@ -50,12 +48,6 @@
* Local functions...
*/
extern int _cupsAdminGetServerSettings(http_t *http,
int *num_settings,
cups_option_t **settings);
extern int _cupsAdminSetServerSettings(http_t *http,
int num_settings,
cups_option_t *settings);
static int do_samba_command(const char *command,
const char *address,
const char *subcommand,
@@ -243,7 +235,7 @@ cupsAdminCreateWindowsPPD(
}
else if (jcloption && !strncmp(line, "*OrderDependency:", 17))
{
for (ptr = line + 17; *ptr && isspace(*ptr & 255); ptr ++);
for (ptr = line + 17; _cups_isspace(*ptr); ptr ++);
ptr = strchr(ptr, ' ');
@@ -1024,7 +1016,7 @@ cupsAdminGetServerSettings(
&& *value != '/'
#endif /* AF_LOCAL */
#ifdef AF_INET6
&& strcmp(value, "::1")
&& strcmp(value, "[::1]")
#endif /* AF_INET6 */
)
remote_access = 1;
@@ -1069,7 +1061,7 @@ cupsAdminGetServerSettings(
while (*value)
{
for (valptr = value; !isspace(*valptr & 255) && *valptr; valptr ++);
for (valptr = value; *valptr && !_cups_isspace(*valptr); valptr ++);
if (*valptr)
*valptr++ = '\0';
@@ -1080,7 +1072,7 @@ cupsAdminGetServerSettings(
break;
}
for (value = valptr; isspace(*value & 255); value ++);
for (value = valptr; _cups_isspace(*value); value ++);
}
}
else if (!strcasecmp(line, "</Limit>"))
@@ -1284,12 +1276,18 @@ cupsAdminSetServerSettings(
else
old_debug_logging = 0;
DEBUG_printf(("1cupsAdminSetServerSettings: old debug_logging=%d",
old_debug_logging));
if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ADMIN, cupsd_num_settings,
cupsd_settings)) != NULL)
old_remote_admin = atoi(val);
else
old_remote_admin = 0;
DEBUG_printf(("1cupsAdminSetServerSettings: old remote_admin=%d",
old_remote_admin));
if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ANY, cupsd_num_settings,
cupsd_settings)) != NULL)
remote_any = atoi(val);
@@ -1305,18 +1303,27 @@ cupsAdminSetServerSettings(
else
old_remote_printers = 1;
DEBUG_printf(("1cupsAdminSetServerSettings: old remote_printers=%d",
old_remote_printers));
if ((val = cupsGetOption(CUPS_SERVER_SHARE_PRINTERS, cupsd_num_settings,
cupsd_settings)) != NULL)
old_share_printers = atoi(val);
else
old_share_printers = 0;
DEBUG_printf(("1cupsAdminSetServerSettings: old share_printers=%d",
old_share_printers));
if ((val = cupsGetOption(CUPS_SERVER_USER_CANCEL_ANY, cupsd_num_settings,
cupsd_settings)) != NULL)
old_user_cancel_any = atoi(val);
else
old_user_cancel_any = 0;
DEBUG_printf(("1cupsAdminSetServerSettings: old user_cancel_any=%d",
old_user_cancel_any));
cupsFreeOptions(cupsd_num_settings, cupsd_settings);
/*
@@ -1340,16 +1347,22 @@ cupsAdminSetServerSettings(
else
debug_logging = -1;
DEBUG_printf(("1cupsAdminSetServerSettings: debug_logging=%d",
debug_logging));
if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ANY, num_settings,
settings)) != NULL)
remote_any = atoi(val);
DEBUG_printf(("1cupsAdminSetServerSettings: remote_any=%d",
remote_any));
if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ADMIN, num_settings,
settings)) != NULL)
{
remote_admin = atoi(val);
if (remote_admin == old_remote_admin && remote_any < 0)
if (remote_admin == old_remote_admin)
{
/*
* No change to this setting...
@@ -1361,6 +1374,9 @@ cupsAdminSetServerSettings(
else
remote_admin = -1;
DEBUG_printf(("1cupsAdminSetServerSettings: remote_admin=%d",
remote_admin));
if ((val = cupsGetOption(CUPS_SERVER_REMOTE_PRINTERS, num_settings,
settings)) != NULL)
{
@@ -1378,12 +1394,15 @@ cupsAdminSetServerSettings(
else
remote_printers = -1;
DEBUG_printf(("1cupsAdminSetServerSettings: remote_printers=%d",
remote_printers));
if ((val = cupsGetOption(CUPS_SERVER_SHARE_PRINTERS, num_settings,
settings)) != NULL)
{
share_printers = atoi(val);
if (share_printers == old_share_printers && remote_any < 0)
if (share_printers == old_share_printers)
{
/*
* No change to this setting...
@@ -1395,6 +1414,9 @@ cupsAdminSetServerSettings(
else
share_printers = -1;
DEBUG_printf(("1cupsAdminSetServerSettings: share_printers=%d",
share_printers));
if ((val = cupsGetOption(CUPS_SERVER_USER_CANCEL_ANY, num_settings,
settings)) != NULL)
{
@@ -1412,6 +1434,9 @@ cupsAdminSetServerSettings(
else
user_cancel_any = -1;
DEBUG_printf(("1cupsAdminSetServerSettings: user_cancel_any=%d",
user_cancel_any));
/*
* Create a temporary file for the new cupsd.conf file...
*/
@@ -1678,7 +1703,7 @@ cupsAdminSetServerSettings(
remote_any > 0 ? "all" : "@LOCAL");
}
else if (in_root_location &&
(remote_admin >= 0 || remote_any >= 0 || share_printers >= 0))
(remote_admin >= 0 || remote_any > 0 || share_printers >= 0))
{
wrote_root_location = 1;
@@ -1707,83 +1732,86 @@ cupsAdminSetServerSettings(
cupsFilePuts(temp, "</Location>\n");
}
else if (!strcasecmp(line, "<Limit") && in_default_policy)
else if (!strcasecmp(line, "<Limit"))
{
/*
* See if the policy limit is for the Cancel-Job operation...
*/
char *valptr; /* Pointer into value */
indent += 2;
if (!strcasecmp(value, "cancel-job") && user_cancel_any >= 0)
if (in_default_policy)
{
/*
* Don't write anything for this limit section...
* See if the policy limit is for the Cancel-Job operation...
*/
in_cancel_job = 2;
char *valptr; /* Pointer into value */
if (!strcasecmp(value, "cancel-job") && user_cancel_any >= 0)
{
/*
* Don't write anything for this limit section...
*/
in_cancel_job = 2;
}
else
{
cupsFilePrintf(temp, "%*s%s", indent, "", line);
while (*value)
{
for (valptr = value; *valptr && !_cups_isspace(*valptr); valptr ++);
if (*valptr)
*valptr++ = '\0';
if (!strcasecmp(value, "cancel-job") && user_cancel_any >= 0)
{
/*
* Write everything except for this definition...
*/
in_cancel_job = 1;
}
else
cupsFilePrintf(temp, " %s", value);
for (value = valptr; _cups_isspace(*value); value ++);
}
cupsFilePuts(temp, ">\n");
}
}
else
{
cupsFilePrintf(temp, " %s", line);
cupsFilePrintf(temp, "%*s%s %s>\n", indent, "", line, value);
while (*value)
{
for (valptr = value; !isspace(*valptr & 255) && *valptr; valptr ++);
if (*valptr)
*valptr++ = '\0';
if (!strcasecmp(value, "cancel-job") && user_cancel_any >= 0)
{
/*
* Write everything except for this definition...
*/
in_cancel_job = 1;
}
else
cupsFilePrintf(temp, " %s", value);
for (value = valptr; isspace(*value & 255); value ++);
}
cupsFilePuts(temp, ">\n");
}
indent += 2;
}
else if (!strcasecmp(line, "</Limit>") && in_cancel_job)
{
indent -= 2;
if (in_cancel_job == 1)
cupsFilePuts(temp, " </Limit>\n");
cupsFilePuts(temp, " </Limit>\n");
wrote_policy = 1;
if (!user_cancel_any)
cupsFilePuts(temp, " # Only the owner or an administrator can cancel "
"a job...\n"
" <Limit Cancel-Job>\n"
" Order deny,allow\n"
" Require user @OWNER "
"a job...\n"
" <Limit Cancel-Job>\n"
" Order deny,allow\n"
" Require user @OWNER "
CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n"
" </Limit>\n");
in_cancel_job = 0;
}
else if ((((in_admin_location || in_conf_location || in_root_location) &&
remote_admin >= 0) ||
(remote_admin >= 0 || remote_any > 0)) ||
(in_root_location && share_printers >= 0)) &&
(!strcasecmp(line, "Allow") || !strcasecmp(line, "Deny") ||
!strcasecmp(line, "Order")))
continue;
else if (in_cancel_job == 2)
continue;
else if (!strcasecmp(line, "<Limit") && value)
cupsFilePrintf(temp, " %s %s>\n", line, value);
else if (line[0] == '<')
{
if (value)
@@ -1823,7 +1851,7 @@ cupsAdminSetServerSettings(
/*
* Record the non-policy, non-location directives that we find
* in the server settings, since we cache this info and record it
* in _cupsAdminGetServerSettings()...
* in cupsAdminGetServerSettings()...
*/
cupsd_num_settings = cupsAddOption(line, value, cupsd_num_settings,
@@ -1882,7 +1910,7 @@ cupsAdminSetServerSettings(
}
if (!wrote_port_listen &&
(remote_admin >= 0 || remote_any >= 0 || share_printers >= 0))
(remote_admin >= 0 || remote_any > 0 || share_printers >= 0))
{
if (remote_admin > 0 || remote_any > 0 || share_printers > 0)
{
@@ -1903,7 +1931,7 @@ cupsAdminSetServerSettings(
}
if (!wrote_root_location &&
(remote_admin >= 0 || remote_any >= 0 || share_printers >= 0))
(remote_admin >= 0 || remote_any > 0 || share_printers >= 0))
{
if (remote_admin > 0 && share_printers > 0)
cupsFilePuts(temp,
@@ -2009,6 +2037,8 @@ cupsAdminSetServerSettings(
for (i = num_settings, setting = settings; i > 0; i --, setting ++)
if (setting->name[0] != '_' &&
strcasecmp(setting->name, "Listen") &&
strcasecmp(setting->name, "Port") &&
!cupsGetOption(setting->name, cupsd_num_settings, cupsd_settings))
{
/*
+3 -3
Ver Arquivo
@@ -1,9 +1,9 @@
<!--
"$Id: api-array.shtml 7616 2008-05-28 00:34:13Z mike $"
"$Id: api-array.shtml 9728 2011-04-28 21:21:24Z mike $"
Array API introduction for the Common UNIX Printing System (CUPS).
Array API introduction for CUPS.
Copyright 2007-2008 by Apple Inc.
Copyright 2007-2011 by Apple Inc.
Copyright 1997-2006 by Easy Software Products, all rights reserved.
These coded instructions, statements, and computer programs are the
+4 -4
Ver Arquivo
@@ -1,9 +1,9 @@
<!--
"$Id: api-cups.shtml 9061 2010-03-30 22:07:33Z mike $"
"$Id: api-cups.shtml 9728 2011-04-28 21:21:24Z mike $"
CUPS API introduction for the Common UNIX Printing System (CUPS).
API introduction for CUPS.
Copyright 2007-2010 by Apple Inc.
Copyright 2007-2011 by Apple Inc.
Copyright 1997-2006 by Easy Software Products, all rights reserved.
These coded instructions, statements, and computer programs are the
@@ -50,7 +50,7 @@ specific destination for printing:</p>
int num_dests = <a href='#cupsGetDests'>cupsGetDests</a>(&amp;dests);
<a href='#cups_dest_t'>cups_dest_t</a> *dest = <a href='#cupsGetDest'>cupsGetDest</a>("name", NULL, num_dests, dests);
/* do something wiith dest */
/* do something with dest */
<a href='#cupsFreeDests'>cupsFreeDests</a>(num_dests, dests);
</pre>
+3 -3
Ver Arquivo
@@ -1,9 +1,9 @@
<!--
"$Id: api-filedir.shtml 7279 2008-01-31 01:50:44Z mike $"
"$Id: api-filedir.shtml 9728 2011-04-28 21:21:24Z mike $"
File and directory API introduction for the Common UNIX Printing System (CUPS).
File and directory API introduction for CUPS.
Copyright 2007-2008 by Apple Inc.
Copyright 2007-2011 by Apple Inc.
Copyright 1997-2005 by Easy Software Products, all rights reserved.
These coded instructions, statements, and computer programs are the
+2 -2
Ver Arquivo
@@ -1,5 +1,5 @@
<!--
"$Id: api-filter.header 8673 2009-05-22 17:34:15Z mike $"
"$Id: api-filter.header 9272 2010-08-27 16:51:43Z mike $"
Filter and backend programming header for the Common UNIX Printing System
(CUPS).
@@ -36,7 +36,7 @@
Programming: <a href='api-raster.html' target='_top'>Raster API</a><br>
Programming: <a href='postscript-driver.html' target='_top'>Developing PostScript Printer Drivers</a><br>
Programming: <a href='raster-driver.html' target='_top'>Developing Raster Printer Drivers</a><br>
Specifications: <a href='spec-design' target='_top'>CUPS Design Description</a></td>
Specifications: <a href='spec-design.html' target='_top'>CUPS Design Description</a></td>
</tr>
</tbody>
</table></div>
+2 -2
Ver Arquivo
@@ -1,5 +1,5 @@
<!--
"$Id: api-filter.shtml 9120 2010-04-23 18:56:34Z mike $"
"$Id: api-filter.shtml 9728 2011-04-28 21:21:24Z mike $"
Filter and backend programming introduction for the Common UNIX Printing
System (CUPS).
@@ -58,7 +58,7 @@ more detail.</p>
<h3><a name="SECURITY">Security Considerations</a></h3>
<p>It is always important to use security programming practices. Filters and
most backends are run as a non-priviledged user, so the major security
most backends are run as a non-privileged user, so the major security
consideration is resource utilization - filters should not depend on unlimited
amounts of CPU, memory, or disk space, and should protect against conditions
that could lead to excess usage of any resource like infinite loops and
+3 -3
Ver Arquivo
@@ -1,9 +1,9 @@
<!--
"$Id: api-httpipp.shtml 7684 2008-06-23 16:47:38Z mike $"
"$Id: api-httpipp.shtml 9728 2011-04-28 21:21:24Z mike $"
HTTP and IPP API introduction for the Common UNIX Printing System (CUPS).
HTTP and IPP API introduction for CUPS.
Copyright 2007-2008 by Apple Inc.
Copyright 2007-2011 by Apple Inc.
Copyright 1997-2006 by Easy Software Products, all rights reserved.
These coded instructions, statements, and computer programs are the
+2 -3
Ver Arquivo
@@ -1,10 +1,9 @@
<!--
"$Id: api-cups.header 7279 2008-01-31 01:50:44Z mike $"
Introduction to CUPS programming content for the Common UNIX Printing System
(CUPS).
Introduction to CUPS programming content for CUPS.
Copyright 2008 by Apple Inc.
Copyright 2008-2011 by Apple Inc.
These coded instructions, statements, and computer programs are the
property of Apple Inc. and are protected by Federal copyright
+3 -3
Ver Arquivo
@@ -1,9 +1,9 @@
<!--
"$Id: api-ppd.shtml 7616 2008-05-28 00:34:13Z mike $"
"$Id: api-ppd.shtml 9728 2011-04-28 21:21:24Z mike $"
PPD API introduction for the Common UNIX Printing System (CUPS).
PPD API introduction for CUPS.
Copyright 2007-2008 by Apple Inc.
Copyright 2007-2011 by Apple Inc.
Copyright 1997-2006 by Easy Software Products, all rights reserved.
These coded instructions, statements, and computer programs are the
+11 -9
Ver Arquivo
@@ -4,7 +4,7 @@
* PPD model-specific attribute routines for the Common UNIX Printing System
* (CUPS).
*
* Copyright 2007-2009 by Apple Inc.
* Copyright 2007-2010 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -15,8 +15,10 @@
*
* Contents:
*
* ppdFindAttr() - Find the first matching attribute.
* ppdFindNextAttr() - Find the next matching attribute.
* ppdFindAttr() - Find the first matching attribute.
* ppdFindNextAttr() - Find the next matching attribute.
* _ppdGet1284Values() - Get 1284 device ID keys and values.
* _ppdNormalizeMakeAndModel() - Normalize a product/make-and-model string.
*/
/*
@@ -178,7 +180,7 @@ _ppdGet1284Values(
num_values = 0;
while (*device_id)
{
while (isspace(*device_id & 255))
while (_cups_isspace(*device_id))
device_id ++;
if (!*device_id)
@@ -191,13 +193,13 @@ _ppdGet1284Values(
if (!*device_id)
break;
while (ptr > key && isspace(ptr[-1] & 255))
while (ptr > key && _cups_isspace(ptr[-1]))
ptr --;
*ptr = '\0';
device_id ++;
while (isspace(*device_id & 255))
while (_cups_isspace(*device_id))
device_id ++;
if (!*device_id)
@@ -210,7 +212,7 @@ _ppdGet1284Values(
if (!*device_id)
break;
while (ptr > value && isspace(ptr[-1] & 255))
while (ptr > value && _cups_isspace(ptr[-1]))
ptr --;
*ptr = '\0';
@@ -251,7 +253,7 @@ _ppdNormalizeMakeAndModel(
* Skip leading whitespace...
*/
while (isspace(*make_and_model & 255))
while (_cups_isspace(*make_and_model))
make_and_model ++;
/*
@@ -406,7 +408,7 @@ _ppdNormalizeMakeAndModel(
*/
for (bufptr = buffer + strlen(buffer) - 1;
bufptr >= buffer && isspace(*bufptr & 255);
bufptr >= buffer && _cups_isspace(*bufptr);
bufptr --);
bufptr[1] = '\0';
+1 -1
Ver Arquivo
@@ -251,7 +251,7 @@ cupsDoAuthentication(
authorization = httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE);
authorization += 9;
while (*authorization && isspace(*authorization & 255))
while (*authorization && _cups_isspace(*authorization))
authorization ++;
if (*authorization)
+15 -15
Ver Arquivo
@@ -1,9 +1,9 @@
/*
* "$Id$"
*
* Option marking routines for the Common UNIX Printing System (CUPS).
* Option marking routines for CUPS.
*
* Copyright 2007-2009 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -290,25 +290,25 @@ cupsResolveConflicts(
for (resval = resolver->value; *resval && !changed;)
{
while (isspace(*resval & 255))
while (_cups_isspace(*resval))
resval ++;
if (*resval != '*')
break;
for (resval ++, resptr = resoption;
*resval && !isspace(*resval & 255);
*resval && !_cups_isspace(*resval);
resval ++)
if (resptr < (resoption + sizeof(resoption) - 1))
*resptr++ = *resval;
*resptr = '\0';
while (isspace(*resval & 255))
while (_cups_isspace(*resval))
resval ++;
for (resptr = reschoice;
*resval && !isspace(*resval & 255);
*resval && !_cups_isspace(*resval);
resval ++)
if (resptr < (reschoice + sizeof(reschoice) - 1))
*resptr++ = *resval;
@@ -483,13 +483,13 @@ cupsResolveConflicts(
}
}
}
}
if (!changed)
{
DEBUG_puts("1ppdResolveConflicts: Unable to automatically resolve "
"constraint!");
goto error;
}
if (!changed)
{
DEBUG_puts("1ppdResolveConflicts: Unable to automatically resolve "
"constraint!");
goto error;
}
cupsArrayClear(pass);
@@ -887,20 +887,20 @@ ppd_load_constraints(ppd_file_t *ppd) /* I - PPD file */
* Extract "*Option Choice" or just "*Option"...
*/
for (vptr ++, ptr = option; *vptr && !isspace(*vptr & 255); vptr ++)
for (vptr ++, ptr = option; *vptr && !_cups_isspace(*vptr); vptr ++)
if (ptr < (option + sizeof(option) - 1))
*ptr++ = *vptr;
*ptr = '\0';
while (isspace(*vptr & 255))
while (_cups_isspace(*vptr))
vptr ++;
if (*vptr == '*')
choice[0] = '\0';
else
{
for (ptr = choice; *vptr && !isspace(*vptr & 255); vptr ++)
for (ptr = choice; *vptr && !_cups_isspace(*vptr); vptr ++)
if (ptr < (choice + sizeof(choice) - 1))
*ptr++ = *vptr;
+2 -2
Ver Arquivo
@@ -61,10 +61,10 @@ extern "C" {
* Constants...
*/
# define CUPS_VERSION 1.0404
# define CUPS_VERSION 1.0408
# define CUPS_VERSION_MAJOR 1
# define CUPS_VERSION_MINOR 4
# define CUPS_VERSION_PATCH 4
# define CUPS_VERSION_PATCH 8
# define CUPS_BC_FD 3 /* Back-channel file descriptor for select/poll */
# define CUPS_DATE_ANY (time_t)-1
+10 -5
Ver Arquivo
@@ -1,9 +1,9 @@
/*
* "$Id$"
*
* PPD custom option routines for the Common UNIX Printing System (CUPS).
* PPD custom option routines for CUPS.
*
* Copyright 2007 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -70,14 +70,19 @@ ppd_cparam_t * /* O - Custom parameter or NULL */
ppdFindCustomParam(ppd_coption_t *opt, /* I - Custom option */
const char *name) /* I - Parameter name */
{
ppd_cparam_t key; /* Custom parameter search key */
ppd_cparam_t *param; /* Current custom parameter */
if (!opt)
return (NULL);
strlcpy(key.name, name, sizeof(key.name));
return ((ppd_cparam_t *)cupsArrayFind(opt->params, &key));
for (param = (ppd_cparam_t *)cupsArrayFirst(opt->params);
param;
param = (ppd_cparam_t *)cupsArrayNext(opt->params))
if (!strcasecmp(param->name, name))
break;
return (param);
}
+15 -2
Ver Arquivo
@@ -509,7 +509,19 @@ cupsGetNamedDest(http_t *http, /* I - Connection to server or @code CUPS_HTT
set_as_default = 1;
name = _cupsUserDefault(defname, sizeof(defname));
if (!name && home)
if (name)
{
char *ptr; /* Temporary pointer... */
if ((ptr = strchr(defname, '/')) != NULL)
{
*ptr++ = '\0';
instance = ptr;
}
else
instance = NULL;
}
else if (home)
{
/*
* No default in the environment, try the user's lpoptions files...
@@ -1234,7 +1246,8 @@ appleSetDefault(const char *name) /* I - Default printer/class name */
CFArrayRemoveValueAtIndex(newlocations, locindex);
}
else
newlocations = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL);
newlocations = CFArrayCreateMutable(kCFAllocatorDefault, 0,
&kCFTypeArrayCallBacks);
newlocation = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
&kCFTypeDictionaryKeyCallBacks,
+26 -14
Ver Arquivo
@@ -484,7 +484,8 @@ ppdEmitJCL(ppd_file_t *ppd, /* I - PPD file record */
*/
for (title += 7; *title && isdigit(*title & 255); title ++);
for (; *title && isspace(*title & 255); title ++);
while (_cups_isspace(*title))
title ++;
if ((ptr = strstr(title, " - ")) != NULL)
{
@@ -683,7 +684,8 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
case PPD_CUSTOM_PASSCODE :
case PPD_CUSTOM_PASSWORD :
case PPD_CUSTOM_STRING :
bufsize += strlen(cparam->current.custom_string);
if (cparam->current.custom_string)
bufsize += strlen(cparam->current.custom_string);
break;
}
}
@@ -728,7 +730,9 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
case PPD_CUSTOM_PASSCODE :
case PPD_CUSTOM_PASSWORD :
case PPD_CUSTOM_STRING :
bufsize += 3 + 4 * strlen(cparam->current.custom_string);
bufsize += 3;
if (cparam->current.custom_string)
bufsize += 4 * strlen(cparam->current.custom_string);
break;
}
}
@@ -797,8 +801,8 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
*/
pnum = *cptr++ - '0';
while (isalnum(*cptr & 255))
pnum = pnum * 10 + *cptr - '0';
while (isdigit(*cptr & 255))
pnum = pnum * 10 + *cptr++ - '0';
for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params);
cparam;
@@ -828,9 +832,12 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
case PPD_CUSTOM_PASSCODE :
case PPD_CUSTOM_PASSWORD :
case PPD_CUSTOM_STRING :
strlcpy(bufptr, cparam->current.custom_string,
bufend - bufptr);
bufptr += strlen(bufptr);
if (cparam->current.custom_string)
{
strlcpy(bufptr, cparam->current.custom_string,
bufend - bufptr);
bufptr += strlen(bufptr);
}
break;
}
}
@@ -1033,14 +1040,19 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
case PPD_CUSTOM_STRING :
*bufptr++ = '(';
for (s = cparam->current.custom_string; *s; s ++)
if (*s < ' ' || *s == '(' || *s == ')' || *s >= 127)
if (cparam->current.custom_string)
{
for (s = cparam->current.custom_string; *s; s ++)
{
snprintf(bufptr, bufend - bufptr + 1, "\\%03o", *s & 255);
bufptr += strlen(bufptr);
if (*s < ' ' || *s == '(' || *s == ')' || *s >= 127)
{
snprintf(bufptr, bufend - bufptr + 1, "\\%03o", *s & 255);
bufptr += strlen(bufptr);
}
else
*bufptr++ = *s;
}
else
*bufptr++ = *s;
}
*bufptr++ = ')';
*bufptr++ = '\n';
+1
Ver Arquivo
@@ -125,6 +125,7 @@ static const _ipp_option_t ipp_options[] =
{ 0, "penwidth", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "penwidth-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "port-monitor", IPP_TAG_NAME, IPP_TAG_PRINTER },
{ 0, "ppd-name", IPP_TAG_NAME, IPP_TAG_PRINTER },
{ 0, "ppi", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "ppi-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "prettyprint", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
+5 -5
Ver Arquivo
@@ -494,7 +494,7 @@ cupsFileGetConf(cups_file_t *fp, /* I - CUPS file */
// Strip the comment and any trailing whitespace...
while (ptr > buf)
{
if (!isspace(ptr[-1] & 255))
if (!_cups_isspace(ptr[-1]))
break;
ptr --;
@@ -508,7 +508,7 @@ cupsFileGetConf(cups_file_t *fp, /* I - CUPS file */
* Strip leading whitespace...
*/
for (ptr = buf; isspace(*ptr & 255); ptr ++);
for (ptr = buf; _cups_isspace(*ptr); ptr ++);
if (ptr > buf)
_cups_strcpy(buf, ptr);
@@ -524,7 +524,7 @@ cupsFileGetConf(cups_file_t *fp, /* I - CUPS file */
*/
for (ptr = buf; *ptr; ptr ++)
if (isspace(*ptr & 255))
if (_cups_isspace(*ptr))
break;
if (*ptr)
@@ -533,7 +533,7 @@ cupsFileGetConf(cups_file_t *fp, /* I - CUPS file */
* Have a value, skip any other spaces...
*/
while (isspace(*ptr & 255))
while (_cups_isspace(*ptr))
*ptr++ = '\0';
if (*ptr)
@@ -557,7 +557,7 @@ cupsFileGetConf(cups_file_t *fp, /* I - CUPS file */
return (buf);
}
while (ptr > *value && isspace(*ptr & 255))
while (ptr > *value && _cups_isspace(*ptr))
*ptr-- = '\0';
}
+2 -1
Ver Arquivo
@@ -195,8 +195,9 @@ globals_destructor(void *value) /* I - Data to free */
free(buffer);
}
cupsArrayDelete(cg->pwg_size_lut);
cupsArrayDelete(cg->leg_size_lut);
cupsArrayDelete(cg->ppd_size_lut);
cupsArrayDelete(cg->pwg_size_lut);
free(value);
}
+1
Ver Arquivo
@@ -26,6 +26,7 @@
# include "http-private.h"
# include "cups.h"
# include "i18n.h"
# include "ppd-private.h"
# include "pwg-private.h"
# ifdef HAVE_PTHREAD_H
+34 -22
Ver Arquivo
@@ -1,9 +1,9 @@
/*
* "$Id$"
*
* HTTP address routines for the Common UNIX Printing System (CUPS).
* HTTP address routines for CUPS.
*
* Copyright 2007-2009 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -358,8 +358,11 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */
#ifdef AF_INET6
else if (addr->addr.sa_family == AF_INET6)
{
char *sptr, /* Pointer into string */
temps[64]; /* Temporary string for address */
# ifdef HAVE_GETNAMEINFO
if (getnameinfo(&addr->addr, httpAddrLength(addr), s, slen,
if (getnameinfo(&addr->addr, httpAddrLength(addr), temps, sizeof(temps),
NULL, 0, NI_NUMERICHOST))
{
/*
@@ -371,29 +374,36 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */
return (NULL);
}
else if ((sptr = strchr(temps, '%')) != NULL)
{
/*
* Convert "%zone" to "+zone" to match URI form...
*/
*sptr = '+';
}
# else
char *sptr; /* Pointer into string */
int i; /* Looping var */
unsigned temp; /* Current value */
const char *prefix; /* Prefix for address */
prefix = "";
for (sptr = s, i = 0; i < 4 && addr->ipv6.sin6_addr.s6_addr32[i]; i ++)
for (sptr = temps, i = 0; i < 4 && addr->ipv6.sin6_addr.s6_addr32[i]; i ++)
{
temp = ntohl(addr->ipv6.sin6_addr.s6_addr32[i]);
snprintf(sptr, slen, "%s%x", prefix, (temp >> 16) & 0xffff);
snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix,
(temp >> 16) & 0xffff);
prefix = ":";
slen -= strlen(sptr);
sptr += strlen(sptr);
temp &= 0xffff;
if (temp || i == 3 || addr->ipv6.sin6_addr.s6_addr32[i + 1])
{
snprintf(sptr, slen, "%s%x", prefix, temp);
slen -= strlen(sptr);
snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix, temp);
sptr += strlen(sptr);
}
}
@@ -405,24 +415,24 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */
if (i < 4)
{
snprintf(sptr, slen, "%s:", prefix);
snprintf(sptr, sizeof(temps) - (sptr - temps), "%s:", prefix);
prefix = ":";
slen -= strlen(sptr);
sptr += strlen(sptr);
for (; i < 4; i ++)
{
temp = ntohl(addr->ipv6.sin6_addr.s6_addr32[i]);
if ((temp & 0xffff0000) || addr->ipv6.sin6_addr.s6_addr32[i - 1])
if ((temp & 0xffff0000) ||
(i > 0 && addr->ipv6.sin6_addr.s6_addr32[i - 1]))
{
snprintf(sptr, slen, "%s%x", prefix, (temp >> 16) & 0xffff);
slen -= strlen(sptr);
snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix,
(temp >> 16) & 0xffff);
sptr += strlen(sptr);
}
snprintf(sptr, slen, "%s%x", prefix, temp & 0xffff);
slen -= strlen(sptr);
snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix,
temp & 0xffff);
sptr += strlen(sptr);
}
}
@@ -432,9 +442,7 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */
* Empty address...
*/
strlcpy(s, "::", slen);
sptr = s + 2;
slen -= 2;
strlcpy(temps, "::", sizeof(temps));
}
else
{
@@ -442,12 +450,16 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */
* Empty at end...
*/
strlcpy(sptr, "::", slen);
sptr += 2;
slen -= 2;
strlcpy(sptr, "::", sizeof(temps) - (sptr - temps));
}
}
# endif /* HAVE_GETNAMEINFO */
/*
* Add "[v1." and "]" around IPv6 address to convert to URI form.
*/
snprintf(s, slen, "[v1.%s]", temps);
}
#endif /* AF_INET6 */
else
+3 -3
Ver Arquivo
@@ -1,9 +1,9 @@
/*
* "$Id$"
*
* HTTP address list routines for the Common UNIX Printing System (CUPS).
* HTTP address list routines for CUPS.
*
* Copyright 2007-2009 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -271,7 +271,7 @@ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for p
struct addrinfo hints, /* Address lookup hints */
*results, /* Address lookup results */
*current; /* Current result */
char ipv6[1024], /* IPv6 address */
char ipv6[64], /* IPv6 address */
*ipv6zone; /* Pointer to zone separator */
int ipv6len; /* Length of IPv6 address */
int error; /* getaddrinfo() error */
+3 -2
Ver Arquivo
@@ -1,9 +1,9 @@
/*
* "$Id$"
*
* Private HTTP definitions for the Common UNIX Printing System (CUPS).
* Private HTTP definitions for CUPS.
*
* Copyright 2007-2008 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -269,6 +269,7 @@ extern char *_httpEncodeURI(char *dst, const char *src,
size_t dstsize);
extern const char *_httpResolveURI(const char *uri, char *resolved_uri,
size_t resolved_size, int log);
extern int _httpUpdate(http_t *http, http_status_t *status);
extern int _httpWait(http_t *http, int msec, int usessl);
#endif /* !_CUPS_HTTP_PRIVATE_H_ */
+17 -3
Ver Arquivo
@@ -917,7 +917,9 @@ httpSeparateURI(
for (ptr = scheme, end = scheme + schemelen - 1;
*uri && *uri != ':' && ptr < end;)
if (isalnum(*uri & 255) || *uri == '-' || *uri == '+' || *uri == '.')
if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789-+.", *uri) != NULL)
*ptr++ = *uri++;
else
break;
@@ -1353,7 +1355,8 @@ _httpResolveURI(
DNSServiceRef ref, /* DNS-SD master service reference */
domainref, /* DNS-SD service reference for domain */
localref; /* DNS-SD service reference for .local */
int domainsent = 0; /* Send the domain resolve? */
int domainsent = 0, /* Send the domain resolve? */
offline = 0; /* offline-report state set? */
char *regtype, /* Pointer to type in hostname */
*domain; /* Pointer to domain in hostname */
_http_uribuf_t uribuf; /* URI buffer */
@@ -1467,6 +1470,17 @@ _httpResolveURI(
&uribuf) == kDNSServiceErr_NoError)
domainsent = 1;
}
/*
* If it hasn't resolved within 5 seconds set the offline-report
* printer-state-reason...
*/
if (logit && offline == 0 && time(NULL) > (start_time + 5))
{
fputs("STATE: +offline-report\n", stderr);
offline = 1;
}
}
else
{
@@ -1494,7 +1508,7 @@ _httpResolveURI(
else
fputs("DEBUG: Unable to resolve URI!\n", stderr);
fputs("STATE: -connecting-to-device\n", stderr);
fputs("STATE: -connecting-to-device,offline-report\n", stderr);
}
#else
+170 -137
Ver Arquivo
@@ -3,7 +3,7 @@
*
* HTTP routines for CUPS.
*
* Copyright 2007-2010 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* This file contains Kerberos support code, copyright 2006 by
@@ -67,6 +67,7 @@
* httpSetField() - Set the value of an HTTP header.
* httpSetLength() - Set the content-length and content-encoding.
* httpTrace() - Send an TRACE request to the server.
* _httpUpdate() - Update the current HTTP status for incoming data.
* httpUpdate() - Update the current HTTP state for incoming data.
* _httpWait() - Wait for data available on a connection (no flush).
* httpWait() - Wait for data available on a connection.
@@ -910,7 +911,7 @@ httpGetSubField2(http_t *http, /* I - Connection to server */
* Skip leading whitespace...
*/
while (isspace(*fptr & 255))
while (_cups_isspace(*fptr))
fptr ++;
if (*fptr == ',')
@@ -924,7 +925,7 @@ httpGetSubField2(http_t *http, /* I - Connection to server */
*/
for (ptr = temp;
*fptr && *fptr != '=' && !isspace(*fptr & 255) &&
*fptr && *fptr != '=' && !_cups_isspace(*fptr) &&
ptr < (temp + sizeof(temp) - 1);
*ptr++ = *fptr++);
@@ -936,7 +937,7 @@ httpGetSubField2(http_t *http, /* I - Connection to server */
* Skip trailing chars up to the '='...
*/
while (isspace(*fptr & 255))
while (_cups_isspace(*fptr))
fptr ++;
if (!*fptr)
@@ -951,7 +952,7 @@ httpGetSubField2(http_t *http, /* I - Connection to server */
fptr ++;
while (isspace(*fptr & 255))
while (_cups_isspace(*fptr))
fptr ++;
if (*fptr == '\"')
@@ -979,12 +980,12 @@ httpGetSubField2(http_t *http, /* I - Connection to server */
*/
for (ptr = value;
*fptr && !isspace(*fptr & 255) && *fptr != ',' && ptr < end;
*fptr && !_cups_isspace(*fptr) && *fptr != ',' && ptr < end;
*ptr++ = *fptr++);
*ptr = '\0';
while (*fptr && !isspace(*fptr & 255) && *fptr != ',')
while (*fptr && !_cups_isspace(*fptr) && *fptr != ',')
fptr ++;
}
@@ -2011,6 +2012,164 @@ httpTrace(http_t *http, /* I - Connection to server */
}
/*
* '_httpUpdate()' - Update the current HTTP status for incoming data.
*
* Note: Unlike httpUpdate(), this function does not flush pending write data
* and only retrieves a single status line from the HTTP connection.
*/
int /* O - 1 to continue, 0 to stop */
_httpUpdate(http_t *http, /* I - Connection to server */
http_status_t *status) /* O - Current HTTP status */
{
char line[32768], /* Line from connection... */
*value; /* Pointer to value on line */
http_field_t field; /* Field index */
int major, minor; /* HTTP version numbers */
DEBUG_printf(("_httpUpdate(http=%p, status=%p), state=%s", http, status,
http_states[http->state]));
/*
* Grab a single line from the connection...
*/
if (!httpGets(line, sizeof(line), http))
{
*status = HTTP_ERROR;
return (0);
}
DEBUG_printf(("2_httpUpdate: Got \"%s\"", line));
if (line[0] == '\0')
{
/*
* Blank line means the start of the data section (if any). Return
* the result code, too...
*
* If we get status 100 (HTTP_CONTINUE), then we *don't* change states.
* Instead, we just return HTTP_CONTINUE to the caller and keep on
* tryin'...
*/
if (http->status == HTTP_CONTINUE)
{
*status = http->status;
return (0);
}
if (http->status < HTTP_BAD_REQUEST)
http->digest_tries = 0;
#ifdef HAVE_SSL
if (http->status == HTTP_SWITCHING_PROTOCOLS && !http->tls)
{
if (http_setup_ssl(http) != 0)
{
# ifdef WIN32
closesocket(http->fd);
# else
close(http->fd);
# endif /* WIN32 */
*status = http->status = HTTP_ERROR;
return (0);
}
*status = HTTP_CONTINUE;
return (0);
}
#endif /* HAVE_SSL */
httpGetLength2(http);
switch (http->state)
{
case HTTP_GET :
case HTTP_POST :
case HTTP_POST_RECV :
case HTTP_PUT :
http->state ++;
case HTTP_POST_SEND :
case HTTP_HEAD :
break;
default :
http->state = HTTP_WAITING;
break;
}
*status = http->status;
return (0);
}
else if (!strncmp(line, "HTTP/", 5))
{
/*
* Got the beginning of a response...
*/
int intstatus; /* Status value as an integer */
if (sscanf(line, "HTTP/%d.%d%d", &major, &minor, &intstatus) != 3)
{
*status = http->status = HTTP_ERROR;
return (0);
}
http->version = (http_version_t)(major * 100 + minor);
*status = http->status = (http_status_t)intstatus;
}
else if ((value = strchr(line, ':')) != NULL)
{
/*
* Got a value...
*/
*value++ = '\0';
while (_cups_isspace(*value))
value ++;
/*
* Be tolerants of servers that send unknown attribute fields...
*/
if (!strcasecmp(line, "expect"))
{
/*
* "Expect: 100-continue" or similar...
*/
http->expect = (http_status_t)atoi(value);
}
else if (!strcasecmp(line, "cookie"))
{
/*
* "Cookie: name=value[; name=value ...]" - replaces previous cookies...
*/
httpSetCookie(http, value);
}
else if ((field = http_field(line)) != HTTP_FIELD_UNKNOWN)
httpSetField(http, field, value);
#ifdef DEBUG
else
DEBUG_printf(("1_httpUpdate: unknown field %s seen!", line));
#endif /* DEBUG */
}
else
{
DEBUG_printf(("1_httpUpdate: Bad response line \"%s\"!", line));
*status = http->status = HTTP_ERROR;
return (0);
}
return (1);
}
/*
* 'httpUpdate()' - Update the current HTTP state for incoming data.
*/
@@ -2018,11 +2177,7 @@ httpTrace(http_t *http, /* I - Connection to server */
http_status_t /* O - HTTP status */
httpUpdate(http_t *http) /* I - Connection to server */
{
char line[32768], /* Line from connection... */
*value; /* Pointer to value on line */
http_field_t field; /* Field index */
int major, minor, /* HTTP version numbers */
status; /* Request status */
http_status_t status; /* Request status */
DEBUG_printf(("httpUpdate(http=%p), state=%s", http,
@@ -2051,122 +2206,7 @@ httpUpdate(http_t *http) /* I - Connection to server */
* Grab all of the lines we can from the connection...
*/
while (httpGets(line, sizeof(line), http) != NULL)
{
DEBUG_printf(("2httpUpdate: Got \"%s\"", line));
if (line[0] == '\0')
{
/*
* Blank line means the start of the data section (if any). Return
* the result code, too...
*
* If we get status 100 (HTTP_CONTINUE), then we *don't* change states.
* Instead, we just return HTTP_CONTINUE to the caller and keep on
* tryin'...
*/
if (http->status == HTTP_CONTINUE)
return (http->status);
if (http->status < HTTP_BAD_REQUEST)
http->digest_tries = 0;
#ifdef HAVE_SSL
if (http->status == HTTP_SWITCHING_PROTOCOLS && !http->tls)
{
if (http_setup_ssl(http) != 0)
{
# ifdef WIN32
closesocket(http->fd);
# else
close(http->fd);
# endif /* WIN32 */
return (HTTP_ERROR);
}
return (HTTP_CONTINUE);
}
#endif /* HAVE_SSL */
httpGetLength2(http);
switch (http->state)
{
case HTTP_GET :
case HTTP_POST :
case HTTP_POST_RECV :
case HTTP_PUT :
http->state ++;
case HTTP_POST_SEND :
case HTTP_HEAD :
break;
default :
http->state = HTTP_WAITING;
break;
}
return (http->status);
}
else if (!strncmp(line, "HTTP/", 5))
{
/*
* Got the beginning of a response...
*/
if (sscanf(line, "HTTP/%d.%d%d", &major, &minor, &status) != 3)
return (HTTP_ERROR);
http->version = (http_version_t)(major * 100 + minor);
http->status = (http_status_t)status;
}
else if ((value = strchr(line, ':')) != NULL)
{
/*
* Got a value...
*/
*value++ = '\0';
while (isspace(*value & 255))
value ++;
/*
* Be tolerants of servers that send unknown attribute fields...
*/
if (!strcasecmp(line, "expect"))
{
/*
* "Expect: 100-continue" or similar...
*/
http->expect = (http_status_t)atoi(value);
}
else if (!strcasecmp(line, "cookie"))
{
/*
* "Cookie: name=value[; name=value ...]" - replaces previous cookies...
*/
httpSetCookie(http, value);
}
else if ((field = http_field(line)) == HTTP_FIELD_UNKNOWN)
{
DEBUG_printf(("1httpUpdate: unknown field %s seen!", line));
continue;
}
else
httpSetField(http, field, value);
}
else
{
DEBUG_printf(("1httpUpdate: Bad response line \"%s\"!", line));
http->status = HTTP_ERROR;
return (HTTP_ERROR);
}
}
while (_httpUpdate(http, &status));
/*
* See if there was an error...
@@ -2187,10 +2227,10 @@ httpUpdate(http_t *http) /* I - Connection to server */
}
/*
* If we haven't already returned, then there is nothing new...
* Return the current status...
*/
return (HTTP_CONTINUE);
return (status);
}
@@ -2454,13 +2494,6 @@ httpWrite2(http_t *http, /* I - Connection to server */
http->data_encoding = HTTP_ENCODE_LENGTH;
http->data_remaining = 0;
}
if (http->state == HTTP_POST_RECV)
http->state ++;
else if (http->state == HTTP_PUT_RECV)
http->state = HTTP_STATUS;
else
http->state = HTTP_WAITING;
}
return (bytes);
+3 -4
Ver Arquivo
@@ -1,10 +1,9 @@
/*
* "$Id$"
*
* Hyper-Text Transport Protocol definitions for the Common UNIX Printing
* System (CUPS).
* Hyper-Text Transport Protocol definitions for CUPS.
*
* Copyright 2007-2009 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -88,7 +87,7 @@ extern "C" {
#if defined(AF_INET6) && !defined(s6_addr32)
# if defined(__sun)
# define s6_addr32 _S6_un._S6_u32
# elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__)
# elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__)|| defined(__DragonFly__)
# define s6_addr32 __u6_addr.__u6_addr32
# elif defined(__osf__)
# define s6_addr32 s6_un.sa6_laddr
+7 -3
Ver Arquivo
@@ -1275,7 +1275,9 @@ ippReadIO(void *src, /* I - Data source */
attr->value_tag = tag;
}
else if ((value_tag >= IPP_TAG_TEXTLANG &&
else if (value_tag == IPP_TAG_TEXTLANG ||
value_tag == IPP_TAG_NAMELANG ||
(value_tag >= IPP_TAG_TEXT &&
value_tag <= IPP_TAG_MIMETYPE))
{
/*
@@ -1283,8 +1285,9 @@ ippReadIO(void *src, /* I - Data source */
* forms; accept sets of differing values...
*/
if ((tag < IPP_TAG_TEXTLANG || tag > IPP_TAG_MIMETYPE) &&
tag != IPP_TAG_NOVALUE)
if (tag != IPP_TAG_TEXTLANG && tag != IPP_TAG_NAMELANG &&
(tag < IPP_TAG_TEXT || tag > IPP_TAG_MIMETYPE) &&
tag != IPP_TAG_NOVALUE)
{
DEBUG_printf(("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)",
value_tag, ippTagString(value_tag), tag,
@@ -2766,6 +2769,7 @@ _ippFreeAttr(ipp_attribute_t *attr) /* I - Attribute to free */
{
case IPP_TAG_TEXT :
case IPP_TAG_NAME :
case IPP_TAG_RESERVED_STRING :
case IPP_TAG_KEYWORD :
case IPP_TAG_URI :
case IPP_TAG_URISCHEME :
+2 -1
Ver Arquivo
@@ -93,7 +93,8 @@ typedef enum ipp_tag_e /**** Format tags for attributes ****/
IPP_TAG_END_COLLECTION, /* End of collection value */
IPP_TAG_TEXT = 0x41, /* Text value */
IPP_TAG_NAME, /* Name value */
IPP_TAG_KEYWORD = 0x44, /* Keyword value */
IPP_TAG_RESERVED_STRING, /* Reserved for future string value @private@ */
IPP_TAG_KEYWORD, /* Keyword value */
IPP_TAG_URI, /* URI value */
IPP_TAG_URISCHEME, /* URI scheme value */
IPP_TAG_CHARSET, /* Character set value */
+11 -3
Ver Arquivo
@@ -267,9 +267,17 @@ _cupsEncodingName(
{
if (encoding < 0 ||
encoding >= (sizeof(lang_encodings) / sizeof(const char *)))
{
DEBUG_printf(("1_cupsEncodingName(encoding=%d) = out of range (\"%s\")",
encoding, lang_encodings[0]));
return (lang_encodings[0]);
}
else
{
DEBUG_printf(("1_cupsEncodingName(encoding=%d) = \"%s\"",
encoding, lang_encodings[encoding]));
return (lang_encodings[encoding]);
}
}
@@ -497,7 +505,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
*/
for (ptr = charset, csptr ++; *csptr; csptr ++)
if (ptr < (charset + sizeof(charset) - 1) && isalnum(*csptr & 255))
if (ptr < (charset + sizeof(charset) - 1) && _cups_isalnum(*csptr))
*ptr++ = *csptr;
*ptr = '\0';
@@ -557,7 +565,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
*/
for (ptr = charset; *csptr; csptr ++)
if (isalnum(*csptr & 255) && ptr < (charset + sizeof(charset) - 1))
if (_cups_isalnum(*csptr) && ptr < (charset + sizeof(charset) - 1))
*ptr++ = *csptr;
*ptr = '\0';
@@ -624,7 +632,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
*/
for (language ++, ptr = charset; *language; language ++)
if (isalnum(*language & 255) && ptr < (charset + sizeof(charset) - 1))
if (_cups_isalnum(*language) && ptr < (charset + sizeof(charset) - 1))
*ptr++ = toupper(*language & 255);
*ptr = '\0';
+10 -8
Ver Arquivo
@@ -58,24 +58,26 @@ __ppdLocalizedAttr
__ppdNormalizeMakeAndModel
__ppdParseOptions
__pwgCreateWithFile
__pwgDestroy
__pwgWriteFile
__pwgGenerateSize
__pwgInitSize
__pwgMediaForLegacy
__pwgMediaForPPD
__pwgMediaForPWG
__pwgMediaForSize
__pwgCreateWithPPD
__pwgDestroy
__pwgGenerateSize
__pwgGetBin
__pwgGetInputSlot
__pwgGetMediaType
__pwgGetOutputBin
__pwgGetPageSize
__pwgGetSize
__pwgGetSource
__pwgGetType
__pwgInitSize
__pwgInputSlotForSource
__pwgMediaForLegacy
__pwgMediaForPPD
__pwgMediaForPWG
__pwgMediaForSize
__pwgMediaTypeForType
__pwgPageSizeForMedia
__pwgWriteFile
_cupsAddDest
_cupsAddOption
_cupsAdminCreateWindowsPPD
+8 -8
Ver Arquivo
@@ -389,7 +389,7 @@ ppdLocalizeIPPReason(
valptr += 5;
while (*valptr && !isspace(*valptr & 255) && bufptr < bufend)
while (*valptr && !_cups_isspace(*valptr) && bufptr < bufend)
{
if (*valptr == '%' && isxdigit(valptr[1] & 255) &&
isxdigit(valptr[2] & 255))
@@ -427,7 +427,7 @@ ppdLocalizeIPPReason(
* Skip this URI...
*/
while (*valptr && !isspace(*valptr & 255))
while (*valptr && !_cups_isspace(*valptr))
valptr++;
}
@@ -435,7 +435,7 @@ ppdLocalizeIPPReason(
* Skip whitespace...
*/
while (isspace(*valptr & 255))
while (_cups_isspace(*valptr))
valptr ++;
}
@@ -463,7 +463,7 @@ ppdLocalizeIPPReason(
* Copy URI...
*/
while (*valptr && !isspace(*valptr & 255) && bufptr < bufend)
while (*valptr && !_cups_isspace(*valptr) && bufptr < bufend)
*bufptr++ = *valptr++;
*bufptr = '\0';
@@ -476,7 +476,7 @@ ppdLocalizeIPPReason(
* Skip this URI...
*/
while (*valptr && !isspace(*valptr & 255))
while (*valptr && !_cups_isspace(*valptr))
valptr++;
}
@@ -484,7 +484,7 @@ ppdLocalizeIPPReason(
* Skip whitespace...
*/
while (isspace(*valptr & 255))
while (_cups_isspace(*valptr))
valptr ++;
}
@@ -598,7 +598,7 @@ _ppdGetLanguages(ppd_file_t *ppd) /* I - PPD file */
* Skip leading whitespace...
*/
while (isspace(*ptr & 255))
while (_cups_isspace(*ptr))
ptr ++;
if (!*ptr)
@@ -608,7 +608,7 @@ _ppdGetLanguages(ppd_file_t *ppd) /* I - PPD file */
* Find the end of this language name...
*/
for (start = ptr; *ptr && !isspace(*ptr & 255); ptr ++);
for (start = ptr; *ptr && !_cups_isspace(*ptr); ptr ++);
if (*ptr)
*ptr++ = '\0';
+158 -215
Ver Arquivo
@@ -43,6 +43,7 @@
#include "cups.h"
#include "string.h"
#include "debug.h"
#include "ppd-private.h"
#include "pwg-private.h"
@@ -75,41 +76,20 @@ cupsMarkOptions(
int num_options, /* I - Number of options */
cups_option_t *options) /* I - Options */
{
int i, j, k; /* Looping vars */
int i, j; /* Looping vars */
char *ptr, /* Pointer into string */
s[255]; /* Temporary string */
const char *val, /* Pointer into value */
*media, /* media option */
*output_bin, /* output-bin option */
*output_mode, /* output-mode option */
*page_size, /* PageSize option */
*ppd_keyword; /* PPD keyword */
*ppd_keyword, /* PPD keyword */
*print_quality, /* print-quality option */
*sides; /* sides option */
cups_option_t *optptr; /* Current option */
ppd_option_t *option; /* PPD option */
ppd_attr_t *attr; /* PPD attribute */
static const char * const duplex_options[] =
{ /* Duplex option names */
"Duplex", /* Adobe */
"EFDuplex", /* EFI */
"EFDuplexing", /* EFI */
"KD03Duplex", /* Kodak */
"JCLDuplex" /* Samsung */
};
static const char * const duplex_one[] =
{ /* one-sided names */
"None",
"False"
};
static const char * const duplex_two_long[] =
{ /* two-sided-long-edge names */
"DuplexNoTumble", /* Adobe */
"LongEdge", /* EFI */
"Top" /* EFI */
};
static const char * const duplex_two_short[] =
{ /* two-sided-long-edge names */
"DuplexTumble", /* Adobe */
"ShortEdge", /* EFI */
"Bottom" /* EFI */
};
_pwg_t *pwg; /* PWG mapping data */
/*
@@ -122,29 +102,39 @@ cupsMarkOptions(
ppd_debug_marked(ppd, "Before...");
/*
* Do special handling for media and PageSize...
* Do special handling for finishings, media, output-bin, output-mode,
* print-color-mode, print-quality, and PageSize...
*/
media = cupsGetOption("media", num_options, options);
page_size = cupsGetOption("PageSize", num_options, options);
media = cupsGetOption("media", num_options, options);
output_bin = cupsGetOption("output-bin", num_options, options);
output_mode = cupsGetOption("output-mode", num_options, options);
page_size = cupsGetOption("PageSize", num_options, options);
print_quality = cupsGetOption("print-quality", num_options, options);
sides = cupsGetOption("sides", num_options, options);
if (media)
if ((media || output_bin || output_mode || print_quality || sides) &&
!ppd->pwg)
{
/*
* Load PWG mapping data as needed...
*/
if (!ppd->pwg)
ppd->pwg = _pwgCreateWithPPD(ppd);
ppd->pwg = _pwgCreateWithPPD(ppd);
}
pwg = (_pwg_t *)ppd->pwg;
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.
* 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.
* 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.
*/
for (val = media; *val;)
@@ -168,118 +158,125 @@ cupsMarkOptions(
{
if (!strncasecmp(s, "Custom.", 7) || ppdPageSize(ppd, s))
ppd_mark_option(ppd, "PageSize", s);
else if ((ppd_keyword = _pwgGetPageSize((_pwg_t *)ppd->pwg, NULL, s,
NULL)) != NULL)
else if ((ppd_keyword = _pwgGetPageSize(pwg, NULL, s, NULL)) != NULL)
ppd_mark_option(ppd, "PageSize", ppd_keyword);
}
if (!cupsGetOption("InputSlot", num_options, options) &&
(ppd_keyword = _pwgGetInputSlot((_pwg_t *)ppd->pwg, NULL, s)) != NULL)
ppd_mark_option(ppd, "InputSlot", ppd_keyword);
if (pwg && pwg->source_option &&
!cupsGetOption(pwg->source_option, num_options, options) &&
(ppd_keyword = _pwgGetInputSlot(pwg, NULL, s)) != NULL)
ppd_mark_option(ppd, pwg->source_option, ppd_keyword);
if (!cupsGetOption("MediaType", num_options, options) &&
(ppd_keyword = _pwgGetMediaType((_pwg_t *)ppd->pwg, NULL, s)) != NULL)
(ppd_keyword = _pwgGetMediaType(pwg, NULL, s)) != NULL)
ppd_mark_option(ppd, "MediaType", ppd_keyword);
}
}
if (pwg)
{
if (!cupsGetOption("com.apple.print.DocumentTicket.PMSpoolFormat",
num_options, options) &&
!cupsGetOption("APPrinterPreset", num_options, options) &&
(output_mode || print_quality))
{
/*
* Map output-mode and print-quality to a preset...
*/
_pwg_output_mode_t pwg_om; /* output-mode index */
_pwg_print_quality_t pwg_pq; /* print-quality index */
cups_option_t *preset;/* Current preset option */
if (output_mode && !strcmp(output_mode, "monochrome"))
pwg_om = _PWG_OUTPUT_MODE_MONOCHROME;
else
pwg_om = _PWG_OUTPUT_MODE_COLOR;
if (print_quality)
{
pwg_pq = atoi(print_quality) - IPP_QUALITY_DRAFT;
if (pwg_pq < _PWG_PRINT_QUALITY_DRAFT)
pwg_pq = _PWG_PRINT_QUALITY_DRAFT;
else if (pwg_pq > _PWG_PRINT_QUALITY_HIGH)
pwg_pq = _PWG_PRINT_QUALITY_HIGH;
}
else
pwg_pq = _PWG_PRINT_QUALITY_NORMAL;
if (pwg->num_presets[pwg_om][pwg_pq] == 0)
{
/*
* Try to find a preset that works so that we maximize the chances of us
* getting a good print using IPP attributes.
*/
if (pwg->num_presets[pwg_om][_PWG_PRINT_QUALITY_NORMAL] > 0)
pwg_pq = _PWG_PRINT_QUALITY_NORMAL;
else if (pwg->num_presets[_PWG_OUTPUT_MODE_COLOR][pwg_pq] > 0)
pwg_om = _PWG_OUTPUT_MODE_COLOR;
else
{
pwg_pq = _PWG_PRINT_QUALITY_NORMAL;
pwg_om = _PWG_OUTPUT_MODE_COLOR;
}
}
if (pwg->num_presets[pwg_om][pwg_pq] > 0)
{
/*
* Copy the preset options as long as the corresponding names are not
* already defined in the IPP request...
*/
for (i = pwg->num_presets[pwg_om][pwg_pq],
preset = pwg->presets[pwg_om][pwg_pq];
i > 0;
i --, preset ++)
{
if (!cupsGetOption(preset->name, num_options, options))
ppd_mark_option(ppd, preset->name, preset->value);
}
}
}
if (output_bin && !cupsGetOption("OutputBin", num_options, options) &&
(ppd_keyword = _pwgGetOutputBin(pwg, output_bin)) != NULL)
{
/*
* Map output-bin to OutputBin...
*/
ppd_mark_option(ppd, "OutputBin", ppd_keyword);
}
if (sides && pwg->sides_option &&
!cupsGetOption(pwg->sides_option, num_options, options))
{
/*
* Map sides to duplex option...
*/
if (!strcmp(sides, "one-sided"))
ppd_mark_option(ppd, pwg->sides_option, pwg->sides_1sided);
else if (!strcmp(sides, "two-sided-long-edge"))
ppd_mark_option(ppd, pwg->sides_option, pwg->sides_2sided_long);
else if (!strcmp(sides, "two-sided-short-edge"))
ppd_mark_option(ppd, pwg->sides_option, pwg->sides_2sided_short);
}
}
/*
* Mark other options...
*/
for (i = num_options, optptr = options; i > 0; i --, optptr ++)
if (!strcasecmp(optptr->name, "media"))
if (!strcasecmp(optptr->name, "media") ||
!strcasecmp(optptr->name, "output-bin") ||
!strcasecmp(optptr->name, "output-mode") ||
!strcasecmp(optptr->name, "print-quality") ||
!strcasecmp(optptr->name, "sides"))
continue;
else if (!strcasecmp(optptr->name, "sides"))
{
for (j = 0;
j < (int)(sizeof(duplex_options) / sizeof(duplex_options[0]));
j ++)
if (cupsGetOption(duplex_options[j], num_options, options))
break;
if (j < (int)(sizeof(duplex_options) / sizeof(duplex_options[0])))
{
/*
* Don't override the PPD option with the IPP attribute...
*/
continue;
}
if (!strcasecmp(optptr->value, "one-sided"))
{
/*
* Mark the appropriate duplex option for one-sided output...
*/
for (j = 0;
j < (int)(sizeof(duplex_options) / sizeof(duplex_options[0]));
j ++)
if ((option = ppdFindOption(ppd, duplex_options[j])) != NULL)
break;
if (j < (int)(sizeof(duplex_options) / sizeof(duplex_options[0])))
{
for (k = 0;
k < (int)(sizeof(duplex_one) / sizeof(duplex_one[0]));
k ++)
if (ppdFindChoice(option, duplex_one[k]))
{
ppd_mark_option(ppd, duplex_options[j], duplex_one[k]);
break;
}
}
}
else if (!strcasecmp(optptr->value, "two-sided-long-edge"))
{
/*
* Mark the appropriate duplex option for two-sided-long-edge output...
*/
for (j = 0;
j < (int)(sizeof(duplex_options) / sizeof(duplex_options[0]));
j ++)
if ((option = ppdFindOption(ppd, duplex_options[j])) != NULL)
break;
if (j < (int)(sizeof(duplex_options) / sizeof(duplex_options[0])))
{
for (k = 0;
k < (int)(sizeof(duplex_two_long) / sizeof(duplex_two_long[0]));
k ++)
if (ppdFindChoice(option, duplex_two_long[k]))
{
ppd_mark_option(ppd, duplex_options[j], duplex_two_long[k]);
break;
}
}
}
else if (!strcasecmp(optptr->value, "two-sided-short-edge"))
{
/*
* Mark the appropriate duplex option for two-sided-short-edge output...
*/
for (j = 0;
j < (int)(sizeof(duplex_options) / sizeof(duplex_options[0]));
j ++)
if ((option = ppdFindOption(ppd, duplex_options[j])) != NULL)
break;
if (j < (int)(sizeof(duplex_options) / sizeof(duplex_options[0])))
{
for (k = 0;
k < (int)(sizeof(duplex_two_short) / sizeof(duplex_two_short[0]));
k ++)
if (ppdFindChoice(option, duplex_two_short[k]))
{
ppd_mark_option(ppd, duplex_options[j], duplex_two_short[k]);
break;
}
}
}
}
else if (!strcasecmp(optptr->name, "resolution") ||
!strcasecmp(optptr->name, "printer-resolution"))
{
@@ -291,13 +288,6 @@ cupsMarkOptions(
ppd_mark_option(ppd, "CNRes_PGP", optptr->value);
/* Canon */
}
else if (!strcasecmp(optptr->name, "output-bin"))
{
if (!cupsGetOption("OutputBin", num_options, options) &&
(ppd_keyword = _pwgGetOutputBin((_pwg_t *)ppd->pwg,
optptr->value)) != NULL)
ppd_mark_option(ppd, "OutputBin", ppd_keyword);
}
else if (!strcasecmp(optptr->name, "multiple-document-handling"))
{
if (!cupsGetOption("Collate", num_options, options) &&
@@ -350,60 +340,6 @@ cupsMarkOptions(
ppd_mark_choices(ppd, attr->value);
}
}
else if (!strcasecmp(optptr->name, "print-quality"))
{
ppd_option_t *output_mode = ppdFindOption(ppd, "OutputMode");
/* OutputMode option */
if (!strcmp(optptr->value, "3"))
{
/*
* Draft quality...
*/
if (ppdFindChoice(output_mode, "Draft"))
ppd_mark_option(ppd, "OutputMode", "Draft");
else if (ppdFindChoice(output_mode, "Fast"))
ppd_mark_option(ppd, "OutputMode", "Fast");
if ((attr = ppdFindAttr(ppd, "APPrinterPreset",
"DraftGray_with_Paper_Auto-Detect")) != NULL)
ppd_mark_choices(ppd, attr->value);
}
else if (!strcmp(optptr->value, "4"))
{
/*
* Normal quality...
*/
if (ppdFindChoice(output_mode, "Normal"))
ppd_mark_option(ppd, "OutputMode", "Normal");
else if (ppdFindChoice(output_mode, "Good"))
ppd_mark_option(ppd, "OutputMode", "Good");
if ((attr = ppdFindAttr(ppd, "APPrinterPreset",
"Color_with_Paper_Auto-Detect")) != NULL)
ppd_mark_choices(ppd, attr->value);
else if ((attr = ppdFindAttr(ppd, "APPrinterPreset",
"Gray_with_Paper_Auto-Detect")) != NULL)
ppd_mark_choices(ppd, attr->value);
}
else if (!strcmp(optptr->value, "5"))
{
/*
* High/best/photo quality...
*/
if (ppdFindChoice(output_mode, "Best"))
ppd_mark_option(ppd, "OutputMode", "Best");
else if (ppdFindChoice(output_mode, "High"))
ppd_mark_option(ppd, "OutputMode", "High");
if ((attr = ppdFindAttr(ppd, "APPrinterPreset",
"Photo_on_Photo_Paper")) != NULL)
ppd_mark_choices(ppd, attr->value);
}
}
else if (!strcasecmp(optptr->name, "APPrinterPreset"))
{
/*
@@ -584,7 +520,10 @@ ppdMarkDefaults(ppd_file_t *ppd) /* I - PPD file record */
for (c = (ppd_choice_t *)cupsArrayFirst(ppd->marked);
c;
c = (ppd_choice_t *)cupsArrayNext(ppd->marked))
{
cupsArrayRemove(ppd->marked, c);
c->marked = 0;
}
/*
* Then repopulate it with the defaults...
@@ -671,6 +610,7 @@ ppdNextOption(ppd_file_t *ppd) /* I - PPD file */
* This function looks for strings of the form:
*
* *option choice ... *optionN choiceN
* property value ... propertyN valueN
*
* It stops when it finds a string that doesn't match this format.
*/
@@ -679,10 +619,11 @@ int /* O - Number of options */
_ppdParseOptions(
const char *s, /* I - String to parse */
int num_options, /* I - Number of options */
cups_option_t **options) /* IO - Options */
cups_option_t **options, /* IO - Options */
_ppd_parse_t which) /* I - What to parse */
{
char option[PPD_MAX_NAME], /* Current option */
choice[PPD_MAX_NAME], /* Current choice */
char option[PPD_MAX_NAME * 2 + 1], /* Current option/property */
choice[PPD_MAX_NAME], /* Current choice/value */
*ptr; /* Pointer into option or choice */
@@ -690,8 +631,8 @@ _ppdParseOptions(
return (num_options);
/*
* Read all of the "*Option Choice" pairs from the string, marking PPD
* options as we go...
* Read all of the "*Option Choice" and "property value" pairs from the
* string, add them to an options array as we go...
*/
while (*s)
@@ -700,22 +641,18 @@ _ppdParseOptions(
* Skip leading whitespace...
*/
while (isspace(*s & 255))
while (_cups_isspace(*s))
s ++;
if (*s != '*')
break;
/*
* Get the option name...
* Get the option/property name...
*/
s ++;
ptr = option;
while (*s && !isspace(*s & 255) && ptr < (option + sizeof(option) - 1))
while (*s && !_cups_isspace(*s) && ptr < (option + sizeof(option) - 1))
*ptr++ = *s++;
if (ptr == s)
if (ptr == s || !_cups_isspace(*s))
break;
*ptr = '\0';
@@ -724,23 +661,29 @@ _ppdParseOptions(
* Get the choice...
*/
while (isspace(*s & 255))
while (_cups_isspace(*s))
s ++;
if (!*s)
break;
ptr = choice;
while (*s && !isspace(*s & 255) && ptr < (choice + sizeof(choice) - 1))
while (*s && !_cups_isspace(*s) && ptr < (choice + sizeof(choice) - 1))
*ptr++ = *s++;
if (*s && !_cups_isspace(*s))
break;
*ptr = '\0';
/*
* Add it to the options array...
*/
num_options = cupsAddOption(option, choice, num_options, options);
if (option[0] == '*' && which != _PPD_PARSE_PROPERTIES)
num_options = cupsAddOption(option + 1, choice, num_options, options);
else if (option[0] != '*' && which != _PPD_PARSE_OPTIONS)
num_options = cupsAddOption(option, choice, num_options, options);
}
return (num_options);
@@ -809,7 +752,7 @@ ppd_mark_choices(ppd_file_t *ppd, /* I - PPD file */
return;
options = NULL;
num_options = _ppdParseOptions(s, 0, &options);
num_options = _ppdParseOptions(s, 0, &options, 0);
for (i = num_options, option = options; i > 0; i --, option ++)
ppd_mark_option(ppd, option->name, option->value);
+6 -6
Ver Arquivo
@@ -282,7 +282,7 @@ cupsParseOptions(
* Skip leading spaces...
*/
while (isspace(*ptr & 255))
while (_cups_isspace(*ptr))
ptr ++;
/*
@@ -296,7 +296,7 @@ cupsParseOptions(
*/
name = ptr;
while (!isspace(*ptr & 255) && *ptr != '=' && *ptr)
while (!strchr("\f\n\r\t\v =", *ptr) && *ptr)
ptr ++;
/*
@@ -310,7 +310,7 @@ cupsParseOptions(
* Skip trailing spaces...
*/
while (isspace(*ptr & 255))
while (_cups_isspace(*ptr))
*ptr++ = '\0';
if ((sep = *ptr) == '=')
@@ -339,7 +339,7 @@ cupsParseOptions(
value = ptr;
while (*ptr && !isspace(*ptr & 255))
while (*ptr && !_cups_isspace(*ptr))
{
if (*ptr == ',')
ptr ++;
@@ -394,7 +394,7 @@ cupsParseOptions(
* Normal space-delimited string...
*/
while (!isspace(*ptr & 255) && *ptr)
while (*ptr && !_cups_isspace(*ptr))
{
if (*ptr == '\\' && ptr[1])
_cups_strcpy(ptr, ptr + 1);
@@ -413,7 +413,7 @@ cupsParseOptions(
* Skip trailing whitespace...
*/
while (isspace(*ptr & 255))
while (_cups_isspace(*ptr))
ptr ++;
/*
+10 -2
Ver Arquivo
@@ -44,9 +44,16 @@ extern "C" {
/*
* Structures...
* Types and structures...
*/
typedef enum _ppd_parse_e /**** Selector for _ppdParseOptions ****/
{
_PPD_PARSE_OPTIONS, /* Parse only the options */
_PPD_PARSE_PROPERTIES, /* Parse only the properties */
_PPD_PARSE_ALL /* Parse everything */
} _ppd_parse_t;
typedef struct _ppd_cups_uiconst_s /**** Constraint from cupsUIConstraints ****/
{
ppd_option_t *option; /* Constrained option */
@@ -79,7 +86,8 @@ extern char *_ppdNormalizeMakeAndModel(const char *make_and_model,
char *buffer,
size_t bufsize);
extern int _ppdParseOptions(const char *s, int num_options,
cups_option_t **options);
cups_option_t **options,
_ppd_parse_t which);
/*
+18 -30
Ver Arquivo
@@ -3,7 +3,7 @@
*
* PPD file routines for CUPS.
*
* Copyright 2007-2010 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
@@ -41,7 +41,6 @@
* ppd_compare_attrs() - Compare two attributes.
* ppd_compare_choices() - Compare two choices...
* ppd_compare_coptions() - Compare two custom options.
* ppd_compare_cparams() - Compare two custom parameters.
* ppd_compare_options() - Compare two options.
* ppd_decode() - Decode a string value...
* ppd_free_group() - Free a single UI group.
@@ -112,7 +111,6 @@ static int ppd_compare_attrs(ppd_attr_t *a, ppd_attr_t *b);
static int ppd_compare_choices(ppd_choice_t *a, ppd_choice_t *b);
static int ppd_compare_coptions(ppd_coption_t *a,
ppd_coption_t *b);
static int ppd_compare_cparams(ppd_cparam_t *a, ppd_cparam_t *b);
static int ppd_compare_options(ppd_option_t *a, ppd_option_t *b);
static int ppd_decode(char *string);
static void ppd_free_group(ppd_group_t *group);
@@ -666,6 +664,8 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */
goto error;
}
else if (!string)
continue;
/*
* Certain main keywords (as defined by the PPD spec) may be used
@@ -1258,7 +1258,7 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */
if (name[0] == '*')
_cups_strcpy(name, name + 1); /* Eliminate leading asterisk */
for (i = (int)strlen(name) - 1; i > 0 && isspace(name[i] & 255); i --)
for (i = (int)strlen(name) - 1; i > 0 && _cups_isspace(name[i]); i --)
name[i] = '\0'; /* Eliminate trailing spaces */
DEBUG_printf(("2ppdOpen2: OpenUI of %s in group %s...", name,
@@ -2310,18 +2310,6 @@ ppd_compare_coptions(ppd_coption_t *a, /* I - First option */
}
/*
* 'ppd_compare_cparams()' - Compare two custom parameters.
*/
static int /* O - Result of comparison */
ppd_compare_cparams(ppd_cparam_t *a, /* I - First parameter */
ppd_cparam_t *b) /* I - Second parameter */
{
return (strcasecmp(a->name, b->name));
}
/*
* 'ppd_compare_options()' - Compare two options.
*/
@@ -2358,7 +2346,7 @@ ppd_decode(char *string) /* I - String to decode */
inptr ++;
while (isxdigit(*inptr & 255))
{
if (isalpha(*inptr))
if (_cups_isalpha(*inptr))
*outptr = (tolower(*inptr) - 'a' + 10) << 4;
else
*outptr = (*inptr - '0') << 4;
@@ -2368,7 +2356,7 @@ ppd_decode(char *string) /* I - String to decode */
if (!isxdigit(*inptr & 255))
break;
if (isalpha(*inptr))
if (_cups_isalpha(*inptr))
*outptr |= tolower(*inptr) - 'a' + 10;
else
*outptr |= *inptr - '0';
@@ -2477,7 +2465,7 @@ ppd_get_coption(ppd_file_t *ppd, /* I - PPD file */
strlcpy(copt->keyword, name, sizeof(copt->keyword));
copt->params = cupsArrayNew((cups_array_func_t)ppd_compare_cparams, NULL);
copt->params = cupsArrayNew((cups_array_func_t)NULL, NULL);
cupsArrayAdd(ppd->coptions, copt);
@@ -2999,7 +2987,7 @@ ppd_read(cups_file_t *fp, /* I - File to read from */
*/
for (lineptr = line->buffer; *lineptr; lineptr ++)
if (!isspace(*lineptr & 255))
if (*lineptr && !_cups_isspace(*lineptr))
break;
if (*lineptr)
@@ -3019,7 +3007,7 @@ ppd_read(cups_file_t *fp, /* I - File to read from */
keyptr = keyword;
while (*lineptr != '\0' && *lineptr != ':' && !isspace(*lineptr & 255))
while (*lineptr && *lineptr != ':' && !_cups_isspace(*lineptr))
{
if (*lineptr <= ' ' || *lineptr > 126 || *lineptr == '/' ||
(keyptr - keyword) >= (PPD_MAX_NAME - 1))
@@ -3038,18 +3026,18 @@ ppd_read(cups_file_t *fp, /* I - File to read from */
mask |= PPD_KEYWORD;
if (isspace(*lineptr & 255))
if (_cups_isspace(*lineptr))
{
/*
* Get an option name...
*/
while (isspace(*lineptr & 255))
while (_cups_isspace(*lineptr))
lineptr ++;
optptr = option;
while (*lineptr != '\0' && !isspace(*lineptr & 255) && *lineptr != ':' &&
while (*lineptr && !_cups_isspace(*lineptr) && *lineptr != ':' &&
*lineptr != '/')
{
if (*lineptr <= ' ' || *lineptr > 126 ||
@@ -3064,13 +3052,13 @@ ppd_read(cups_file_t *fp, /* I - File to read from */
*optptr = '\0';
if (isspace(*lineptr & 255) && cg->ppd_conform == PPD_CONFORM_STRICT)
if (_cups_isspace(*lineptr) && cg->ppd_conform == PPD_CONFORM_STRICT)
{
cg->ppd_status = PPD_ILLEGAL_WHITESPACE;
return (0);
}
while (isspace(*lineptr & 255))
while (_cups_isspace(*lineptr))
lineptr ++;
mask |= PPD_OPTION;
@@ -3110,13 +3098,13 @@ ppd_read(cups_file_t *fp, /* I - File to read from */
}
}
if (isspace(*lineptr & 255) && cg->ppd_conform == PPD_CONFORM_STRICT)
if (_cups_isspace(*lineptr) && cg->ppd_conform == PPD_CONFORM_STRICT)
{
cg->ppd_status = PPD_ILLEGAL_WHITESPACE;
return (0);
}
while (isspace(*lineptr & 255))
while (_cups_isspace(*lineptr))
lineptr ++;
if (*lineptr == ':')
@@ -3126,11 +3114,11 @@ ppd_read(cups_file_t *fp, /* I - File to read from */
*/
lineptr ++;
while (isspace(*lineptr & 255))
while (_cups_isspace(*lineptr))
lineptr ++;
strptr = lineptr + strlen(lineptr) - 1;
while (strptr >= lineptr && isspace(*strptr & 255))
while (strptr >= lineptr && _cups_isspace(*strptr))
*strptr-- = '\0';
if (*strptr == '\"')
+80 -2
Ver Arquivo
@@ -47,11 +47,14 @@ _pwgCreateWithFile(const char *filename)/* I - File to read */
num_sizes, /* Number of sizes in file */
num_sources, /* Number of sources in file */
num_types; /* Number of types in file */
char line[512], /* Current line */
char line[2048], /* Current line */
*value, /* Pointer to value in line */
*valueptr, /* Pointer into value */
pwg_keyword[128], /* PWG keyword */
ppd_keyword[PPD_MAX_NAME];
/* PPD keyword */
_pwg_output_mode_t output_mode; /* Output mode for preset */
_pwg_print_quality_t print_quality; /* Print quality for preset */
DEBUG_printf(("_pwgCreateWithFile(filename=\"%s\")", filename));
@@ -236,6 +239,10 @@ _pwgCreateWithFile(const char *filename)/* I - File to read */
pwg->custom_min_width, pwg->custom_min_length);
pwg->custom_min_keyword = _cupsStrAlloc(pwg_keyword);
}
else if (!strcasecmp(line, "SourceOption"))
{
pwg->source_option = _cupsStrAlloc(value);
}
else if (!strcasecmp(line, "NumSources"))
{
if (num_sources > 0)
@@ -332,6 +339,38 @@ _pwgCreateWithFile(const char *filename)/* I - File to read */
pwg->num_types ++;
}
else if (!strcasecmp(line, "Preset"))
{
/*
* Preset output-mode print-quality name=value ...
*/
output_mode = (_pwg_output_mode_t)strtol(value, &valueptr, 10);
print_quality = (_pwg_print_quality_t)strtol(valueptr, &valueptr, 10);
if (output_mode < _PWG_OUTPUT_MODE_MONOCHROME ||
output_mode >= _PWG_OUTPUT_MODE_MAX ||
print_quality < _PWG_PRINT_QUALITY_DRAFT ||
print_quality >= _PWG_PRINT_QUALITY_MAX ||
valueptr == value || !*valueptr)
{
DEBUG_printf(("_pwgCreateWithFile: Bad Preset on line %d.", linenum));
_cupsSetError(IPP_INTERNAL_ERROR, _("Bad PWG mapping file."), 1);
goto create_error;
}
pwg->num_presets[output_mode][print_quality] =
cupsParseOptions(valueptr, 0,
pwg->presets[output_mode] + print_quality);
}
else if (!strcasecmp(line, "SidesOption"))
pwg->sides_option = _cupsStrAlloc(value);
else if (!strcasecmp(line, "Sides1Sided"))
pwg->sides_1sided = _cupsStrAlloc(value);
else if (!strcasecmp(line, "Sides2SidedLong"))
pwg->sides_2sided_long = _cupsStrAlloc(value);
else if (!strcasecmp(line, "Sides2SidedShort"))
pwg->sides_2sided_short = _cupsStrAlloc(value);
else
{
DEBUG_printf(("_pwgCreateWithFile: Unknown %s on line %d.", line,
@@ -427,6 +466,9 @@ _pwgDestroy(_pwg_t *pwg) /* I - PWG mapping data */
free(pwg->sizes);
}
if (pwg->source_option)
_cupsStrFree(pwg->source_option);
if (pwg->sources)
{
for (i = pwg->num_sources, map = pwg->sources; i > 0; i --, map ++)
@@ -467,10 +509,11 @@ int /* O - 1 on success, 0 on failure */
_pwgWriteFile(_pwg_t *pwg, /* I - PWG mapping data */
const char *filename) /* I - File to write */
{
int i; /* Looping var */
int i, j, k; /* Looping vars */
cups_file_t *fp; /* Output file */
_pwg_size_t *size; /* Current size */
_pwg_map_t *map; /* Current map */
cups_option_t *option; /* Current option */
/*
@@ -530,6 +573,9 @@ _pwgWriteFile(_pwg_t *pwg, /* I - PWG mapping data */
* Media sources...
*/
if (pwg->source_option)
cupsFilePrintf(fp, "SourceOption %s\n", pwg->source_option);
if (pwg->num_sources > 0)
{
cupsFilePrintf(fp, "NumSources %d\n", pwg->num_sources);
@@ -548,6 +594,38 @@ _pwgWriteFile(_pwg_t *pwg, /* I - PWG mapping data */
cupsFilePrintf(fp, "Type %s %s\n", map->pwg, map->ppd);
}
/*
* Presets...
*/
for (i = _PWG_OUTPUT_MODE_MONOCHROME; i < _PWG_OUTPUT_MODE_MAX; i ++)
for (j = _PWG_PRINT_QUALITY_DRAFT; j < _PWG_PRINT_QUALITY_MAX; j ++)
if (pwg->num_presets[i][j])
{
cupsFilePrintf(fp, "Preset %d %d", i, j);
for (k = pwg->num_presets[i][j], option = pwg->presets[i][j];
k > 0;
k --, option ++)
cupsFilePrintf(fp, " %s=%s", option->name, option->value);
cupsFilePutChar(fp, '\n');
}
/*
* Duplex/sides...
*/
if (pwg->sides_option)
cupsFilePrintf(fp, "SidesOption %s\n", pwg->sides_option);
if (pwg->sides_1sided)
cupsFilePrintf(fp, "Sides1Sided %s\n", pwg->sides_1sided);
if (pwg->sides_2sided_long)
cupsFilePrintf(fp, "Sides2SidedLong %s\n", pwg->sides_2sided_long);
if (pwg->sides_2sided_short)
cupsFilePrintf(fp, "Sides2SidedShort %s\n", pwg->sides_2sided_short);
/*
* Close and return...
*/
+189 -26
Ver Arquivo
@@ -61,26 +61,26 @@ static int pwg_compare_ppd(_pwg_media_t *a, _pwg_media_t *b);
static _pwg_media_t const cups_pwg_media[] =
{ /* Media size lookup table */
/* North American Standard Sheet Media Sizes */
_PWG_MEDIA_IN("na_index-3x5_3x5in", NULL, NULL, 3, 5),
_PWG_MEDIA_IN("na_index-3x5_3x5in", NULL, "3x5", 3, 5),
_PWG_MEDIA_IN("na_personal_3.625x6.5in", NULL, "EnvPersonal", 3.625, 6.5),
_PWG_MEDIA_IN("na_monarch_3.875x7.5in", "monarch-envelope", "EnvMonarch", 3.875, 7.5),
_PWG_MEDIA_IN("na_number-9_3.875x8.875in", "na-number-9-envelope", "Env9", 3.875, 8.875),
_PWG_MEDIA_IN("na_index-4x6_4x6in", NULL, NULL, 4, 6),
_PWG_MEDIA_IN("na_index-4x6_4x6in", NULL, "4x6", 4, 6),
_PWG_MEDIA_IN("na_number-10_4.125x9.5in", "na-number-10-envelope", "Env10", 4.125, 9.5),
_PWG_MEDIA_IN("na_a2_4.375x5.75in", NULL, NULL, 4.375, 5.75),
_PWG_MEDIA_IN("na_number-11_4.5x10.375in", NULL, "Env11", 4.5, 10.375),
_PWG_MEDIA_IN("na_number-12_4.75x11in", NULL, "Env12", 4.75, 11),
_PWG_MEDIA_IN("na_5x7_5x7in", NULL, NULL, 5, 7),
_PWG_MEDIA_IN("na_index-5x8_5x8in", NULL, NULL, 5, 8),
_PWG_MEDIA_IN("na_5x7_5x7in", NULL, "5x7", 5, 7),
_PWG_MEDIA_IN("na_index-5x8_5x8in", NULL, "5x8", 5, 8),
_PWG_MEDIA_IN("na_number-14_5x11.5in", NULL, "Env14", 5, 11.5),
_PWG_MEDIA_IN("na_invoice_5.5x8.5in", "invoice", "Statement", 5.5, 8.5),
_PWG_MEDIA_IN("na_index-4x6-ext_6x8in", NULL, NULL, 6, 8),
_PWG_MEDIA_IN("na_6x9_6x9in", "na-6x9-envelope", NULL, 6, 9),
_PWG_MEDIA_IN("na_c5_6.5x9.5in", NULL, NULL, 6.5, 9.5),
_PWG_MEDIA_IN("na_6x9_6x9in", "na-6x9-envelope", "6x9", 6, 9),
_PWG_MEDIA_IN("na_c5_6.5x9.5in", NULL, "6.5x9.5", 6.5, 9.5),
_PWG_MEDIA_IN("na_7x9_7x9in", "na-7x9-envelope", "7x9", 7, 9),
_PWG_MEDIA_IN("na_executive_7.25x10.5in", "executive", "Executive", 7.25, 10.5),
_PWG_MEDIA_IN("na_govt-letter_8x10in", "na-8x10", "8x10", 8, 10),
_PWG_MEDIA_IN("na_govt-legal_8x13in", NULL, NULL, 8, 13),
_PWG_MEDIA_IN("na_govt-legal_8x13in", NULL, "8x13", 8, 13),
_PWG_MEDIA_IN("na_quarto_8.5x10.83in", "quarto", "Quarto", 8.5, 10.83),
_PWG_MEDIA_IN("na_letter_8.5x11in", "na-letter", "Letter", 8.5, 11),
_PWG_MEDIA_IN("na_fanfold-eur_8.5x12in", NULL, "FanFoldGerman", 8.5, 12),
@@ -95,15 +95,15 @@ static _pwg_media_t const cups_pwg_media[] =
_PWG_MEDIA_IN("na_10x11_10x11in", NULL, "10x11", 10, 11),
_PWG_MEDIA_IN("na_10x13_10x13in", "na-10x13-envelope", "10x13", 10, 13),
_PWG_MEDIA_IN("na_10x14_10x14in", "na-10x14-envelope", "10x14", 10, 14),
_PWG_MEDIA_IN("na_10x15_10x15in", "na-10x15-envelope", NULL, 10, 15),
_PWG_MEDIA_IN("na_11x12_11x12in", NULL, NULL, 11, 12),
_PWG_MEDIA_IN("na_edp_11x14in", NULL, NULL, 11, 14),
_PWG_MEDIA_IN("na_10x15_10x15in", "na-10x15-envelope", "10x15", 10, 15),
_PWG_MEDIA_IN("na_11x12_11x12in", NULL, "11x12", 11, 12),
_PWG_MEDIA_IN("na_edp_11x14in", NULL, "11x14", 11, 14),
_PWG_MEDIA_IN("na_fanfold-us_11x14.875in", NULL, NULL, 11, 14.875),
_PWG_MEDIA_IN("na_11x15_11x15in", NULL, NULL, 11, 15),
_PWG_MEDIA_IN("na_11x15_11x15in", NULL, "11x15", 11, 15),
_PWG_MEDIA_IN("na_ledger_11x17in", "tabloid", "Tabloid", 11, 17),
_PWG_MEDIA_IN("na_eur-edp_12x14in", NULL, NULL, 12, 14),
_PWG_MEDIA_IN("na_arch-b_12x18in", "arch-b", "ARCHB", 12, 18),
_PWG_MEDIA_IN("na_12x19_12x19in", NULL, NULL, 12, 19),
_PWG_MEDIA_IN("na_12x19_12x19in", NULL, "12x19", 12, 19),
_PWG_MEDIA_IN("na_b-plus_12x19.17in", NULL, "SuperB", 12, 19.17),
_PWG_MEDIA_IN("na_super-b_13x19in", "super-b", NULL, 13, 19),
_PWG_MEDIA_IN("na_c_17x22in", "c", "AnsiC", 17, 22),
@@ -114,7 +114,7 @@ static _pwg_media_t const cups_pwg_media[] =
_PWG_MEDIA_IN("na_wide-format_30x42in", NULL, NULL, 30, 42),
_PWG_MEDIA_IN("na_e_34x44in", "e", "AnsiE", 34, 44),
_PWG_MEDIA_IN("na_arch-e_36x48in", "arch-e", "ARCHE", 36, 48),
_PWG_MEDIA_IN("na_f_44x68in", NULL, NULL, 44, 68),
_PWG_MEDIA_IN("na_f_44x68in", NULL, "AnsiF", 44, 68),
/* Chinese Standard Sheet Media Inch Sizes */
_PWG_MEDIA_IN("roc_16k_7.75x10.75in", NULL, NULL, 7.75, 10.75),
@@ -354,8 +354,8 @@ _pwgInitSize(_pwg_size_t *size, /* I - Size to initialize */
*/
if ((media_size = ippFindAttribute(media_col->values[0].collection,
"media-size",
IPP_TAG_BEGIN_COLLECTION)) != NULL)
"media-size",
IPP_TAG_BEGIN_COLLECTION)) != NULL)
{
/*
* Got media-size, look for x-dimension and y-dimension member
@@ -418,12 +418,42 @@ _pwgInitSize(_pwg_size_t *size, /* I - Size to initialize */
else
{
if ((media = ippFindAttribute(job, "media", IPP_TAG_NAME)) == NULL)
media = ippFindAttribute(job, "media", IPP_TAG_KEYWORD);
if ((media = ippFindAttribute(job, "media", IPP_TAG_KEYWORD)) == NULL)
if ((media = ippFindAttribute(job, "PageSize", IPP_TAG_NAME)) == NULL)
media = ippFindAttribute(job, "PageRegion", IPP_TAG_NAME);
if (media)
{
if ((pwg = _pwgMediaForPWG(media->values[0].string.text)) == NULL)
pwg = _pwgMediaForLegacy(media->values[0].string.text);
const char *name = media->values[0].string.text;
/* Name string */
if ((pwg = _pwgMediaForPWG(name)) == NULL)
{
/*
* Not a PWG name, try a legacy name...
*/
if ((pwg = _pwgMediaForLegacy(name)) == NULL)
{
/*
* Not a legacy name, try a PPD name...
*/
const char *suffix; /* Suffix on media string */
pwg = _pwgMediaForPPD(name);
if (pwg &&
(suffix = name + strlen(name) - 10 /* .FullBleed */) > name &&
!strcasecmp(suffix, ".FullBleed"))
{
/*
* Indicate that margins are set with the default values of 0.
*/
*margins_set = 1;
}
}
}
if (pwg)
{
@@ -502,7 +532,8 @@ _pwgMediaForLegacy(
_pwg_media_t * /* O - Matching size or NULL */
_pwgMediaForPPD(const char *ppd) /* I - PPD size name */
{
_pwg_media_t key; /* Search key */
_pwg_media_t key, /* Search key */
*size; /* Matching size */
_cups_globals_t *cg = _cupsGlobals(); /* Global data */
@@ -519,8 +550,7 @@ _pwgMediaForPPD(const char *ppd) /* I - PPD size name */
if (!cg->ppd_size_lut)
{
int i; /* Looping var */
_pwg_media_t *size; /* Current size */
int i; /* Looping var */
cg->ppd_size_lut = cupsArrayNew((cups_array_func_t)pwg_compare_ppd, NULL);
@@ -537,7 +567,96 @@ _pwgMediaForPPD(const char *ppd) /* I - PPD size name */
*/
key.ppd = ppd;
return ((_pwg_media_t *)cupsArrayFind(cg->ppd_size_lut, &key));
if ((size = (_pwg_media_t *)cupsArrayFind(cg->ppd_size_lut, &key)) == NULL)
{
/*
* See if the name is of the form:
*
* [Custom.]WIDTHxLENGTH[.FullBleed] - Size in points/inches [borderless]
* [Custom.]WIDTHxLENGTHcm[.FullBleed] - Size in centimeters [borderless]
* [Custom.]WIDTHxLENGTHft[.FullBleed] - Size in feet [borderless]
* [Custom.]WIDTHxLENGTHin[.FullBleed] - Size in inches [borderless]
* [Custom.]WIDTHxLENGTHm[.FullBleed] - Size in meters [borderless]
* [Custom.]WIDTHxLENGTHmm[.FullBleed] - Size in millimeters [borderless]
* [Custom.]WIDTHxLENGTHpt[.FullBleed] - Size in points [borderless]
*/
double w, l, /* Width and length of page */
factor; /* Unit scaling factor */
char *ptr; /* Pointer into name */
struct lconv *loc; /* Locale data */
int custom; /* Custom page size? */
if (!strncasecmp(ppd, "Custom.", 7))
{
custom = 1;
factor = 2540.0 / 72.0;
ptr = (char *)ppd + 7;
}
else
{
custom = 0;
factor = 2540.0;
ptr = (char *)ppd;
}
loc = localeconv();
w = _cupsStrScand(ptr, &ptr, loc);
if (ptr && ptr > ppd && *ptr == 'x')
{
l = _cupsStrScand(ptr + 1, &ptr, loc);
if (ptr &&
(!*ptr ||
!strcasecmp(ptr, "FullBleed") ||
!strcasecmp(ptr, ".FullBleed") ||
!strcasecmp(ptr, "cm") ||
!strcasecmp(ptr, "cm.FullBleed") ||
!strcasecmp(ptr, "ft") ||
!strcasecmp(ptr, "ft.FullBleed") ||
!strcasecmp(ptr, "in") ||
!strcasecmp(ptr, "in.FullBleed") ||
!strcasecmp(ptr, "m") ||
!strcasecmp(ptr, "m.FullBleed") ||
!strcasecmp(ptr, "mm") ||
!strcasecmp(ptr, "mm.FullBleed") ||
!strcasecmp(ptr, "pt") ||
!strcasecmp(ptr, "pt.FullBleed")))
{
size = &(cg->pwg_media);
if (!strncasecmp(ptr, "cm", 2))
factor = 1000.0;
else if (!strncasecmp(ptr, "ft", 2))
factor = 2540.0 * 12.0;
else if (!strncasecmp(ptr, "in", 2))
factor = 2540.0;
else if (!strncasecmp(ptr, "mm", 2))
factor = 100.0;
else if (*ptr == 'm' || *ptr == 'M')
factor = 100000.0;
else if (!strncasecmp(ptr, "pt", 2))
factor = 2540.0 / 72.0;
/*
* Not a standard size; convert it to a PWG custom name of the form:
*
* [oe|om]_WIDTHxHEIGHTuu_WIDTHxHEIGHTuu
*/
size->width = (int)(w * factor);
size->length = (int)(l * factor);
size->pwg = cg->pwg_name;
_pwgGenerateSize(cg->pwg_name, sizeof(cg->pwg_name),
custom ? "custom" : NULL, custom ? ppd + 7 : NULL,
size->width, size->length);
}
}
}
return (size);
}
@@ -548,7 +667,9 @@ _pwgMediaForPPD(const char *ppd) /* I - PPD size name */
_pwg_media_t * /* O - Matching size or NULL */
_pwgMediaForPWG(const char *pwg) /* I - PWG size name */
{
_pwg_media_t key; /* Search key */
char *ptr; /* Pointer into name */
_pwg_media_t key, /* Search key */
*size; /* Matching size */
_cups_globals_t *cg = _cupsGlobals(); /* Global data */
@@ -565,8 +686,7 @@ _pwgMediaForPWG(const char *pwg) /* I - PWG size name */
if (!cg->pwg_size_lut)
{
int i; /* Looping var */
_pwg_media_t *size; /* Current size */
int i; /* Looping var */
cg->pwg_size_lut = cupsArrayNew((cups_array_func_t)pwg_compare_pwg, NULL);
@@ -582,7 +702,50 @@ _pwgMediaForPWG(const char *pwg) /* I - PWG size name */
*/
key.pwg = pwg;
return ((_pwg_media_t *)cupsArrayFind(cg->pwg_size_lut, &key));
if ((size = (_pwg_media_t *)cupsArrayFind(cg->pwg_size_lut, &key)) == NULL &&
(ptr = (char *)strchr(pwg, '_')) != NULL &&
(ptr = (char *)strchr(ptr + 1, '_')) != NULL)
{
/*
* Try decoding the self-describing name of the form:
*
* class_name_WWWxHHHin
* class_name_WWWxHHHmm
*/
double w, l; /* Width and length of page */
struct lconv *loc; /* Locale data */
ptr ++;
loc = localeconv();
w = _cupsStrScand(ptr, &ptr, loc);
if (ptr && *ptr == 'x')
{
l = _cupsStrScand(ptr + 1, &ptr, loc);
if (ptr && (!strcmp(ptr, "in") || !strcmp(ptr, "mm")))
{
size = &(cg->pwg_media);
if (!strcmp(ptr, "mm"))
{
size->width = (int)(w * 100);
size->length = (int)(l * 100);
}
else
{
size->width = (int)(w * 2540);
size->length = (int)(l * 2540);
}
strlcpy(cg->pwg_name, pwg, sizeof(cg->pwg_name));
size->pwg = cg->pwg_name;
}
}
}
return (size);
}
+493 -73
Ver Arquivo
@@ -3,7 +3,7 @@
*
* PWG PPD mapping API implementation for CUPS.
*
* Copyright 2010 by Apple Inc.
* Copyright 2010-2011 by Apple Inc.
*
* These coded instructions, statements, and computer programs are the
* property of Apple Inc. and are protected by Federal copyright
@@ -48,6 +48,13 @@
#include <math.h>
/*
* Macro to test for two almost-equal PWG measurements.
*/
#define _PWG_EQUIVALENT(x, y) (abs((x)-(y)) < 2)
/*
* Local functions...
*/
@@ -63,20 +70,44 @@ static void pwg_unppdize_name(const char *ppd, char *name, size_t namesize);
_pwg_t * /* O - PWG mapping data */
_pwgCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
{
int i, j; /* Looping vars */
_pwg_t *pwg; /* PWG mapping data */
ppd_option_t *input_slot, /* InputSlot option */
*media_type, /* MediaType option */
*output_bin; /* OutputBin option */
ppd_choice_t *choice; /* Current InputSlot/MediaType */
_pwg_map_t *map; /* Current source/type map */
ppd_size_t *ppd_size; /* Current PPD size */
_pwg_size_t *pwg_size; /* Current PWG size */
char pwg_keyword[3 + PPD_MAX_NAME + 1 + 12 + 1 + 12 + 3],
int i, j, k; /* Looping vars */
_pwg_t *pwg; /* PWG mapping data */
ppd_option_t *input_slot, /* InputSlot option */
*media_type, /* MediaType option */
*output_bin, /* OutputBin option */
*color_model, /* ColorModel option */
*duplex; /* Duplex option */
ppd_choice_t *choice; /* Current InputSlot/MediaType */
_pwg_map_t *map; /* Current source/type map */
ppd_attr_t *ppd_attr; /* Current PPD preset attribute */
int num_options; /* Number of preset options and props */
cups_option_t *options; /* Preset options and properties */
ppd_size_t *ppd_size; /* Current PPD size */
_pwg_size_t *pwg_size; /* Current PWG size */
char pwg_keyword[3 + PPD_MAX_NAME + 1 + 12 + 1 + 12 + 3],
/* PWG keyword string */
ppd_name[PPD_MAX_NAME]; /* Normalized PPD name */
const char *pwg_name; /* Standard PWG media name */
_pwg_media_t *pwg_media; /* PWG media data */
ppd_name[PPD_MAX_NAME];
/* Normalized PPD name */
const char *pwg_name; /* Standard PWG media name */
_pwg_media_t *pwg_media; /* PWG media data */
_pwg_output_mode_t pwg_output_mode;/* output-mode index */
_pwg_print_quality_t pwg_print_quality;
/* print-quality index */
int similar; /* Are the old and new size similar? */
_pwg_size_t *old_size; /* Current old size */
int old_imageable, /* Old imageable length in 2540ths */
old_borderless, /* Old borderless state */
old_known_pwg; /* Old PWG name is well-known */
int new_width, /* New width in 2540ths */
new_length, /* New length in 2540ths */
new_left, /* New left margin in 2540ths */
new_bottom, /* New bottom margin in 2540ths */
new_right, /* New right margin in 2540ths */
new_top, /* New top margin in 2540ths */
new_imageable, /* New imageable length in 2540ths */
new_borderless, /* New borderless state */
new_known_pwg; /* New PWG name is well-known */
_pwg_size_t *new_size; /* New size to add, if any */
DEBUG_printf(("_pwgCreateWithPPD(ppd=%p)", ppd));
@@ -150,7 +181,8 @@ _pwgCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
* Standard name and no conflicts, use it!
*/
pwg_name = pwg_media->pwg;
pwg_name = pwg_media->pwg;
new_known_pwg = 1;
}
else
{
@@ -160,7 +192,8 @@ _pwgCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
* pp_lowerppd_WIDTHxHEIGHTuu
*/
pwg_name = pwg_keyword;
pwg_name = pwg_keyword;
new_known_pwg = 0;
pwg_unppdize_name(ppd_size->name, ppd_name, sizeof(ppd_name));
_pwgGenerateSize(pwg_keyword, sizeof(pwg_keyword), NULL, ppd_name,
@@ -169,20 +202,75 @@ _pwgCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
}
/*
* Save this size...
* If we have a similar paper with non-zero margins then we only
* want to keep it if it has a larger imageable area length.
*/
pwg_size->map.ppd = _cupsStrAlloc(ppd_size->name);
pwg_size->map.pwg = _cupsStrAlloc(pwg_name);
pwg_size->width = _PWG_FROMPTS(ppd_size->width);
pwg_size->length = _PWG_FROMPTS(ppd_size->length);
pwg_size->left = _PWG_FROMPTS(ppd_size->left);
pwg_size->bottom = _PWG_FROMPTS(ppd_size->bottom);
pwg_size->right = _PWG_FROMPTS(ppd_size->width - ppd_size->right);
pwg_size->top = _PWG_FROMPTS(ppd_size->length - ppd_size->top);
new_width = _PWG_FROMPTS(ppd_size->width);
new_length = _PWG_FROMPTS(ppd_size->length);
new_left = _PWG_FROMPTS(ppd_size->left);
new_bottom = _PWG_FROMPTS(ppd_size->bottom);
new_right = _PWG_FROMPTS(ppd_size->width - ppd_size->right);
new_top = _PWG_FROMPTS(ppd_size->length - ppd_size->top);
new_imageable = new_length - new_top - new_bottom;
new_borderless = new_bottom == 0 && new_top == 0 &&
new_left == 0 && new_right == 0;
pwg->num_sizes ++;
pwg_size ++;
for (k = pwg->num_sizes, similar = 0, old_size = pwg->sizes, new_size = NULL;
k > 0 && !similar;
k --, old_size ++)
{
old_imageable = old_size->length - old_size->top - old_size->bottom;
old_borderless = old_size->left == 0 && old_size->bottom == 0 &&
old_size->right == 0 && old_size->top == 0;
old_known_pwg = strncmp(old_size->map.pwg, "oe_", 3) &&
strncmp(old_size->map.pwg, "om_", 3);
similar = old_borderless == new_borderless &&
_PWG_EQUIVALENT(old_size->width, new_width) &&
_PWG_EQUIVALENT(old_size->length, new_length);
if (similar &&
(new_known_pwg || (!old_known_pwg && new_imageable > old_imageable)))
{
/*
* The new paper has a larger imageable area so it could replace
* the older paper. Regardless of the imageable area, we always
* prefer the size with a well-known PWG name.
*/
new_size = old_size;
_cupsStrFree(old_size->map.ppd);
_cupsStrFree(old_size->map.pwg);
}
}
if (!similar)
{
/*
* The paper was unique enough to deserve its own entry so add it to the
* end.
*/
new_size = pwg_size ++;
pwg->num_sizes ++;
}
if (new_size)
{
/*
* Save this size...
*/
new_size->map.ppd = _cupsStrAlloc(ppd_size->name);
new_size->map.pwg = _cupsStrAlloc(pwg_name);
new_size->width = new_width;
new_size->length = new_length;
new_size->left = new_left;
new_size->bottom = new_bottom;
new_size->right = new_right;
new_size->top = new_top;
}
}
if (ppd->variable_sizes)
@@ -215,8 +303,13 @@ _pwgCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
* Copy and convert InputSlot data...
*/
if ((input_slot = ppdFindOption(ppd, "InputSlot")) != NULL)
if ((input_slot = ppdFindOption(ppd, "InputSlot")) == NULL)
input_slot = ppdFindOption(ppd, "HPPaperSource");
if (input_slot)
{
pwg->source_option = _cupsStrAlloc(input_slot->keyword);
if ((pwg->sources = calloc(input_slot->num_choices,
sizeof(_pwg_map_t))) == NULL)
{
@@ -237,6 +330,10 @@ _pwgCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
pwg_name = "auto";
else if (!strcasecmp(choice->choice, "Cassette"))
pwg_name = "main";
else if (!strcasecmp(choice->choice, "PhotoTray"))
pwg_name = "photo";
else if (!strcasecmp(choice->choice, "CDTray"))
pwg_name = "disc";
else if (!strncasecmp(choice->choice, "Multipurpose", 12) ||
!strcasecmp(choice->choice, "MP") ||
!strcasecmp(choice->choice, "MPTray"))
@@ -362,6 +459,238 @@ _pwgCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
}
}
if ((ppd_attr = ppdFindAttr(ppd, "APPrinterPreset", NULL)) != NULL)
{
/*
* Copy and convert APPrinterPreset (output-mode + print-quality) data...
*/
const char *quality, /* com.apple.print.preset.quality value */
*output_mode, /* com.apple.print.preset.output-mode value */
*color_model_val, /* ColorModel choice */
*graphics_type, /* com.apple.print.preset.graphicsType value */
*paper_coating; /* com.apple.print.preset.media-front-coating value */
do
{
num_options = _ppdParseOptions(ppd_attr->value, 0, &options,
_PPD_PARSE_ALL);
if ((quality = cupsGetOption("com.apple.print.preset.quality",
num_options, options)) != NULL)
{
/*
* Get the print-quality for this preset...
*/
if (!strcmp(quality, "low"))
pwg_print_quality = _PWG_PRINT_QUALITY_DRAFT;
else if (!strcmp(quality, "high"))
pwg_print_quality = _PWG_PRINT_QUALITY_HIGH;
else
pwg_print_quality = _PWG_PRINT_QUALITY_NORMAL;
/*
* Ignore graphicsType "Photo" presets that are not high quality.
*/
graphics_type = cupsGetOption("com.apple.print.preset.graphicsType",
num_options, options);
if (pwg_print_quality != _PWG_PRINT_QUALITY_HIGH && graphics_type &&
!strcmp(graphics_type, "Photo"))
continue;
/*
* Ignore presets for normal and draft quality where the coating
* isn't "none" or "autodetect".
*/
paper_coating = cupsGetOption(
"com.apple.print.preset.media-front-coating",
num_options, options);
if (pwg_print_quality != _PWG_PRINT_QUALITY_HIGH && paper_coating &&
strcmp(paper_coating, "none") &&
strcmp(paper_coating, "autodetect"))
continue;
/*
* Get the output mode for this preset...
*/
output_mode = cupsGetOption("com.apple.print.preset.output-mode",
num_options, options);
color_model_val = cupsGetOption("ColorModel", num_options, options);
if (output_mode)
{
if (!strcmp(output_mode, "monochrome"))
pwg_output_mode = _PWG_OUTPUT_MODE_MONOCHROME;
else
pwg_output_mode = _PWG_OUTPUT_MODE_COLOR;
}
else if (color_model_val)
{
if (!strcasecmp(color_model_val, "Gray"))
pwg_output_mode = _PWG_OUTPUT_MODE_MONOCHROME;
else
pwg_output_mode = _PWG_OUTPUT_MODE_COLOR;
}
else
pwg_output_mode = _PWG_OUTPUT_MODE_COLOR;
/*
* Save the options for this combination as needed...
*/
if (!pwg->num_presets[pwg_output_mode][pwg_print_quality])
pwg->num_presets[pwg_output_mode][pwg_print_quality] =
_ppdParseOptions(ppd_attr->value, 0,
pwg->presets[pwg_output_mode] +
pwg_print_quality, _PPD_PARSE_OPTIONS);
}
cupsFreeOptions(num_options, options);
}
while ((ppd_attr = ppdFindNextAttr(ppd, "APPrinterPreset", NULL)) != NULL);
}
if (!pwg->num_presets[_PWG_OUTPUT_MODE_MONOCHROME][_PWG_PRINT_QUALITY_DRAFT] &&
!pwg->num_presets[_PWG_OUTPUT_MODE_MONOCHROME][_PWG_PRINT_QUALITY_NORMAL] &&
!pwg->num_presets[_PWG_OUTPUT_MODE_MONOCHROME][_PWG_PRINT_QUALITY_HIGH])
{
/*
* Try adding some common color options to create grayscale presets. These
* are listed in order of popularity...
*/
const char *color_option = NULL, /* Color control option */
*gray_choice = NULL; /* Choice to select grayscale */
if ((color_model = ppdFindOption(ppd, "ColorModel")) != NULL &&
ppdFindChoice(color_model, "Gray"))
{
color_option = "ColorModel";
gray_choice = "Gray";
}
else if ((color_model = ppdFindOption(ppd, "HPColorMode")) != NULL &&
ppdFindChoice(color_model, "grayscale"))
{
color_option = "HPColorMode";
gray_choice = "grayscale";
}
else if ((color_model = ppdFindOption(ppd, "BRMonoColor")) != NULL &&
ppdFindChoice(color_model, "Mono"))
{
color_option = "BRMonoColor";
gray_choice = "Mono";
}
else if ((color_model = ppdFindOption(ppd, "CNIJSGrayScale")) != NULL &&
ppdFindChoice(color_model, "1"))
{
color_option = "CNIJSGrayScale";
gray_choice = "1";
}
else if ((color_model = ppdFindOption(ppd, "HPColorAsGray")) != NULL &&
ppdFindChoice(color_model, "True"))
{
color_option = "HPColorAsGray";
gray_choice = "True";
}
if (color_option && gray_choice)
{
/*
* Copy and convert ColorModel (output-mode) data...
*/
cups_option_t *coption, /* Color option */
*moption; /* Monochrome option */
for (pwg_print_quality = _PWG_PRINT_QUALITY_DRAFT;
pwg_print_quality < _PWG_PRINT_QUALITY_MAX;
pwg_print_quality ++)
{
if (pwg->num_presets[_PWG_OUTPUT_MODE_COLOR][pwg_print_quality])
{
/*
* Copy the color options...
*/
num_options = pwg->num_presets[_PWG_OUTPUT_MODE_COLOR]
[pwg_print_quality];
options = calloc(sizeof(cups_option_t), num_options);
if (options)
{
for (i = num_options, moption = options,
coption = pwg->presets[_PWG_OUTPUT_MODE_COLOR]
[pwg_print_quality];
i > 0;
i --, moption ++, coption ++)
{
moption->name = _cupsStrRetain(coption->name);
moption->value = _cupsStrRetain(coption->value);
}
pwg->num_presets[_PWG_OUTPUT_MODE_MONOCHROME][pwg_print_quality] =
num_options;
pwg->presets[_PWG_OUTPUT_MODE_MONOCHROME][pwg_print_quality] =
options;
}
}
else if (pwg_print_quality != _PWG_PRINT_QUALITY_NORMAL)
continue;
/*
* Add the grayscale option to the preset...
*/
pwg->num_presets[_PWG_OUTPUT_MODE_MONOCHROME][pwg_print_quality] =
cupsAddOption(color_option, gray_choice,
pwg->num_presets[_PWG_OUTPUT_MODE_MONOCHROME]
[pwg_print_quality],
pwg->presets[_PWG_OUTPUT_MODE_MONOCHROME] +
pwg_print_quality);
}
}
}
/*
* Copy and convert Duplex (sides) data...
*/
if ((duplex = ppdFindOption(ppd, "Duplex")) == NULL)
if ((duplex = ppdFindOption(ppd, "JCLDuplex")) == NULL)
if ((duplex = ppdFindOption(ppd, "EFDuplex")) == NULL)
if ((duplex = ppdFindOption(ppd, "EFDuplexing")) == NULL)
duplex = ppdFindOption(ppd, "KD03Duplex");
if (duplex)
{
pwg->sides_option = _cupsStrAlloc(duplex->keyword);
for (i = duplex->num_choices, choice = duplex->choices;
i > 0;
i --, choice ++)
{
if ((!strcasecmp(choice->choice, "None") ||
!strcasecmp(choice->choice, "False")) && !pwg->sides_1sided)
pwg->sides_1sided = _cupsStrAlloc(choice->choice);
else if ((!strcasecmp(choice->choice, "DuplexNoTumble") ||
!strcasecmp(choice->choice, "LongEdge") ||
!strcasecmp(choice->choice, "Top")) && !pwg->sides_2sided_long)
pwg->sides_2sided_long = _cupsStrAlloc(choice->choice);
else if ((!strcasecmp(choice->choice, "DuplexTumble") ||
!strcasecmp(choice->choice, "ShortEdge") ||
!strcasecmp(choice->choice, "Bottom")) &&
!pwg->sides_2sided_short)
pwg->sides_2sided_short = _cupsStrAlloc(choice->choice);
}
}
return (pwg);
/*
@@ -434,13 +763,30 @@ _pwgGetInputSlot(_pwg_t *pwg, /* I - PWG mapping data */
ipp_attribute_t *media_col, /* media-col attribute */
*media_source; /* media-source attribute */
_pwg_size_t size; /* Dimensional size */
int margins_set; /* Were the margins set? */
media_col = ippFindAttribute(job, "media-col", IPP_TAG_BEGIN_COLLECTION);
if (media_col &&
(media_source = ippFindAttribute(media_col->values[0].collection,
"media-source",
IPP_TAG_KEYWORD)) != NULL)
{
/*
* Use the media-source value from media-col...
*/
keyword = media_source->values[0].string.text;
}
else if (_pwgInitSize(&size, job, &margins_set))
{
/*
* For media <= 5x7, look for a photo tray...
*/
if (size.width <= (5 * 2540) && size.length <= (7 * 2540))
keyword = "photo";
}
}
if (keyword)
@@ -550,7 +896,7 @@ const char * /* O - PPD PageSize or NULL */
_pwgGetPageSize(_pwg_t *pwg, /* I - PWG mapping data */
ipp_t *job, /* I - Job attributes or NULL */
const char *keyword, /* I - Keyword string or NULL */
int *exact) /* I - 1 if exact match, 0 otherwise */
int *exact) /* O - 1 if exact match, 0 otherwise */
{
int i; /* Looping var */
_pwg_size_t *size, /* Current size */
@@ -565,8 +911,12 @@ _pwgGetPageSize(_pwg_t *pwg, /* I - PWG mapping data */
dtop, /* Difference in top margins */
dmin, /* Minimum difference */
dclosest; /* Closest difference */
const char *ppd_name; /* PPD media name */
DEBUG_printf(("_pwgGetPageSize(pwg=%p, job=%p, keyword=\"%s\", exact=%p)",
pwg, job, keyword, exact));
/*
* Range check input...
*/
@@ -577,6 +927,59 @@ _pwgGetPageSize(_pwg_t *pwg, /* I - PWG mapping data */
if (exact)
*exact = 0;
ppd_name = keyword;
if (job)
{
/*
* Try getting the PPD media name from the job attributes...
*/
ipp_attribute_t *attr; /* Job attribute */
if ((attr = ippFindAttribute(job, "PageSize", IPP_TAG_ZERO)) == NULL)
if ((attr = ippFindAttribute(job, "PageRegion", IPP_TAG_ZERO)) == NULL)
attr = ippFindAttribute(job, "media", IPP_TAG_ZERO);
#ifdef DEBUG
if (attr)
DEBUG_printf(("1_pwgGetPageSize: Found attribute %s (%s)", attr->name,
ippTagString(attr->value_tag)));
else
DEBUG_puts("1_pwgGetPageSize: Did not find media attribute.");
#endif /* DEBUG */
if (attr && (attr->value_tag == IPP_TAG_NAME ||
attr->value_tag == IPP_TAG_KEYWORD))
ppd_name = attr->values[0].string.text;
}
DEBUG_printf(("1_pwgGetPageSize: ppd_name=\"%s\"", ppd_name));
if (ppd_name)
{
/*
* Try looking up the named PPD size first...
*/
for (i = pwg->num_sizes, size = pwg->sizes; i > 0; i --, size ++)
{
DEBUG_printf(("2_pwgGetPageSize: size[%d]=[\"%s\" \"%s\"]",
(int)(size - pwg->sizes), size->map.pwg, size->map.ppd));
if (!strcasecmp(ppd_name, size->map.ppd) ||
!strcasecmp(ppd_name, size->map.pwg))
{
if (exact)
*exact = 1;
DEBUG_printf(("1_pwgGetPageSize: Returning \"%s\"", ppd_name));
return (size->map.ppd);
}
}
}
if (job && !keyword)
{
/*
@@ -598,7 +1001,8 @@ _pwgGetPageSize(_pwg_t *pwg, /* I - PWG mapping data */
if ((media = _pwgMediaForPWG(keyword)) == NULL)
if ((media = _pwgMediaForLegacy(keyword)) == NULL)
return (NULL);
if ((media = _pwgMediaForPPD(keyword)) == NULL)
return (NULL);
jobsize.width = media->width;
jobsize.length = media->length;
@@ -613,57 +1017,68 @@ _pwgGetPageSize(_pwg_t *pwg, /* I - PWG mapping data */
closest = NULL;
dclosest = 999999999;
for (i = pwg->num_sizes, size = pwg->sizes; i > 0; i --, size ++)
if (!ppd_name || strncasecmp(ppd_name, "Custom.", 7) ||
strncasecmp(ppd_name, "custom_", 7))
{
/*
* Adobe uses a size matching algorithm with an epsilon of 5 points, which
* is just about 176/2540ths...
*/
dwidth = size->width - jobsize.width;
dlength = size->length - jobsize.length;
if (dwidth <= -176 || dwidth >= 176 || dlength <= -176 || dlength >= 176)
continue;
if (margins_set)
for (i = pwg->num_sizes, size = pwg->sizes; i > 0; i --, size ++)
{
/*
* Use a tighter epsilon of 1 point (35/2540ths) for margins...
* Adobe uses a size matching algorithm with an epsilon of 5 points, which
* is just about 176/2540ths...
*/
dleft = size->left - jobsize.left;
dright = size->right - jobsize.right;
dtop = size->top - jobsize.top;
dbottom = size->bottom - jobsize.bottom;
if (dleft <= -35 || dleft >= 35 || dright <= -35 || dright >= 35 ||
dtop <= -35 || dtop >= 35 || dbottom <= -35 || dbottom >= 35)
{
dleft = dleft < 0 ? -dleft : dleft;
dright = dright < 0 ? -dright : dright;
dbottom = dbottom < 0 ? -dbottom : dbottom;
dtop = dtop < 0 ? -dtop : dtop;
dmin = dleft + dright + dbottom + dtop;
if (dmin < dclosest)
{
dclosest = dmin;
closest = size;
}
dwidth = size->width - jobsize.width;
dlength = size->length - jobsize.length;
if (dwidth <= -176 || dwidth >= 176 || dlength <= -176 || dlength >= 176)
continue;
if (margins_set)
{
/*
* Use a tighter epsilon of 1 point (35/2540ths) for margins...
*/
dleft = size->left - jobsize.left;
dright = size->right - jobsize.right;
dtop = size->top - jobsize.top;
dbottom = size->bottom - jobsize.bottom;
if (dleft <= -35 || dleft >= 35 || dright <= -35 || dright >= 35 ||
dtop <= -35 || dtop >= 35 || dbottom <= -35 || dbottom >= 35)
{
dleft = dleft < 0 ? -dleft : dleft;
dright = dright < 0 ? -dright : dright;
dbottom = dbottom < 0 ? -dbottom : dbottom;
dtop = dtop < 0 ? -dtop : dtop;
dmin = dleft + dright + dbottom + dtop;
if (dmin < dclosest)
{
dclosest = dmin;
closest = size;
}
continue;
}
}
if (exact)
*exact = 1;
DEBUG_printf(("1_pwgGetPageSize: Returning \"%s\"", size->map.ppd));
return (size->map.ppd);
}
if (exact)
*exact = 1;
return (size->map.ppd);
}
if (closest)
{
DEBUG_printf(("1_pwgGetPageSize: Returning \"%s\" (closest)",
closest->map.ppd));
return (closest->map.ppd);
}
/*
* If we get here we need to check for custom page size support...
@@ -695,6 +1110,9 @@ _pwgGetPageSize(_pwg_t *pwg, /* I - PWG mapping data */
else if (exact)
*exact = 1;
DEBUG_printf(("1_pwgGetPageSize: Returning \"%s\" (custom)",
pwg->custom_ppd_size));
return (pwg->custom_ppd_size);
}
@@ -702,6 +1120,8 @@ _pwgGetPageSize(_pwg_t *pwg, /* I - PWG mapping data */
* No custom page size support or the size is out of range - return NULL.
*/
DEBUG_puts("1_pwgGetPageSize: Returning NULL");
return (NULL);
}
@@ -1024,7 +1444,7 @@ pwg_ppdize_name(const char *ipp, /* I - IPP keyword */
for (ptr = name + 1, end = name + namesize - 1; *ipp && ptr < end;)
{
if (*ipp == '-' && isalpha(ipp[1] & 255))
if (*ipp == '-' && _cups_isalpha(ipp[1]))
{
ipp ++;
*ptr++ = toupper(*ipp++ & 255);
@@ -1052,13 +1472,13 @@ pwg_unppdize_name(const char *ppd, /* I - PPD keyword */
for (ptr = name, end = name + namesize - 1; *ppd && ptr < end; ppd ++)
{
if (isalnum(*ppd & 255) || *ppd == '-' || *ppd == '.')
if (_cups_isalnum(*ppd) || *ppd == '-')
*ptr++ = tolower(*ppd & 255);
else if (*ppd == '_')
else if (*ppd == '_' || *ppd == '.')
*ptr++ = '-';
if (!isupper(*ppd & 255) && isalnum(*ppd & 255) &&
isupper(ppd[1] & 255) && ptr < end)
if (!_cups_isupper(*ppd) && _cups_isalnum(*ppd) &&
_cups_isupper(ppd[1]) && ptr < end)
*ptr++ = '-';
}
+24
Ver Arquivo
@@ -48,6 +48,21 @@ extern "C" {
* Types and structures...
*/
typedef enum _pwg_output_mode_e /**** PWG output-mode indices ****/
{
_PWG_OUTPUT_MODE_MONOCHROME = 0, /* output-mode=monochrome */
_PWG_OUTPUT_MODE_COLOR, /* output-mode=color */
_PWG_OUTPUT_MODE_MAX
} _pwg_output_mode_t;
typedef enum _pwg_print_quality_e /**** PWG print-quality indices ****/
{
_PWG_PRINT_QUALITY_DRAFT = 0, /* print-quality=3 */
_PWG_PRINT_QUALITY_NORMAL, /* print-quality=4 */
_PWG_PRINT_QUALITY_HIGH, /* print-quality=5 */
_PWG_PRINT_QUALITY_MAX
} _pwg_print_quality_t;
typedef struct _pwg_media_s /**** Common media size data ****/
{
const char *pwg, /* PWG 5101.1 "self describing" name */
@@ -88,10 +103,19 @@ typedef struct _pwg_s /**** PWG-PPD conversion data ****/
*custom_min_keyword, /* Minimum custom size PWG keyword */
custom_ppd_size[41]; /* Custom PPD size name */
_pwg_size_t custom_size; /* Custom size record */
char *source_option; /* PPD option for media source */
int num_sources; /* Number of media sources */
_pwg_map_t *sources; /* Media sources */
int num_types; /* Number of media types */
_pwg_map_t *types; /* Media types */
int num_presets[_PWG_OUTPUT_MODE_MAX][_PWG_PRINT_QUALITY_MAX];
/* Number of output-mode/print-quality options */
cups_option_t *presets[_PWG_OUTPUT_MODE_MAX][_PWG_PRINT_QUALITY_MAX];
/* output-mode/print-quality options */
char *sides_option, /* PPD option for sides */
*sides_1sided, /* Choice for one-sided */
*sides_2sided_long, /* Choice for two-sided-long-edge */
*sides_2sided_short; /* Choice for two-sided-short-edge */
} _pwg_t;
+38 -20
Ver Arquivo
@@ -1,9 +1,9 @@
/*
* "$Id$"
*
* Raster file definitions for the Common UNIX Printing System (CUPS).
* Raster file definitions for CUPS.
*
* Copyright 2007-2008 by Apple Inc.
* Copyright 2007-2010 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products.
*
* This file is part of the CUPS Imaging library.
@@ -84,26 +84,28 @@ typedef enum cups_bool_e /**** Boolean type ****/
typedef enum cups_cspace_e /**** cupsColorSpace attribute values ****/
{
CUPS_CSPACE_W = 0, /* Luminance */
CUPS_CSPACE_RGB = 1, /* Red, green, blue */
CUPS_CSPACE_RGBA = 2, /* Red, green, blue, alpha */
CUPS_CSPACE_K = 3, /* Black */
CUPS_CSPACE_CMY = 4, /* Cyan, magenta, yellow */
CUPS_CSPACE_YMC = 5, /* Yellow, magenta, cyan */
CUPS_CSPACE_CMYK = 6, /* Cyan, magenta, yellow, black */
CUPS_CSPACE_YMCK = 7, /* Yellow, magenta, cyan, black */
CUPS_CSPACE_KCMY = 8, /* Black, cyan, magenta, yellow */
CUPS_CSPACE_KCMYcm = 9, /* Black, cyan, magenta, yellow, *
* light-cyan, light-magenta */
CUPS_CSPACE_GMCK = 10, /* Gold, magenta, yellow, black */
CUPS_CSPACE_GMCS = 11, /* Gold, magenta, yellow, silver */
CUPS_CSPACE_WHITE = 12, /* White ink (as black) */
CUPS_CSPACE_GOLD = 13, /* Gold foil */
CUPS_CSPACE_SILVER = 14, /* Silver foil */
CUPS_CSPACE_W = 0, /* Luminance (DeviceGray, gamma 2.2 by default) */
CUPS_CSPACE_RGB = 1, /* Red, green, blue (DeviceRGB, sRGB by default) */
CUPS_CSPACE_RGBA = 2, /* Red, green, blue, alpha (DeviceRGB, sRGB by default) */
CUPS_CSPACE_K = 3, /* Black (DeviceK) */
CUPS_CSPACE_CMY = 4, /* Cyan, magenta, yellow (DeviceCMY) */
CUPS_CSPACE_YMC = 5, /* Yellow, magenta, cyan @deprecated@ */
CUPS_CSPACE_CMYK = 6, /* Cyan, magenta, yellow, black (DeviceCMYK) */
CUPS_CSPACE_YMCK = 7, /* Yellow, magenta, cyan, black @deprecated@ */
CUPS_CSPACE_KCMY = 8, /* Black, cyan, magenta, yellow @deprecated@ */
CUPS_CSPACE_KCMYcm = 9, /* Black, cyan, magenta, yellow, light-cyan, light-magenta @deprecated@ */
CUPS_CSPACE_GMCK = 10, /* Gold, magenta, yellow, black @deprecated@ */
CUPS_CSPACE_GMCS = 11, /* Gold, magenta, yellow, silver @deprecated@ */
CUPS_CSPACE_WHITE = 12, /* White ink (as black) @deprecated@ */
CUPS_CSPACE_GOLD = 13, /* Gold foil @deprecated@ */
CUPS_CSPACE_SILVER = 14, /* Silver foil @deprecated@ */
CUPS_CSPACE_CIEXYZ = 15, /* CIE XYZ @since CUPS 1.1.19/Mac OS X 10.3@ */
CUPS_CSPACE_CIELab = 16, /* CIE Lab @since CUPS 1.1.19/Mac OS X 10.3@ */
CUPS_CSPACE_RGBW = 17, /* Red, green, blue, white @since CUPS 1.2/Mac OS X 10.5@ */
CUPS_CSPACE_RGBW = 17, /* Red, green, blue, white (DeviceRGB, sRGB by default) @since CUPS 1.2/Mac OS X 10.5@ */
CUPS_CSPACE_SW = 18, /* Luminance (gamma 2.2) @since CUPS 1.4.5@ */
CUPS_CSPACE_SRGB = 19, /* Red, green, blue (sRGB) @since CUPS 1.4.5@ */
CUPS_CSPACE_ADOBERGB = 20, /* Red, green, blue (Adobe RGB) @since CUPS 1.4.5@ */
CUPS_CSPACE_ICC1 = 32, /* ICC-based, 1 color @since CUPS 1.1.19/Mac OS X 10.3@ */
CUPS_CSPACE_ICC2 = 33, /* ICC-based, 2 colors @since CUPS 1.1.19/Mac OS X 10.3@ */
@@ -119,7 +121,23 @@ typedef enum cups_cspace_e /**** cupsColorSpace attribute values ****/
CUPS_CSPACE_ICCC = 43, /* ICC-based, 12 colors @since CUPS 1.1.19/Mac OS X 10.3@ */
CUPS_CSPACE_ICCD = 44, /* ICC-based, 13 colors @since CUPS 1.1.19/Mac OS X 10.3@ */
CUPS_CSPACE_ICCE = 45, /* ICC-based, 14 colors @since CUPS 1.1.19/Mac OS X 10.3@ */
CUPS_CSPACE_ICCF = 46 /* ICC-based, 15 colors @since CUPS 1.1.19/Mac OS X 10.3@ */
CUPS_CSPACE_ICCF = 46, /* ICC-based, 15 colors @since CUPS 1.1.19/Mac OS X 10.3@ */
CUPS_CSPACE_DEVICE1 = 48, /* DeviceN, 1 color @since CUPS 1.4.5@ */
CUPS_CSPACE_DEVICE2 = 49, /* DeviceN, 2 colors @since CUPS 1.4.5@ */
CUPS_CSPACE_DEVICE3 = 50, /* DeviceN, 3 colors @since CUPS 1.4.5@ */
CUPS_CSPACE_DEVICE4 = 51, /* DeviceN, 4 colors @since CUPS 1.4.5@ */
CUPS_CSPACE_DEVICE5 = 52, /* DeviceN, 5 colors @since CUPS 1.4.5@ */
CUPS_CSPACE_DEVICE6 = 53, /* DeviceN, 6 colors @since CUPS 1.4.5@ */
CUPS_CSPACE_DEVICE7 = 54, /* DeviceN, 7 colors @since CUPS 1.4.5@ */
CUPS_CSPACE_DEVICE8 = 55, /* DeviceN, 8 colors @since CUPS 1.4.5@ */
CUPS_CSPACE_DEVICE9 = 56, /* DeviceN, 9 colors @since CUPS 1.4.5@ */
CUPS_CSPACE_DEVICEA = 57, /* DeviceN, 10 colors @since CUPS 1.4.5@ */
CUPS_CSPACE_DEVICEB = 58, /* DeviceN, 11 colors @since CUPS 1.4.5@ */
CUPS_CSPACE_DEVICEC = 59, /* DeviceN, 12 colors @since CUPS 1.4.5@ */
CUPS_CSPACE_DEVICED = 60, /* DeviceN, 13 colors @since CUPS 1.4.5@ */
CUPS_CSPACE_DEVICEE = 61, /* DeviceN, 14 colors @since CUPS 1.4.5@ */
CUPS_CSPACE_DEVICEF = 62 /* DeviceN, 15 colors @since CUPS 1.4.5@ */
} cups_cspace_t;
typedef enum cups_cut_e /**** CutMedia attribute values ****/
+48 -20
Ver Arquivo
@@ -1,9 +1,9 @@
/*
* "$Id$"
*
* IPP utilities for the Common UNIX Printing System (CUPS).
* IPP utilities for CUPS.
*
* Copyright 2007-2010 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -153,7 +153,11 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
if (!http)
if ((http = _cupsConnect()) == NULL)
{
ippDelete(request);
return (NULL);
}
/*
* See if we have a file to send...
@@ -245,7 +249,9 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
{
if (httpCheck(http))
{
if ((status = httpUpdate(http)) != HTTP_CONTINUE)
_httpUpdate(http, &status);
if (status >= HTTP_MULTIPLE_CHOICES)
break;
}
@@ -385,9 +391,11 @@ cupsGetResponse(http_t *http, /* I - Connection to server or @code CUPS_HTTP
DEBUG_printf(("2cupsGetResponse: Update loop, http->status=%d...",
http->status));
status = http->status;
while (status == HTTP_CONTINUE)
do
{
status = httpUpdate(http);
}
while (http->state == HTTP_POST_RECV);
DEBUG_printf(("2cupsGetResponse: status=%d", status));
@@ -614,10 +622,25 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
*/
httpClearFields(http);
httpSetLength(http, length);
httpSetField(http, HTTP_FIELD_CONTENT_TYPE, "application/ipp");
httpSetField(http, HTTP_FIELD_AUTHORIZATION, http->authstring);
httpSetExpect(http, expect);
httpSetField(http, HTTP_FIELD_CONTENT_TYPE, "application/ipp");
httpSetLength(http, length);
#ifdef HAVE_GSSAPI
if (http->authstring && !strncmp(http->authstring, "Negotiate", 9))
{
/*
* Do not use cached Kerberos credentials since they will look like a
* "replay" attack...
*/
httpSetField(http, HTTP_FIELD_WWW_AUTHENTICATE, "Negotiate");
cupsDoAuthentication(http, "POST", resource);
httpSetField(http, HTTP_FIELD_WWW_AUTHENTICATE, "");
}
#endif /* HAVE_GSSAPI */
httpSetField(http, HTTP_FIELD_AUTHORIZATION, http->authstring);
DEBUG_printf(("2cupsSendRequest: authstring=\"%s\"", http->authstring));
@@ -655,7 +678,8 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
{
got_status = 1;
if ((status = httpUpdate(http)) != HTTP_CONTINUE)
_httpUpdate(http, &status);
if (status >= HTTP_MULTIPLE_CHOICES)
break;
}
@@ -663,15 +687,18 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
* Wait up to 1 second to get the 100-continue response as needed...
*/
if (!got_status && expect == HTTP_CONTINUE)
if (!got_status)
{
DEBUG_puts("2cupsSendRequest: Waiting for 100-continue...");
if (expect == HTTP_CONTINUE)
{
DEBUG_puts("2cupsSendRequest: Waiting for 100-continue...");
if (httpWait(http, 1000))
status = httpUpdate(http);
if (httpWait(http, 1000))
_httpUpdate(http, &status);
}
else if (httpCheck(http))
_httpUpdate(http, &status);
}
else if (httpCheck(http))
status = httpUpdate(http);
DEBUG_printf(("2cupsSendRequest: status=%d", status));
@@ -679,7 +706,7 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
* Process the current HTTP status...
*/
if (status >= HTTP_BAD_REQUEST)
if (status >= HTTP_MULTIPLE_CHOICES)
httpFlush(http);
switch (status)
@@ -806,9 +833,10 @@ cupsWriteRequestData(
if (_httpWait(http, 0, 1))
{
http_status_t status; /* Status from httpUpdate */
http_status_t status; /* Status from _httpUpdate */
if ((status = httpUpdate(http)) >= HTTP_BAD_REQUEST)
_httpUpdate(http, &status);
if (status >= HTTP_MULTIPLE_CHOICES)
httpFlush(http);
return (status);
@@ -884,10 +912,10 @@ _cupsSetHTTPError(http_status_t status) /* I - HTTP status code */
break;
case HTTP_UNAUTHORIZED :
case HTTP_AUTHORIZATION_CANCELED :
_cupsSetError(IPP_NOT_AUTHORIZED, httpStatus(status), 0);
_cupsSetError(IPP_NOT_AUTHENTICATED, httpStatus(status), 0);
break;
case HTTP_AUTHORIZATION_CANCELED :
case HTTP_FORBIDDEN :
_cupsSetError(IPP_FORBIDDEN, httpStatus(status), 0);
break;
+2 -1
Ver Arquivo
@@ -41,6 +41,7 @@
#include <limits.h>
#include "array.h"
#include "debug.h"
#define _CUPS_STRING_C_
#include "string.h"
#ifdef HAVE_PTHREAD_H
# include <pthread.h>
@@ -428,7 +429,7 @@ _cupsStrScand(const char *buf, /* I - Pointer to number */
* Skip leading whitespace...
*/
while (isspace(*buf & 255))
while (_cups_isspace(*buf))
buf ++;
/*
+56
Ver Arquivo
@@ -79,6 +79,62 @@ typedef struct _cups_sp_item_s /**** String Pool Item ****/
} _cups_sp_item_t;
/*
* Replacements for the ctype macros that are not affected by locale, since we
* really only care about testing for ASCII characters when parsing files, etc.
* These are used only within libcups since the rest of CUPS doesn't call
* setlocale() for LC_CTYPE and doesn't have to worry about third-party
* libraries doing so (and if they do that is a bug: NetSNMP, I'm looking at
* you!)
*
* The _CUPS_INLINE definition controls whether we get an inline function body,
* and external function body, or an external definition.
*/
# if defined(__GNUC__) || __STDC_VERSION__ >= 199901L
# define _CUPS_INLINE static inline
# elif defined(_MSC_VER)
# define _CUPS_INLINE static __inline
# elif defined(_CUPS_STRING_C_)
# define _CUPS_INLINE
# endif /* __GNUC__ || __STDC_VERSION__ */
# ifdef _CUPS_INLINE
_CUPS_INLINE int /* O - 1 on match, 0 otherwise */
_cups_isalnum(int ch) /* I - Character to test */
{
return ((ch >= '0' && ch <= '9') ||
(ch >= 'A' && ch <= 'Z') ||
(ch >= 'a' && ch <= 'z'));
}
_CUPS_INLINE int /* O - 1 on match, 0 otherwise */
_cups_isalpha(int ch) /* I - Character to test */
{
return ((ch >= 'A' && ch <= 'Z') ||
(ch >= 'a' && ch <= 'z'));
}
_CUPS_INLINE int /* O - 1 on match, 0 otherwise */
_cups_isspace(int ch) /* I - Character to test */
{
return (ch == ' ' || ch == '\f' || ch == '\n' || ch == '\r' || ch == '\t' ||
ch == '\v');
}
_CUPS_INLINE int /* O - 1 on match, 0 otherwise */
_cups_isupper(int ch) /* I - Character to test */
{
return (ch >= 'A' && ch <= 'Z');
}
# else
extern int _cups_isalnum(int ch);
extern int _cups_isalpha(int ch);
extern int _cups_isspace(int ch);
extern int _cups_isupper(int ch);
# endif /* _CUPS_INLINE */
/*
* Prototypes...
*/
+8
Ver Arquivo
@@ -65,6 +65,9 @@
*PageSize Letter/US Letter: "PageSize=Letter"
*fr.PageSize Letter/French US Letter: ""
*fr_CA.PageSize Letter/French Canadian US Letter: ""
*PageSize Letter.Banner/US Letter Banner: "PageSize=Letter.Banner"
*fr.PageSize Letter.Banner/French US Letter Banner: ""
*fr_CA.PageSize Letter.Banner/French Canadian US Letter Banner: ""
*PageSize Letter.Fullbleed/US Letter Borderless: "PageSize=Letter.Fullbleed"
*fr.PageSize Letter.Fullbleed/French US Letter Borderless: ""
*fr_CA.PageSize Letter.Fullbleed/French Canadian US Letter Borderless: ""
@@ -81,6 +84,7 @@
*OrderDependency: 10 AnySetup *PageRegion
*DefaultPageRegion: Letter
*PageRegion Letter/US Letter: "PageRegion=Letter"
*PageRegion Letter.Banner/US Letter Banner: "PageRegion=Letter.Fullbleed"
*PageRegion Letter.Fullbleed/US Letter Borderless: "PageRegion=Letter.Fullbleed"
*PageRegion A4/A4: "PageRegion=A4"
*PageRegion Env10/#10 Envelope: "PageRegion=Env10"
@@ -88,24 +92,28 @@
*fr.Translation PageRegion/French Page Region: ""
*fr.PageRegion Letter/French US Letter: ""
*fr.PageRegion Letter.Banner/French US Letter Banner: ""
*fr.PageRegion Letter.Fullbleed/French US Letter Borderless: ""
*fr.PageRegion A4/French A4: ""
*fr.PageRegion Env10/French #10 Envelope: ""
*fr_CA.Translation PageRegion/French Canadian Page Region: ""
*fr_CA.PageRegion Letter/French Canadian US Letter: ""
*fr_CA.PageRegion Letter.Banner/French Canadian US Letter Banner: ""
*fr_CA.PageRegion Letter.Fullbleed/French Canadian US Letter Borderless: ""
*fr_CA.PageRegion A4/French Canadian A4: ""
*fr_CA.PageRegion Env10/French Canadian #10 Envelope: ""
*DefaultImageableArea: Letter
*ImageableArea Letter: "18 36 594 756"
*ImageableArea Letter.Banner: "18 0 594 792"
*ImageableArea Letter.Fullbleed: "0 0 612 792"
*ImageableArea A4: "18 36 577 806"
*ImageableArea Env10: "18 36 279 648"
*DefaultPaperDimension: Letter
*PaperDimension Letter: "612 792"
*PaperDimension Letter.Banner: "612 792"
*PaperDimension Letter.Fullbleed: "612 792"
*PaperDimension A4: "595 842"
*PaperDimension Env10: "297 684"
+33 -5
Ver Arquivo
@@ -1,9 +1,9 @@
/*
* "$Id$"
*
* PPD test program for the Common UNIX Printing System (CUPS).
* PPD test program for CUPS.
*
* Copyright 2007-2010 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -445,6 +445,21 @@ main(int argc, /* I - Number of command-line arguments */
else
puts("PASS");
fputs("cupsMarkOptions(media=oe_letter-fullbleed_8.5x11in): ", stdout);
num_options = cupsAddOption("media", "oe_letter-fullbleed_8.5x11in", 0,
&options);
cupsMarkOptions(ppd, num_options, options);
cupsFreeOptions(num_options, options);
size = ppdPageSize(ppd, NULL);
if (!size || strcmp(size->name, "Letter.Fullbleed"))
{
printf("FAIL (%s)\n", size ? size->name : "unknown");
status ++;
}
else
puts("PASS");
fputs("cupsMarkOptions(media=A4): ", stdout);
num_options = cupsAddOption("media", "A4", 0, &options);
cupsMarkOptions(ppd, num_options, options);
@@ -714,7 +729,7 @@ main(int argc, /* I - Number of command-line arguments */
}
else
puts("FAIL (No conflicts!)");
fputs("ppdInstallableConflict(): ", stdout);
if (ppdInstallableConflict(ppd, "Duplex", "DuplexNoTumble") &&
!ppdInstallableConflict(ppd, "Duplex", "None"))
@@ -830,10 +845,23 @@ main(int argc, /* I - Number of command-line arguments */
if (!strncmp(argv[1], "-d", 2))
{
filename = cupsGetPPD(argv[1] + 2);
const char *printer; /* Printer name */
if (argv[1][2])
printer = argv[1] + 2;
else if (argv[2])
printer = argv[2];
else
{
puts("Usage: ./testppd -d printer");
return (1);
}
filename = cupsGetPPD(printer);
if (!filename)
{
printf("%s: %s\n", argv[1], cupsLastErrorString());
printf("%s: %s\n", printer, cupsLastErrorString());
return (1);
}
}
+231 -10
Ver Arquivo
@@ -15,22 +15,26 @@
*
* Contents:
*
* main() - Main entry.
* test_pwg() - Test the PWG mapping functions.
* main() - Main entry.
* test_pagesize() - Test the PWG mapping functions.
* test_pwg() - Test the PWG mapping functions.
*/
/*
* Include necessary headers...
*/
#include "pwg-private.h"
#include "ppd-private.h"
#include "file-private.h"
/*
* Local functions...
*/
static int test_pwg(_pwg_t *pwg);
static int test_pwg(_pwg_t *pwg, ppd_file_t *ppd);
static int test_pagesize(_pwg_t *pwg, ppd_file_t *ppd,
const char *ppdsize);
/*
@@ -50,13 +54,13 @@ main(int argc, /* I - Number of command-line args */
status = 0;
if (argc != 2)
if (argc < 2 || argc > 3)
{
puts("Usage: ./testpwg filename.ppd");
puts("Usage: ./testpwg filename.ppd [jobfile]");
return (1);
}
else
ppdfile = argv[1];
ppdfile = argv[1];
printf("ppdOpenFile(%s): ", ppdfile);
if ((ppd = ppdOpenFile(ppdfile)) == NULL)
@@ -83,7 +87,59 @@ main(int argc, /* I - Number of command-line args */
else
{
puts("PASS");
status += test_pwg(pwg);
status += test_pwg(pwg, ppd);
if (argc == 3)
{
/*
* Test PageSize mapping code.
*/
int fd; /* Job file descriptor */
const char *pagesize; /* PageSize value */
ipp_t *job; /* Job attributes */
ipp_attribute_t *media; /* Media attribute */
if ((fd = open(argv[2], O_RDONLY)) >= 0)
{
job = ippNew();
ippReadFile(fd, job);
close(fd);
if ((media = ippFindAttribute(job, "media", IPP_TAG_ZERO)) != NULL &&
media->value_tag != IPP_TAG_NAME &&
media->value_tag != IPP_TAG_KEYWORD)
media = NULL;
if (media)
printf("_pwgGetPageSize(media=%s): ", media->values[0].string.text);
else
fputs("_pwgGetPageSize(media-col): ", stdout);
fflush(stdout);
if ((pagesize = _pwgGetPageSize(pwg, job, NULL, NULL)) == NULL)
{
puts("FAIL (Not Found)");
status = 1;
}
else if (media && strcasecmp(pagesize, media->values[0].string.text))
{
printf("FAIL (Got \"%s\", Expected \"%s\")\n", pagesize,
media->values[0].string.text);
status = 1;
}
else
printf("PASS (%s)\n", pagesize);
ippDelete(job);
}
else
{
perror(argv[2]);
status = 1;
}
}
/*
* _pwgDestroy should never fail...
@@ -94,6 +150,101 @@ main(int argc, /* I - Number of command-line args */
puts("PASS");
}
fputs("_pwgMediaForPWG(\"iso_a4_210x297mm\"): ", stdout);
if ((pwgmedia = _pwgMediaForPWG("iso_a4_210x297mm")) == NULL)
{
puts("FAIL (not found)");
status ++;
}
else if (strcmp(pwgmedia->pwg, "iso_a4_210x297mm"))
{
printf("FAIL (%s)\n", pwgmedia->pwg);
status ++;
}
else if (pwgmedia->width != 21000 || pwgmedia->length != 29700)
{
printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length);
status ++;
}
else
puts("PASS");
fputs("_pwgMediaForLegacy(\"na-letter\"): ", stdout);
if ((pwgmedia = _pwgMediaForLegacy("na-letter")) == NULL)
{
puts("FAIL (not found)");
status ++;
}
else if (strcmp(pwgmedia->pwg, "na_letter_8.5x11in"))
{
printf("FAIL (%s)\n", pwgmedia->pwg);
status ++;
}
else if (pwgmedia->width != 21590 || pwgmedia->length != 27940)
{
printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length);
status ++;
}
else
puts("PASS");
fputs("_pwgMediaForPPD(\"4x6\"): ", stdout);
if ((pwgmedia = _pwgMediaForPPD("4x6")) == NULL)
{
puts("FAIL (not found)");
status ++;
}
else if (strcmp(pwgmedia->pwg, "na_index-4x6_4x6in"))
{
printf("FAIL (%s)\n", pwgmedia->pwg);
status ++;
}
else if (pwgmedia->width != 10160 || pwgmedia->length != 15240)
{
printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length);
status ++;
}
else
puts("PASS");
fputs("_pwgMediaForPPD(\"10x15cm\"): ", stdout);
if ((pwgmedia = _pwgMediaForPPD("10x15cm")) == NULL)
{
puts("FAIL (not found)");
status ++;
}
else if (strcmp(pwgmedia->pwg, "om_100x150mm_100x150mm"))
{
printf("FAIL (%s)\n", pwgmedia->pwg);
status ++;
}
else if (pwgmedia->width != 10000 || pwgmedia->length != 15000)
{
printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length);
status ++;
}
else
puts("PASS");
fputs("_pwgMediaForPPD(\"Custom.10x15cm\"): ", stdout);
if ((pwgmedia = _pwgMediaForPPD("Custom.10x15cm")) == NULL)
{
puts("FAIL (not found)");
status ++;
}
else if (strcmp(pwgmedia->pwg, "custom_10x15cm_100x150mm"))
{
printf("FAIL (%s)\n", pwgmedia->pwg);
status ++;
}
else if (pwgmedia->width != 10000 || pwgmedia->length != 15000)
{
printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length);
status ++;
}
else
puts("PASS");
fputs("_pwgMediaForSize(29700, 42000): ", stdout);
if ((pwgmedia = _pwgMediaForSize(29700, 42000)) == NULL)
{
@@ -112,12 +263,71 @@ main(int argc, /* I - Number of command-line args */
}
/*
* 'test_pagesize()' - Test the PWG mapping functions.
*/
static int /* O - 1 on failure, 0 on success */
test_pagesize(_pwg_t *pwg, /* I - PWG mapping data */
ppd_file_t *ppd, /* I - PPD file */
const char *ppdsize) /* I - PPD page size */
{
int status = 0; /* Return status */
ipp_t *job; /* Job attributes */
const char *pagesize; /* PageSize value */
if (ppdPageSize(ppd, ppdsize))
{
printf("_pwgGetPageSize(keyword=%s): ", ppdsize);
fflush(stdout);
if ((pagesize = _pwgGetPageSize(pwg, NULL, ppdsize, NULL)) == NULL)
{
puts("FAIL (Not Found)");
status = 1;
}
else if (strcasecmp(pagesize, ppdsize))
{
printf("FAIL (Got \"%s\", Expected \"%s\")\n", pagesize, ppdsize);
status = 1;
}
else
puts("PASS");
job = ippNew();
ippAddString(job, IPP_TAG_JOB, IPP_TAG_KEYWORD, "media", NULL, ppdsize);
printf("_pwgGetPageSize(media=%s): ", ppdsize);
fflush(stdout);
if ((pagesize = _pwgGetPageSize(pwg, job, NULL, NULL)) == NULL)
{
puts("FAIL (Not Found)");
status = 1;
}
else if (strcasecmp(pagesize, ppdsize))
{
printf("FAIL (Got \"%s\", Expected \"%s\")\n", pagesize, ppdsize);
status = 1;
}
else
puts("PASS");
ippDelete(job);
}
return (status);
}
/*
* 'test_pwg()' - Test the PWG mapping functions.
*/
static int /* O - 1 on failure, 0 on success */
test_pwg(_pwg_t *pwg) /* I - PWG mapping data */
test_pwg(_pwg_t *pwg, /* I - PWG mapping data */
ppd_file_t *ppd) /* I - PPD file */
{
int i, /* Looping var */
status = 0; /* Return status */
@@ -263,8 +473,19 @@ test_pwg(_pwg_t *pwg) /* I - PWG mapping data */
if (!status)
puts("PASS");
_pwgDestroy(pwg2);
}
/*
* Test PageSize mapping code...
*/
status += test_pagesize(pwg, ppd, "Letter");
status += test_pagesize(pwg, ppd, "na-letter");
status += test_pagesize(pwg, ppd, "A4");
status += test_pagesize(pwg, ppd, "iso-a4");
return (status);
}
+8 -7
Ver Arquivo
@@ -1,9 +1,9 @@
/*
* "$Id$"
*
* Transcoding support for the Common UNIX Printing System (CUPS).
* Transcoding support for CUPS.
*
* Copyright 2007-2009 by Apple Inc.
* Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -279,7 +279,7 @@ cupsCharsetToUTF8(
* Handle identity conversions...
*/
if (encoding == CUPS_UTF8 ||
if (encoding == CUPS_UTF8 || encoding <= CUPS_US_ASCII ||
encoding < 0 || encoding >= CUPS_ENCODING_VBCS_END)
{
strlcpy((char *)dest, src, maxout);
@@ -385,13 +385,14 @@ cupsUTF8ToCharset(
* Handle UTF-8 to ISO-8859-1 directly...
*/
if (encoding == CUPS_ISO8859_1)
if (encoding == CUPS_ISO8859_1 || encoding == CUPS_US_ASCII)
{
int ch; /* Character from string */
int ch, /* Character from string */
maxch; /* Maximum character for charset */
char *destptr, /* Pointer into ISO-8859-1 buffer */
*destend; /* End of ISO-8859-1 buffer */
maxch = encoding == CUPS_ISO8859_1 ? 256 : 128;
destptr = dest;
destend = dest + maxout - 1;
@@ -403,7 +404,7 @@ cupsUTF8ToCharset(
{
ch = ((ch & 0x1f) << 6) | (*src++ & 0x3f);
if (ch < 256)
if (ch < maxch)
*destptr++ = ch;
else
*destptr++ = '?';
+5 -3
Ver Arquivo
@@ -1,9 +1,9 @@
#
# "$Id$"
#
# Documentation makefile for the Common UNIX Printing System (CUPS).
# Documentation makefile for CUPS.
#
# Copyright 2007-2009 by Apple Inc.
# Copyright 2007-2011 by Apple Inc.
# Copyright 1997-2007 by Easy Software Products.
#
# These coded instructions, statements, and computer programs are the
@@ -28,6 +28,7 @@ WEBIMAGES = \
images/color-wheel.png \
images/cups.png \
images/cups-icon.png \
images/generic.png \
images/left.gif \
images/right.gif \
images/sel.gif \
@@ -39,6 +40,8 @@ HELPIMAGES = \
images/cups-postscript-chain.png \
images/cups-raster-chain.png \
images/raster.png \
images/raster-organization.png \
images/sample-image.png \
images/smiley.jpg
HELPFILES = \
help/accounting.html \
@@ -69,7 +72,6 @@ HELPFILES = \
help/man-cupsenable.html \
help/man-cupstestdsc.html \
help/man-cupstestppd.html \
help/man-drv.html \
help/man-filter.html \
help/man-lp.html \
help/man-lpadmin.html \
+2
Ver Arquivo
@@ -114,7 +114,9 @@ TD.unsel {
TD.sel A, TD.sel A:hover, TD.unsel A:link:hover, TD.unsel A:visited:hover,
TD.unsel A:active, TD.unsel A, TD.unsel A:visited {
color: #666666;
display: block;
font-weight: normal;
padding: 8px;
text-decoration: none;
}
+1 -1
Ver Arquivo
@@ -101,7 +101,7 @@ HEIGHT="128" ALT="CUPS"></A></TD>
<TR><TD>&nbsp;</TD></TR>
<TR><TD CLASS="trailer">CUPS und das CUPS Logo sind
eingetragene Warenzeichen der <A HREF="http://www.apple.com">Apple Inc.</A>
CUPS ist urheberrechtlich gesch&uuml;tzt 2007-2010 von Apple Inc, alle Rechte vorbehalten.</TD></TR>
CUPS ist urheberrechtlich gesch&uuml;tzt 2007-2011 von Apple Inc, alle Rechte vorbehalten.</TD></TR>
</TABLE>
</BODY>
</HTML>
+1 -1
Ver Arquivo
@@ -101,7 +101,7 @@ HEIGHT="128" ALT="CUPS"></A></TD>
<TR><TD>&nbsp;</TD></TR>
<TR><TD CLASS="trailer">CUPS y el logo de CUPS son
marcas registradas de <A HREF="http://www.apple.com">Apple Inc.</A> Los derechos
de copia de CUPS 2007-2010 son de Apple Inc. Todos los derechos reservados.</TD></TR>
de copia de CUPS 2007-2011 son de Apple Inc. Todos los derechos reservados.</TD></TR>
</TABLE>
</BODY>
</HTML>
+2 -2
Ver Arquivo
@@ -99,8 +99,8 @@ HEIGHT="128" ALT="CUPS"></A></TD>
</TD></TR>
<TR><TD>&nbsp;</TD></TR>
<TR><TD CLASS="trailer">CUPS eta CUPSen logotipoa <A HREF="http://www.apple.com">Apple Inc.</A>en marka erregistratuaj dira.
CUPSen copyright-a 2007-2010 Apple Inc. Eskubide guztiak gordeta.</TD></TR>
<TR><TD CLASS="trailer">CUPS eta CUPSen logotipoa <A HREF="http://www.apple.com">Apple Inc.</A> en marka erregistratuak dira.
CUPSen copyright-a 2007-2011 Apple Inc. Eskubide guztiak gordeta.</TD></TR>
</TABLE>
</BODY>
</HTML>
+3 -3
Ver Arquivo
@@ -18,15 +18,15 @@ support, there are several third-party solutions that can be found on
<P>CUPS supports page and size-based quotas for each printer.
The quotas are tracked individually for each user, but a single set of
limits applies to all users for a partiuclar printer. For example, you
limits applies to all users for a particular printer. For example, you
can limit every user to 5 pages per day on an expensive printer, but
you cannot limit every user except Johnny.</P>
<P>The <CODE>job-k-limit</CODE>, <CODE>job-page-limit</CODE>, and <CODE>job-quota-peiod</CODE>
<P>The <CODE>job-k-limit</CODE>, <CODE>job-page-limit</CODE>, and <CODE>job-quota-period</CODE>
options determine whether and how quotas are enforced for a printer.
The <CODE>job-quota-period</CODE> option determines the time interval for
quota tracking. The interval is expressed in seconds, so a day is
86,400, a week is 604,800 and a month is 2,592,000 seconds. The
86,400, a week is 604,800, and a month is 2,592,000 seconds. The
<CODE>job-k-limit</CODE> option specifies the job size limit in killobytes. The
<CODE>job-page-limit</CODE> option specifies the number of pages limit.</P>
+5 -5
Ver Arquivo
@@ -4,7 +4,7 @@
<head>
<title>Array API</title>
<meta name="keywords" content="Programming">
<meta name="creator" content="Mini-XML v2.6">
<meta name="creator" content="Mini-XML v2.7">
<style type="text/css"><!--
BODY {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
@@ -338,7 +338,7 @@ div.contents ul.subcontents li {
<body>
<div class='body'>
<!--
"$Id: api-array.html 8653 2009-05-16 23:53:28Z mike $"
"$Id: api-array.html 9728 2011-04-28 21:21:24Z mike $"
Array API header for the Common UNIX Printing System (CUPS).
@@ -407,11 +407,11 @@ div.contents ul.subcontents li {
<li><a href="#cups_array_t" title="CUPS array type">cups_array_t</a></li>
</ul></li>
<!--
"$Id: api-array.html 8653 2009-05-16 23:53:28Z mike $"
"$Id: api-array.html 9728 2011-04-28 21:21:24Z mike $"
Array API introduction for the Common UNIX Printing System (CUPS).
Array API introduction for CUPS.
Copyright 2007-2008 by Apple Inc.
Copyright 2007-2011 by Apple Inc.
Copyright 1997-2006 by Easy Software Products, all rights reserved.
These coded instructions, statements, and computer programs are the
+3 -3
Ver Arquivo
@@ -4,7 +4,7 @@
<head>
<title>CGI API</title>
<meta name="keywords" content="Programming">
<meta name="creator" content="Mini-XML v2.6">
<meta name="creator" content="Mini-XML v2.7">
<style type="text/css"><!--
BODY {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
@@ -338,7 +338,7 @@ div.contents ul.subcontents li {
<body>
<div class='body'>
<!--
"$Id: api-cgi.html 9121 2010-04-23 18:57:00Z mike $"
"$Id: api-cgi.html 9728 2011-04-28 21:21:24Z mike $"
CGI API header for CUPS.
@@ -434,7 +434,7 @@ by the template file.">cgiGetAttributes</a></li>
<li><a href="#help_word_s" title="Help word structure...">help_word_s</a></li>
</ul></li>
<!--
"$Id: api-cgi.html 9121 2010-04-23 18:57:00Z mike $"
"$Id: api-cgi.html 9728 2011-04-28 21:21:24Z mike $"
CGI API introduction for CUPS.
+6 -6
Ver Arquivo
@@ -4,7 +4,7 @@
<head>
<title>CUPS API</title>
<meta name="keywords" content="Programming">
<meta name="creator" content="Mini-XML v2.6">
<meta name="creator" content="Mini-XML v2.7">
<style type="text/css"><!--
BODY {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
@@ -338,7 +338,7 @@ div.contents ul.subcontents li {
<body>
<div class='body'>
<!--
"$Id: api-cups.html 9121 2010-04-23 18:57:00Z mike $"
"$Id: api-cups.html 9728 2011-04-28 21:21:24Z mike $"
CUPS API header for the Common UNIX Printing System (CUPS).
@@ -475,11 +475,11 @@ specified server.">cupsPrintFiles2</a></li>
<li><a href="#cups_ptype_e" title="Printer type/capability bit constants">cups_ptype_e</a></li>
</ul></li>
<!--
"$Id: api-cups.html 9121 2010-04-23 18:57:00Z mike $"
"$Id: api-cups.html 9728 2011-04-28 21:21:24Z mike $"
CUPS API introduction for the Common UNIX Printing System (CUPS).
API introduction for CUPS.
Copyright 2007-2010 by Apple Inc.
Copyright 2007-2011 by Apple Inc.
Copyright 1997-2006 by Easy Software Products, all rights reserved.
These coded instructions, statements, and computer programs are the
@@ -526,7 +526,7 @@ specific destination for printing:</p>
int num_dests = <a href='#cupsGetDests'>cupsGetDests</a>(&amp;dests);
<a href='#cups_dest_t'>cups_dest_t</a> *dest = <a href='#cupsGetDest'>cupsGetDest</a>("name", NULL, num_dests, dests);
/* do something wiith dest */
/* do something with dest */
<a href='#cupsFreeDests'>cupsFreeDests</a>(num_dests, dests);
</pre>
+3 -3
Ver Arquivo
@@ -4,7 +4,7 @@
<head>
<title>Printer Driver API</title>
<meta name="keywords" content="Programming">
<meta name="creator" content="Mini-XML v2.6">
<meta name="creator" content="Mini-XML v2.7">
<style type="text/css"><!--
BODY {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
@@ -338,7 +338,7 @@ div.contents ul.subcontents li {
<body>
<div class='body'>
<!--
"$Id: api-driver.html 8653 2009-05-16 23:53:28Z mike $"
"$Id: api-driver.html 9728 2011-04-28 21:21:24Z mike $"
Driver API header for CUPS.
@@ -427,7 +427,7 @@ media, and resolution.">cupsFindAttr</a></li>
<li><a href="#cups_srgb_lut[256]" title="sRGB gamma lookup table">cups_srgb_lut[256]</a></li>
</ul></li>
<!--
"$Id: api-driver.html 8653 2009-05-16 23:53:28Z mike $"
"$Id: api-driver.html 9728 2011-04-28 21:21:24Z mike $"
Driver API introduction for CUPS.
+5 -5
Ver Arquivo
@@ -4,7 +4,7 @@
<head>
<title>File and Directory APIs</title>
<meta name="keywords" content="Programming">
<meta name="creator" content="Mini-XML v2.6">
<meta name="creator" content="Mini-XML v2.7">
<style type="text/css"><!--
BODY {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
@@ -338,7 +338,7 @@ div.contents ul.subcontents li {
<body>
<div class='body'>
<!--
"$Id: api-filedir.html 8653 2009-05-16 23:53:28Z mike $"
"$Id: api-filedir.html 9728 2011-04-28 21:21:24Z mike $"
File and Directory API header for the Common UNIX Printing System (CUPS).
@@ -421,11 +421,11 @@ file.">cupsFileRewind</a></li>
<li><a href="#cups_dentry_s" title="Directory entry type">cups_dentry_s</a></li>
</ul></li>
<!--
"$Id: api-filedir.html 8653 2009-05-16 23:53:28Z mike $"
"$Id: api-filedir.html 9728 2011-04-28 21:21:24Z mike $"
File and directory API introduction for the Common UNIX Printing System (CUPS).
File and directory API introduction for CUPS.
Copyright 2007-2008 by Apple Inc.
Copyright 2007-2011 by Apple Inc.
Copyright 1997-2005 by Easy Software Products, all rights reserved.
These coded instructions, statements, and computer programs are the
+5 -5
Ver Arquivo
@@ -4,7 +4,7 @@
<head>
<title>Filter and Backend Programming</title>
<meta name="keywords" content="Programming">
<meta name="creator" content="Mini-XML v2.6">
<meta name="creator" content="Mini-XML v2.7">
<style type="text/css"><!--
BODY {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
@@ -338,7 +338,7 @@ div.contents ul.subcontents li {
<body>
<div class='body'>
<!--
"$Id: api-filter.html 9121 2010-04-23 18:57:00Z mike $"
"$Id: api-filter.html 9728 2011-04-28 21:21:24Z mike $"
Filter and backend programming header for the Common UNIX Printing System
(CUPS).
@@ -375,7 +375,7 @@ div.contents ul.subcontents li {
Programming: <a href='api-raster.html' target='_top'>Raster API</a><br>
Programming: <a href='postscript-driver.html' target='_top'>Developing PostScript Printer Drivers</a><br>
Programming: <a href='raster-driver.html' target='_top'>Developing Raster Printer Drivers</a><br>
Specifications: <a href='spec-design' target='_top'>CUPS Design Description</a></td>
Specifications: <a href='spec-design.html' target='_top'>CUPS Design Description</a></td>
</tr>
</tbody>
</table></div>
@@ -421,7 +421,7 @@ div.contents ul.subcontents li {
<li><a href="#cups_sc_status_e" title="Response status codes">cups_sc_status_e</a></li>
</ul></li>
<!--
"$Id: api-filter.html 9121 2010-04-23 18:57:00Z mike $"
"$Id: api-filter.html 9728 2011-04-28 21:21:24Z mike $"
Filter and backend programming introduction for the Common UNIX Printing
System (CUPS).
@@ -480,7 +480,7 @@ more detail.</p>
<h3><a name="SECURITY">Security Considerations</a></h3>
<p>It is always important to use security programming practices. Filters and
most backends are run as a non-priviledged user, so the major security
most backends are run as a non-privileged user, so the major security
consideration is resource utilization - filters should not depend on unlimited
amounts of CPU, memory, or disk space, and should protect against conditions
that could lead to excess usage of any resource like infinite loops and
+6 -6
Ver Arquivo
@@ -4,7 +4,7 @@
<head>
<title>HTTP and IPP APIs</title>
<meta name="keywords" content="Programming">
<meta name="creator" content="Mini-XML v2.6">
<meta name="creator" content="Mini-XML v2.7">
<style type="text/css"><!--
BODY {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
@@ -338,7 +338,7 @@ div.contents ul.subcontents li {
<body>
<div class='body'>
<!--
"$Id: api-httpipp.html 9121 2010-04-23 18:57:00Z mike $"
"$Id: api-httpipp.html 9728 2011-04-28 21:21:24Z mike $"
HTTP and IPP API header for the Common UNIX Printing System (CUPS).
@@ -588,11 +588,11 @@ are server-oriented...">http_state_e</a></li>
<li><a href="#ipp_tag_e" title="Format tags for attributes">ipp_tag_e</a></li>
</ul></li>
<!--
"$Id: api-httpipp.html 9121 2010-04-23 18:57:00Z mike $"
"$Id: api-httpipp.html 9728 2011-04-28 21:21:24Z mike $"
HTTP and IPP API introduction for the Common UNIX Printing System (CUPS).
HTTP and IPP API introduction for CUPS.
Copyright 2007-2008 by Apple Inc.
Copyright 2007-2011 by Apple Inc.
Copyright 1997-2006 by Easy Software Products, all rights reserved.
These coded instructions, statements, and computer programs are the
@@ -3647,7 +3647,7 @@ are server-oriented...</p>
<dt>HTTP_ACCEPTED </dt>
<dd class="description">DELETE command was successful</dd>
<dt>HTTP_AUTHORIZATION_CANCELED </dt>
<dd class="description">User cancelled authorization</dd>
<dd class="description">User canceled authorization</dd>
<dt>HTTP_BAD_GATEWAY </dt>
<dd class="description">Bad gateway</dd>
<dt>HTTP_BAD_REQUEST </dt>
+3 -3
Ver Arquivo
@@ -4,7 +4,7 @@
<head>
<title>MIME API</title>
<meta name="keywords" content="Programming">
<meta name="creator" content="Mini-XML v2.6">
<meta name="creator" content="Mini-XML v2.7">
<style type="text/css"><!--
BODY {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
@@ -338,7 +338,7 @@ div.contents ul.subcontents li {
<body>
<div class='body'>
<!--
"$Id: api-mime.html 8653 2009-05-16 23:53:28Z mike $"
"$Id: api-mime.html 9728 2011-04-28 21:21:24Z mike $"
MIME API header for CUPS.
@@ -404,7 +404,7 @@ div.contents ul.subcontents li {
<li><a href="#mime_type_t" title="MIME Type Data">mime_type_t</a></li>
</ul></li>
<!--
"$Id: api-mime.html 8653 2009-05-16 23:53:28Z mike $"
"$Id: api-mime.html 9728 2011-04-28 21:21:24Z mike $"
MIME API introduction for CUPS.
+5 -6
Ver Arquivo
@@ -4,7 +4,7 @@
<head>
<title>Introduction to CUPS Programming</title>
<meta name="keywords" content="Programming">
<meta name="creator" content="Mini-XML v2.6">
<meta name="creator" content="Mini-XML v2.7">
<style type="text/css"><!--
BODY {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
@@ -338,7 +338,7 @@ div.contents ul.subcontents li {
<body>
<div class='body'>
<!--
"$Id: api-overview.html 8653 2009-05-16 23:53:28Z mike $"
"$Id: api-overview.html 9728 2011-04-28 21:21:24Z mike $"
Introduction to CUPS programming header for the Common UNIX Printing System
(CUPS).
@@ -401,12 +401,11 @@ div.contents ul.subcontents li {
</ul></li>
<li><a href="#WHERETOGO">Where to Go Next</a></li>
<!--
"$Id: api-overview.html 8653 2009-05-16 23:53:28Z mike $"
"$Id: api-overview.html 9728 2011-04-28 21:21:24Z mike $"
Introduction to CUPS programming content for the Common UNIX Printing System
(CUPS).
Introduction to CUPS programming content for CUPS.
Copyright 2008 by Apple Inc.
Copyright 2008-2011 by Apple Inc.
These coded instructions, statements, and computer programs are the
property of Apple Inc. and are protected by Federal copyright
+5 -5
Ver Arquivo
@@ -4,7 +4,7 @@
<head>
<title>PPD API</title>
<meta name="keywords" content="Programming">
<meta name="creator" content="Mini-XML v2.6">
<meta name="creator" content="Mini-XML v2.7">
<style type="text/css"><!--
BODY {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
@@ -338,7 +338,7 @@ div.contents ul.subcontents li {
<body>
<div class='body'>
<!--
"$Id: api-ppd.html 9121 2010-04-23 18:57:00Z mike $"
"$Id: api-ppd.html 9728 2011-04-28 21:21:24Z mike $"
PPD API header for the Common UNIX Printing System (CUPS).
@@ -482,11 +482,11 @@ conflicts.">ppdMarkOption</a></li>
<li><a href="#ppd_ui_e" title="UI Types">ppd_ui_e</a></li>
</ul></li>
<!--
"$Id: api-ppd.html 9121 2010-04-23 18:57:00Z mike $"
"$Id: api-ppd.html 9728 2011-04-28 21:21:24Z mike $"
PPD API introduction for the Common UNIX Printing System (CUPS).
PPD API introduction for CUPS.
Copyright 2007-2008 by Apple Inc.
Copyright 2007-2011 by Apple Inc.
Copyright 1997-2006 by Easy Software Products, all rights reserved.
These coded instructions, statements, and computer programs are the
+3 -3
Ver Arquivo
@@ -4,7 +4,7 @@
<head>
<title>PPD Compiler API</title>
<meta name="keywords" content="Programming">
<meta name="creator" content="Mini-XML v2.6">
<meta name="creator" content="Mini-XML v2.7">
<style type="text/css"><!--
BODY {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
@@ -338,7 +338,7 @@ div.contents ul.subcontents li {
<body>
<div class='body'>
<!--
"$Id: api-ppdc.html 8704 2009-06-10 15:51:21Z mike $"
"$Id: api-ppdc.html 9728 2011-04-28 21:21:24Z mike $"
PPD Compiler API header for CUPS.
@@ -411,7 +411,7 @@ div.contents ul.subcontents li {
<li><a href="#ppdcOptType" title="// Option type">ppdcOptType</a></li>
</ul></li>
<!--
"$Id: api-ppdc.html 8704 2009-06-10 15:51:21Z mike $"
"$Id: api-ppdc.html 9728 2011-04-28 21:21:24Z mike $"
PPD Compiler API introduction for CUPS.
+73 -36
Ver Arquivo
@@ -4,7 +4,7 @@
<head>
<title>Raster API</title>
<meta name="keywords" content="Programming">
<meta name="creator" content="Mini-XML v2.6">
<meta name="creator" content="Mini-XML v2.7">
<style type="text/css"><!--
BODY {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
@@ -338,7 +338,7 @@ div.contents ul.subcontents li {
<body>
<div class='body'>
<!--
"$Id: api-raster.html 8653 2009-05-16 23:53:28Z mike $"
"$Id: api-raster.html 9728 2011-04-28 21:21:24Z mike $"
Raster API header for the Common UNIX Printing System (CUPS).
@@ -386,7 +386,7 @@ div.contents ul.subcontents li {
<li><a href="#FUNCTIONS">Functions</a><ul class="code">
<li><a href="#cupsRasterClose" title="Close a raster stream.">cupsRasterClose</a></li>
<li><a href="#cupsRasterInterpretPPD" title="Interpret PPD commands to create a page header.">cupsRasterInterpretPPD</a></li>
<li><a href="#cupsRasterOpen" title="Open a raster stream.">cupsRasterOpen</a></li>
<li><a href="#cupsRasterOpen" title="Open a raster stream using a file descriptor.">cupsRasterOpen</a></li>
<li><a href="#cupsRasterReadHeader" title="Read a raster page header and store it in a
version 1 page header structure.">cupsRasterReadHeader</a></li>
<li><a href="#cupsRasterReadHeader2" title="Read a raster page header and store it in a
@@ -429,11 +429,11 @@ page header structure.">cupsRasterWriteHeader2</a></li>
<li><a href="#cups_orient_e" title="Orientation attribute values">cups_orient_e</a></li>
</ul></li>
<!--
"$Id: api-raster.html 8653 2009-05-16 23:53:28Z mike $"
"$Id: api-raster.html 9728 2011-04-28 21:21:24Z mike $"
Raster API introduction for the Common UNIX Printing System (CUPS).
Raster API introduction for CUPS.
Copyright 2007-2008 by Apple Inc.
Copyright 2007-2011 by Apple Inc.
Copyright 1997-2006 by Easy Software Products, all rights reserved.
These coded instructions, statements, and computer programs are the
@@ -655,7 +655,7 @@ are supported.
</p>
<h3 class="function"><a name="cupsRasterOpen">cupsRasterOpen</a></h3>
<p class="description">Open a raster stream.</p>
<p class="description">Open a raster stream using a file descriptor.</p>
<p class="code">
<a href="#cups_raster_t">cups_raster_t</a> *cupsRasterOpen (<br>
&nbsp;&nbsp;&nbsp;&nbsp;int fd,<br>
@@ -666,7 +666,9 @@ are supported.
<dt>fd</dt>
<dd class="description">File descriptor</dd>
<dt>mode</dt>
<dd class="description">Mode - <code>CUPS_RASTER_READ</code>, <code>CUPS_RASTER_WRITE</code>, or <code>CUPS_RASTER_WRITE_COMPRESSED</code></dd>
<dd class="description">Mode - <code>CUPS_RASTER_READ</code>,
<code>CUPS_RASTER_WRITE</code>, or
<code>CUPS_RASTER_WRITE_COMPRESSED</code></dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">New stream</p>
@@ -677,8 +679,8 @@ image processor (RIP) filters that generate raster data, &quot;fd&quot; will be
(stdout).<br>
<br>
When writing raster data, the <code>CUPS_RASTER_WRITE</code> or
<code>CUPS_RASTER_WRITE_COMPRESS</code> mode can be used - compressed output
is generally 25-50% smaller but adds a 100-300% execution time overhead.</p>
<code>CUPS_RASTER_WRITE_COMPRESS</code> mode can be used - compressed output is
generally 25-50% smaller but adds a 100-300% execution time overhead.</p>
<h3 class="function"><span class="info">&nbsp;DEPRECATED&nbsp;</span><a name="cupsRasterReadHeader">cupsRasterReadHeader</a></h3>
<p class="description">Read a raster page header and store it in a
version 1 page header structure.</p>
@@ -1186,20 +1188,52 @@ factor not applied) </dd>
<p class="description">cupsColorSpace attribute values</p>
<h4 class="constants">Constants</h4>
<dl>
<dt>CUPS_CSPACE_ADOBERGB <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">Red, green, blue (Adobe RGB) </dd>
<dt>CUPS_CSPACE_CIELab <span class="info">&nbsp;CUPS 1.1.19/Mac OS X 10.3&nbsp;</span></dt>
<dd class="description">CIE Lab </dd>
<dt>CUPS_CSPACE_CIEXYZ <span class="info">&nbsp;CUPS 1.1.19/Mac OS X 10.3&nbsp;</span></dt>
<dd class="description">CIE XYZ </dd>
<dt>CUPS_CSPACE_CMY </dt>
<dd class="description">Cyan, magenta, yellow</dd>
<dd class="description">Cyan, magenta, yellow (DeviceCMY)</dd>
<dt>CUPS_CSPACE_CMYK </dt>
<dd class="description">Cyan, magenta, yellow, black</dd>
<dt>CUPS_CSPACE_GMCK </dt>
<dd class="description">Gold, magenta, yellow, black</dd>
<dt>CUPS_CSPACE_GMCS </dt>
<dd class="description">Gold, magenta, yellow, silver</dd>
<dt>CUPS_CSPACE_GOLD </dt>
<dd class="description">Gold foil</dd>
<dd class="description">Cyan, magenta, yellow, black (DeviceCMYK)</dd>
<dt>CUPS_CSPACE_DEVICE1 <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">DeviceN, 1 color </dd>
<dt>CUPS_CSPACE_DEVICE2 <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">DeviceN, 2 colors </dd>
<dt>CUPS_CSPACE_DEVICE3 <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">DeviceN, 3 colors </dd>
<dt>CUPS_CSPACE_DEVICE4 <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">DeviceN, 4 colors </dd>
<dt>CUPS_CSPACE_DEVICE5 <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">DeviceN, 5 colors </dd>
<dt>CUPS_CSPACE_DEVICE6 <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">DeviceN, 6 colors </dd>
<dt>CUPS_CSPACE_DEVICE7 <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">DeviceN, 7 colors </dd>
<dt>CUPS_CSPACE_DEVICE8 <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">DeviceN, 8 colors </dd>
<dt>CUPS_CSPACE_DEVICE9 <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">DeviceN, 9 colors </dd>
<dt>CUPS_CSPACE_DEVICEA <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">DeviceN, 10 colors </dd>
<dt>CUPS_CSPACE_DEVICEB <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">DeviceN, 11 colors </dd>
<dt>CUPS_CSPACE_DEVICEC <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">DeviceN, 12 colors </dd>
<dt>CUPS_CSPACE_DEVICED <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">DeviceN, 13 colors </dd>
<dt>CUPS_CSPACE_DEVICEE <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">DeviceN, 14 colors </dd>
<dt>CUPS_CSPACE_DEVICEF <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">DeviceN, 15 colors </dd>
<dt>CUPS_CSPACE_GMCK <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
<dd class="description">Gold, magenta, yellow, black </dd>
<dt>CUPS_CSPACE_GMCS <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
<dd class="description">Gold, magenta, yellow, silver </dd>
<dt>CUPS_CSPACE_GOLD <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
<dd class="description">Gold foil </dd>
<dt>CUPS_CSPACE_ICC1 <span class="info">&nbsp;CUPS 1.1.19/Mac OS X 10.3&nbsp;</span></dt>
<dd class="description">ICC-based, 1 color </dd>
<dt>CUPS_CSPACE_ICC2 <span class="info">&nbsp;CUPS 1.1.19/Mac OS X 10.3&nbsp;</span></dt>
@@ -1231,28 +1265,31 @@ factor not applied) </dd>
<dt>CUPS_CSPACE_ICCF <span class="info">&nbsp;CUPS 1.1.19/Mac OS X 10.3&nbsp;</span></dt>
<dd class="description">ICC-based, 15 colors </dd>
<dt>CUPS_CSPACE_K </dt>
<dd class="description">Black</dd>
<dt>CUPS_CSPACE_KCMY </dt>
<dd class="description">Black, cyan, magenta, yellow</dd>
<dt>CUPS_CSPACE_KCMYcm </dt>
<dd class="description">Black, cyan, magenta, yellow, *
light-cyan, light-magenta</dd>
<dd class="description">Black (DeviceK)</dd>
<dt>CUPS_CSPACE_KCMY <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
<dd class="description">Black, cyan, magenta, yellow </dd>
<dt>CUPS_CSPACE_KCMYcm <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
<dd class="description">Black, cyan, magenta, yellow, light-cyan, light-magenta </dd>
<dt>CUPS_CSPACE_RGB </dt>
<dd class="description">Red, green, blue</dd>
<dd class="description">Red, green, blue (DeviceRGB, sRGB by default)</dd>
<dt>CUPS_CSPACE_RGBA </dt>
<dd class="description">Red, green, blue, alpha</dd>
<dd class="description">Red, green, blue, alpha (DeviceRGB, sRGB by default)</dd>
<dt>CUPS_CSPACE_RGBW <span class="info">&nbsp;CUPS 1.2/Mac OS X 10.5&nbsp;</span></dt>
<dd class="description">Red, green, blue, white </dd>
<dt>CUPS_CSPACE_SILVER </dt>
<dd class="description">Silver foil</dd>
<dd class="description">Red, green, blue, white (DeviceRGB, sRGB by default) </dd>
<dt>CUPS_CSPACE_SILVER <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
<dd class="description">Silver foil </dd>
<dt>CUPS_CSPACE_SRGB <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">Red, green, blue (sRGB) </dd>
<dt>CUPS_CSPACE_SW <span class="info">&nbsp;CUPS 1.4.5&nbsp;</span></dt>
<dd class="description">Luminance (gamma 2.2) </dd>
<dt>CUPS_CSPACE_W </dt>
<dd class="description">Luminance</dd>
<dt>CUPS_CSPACE_WHITE </dt>
<dd class="description">White ink (as black)</dd>
<dt>CUPS_CSPACE_YMC </dt>
<dd class="description">Yellow, magenta, cyan</dd>
<dt>CUPS_CSPACE_YMCK </dt>
<dd class="description">Yellow, magenta, cyan, black</dd>
<dd class="description">Luminance (DeviceGray, gamma 2.2 by default)</dd>
<dt>CUPS_CSPACE_WHITE <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
<dd class="description">White ink (as black) </dd>
<dt>CUPS_CSPACE_YMC <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
<dd class="description">Yellow, magenta, cyan </dd>
<dt>CUPS_CSPACE_YMCK <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
<dd class="description">Yellow, magenta, cyan, black </dd>
</dl>
<h3 class="enumeration"><a name="cups_cut_e">cups_cut_e</a></h3>
<p class="description">CutMedia attribute values</p>
+2 -2
Ver Arquivo
@@ -53,7 +53,7 @@ systems and network.</P>
Kerberos on your system and setup a system as a KDC. Because this
configuration is highly system and site-specific, please consult
the following on-line resources provided by the creators of Kerberos
at the Massachussetts Institute of Technology (MIT):</P>
at the Massachusetts Institute of Technology (MIT):</P>
<UL>
@@ -113,7 +113,7 @@ converted to just "user" for purposes of user and group checks.</P>
<P>In order to support printing to a shared printer, CUPS has to ask the KDC
for a copy of your credentials (this is called delegation) that can be sent to
the remote server for authenticatation. Delegation only works when the system
the remote server for authentication. Delegation only works when the system
has a stable hostname which maps to the current address of the system, which
is why you need a static IP address or DHCP that updates the DNS entry for your
system.</P>
+2 -2
Ver Arquivo
@@ -93,9 +93,9 @@ page on the device.</P>
<PRE>
socket://<i>ip-address-or-hostname</i>
socket://<i>ip-address-or-hostname</i>?waiteof=false
socket://<i>ip-address-or-hostname</i>/?waiteof=false
socket://<i>ip-address-or-hostname</i>:<i>port-number</i>
socket://<i>ip-address-or-hostname</i>:<i>port-number</i>?waiteof=false
socket://<i>ip-address-or-hostname</i>:<i>port-number</i>/?waiteof=false
</PRE>
<P>The "waiteof" option controls whether the <tt>socket</tt> backend waits for the printer to complete the printing of the job. The default is to wait.</P>
+3 -3
Ver Arquivo
@@ -324,7 +324,7 @@ lpr -o sides=one-sided filename
<H3><A NAME="JOBSHEETS">Selecting the Banner Page(s)</A></H3>
<P>The <CODE>-o jobsheets=start,end</CODE> option sets the banner
<P>The <CODE>-o job-sheets=start,end</CODE> option sets the banner
page(s) to use for a job:</P>
<PRE CLASS="command">
@@ -416,7 +416,7 @@ assign a priority to your job from 1 (lowest) to 100 (highest),
which influences where the job appears in the print queue. Higher
priority jobs are printed before lower priority jobs, however
submitting a new job with a high priority will not interrupt an
</P>
already printing job.</P>
<H3><A NAME="OUTPUTORDER">Specifying the Output Order</A></H3>
@@ -548,7 +548,7 @@ for printers that print face up.
<H3><A NAME="MIRROR">Printing Mirrored Pages</A></H3>
<P>The <CODE>-o mirror</CODE> option flips each page along the
vertical access to produce a mirrored image:</P>
vertical axis to produce a mirrored image:</P>
<PRE CLASS="command">
lp -o mirror filename
+1 -1
Ver Arquivo
@@ -4,7 +4,7 @@
<head>
<title>Developing PostScript Printer Drivers</title>
<meta name="keywords" content="Programming">
<meta name="creator" content="Mini-XML v2.6">
<meta name="creator" content="Mini-XML v2.7">
<style type="text/css"><!--
BODY {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
+1 -1
Ver Arquivo
@@ -4,7 +4,7 @@
<head>
<title>Introduction to the PPD Compiler</title>
<meta name="keywords" content="Programming">
<meta name="creator" content="Mini-XML v2.6">
<meta name="creator" content="Mini-XML v2.7">
<style type="text/css"><!--
BODY {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
+1 -1
Ver Arquivo
@@ -4,7 +4,7 @@
<head>
<title>Developing Raster Printer Drivers</title>
<meta name="keywords" content="Programming">
<meta name="creator" content="Mini-XML v2.6">
<meta name="creator" content="Mini-XML v2.7">
<style type="text/css"><!--
BODY {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
+40 -40
Ver Arquivo
@@ -114,9 +114,9 @@ to the access log file. The following levels are defined:</P>
...
Allow from All
Allow from None
Allow from *.domain.com
Allow from .domain.com
Allow from host.domain.com
Allow from *.example.com
Allow from .example.com
Allow from host.example.com
Allow from nnn.*
Allow from nnn.nnn.*
Allow from nnn.nnn.nnn.*
@@ -134,7 +134,7 @@ to the access log file. The following levels are defined:</P>
<P>The <CODE>Allow</CODE> directive specifies a hostname, IP
address, or network that is allowed access to the server.
<CODE>Allow</CODE> directives are cummulative, so multiple
<CODE>Allow</CODE> directives are cumulative, so multiple
<CODE>Allow</CODE> directives can be used to allow access for
multiple hosts or networks.</P>
@@ -342,7 +342,7 @@ default setting is <CODE>No</CODE>.</P>
<PRE CLASS="command">
BrowseAddress 255.255.255.255:631
BrowseAddress 192.0.2.255:631
BrowseAddress host.domain.com:631
BrowseAddress host.example.com:631
BrowseAddress @LOCAL
BrowseAddress @IF(name)
</PRE>
@@ -380,7 +380,7 @@ BrowseAllow from none
BrowseAllow from 192.0.2
BrowseAllow from 192.0.2.0/24
BrowseAllow from 192.0.2.0/255.255.255.0
BrowseAllow from *.domain.com
BrowseAllow from *.example.com
BrowseAllow from @LOCAL
BrowseAllow from @IF(name)
</PRE>
@@ -418,7 +418,7 @@ BrowseDeny from none
BrowseDeny from 192.0.2
BrowseDeny from 192.0.2.0/24
BrowseDeny from 192.0.2.0/255.255.255.0
BrowseDeny from *.domain.com
BrowseDeny from *.example.com
BrowseDeny from @LOCAL
BrowseDeny from @IF(name)
</PRE>
@@ -616,7 +616,7 @@ allow/deny processing. The default order is
<PRE CLASS="command">
BrowsePoll 192.0.2.2:631
BrowsePoll host.domain.com:631
BrowsePoll host.example.com:631
</PRE>
<H3>Description</H3>
@@ -698,8 +698,8 @@ requests for several seconds while polling the network.</P>
BrowseRelay 193.0.2.1 192.0.2.255
BrowseRelay 193.0.2.0/255.255.255.0 192.0.2.255
BrowseRelay 193.0.2.0/24 192.0.2.255
BrowseRelay *.domain.com 192.0.2.255
BrowseRelay host.domain.com 192.0.2.255
BrowseRelay *.example.com 192.0.2.255
BrowseRelay host.example.com 192.0.2.255
</PRE>
<H3>Description</H3>
@@ -715,11 +715,12 @@ can also be used to relay printer information from polled servers
with the line:</P>
<PRE CLASS="command">
BrowseRelay 127.0.0.1 @LOCAL
BrowseRelay 127.0.0.1 192.0.2.255
</PRE>
<P>This effectively provides access to printers on a WAN for all
clients on the LAN(s).</P>
clients on the LAN. Use multiple <CODE>BrowseRelay</CODE> lines to
relay information to multiple subnets.</P>
<H2 CLASS="title"><A NAME="BrowseRemoteOptions">BrowseRemoteOptions</A></H2>
@@ -1009,6 +1010,7 @@ size.</P>
<PRE CLASS="command">
DefaultPolicy default
DefaultPolicy authenticated
DefaultPolicy foo
</PRE>
@@ -1016,7 +1018,9 @@ DefaultPolicy foo
<P>The <CODE>DefaultPolicy</CODE> directive specifies the default
policy to use for IPP operation. The default is
<CODE>default</CODE>.</P>
<CODE>default</CODE>. CUPS also includes a policy called
<CODE>authenticated</CODE> that requires a username and password for printing
and other job operations.</P>
<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/Mac OS X 10.5</SPAN><A NAME="DefaultShared">DefaultShared</A></H2>
@@ -1044,9 +1048,9 @@ printers are shared (published) by default. The default is
..
Deny from All
Deny from None
Deny from *.domain.com
Deny from .domain.com
Deny from host.domain.com
Deny from *.example.com
Deny from .example.com
Deny from host.example.com
Deny from nnn.*
Deny from nnn.nnn.*
Deny from nnn.nnn.nnn.*
@@ -1064,8 +1068,8 @@ printers are shared (published) by default. The default is
<P>The <CODE>Deny</CODE> directive specifies a hostname, IP
address, or network that is denied access to the server.
<CODE>Deny</CODE> directives are cummulative, so multiple
<CODE>Deny</CODE> directives can be used to allow access for
<CODE>Deny</CODE> directives are cumulative, so multiple
<CODE>Deny</CODE> directives can be used to deny access for
multiple hosts or networks.</P>
<P>Host and domain name matching require that you enable the <A
@@ -1733,11 +1737,11 @@ operations.</P>
</TR>
<TR>
<TD>Get-Printer-Attributes</TD>
<TD>Gets informaion about a printer or class</TD>
<TD>Gets information about a printer or class</TD>
</TR>
<TR>
<TD>Get-Subscription-Attributes</TD>
<TD>Gets informaion about a notification subscription</TD>
<TD>Gets information about a notification subscription</TD>
</TR>
<TR>
<TD>Get-Subscriptions</TD>
@@ -1773,7 +1777,7 @@ operations.</P>
</TR>
<TR>
<TD>Resume-Printer</TD>
<TD>Sets the printer-stae value for a printer to idle/processing</TD>
<TD>Sets the printer-state value for a printer to idle/processing</TD>
</TR>
<TR>
<TD>Send-Document</TD>
@@ -2330,8 +2334,8 @@ information to the system log instead of a plain file.</P>
<H3>Examples</H3>
<PRE CLASS="command">
PageLogFormat %p %j %u %T %P %C %{job-billing} %{job-originating-host-name} %{job-name} %{media} %{sides}
PageLogFormat PAGE %p %j %u %P %C %{job-billing} %{job-originating-host-name}
PageLogFormat %p %u %j %T %P %C %{job-billing} %{job-originating-host-name} %{job-name} %{media} %{sides}
PageLogFormat PAGE %p %u %j %P %C %{job-billing} %{job-originating-host-name}
</PRE>
<H3>Description</H3>
@@ -2364,7 +2368,7 @@ recognized:</P>
</UL>
<P>The default is "%p %j %u %T %P %C %{job-billing} %{job-originating-host-name} %{job-name} %{media} %{sides}".</P>
<P>The default is "%p %u %j %T %P %C %{job-billing} %{job-originating-host-name} %{job-name} %{media} %{sides}".</P>
<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/Mac OS X 10.5</SPAN><A NAME="PassEnv">PassEnv</A></H2>
@@ -2697,7 +2701,7 @@ is generated only once on startup or on a restart. The default is
<P>The <CODE>Satisfy</CODE> directive specifies whether all
conditions must be satisfied to allow access to the resource. If
set to <CODE>all</CODE>, then all authentication and access
control conditions must be satified to allow access.</P>
control conditions must be satisfied to allow access.</P>
<P>Setting <CODE>Satisfy</CODE> to <CODE>any</CODE> allows a user
to gain access if the authentication or access control
@@ -2734,18 +2738,14 @@ HREF="#ServerName"><CODE>ServerName</CODE></A>.</P>
<PRE CLASS="command">
ServerAlias althost
ServerAlias althost.foo.com
ServerAlias althost.bar.com
ServerAlias foo.example.com
ServerAlias bar.example.com
ServerAlias *
</PRE>
<H3>Description</H3>
<P>The <CODE>ServerAlias</CODE> directive specifies alternate names that the
server is known by. By default it contains a list of all aliases associated
with the <A HREF="#ServerName"><CODE>ServerName</CODE></A>. The special name
"*" can be used to allow any hostname when accessing CUPS via an external
network interfaces.</P>
<P>The <CODE>ServerAlias</CODE> directive specifies alternate names that the server is known by. By default it contains a list of all aliases associated with the <A HREF="#ServerName"><CODE>ServerName</CODE></A>. The special name "*" can be used to allow any hostname when accessing CUPS via an external network interfaces.</P>
<BLOCKQUOTE><B>Note</B>
@@ -2822,8 +2822,8 @@ encrypted connections.</P>
<H3>Examples</H3>
<PRE CLASS="command">
ServerName foo.domain.com
ServerName myserver.domain.com
ServerName foo.example.com
ServerName myserver.example.com
</PRE>
<H3>Description</H3>
@@ -2931,23 +2931,23 @@ SetEnv MY_ENV_VAR foo
variable that should be passed to child processes.</P>
<H2 CLASS="title"><A NAME="SSLOptions">SSLOptions</A></H2>
<H2 CLASS="title"><A NAME="SSLListen">SSLListen</A></H2>
<H3>Examples</H3>
<PRE CLASS="command">
SSLOptions 127.0.0.1:443
SSLOptions 192.0.2.1:443
SSLListen 127.0.0.1:443
SSLListen 192.0.2.1:443
</PRE>
<H3>Description</H3>
<P>The <CODE>SSLOptions</CODE> directive specifies a network
<P>The <CODE>SSLListen</CODE> directive specifies a network
address and port to listen for secure connections. Multiple
<CODE>SSLOptions</CODE> directives can be provided to listen on
<CODE>SSLListen</CODE> directives can be provided to listen on
multiple addresses.</P>
<P>The <CODE>SSLOptions</CODE> directive is similar to the <A
<P>The <CODE>SSLListen</CODE> directive is similar to the <A
HREF="#SSLPort"><CODE>SSLPort</CODE></A> directive but allows you
to restrict access to specific interfaces or networks.</P>
+5 -5
Ver Arquivo
@@ -21,8 +21,8 @@ line.</P>
<H3>Examples</H3>
<PRE CLASS="command">
Cc bigbrother@domain.com
Cc John Doe &lt;jd@domain.com>
Cc bigbrother@example.com
Cc John Doe &lt;jd@example.com>
</PRE>
<H3>Description</H3>
@@ -37,8 +37,8 @@ default is to not send a copy to anyone but the subscriber.</P>
<H3>Examples</H3>
<PRE CLASS="command">
From printserver@domain.com
From Your Happy Printer &lt;printserver@domain.com>
From printserver@example.com
From Your Happy Printer &lt;printserver@example.com>
</PRE>
<H3>Description</H3>
@@ -73,7 +73,7 @@ default is <TT>/usr/sbin/sendmail</TT>.</P>
<H3>Examples</H3>
<PRE CLASS="command">
SMTPServer mail.domain.com
SMTPServer mail.example.com
SMTPServer 192.168.2.1
</PRE>
+4 -5
Ver Arquivo
@@ -31,7 +31,7 @@ mechanisms.</p>
<dd>Evaluates to the specified integer; the number can be preceded by
a leading sign (+/-) followed by a decimal number (1234), octal number
(01234), or hexidecimal number (0x1234) using the same rules as C and
(01234), or hexadecimal number (0x1234) using the same rules as C and
C++.</dd>
<dt>(NAME NAME ... number number ...)</dt>
@@ -71,7 +71,7 @@ mechanisms.</p>
</dl>
<p>Printer driver information can be grouped and shared using
curley braces ({ ... }); PPD files are written when a close
curly braces ({ ... }); PPD files are written when a close
brace or end-of-file is seen and a <a href="#PCFileName">PCFileName</a>
directive has been defined.</p>
@@ -1798,8 +1798,7 @@ SimpleColorProfile 720dpi/Glossy 100 90 120 1.5 -5 5 10
<h3>Description</h3>
<p>The <code>SimpleColorProfile</code> directive creates a
matrix-based <a href="#ColorProfile"><code>ColorProfile</code></a>
using values chosen with the <code>cupsprofile(1)</code> utility.
matrix-based <a href="#ColorProfile"><code>ColorProfile</code></a>.
The resolution and mediatype arguments specify the
<code>Resolution</code> and <code>MediaType</code> choices which use the
profile; the hyphen (<code>-</code>) is used to specify that any
@@ -1860,7 +1859,7 @@ Throughput 10
<h3>Description</h3>
<p>The <code>Througput</code> directive sets the <code>Troughput</code>
<p>The <code>Throughput</code> directive sets the <code>Throughput</code>
attribute for the current printer driver. The pages-per-minute
argument is a positive integer representing the peak number of
pages per minute that the printer is capable of producing. Use a
+1 -1
Ver Arquivo
@@ -136,7 +136,7 @@ MaxRunTime 300
<H3>Description</H3>
<P>The <CODE>MaxRunTime</CODE> directive specifies the maxium
<P>The <CODE>MaxRunTime</CODE> directive specifies the maximum
number of seconds that the SNMP backend will spend looking for
printer devices on the network.</P>
+2 -2
Ver Arquivo
@@ -12,7 +12,7 @@
potential security risks - the CUPS server does not accept remote
connections, and only accepts shared printer information from the
local subnet. When you share printers and/or enable remote
adminstration, you expose your system to potential unauthorized
administration, you expose your system to potential unauthorized
access. This help page provides an analysis of possible CUPS
security concerns and describes how to better secure your
server.</P>
@@ -20,7 +20,7 @@ server.</P>
<H2 CLASS="title"><A NAME="AUTHENTICATION">Authentication Issues</A></H2>
<P>When you enable remote administration, the server will use
Basic authentication for adminstration tasks. The current CUPS
Basic authentication for administration tasks. The current CUPS
server supports Basic, Digest, Kerberos, and local certificate
authentication:</P>
+3 -3
Ver Arquivo
@@ -8,11 +8,11 @@
</head>
<body>
<!--
"$Id: spec-banner.html 8653 2009-05-16 23:53:28Z mike $"
"$Id: spec-banner.html 9728 2011-04-28 21:21:24Z mike $"
Banner file format specification for the Common UNIX Printing System (CUPS).
Banner file format specification for CUPS.
Copyright 2008-2009 by Apple Inc.
Copyright 2008-2011 by Apple Inc.
These coded instructions, statements, and computer programs are the
property of Apple Inc. and are protected by Federal copyright
+9 -3
Ver Arquivo
@@ -8,11 +8,11 @@
</head>
<body>
<!--
"$Id: spec-browsing.html 8653 2009-05-16 23:53:28Z mike $"
"$Id: spec-browsing.html 9728 2011-04-28 21:21:24Z mike $"
CUPS Browse Protocol specification for the Common UNIX Printing System (CUPS).
CUPS Browse Protocol specification for CUPS.
Copyright 2008 by Apple Inc.
Copyright 2008-2011 by Apple Inc.
Copyright 1997-2005 by Easy Software Products.
These coded instructions, statements, and computer programs are the
@@ -22,6 +22,12 @@
file is missing or damaged, see the license at "http://www.cups.org/".
-->
<BLOCKQUOTE><B>Note:</B>
<P>The CUPS Browse Protocol is deprecated and will no longer be used in a future release of CUPS.</P>
</BLOCKQUOTE>
<H1 CLASS="title">CUPS Browse Protocol</H1>
<h2><a name='INTRO'>Introduction</a></h2>
+2 -26
Ver Arquivo
@@ -211,7 +211,7 @@ Detailed list of changes.
<P>Primary development occurs on the <var>trunk</var> branch,
with changes merged back to release branches as needed. Table 2
shows the URLs developers use for the various CUPS subprojects
shows the URLs developers use for the various CUPS sub-projects
and branches:</P>
<DIV CLASS="table"><TABLE SUMMARY="CUPS Subversion URLs">
@@ -232,30 +232,6 @@ and branches:</P>
<TD><A HREF="http://svn.easysw.com/public/cups/tags/">https://svn.easysw.com/public/cups/tags/</A></TD>
<TD>CUPS release tags (read-only)</TD>
</TR>
<TR>
<TD><A HREF="http://svn.easysw.com/public/cupsddk/trunk/">https://svn.easysw.com/public/cupsddk/trunk/</A></TD>
<TD>Primary CUPS DDK development branch</TD>
</TR>
<TR>
<TD><A HREF="http://svn.easysw.com/public/cupsddk/branches/">https://svn.easysw.com/public/cupsddk/branches/</A></TD>
<TD>CUPS DDK maintenance branches (merge-only)</TD>
</TR>
<TR>
<TD><A HREF="http://svn.easysw.com/public/cupsddk/tags/">https://svn.easysw.com/public/cupsddk/tags/</A></TD>
<TD>CUPS DDK release tags (read-only)</TD>
</TR>
<TR>
<TD><A HREF="http://svn.easysw.com/public/espgs/trunk/">https://svn.easysw.com/public/espgs/trunk/</A></TD>
<TD>Primary ESP Ghostscript development branch</TD>
</TR>
<TR>
<TD><A HREF="http://svn.easysw.com/public/espgs/branches/">https://svn.easysw.com/public/espgs/branches/</A></TD>
<TD>ESP Ghostscript maintenance branches (merge-only)</TD>
</TR>
<TR>
<TD><A HREF="http://svn.easysw.com/public/espgs/tags/">https://svn.easysw.com/public/espgs/tags/</A></TD>
<TD>ESP Ghostscript release tags (read-only)</TD>
</TR>
<TR>
<TD><A HREF="http://svn.easysw.com/public/windows/trunk/">https://svn.easysw.com/public/windows/trunk/</A></TD>
<TD>Primary CUPS Windows Driver development branch</TD>
@@ -283,7 +259,7 @@ created for developer snapshots.</P>
<H3>Files and Directories</H3>
<P>File and directory names may not exceed 16 characters in
length to ensure compability with older UNIX filesystems. In
length to ensure compatibility with older UNIX filesystems. In
addition, to avoid problems with case-insensitive filesystems,
you may not use names which differ only by case, for example
"ReadMe" and "README" are not allowed in the same directory.</P>
+3 -4
Ver Arquivo
@@ -8,12 +8,11 @@
</head>
<body>
<!--
"$Id: spec-command.html 8653 2009-05-16 23:53:28Z mike $"
"$Id: spec-command.html 9728 2011-04-28 21:21:24Z mike $"
CUPS command file format specification for the Common UNIX Printing
System (CUPS).
CUPS command file format specification for CUPS.
Copyright 2007-2009 by Apple Inc.
Copyright 2007-2011 by Apple Inc.
Copyright 1997-2006 by Easy Software Products.
These coded instructions, statements, and computer programs are the

Alguns arquivos não foram exibidos porque demasiados arquivos foram alterados neste diff Mostrar Mais