summaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
authormsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>2008-04-09 22:42:49 +0000
committermsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>2008-04-09 22:42:49 +0000
commit839a51c83c61febe8d4c9ba56f6a05fce3d03710 (patch)
treef4a78140580870e06a5d95257d979990e12155ab /driver
parent50fe720154d2af59cdeeaecf05cc868530e16248 (diff)
downloadcups-839a51c83c61febe8d4c9ba56f6a05fce3d03710.tar.gz
Merge changes from CUPS 1.4svn-r7394.
git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@702 a1ca3aef-8c08-0410-bb20-df032aa958be
Diffstat (limited to 'driver')
-rw-r--r--driver/Makefile1
-rw-r--r--driver/pcl-common.h2
-rw-r--r--driver/rastertoescpx.c86
-rw-r--r--driver/rastertopclx.c85
4 files changed, 150 insertions, 24 deletions
diff --git a/driver/Makefile b/driver/Makefile
index 30715f805..ea4240acb 100644
--- a/driver/Makefile
+++ b/driver/Makefile
@@ -151,7 +151,6 @@ install-libs: $(INSTALLSTATIC) $(INSTALL32) $(INSTALL64)
$(LN) $(LIBCUPSDRIVER) $(LIBDIR)/`basename $(LIBCUPSDRIVER) .1`; \
fi
if test $(LIBCUPSDRIVER) = "libcupsdriver.1.dylib"; then \
- $(STRIP) -x $(LIBDIR)/$(LIBCUPSDRIVER); \
$(RM) $(LIBDIR)/libcupsdriver.dylib; \
$(LN) $(LIBCUPSDRIVER) $(LIBDIR)/libcupsdriver.dylib; \
fi
diff --git a/driver/pcl-common.h b/driver/pcl-common.h
index 78cf70168..17819ab01 100644
--- a/driver/pcl-common.h
+++ b/driver/pcl-common.h
@@ -17,7 +17,7 @@
* Include necessary headers...
*/
-#include "string.h"
+#include <cups/string.h>
#include "data/pcl.h"
diff --git a/driver/rastertoescpx.c b/driver/rastertoescpx.c
index f9cf22a61..362086e45 100644
--- a/driver/rastertoescpx.c
+++ b/driver/rastertoescpx.c
@@ -3,7 +3,7 @@
*
* Advanced EPSON ESC/P raster driver for CUPS.
*
- * Copyright 2007 by Apple Inc.
+ * Copyright 2007-2008 by Apple Inc.
* Copyright 1993-2005 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -18,6 +18,7 @@
* StartPage() - Start a page of graphics.
* EndPage() - Finish a page of graphics.
* Shutdown() - Shutdown a printer.
+ * CancelJob() - Cancel the current job...
* CompressData() - Compress a line of graphics.
* OutputBand() - Output a band of graphics.
* ProcessLine() - Read graphics from the page stream and output
@@ -32,6 +33,7 @@
#include "driver.h"
#include <cups/string.h>
#include "data/escp.h"
+#include <signal.h>
/*
@@ -82,6 +84,7 @@ int PrinterPlanes, /* # of color planes */
cups_lut_t *DitherLuts[7]; /* Lookup tables for dithering */
cups_dither_t *DitherStates[7]; /* Dither state tables */
int OutputFeed; /* Number of lines to skip */
+int Canceled; /* Is the job canceled? */
/*
@@ -89,18 +92,19 @@ int OutputFeed; /* Number of lines to skip */
*/
void Setup(ppd_file_t *);
-void StartPage(ppd_file_t *, cups_page_header_t *);
-void EndPage(ppd_file_t *, cups_page_header_t *);
+void StartPage(ppd_file_t *, cups_page_header2_t *);
+void EndPage(ppd_file_t *, cups_page_header2_t *);
void Shutdown(ppd_file_t *);
void AddBand(cups_weave_t *band);
+void CancelJob(int sig);
void CompressData(ppd_file_t *, const unsigned char *, const int,
int, int, const int, const int, const int,
const int);
-void OutputBand(ppd_file_t *, cups_page_header_t *,
+void OutputBand(ppd_file_t *, cups_page_header2_t *,
cups_weave_t *band);
void ProcessLine(ppd_file_t *, cups_raster_t *,
- cups_page_header_t *, const int y);
+ cups_page_header2_t *, const int y);
/*
@@ -126,7 +130,7 @@ Setup(ppd_file_t *ppd) /* I - PPD file */
void
StartPage(ppd_file_t *ppd, /* I - PPD file */
- cups_page_header_t *header) /* I - Page header */
+ cups_page_header2_t *header) /* I - Page header */
{
int i, y; /* Looping vars */
int subrow, /* Current subrow */
@@ -1043,7 +1047,7 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
void
EndPage(ppd_file_t *ppd, /* I - PPD file */
- cups_page_header_t *header) /* I - Page header */
+ cups_page_header2_t *header) /* I - Page header */
{
int i; /* Looping var */
cups_weave_t *band, /* Current band */
@@ -1265,6 +1269,19 @@ AddBand(cups_weave_t *band) /* I - Band to add */
/*
+ * 'CancelJob()' - Cancel the current job...
+ */
+
+void
+CancelJob(int sig) /* I - Signal */
+{
+ (void)sig;
+
+ Canceled = 1;
+}
+
+
+/*
* 'CompressData()' - Compress a line of graphics.
*/
@@ -1467,7 +1484,7 @@ CompressData(ppd_file_t *ppd, /* I - PPD file information */
void
OutputBand(ppd_file_t *ppd, /* I - PPD file */
- cups_page_header_t *header, /* I - Page header */
+ cups_page_header2_t *header, /* I - Page header */
cups_weave_t *band) /* I - Current band */
{
int xstep, /* Spacing between columns */
@@ -1529,7 +1546,7 @@ OutputBand(ppd_file_t *ppd, /* I - PPD file */
void
ProcessLine(ppd_file_t *ppd, /* I - PPD file */
cups_raster_t *ras, /* I - Raster stream */
- cups_page_header_t *header, /* I - Page header */
+ cups_page_header2_t *header, /* I - Page header */
const int y) /* I - Current scanline */
{
int plane, /* Current color plane */
@@ -1725,12 +1742,15 @@ main(int argc, /* I - Number of command-line arguments */
{
int fd; /* File descriptor */
cups_raster_t *ras; /* Raster stream for printing */
- cups_page_header_t header; /* Page header from file */
+ cups_page_header2_t header; /* Page header from file */
int page; /* Current page */
int y; /* Current line */
ppd_file_t *ppd; /* PPD file */
int num_options; /* Number of options */
cups_option_t *options; /* Options */
+#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
+ struct sigaction action; /* Actions for POSIX signals */
+#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
/*
@@ -1784,6 +1804,25 @@ main(int argc, /* I - Number of command-line arguments */
ras = cupsRasterOpen(fd, CUPS_RASTER_READ);
/*
+ * Register a signal handler to eject the current page if the
+ * job is cancelled.
+ */
+
+ Canceled = 0;
+
+#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
+ sigset(SIGTERM, CancelJob);
+#elif defined(HAVE_SIGACTION)
+ memset(&action, 0, sizeof(action));
+
+ sigemptyset(&action.sa_mask);
+ action.sa_handler = CancelJob;
+ sigaction(SIGTERM, &action, NULL);
+#else
+ signal(SIGTERM, CancelJob);
+#endif /* HAVE_SIGSET */
+
+ /*
* Initialize the print device...
*/
@@ -1795,8 +1834,15 @@ main(int argc, /* I - Number of command-line arguments */
page = 0;
- while (cupsRasterReadHeader(ras, &header))
+ while (cupsRasterReadHeader2(ras, &header))
{
+ /*
+ * Write a status message with the page number and number of copies.
+ */
+
+ if (Canceled)
+ break;
+
page ++;
fprintf(stderr, "PAGE: %d 1\n", page);
@@ -1806,16 +1852,34 @@ main(int argc, /* I - Number of command-line arguments */
for (y = 0; y < header.cupsHeight; y ++)
{
+ /*
+ * Let the user know how far we have progressed...
+ */
+
+ if (Canceled)
+ break;
+
if ((y & 127) == 0)
fprintf(stderr, "INFO: Printing page %d, %d%% complete...\n", page,
100 * y / header.cupsHeight);
+ /*
+ * Read and write a line of graphics or whitespace...
+ */
+
ProcessLine(ppd, ras, &header, y);
}
+ /*
+ * Eject the page...
+ */
+
fprintf(stderr, "INFO: Finished page %d...\n", page);
EndPage(ppd, &header);
+
+ if (Canceled)
+ break;
}
Shutdown(ppd);
diff --git a/driver/rastertopclx.c b/driver/rastertopclx.c
index 9c5097448..d021e2342 100644
--- a/driver/rastertopclx.c
+++ b/driver/rastertopclx.c
@@ -15,10 +15,10 @@
*
* Contents:
*
- * Setup() - Prepare a printer for graphics output.
* StartPage() - Start a page of graphics.
* EndPage() - Finish a page of graphics.
* Shutdown() - Shutdown a printer.
+ * CancelJob() - Cancel the current job...
* CompressData() - Compress a line of graphics.
* OutputLine() - Output the specified number of lines of graphics.
* ReadLine() - Read graphics from the page stream.
@@ -31,6 +31,7 @@
#include "driver.h"
#include "pcl-common.h"
+#include <signal.h>
/*
@@ -80,23 +81,25 @@ const int ColorOrders[7][7] = /* Order of color planes */
{ 5, 0, 1, 2, 3, 4, 0 }, /* KCMYcm */
{ 5, 0, 1, 2, 3, 4, 6 } /* KCMYcmk */
};
+int Canceled; /* Is the job canceled? */
/*
* Prototypes...
*/
-void StartPage(ppd_file_t *ppd, cups_page_header_t *header, int job_id,
+void StartPage(ppd_file_t *ppd, cups_page_header2_t *header, int job_id,
const char *user, const char *title, int num_options,
cups_option_t *options);
-void EndPage(ppd_file_t *ppd, cups_page_header_t *header);
+void EndPage(ppd_file_t *ppd, cups_page_header2_t *header);
void Shutdown(ppd_file_t *ppd, int job_id, const char *user,
const char *title, int num_options, cups_option_t *options);
+void CancelJob(int sig);
void CompressData(unsigned char *line, int length, int plane, int pend,
int type);
-void OutputLine(ppd_file_t *ppd, cups_page_header_t *header);
-int ReadLine(cups_raster_t *ras, cups_page_header_t *header);
+void OutputLine(ppd_file_t *ppd, cups_page_header2_t *header);
+int ReadLine(cups_raster_t *ras, cups_page_header2_t *header);
/*
@@ -105,7 +108,7 @@ int ReadLine(cups_raster_t *ras, cups_page_header_t *header);
void
StartPage(ppd_file_t *ppd, /* I - PPD file */
- cups_page_header_t *header, /* I - Page header */
+ cups_page_header2_t *header, /* I - Page header */
int job_id, /* I - Job ID */
const char *user, /* I - User printing job */
const char *title, /* I - Title of job */
@@ -807,7 +810,7 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */
void
EndPage(ppd_file_t *ppd, /* I - PPD file */
- cups_page_header_t *header) /* I - Page header */
+ cups_page_header2_t *header) /* I - Page header */
{
int plane; /* Current plane */
@@ -917,6 +920,19 @@ Shutdown(ppd_file_t *ppd, /* I - PPD file */
/*
+ * 'CancelJob()' - Cancel the current job...
+ */
+
+void
+CancelJob(int sig) /* I - Signal */
+{
+ (void)sig;
+
+ Canceled = 1;
+}
+
+
+/*
* 'CompressData()' - Compress a line of graphics.
*/
@@ -1518,7 +1534,7 @@ CompressData(unsigned char *line, /* I - Data to compress */
void
OutputLine(ppd_file_t *ppd, /* I - PPD file */
- cups_page_header_t *header) /* I - Page header */
+ cups_page_header2_t *header) /* I - Page header */
{
int i, j; /* Looping vars */
int plane; /* Current plane */
@@ -1657,7 +1673,7 @@ OutputLine(ppd_file_t *ppd, /* I - PPD file */
int /* O - Number of lines (0 if blank) */
ReadLine(cups_raster_t *ras, /* I - Raster stream */
- cups_page_header_t *header) /* I - Page header */
+ cups_page_header2_t *header) /* I - Page header */
{
int plane, /* Current color plane */
width; /* Width of line */
@@ -1755,12 +1771,15 @@ main(int argc, /* I - Number of command-line arguments */
{
int fd; /* File descriptor */
cups_raster_t *ras; /* Raster stream for printing */
- cups_page_header_t header; /* Page header from file */
+ cups_page_header2_t header; /* Page header from file */
int y; /* Current line */
ppd_file_t *ppd; /* PPD file */
int job_id; /* Job ID */
int num_options; /* Number of options */
cups_option_t *options; /* Options */
+#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
+ struct sigaction action; /* Actions for POSIX signals */
+#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
/*
@@ -1814,6 +1833,25 @@ main(int argc, /* I - Number of command-line arguments */
ras = cupsRasterOpen(fd, CUPS_RASTER_READ);
/*
+ * Register a signal handler to eject the current page if the
+ * job is cancelled.
+ */
+
+ Canceled = 0;
+
+#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
+ sigset(SIGTERM, CancelJob);
+#elif defined(HAVE_SIGACTION)
+ memset(&action, 0, sizeof(action));
+
+ sigemptyset(&action.sa_mask);
+ action.sa_handler = CancelJob;
+ sigaction(SIGTERM, &action, NULL);
+#else
+ signal(SIGTERM, CancelJob);
+#endif /* HAVE_SIGSET */
+
+ /*
* Process pages as needed...
*/
@@ -1821,8 +1859,15 @@ main(int argc, /* I - Number of command-line arguments */
Page = 0;
- while (cupsRasterReadHeader(ras, &header))
+ while (cupsRasterReadHeader2(ras, &header))
{
+ /*
+ * Write a status message with the page number and number of copies.
+ */
+
+ if (Canceled)
+ break;
+
Page ++;
fprintf(stderr, "PAGE: %d %d\n", Page, header.NumCopies);
@@ -1833,19 +1878,37 @@ main(int argc, /* I - Number of command-line arguments */
for (y = 0; y < (int)header.cupsHeight; y ++)
{
+ /*
+ * Let the user know how far we have progressed...
+ */
+
+ if (Canceled)
+ break;
+
if ((y & 127) == 0)
fprintf(stderr, "INFO: Printing page %d, %d%% complete...\n", Page,
100 * y / header.cupsHeight);
+ /*
+ * Read and write a line of graphics or whitespace...
+ */
+
if (ReadLine(ras, &header))
OutputLine(ppd, &header);
else
OutputFeed ++;
}
+ /*
+ * Eject the page...
+ */
+
fprintf(stderr, "INFO: Finished page %d...\n", Page);
EndPage(ppd, &header);
+
+ if (Canceled)
+ break;
}
Shutdown(ppd, job_id, argv[2], argv[3], num_options, options);