Index: filter/rastertolabel.c =================================================================== --- filter/rastertolabel.c (revision 7402) +++ filter/rastertolabel.c (working copy) @@ -3,7 +3,7 @@ * * Label printer filter for the Common UNIX Printing System (CUPS). * - * Copyright 2007 by Apple Inc. + * Copyright 2007-2008 by Apple Inc. * Copyright 2001-2007 by Easy Software Products. * * These coded instructions, statements, and computer programs are the @@ -90,10 +90,10 @@ */ void Setup(ppd_file_t *ppd); -void StartPage(ppd_file_t *ppd, cups_page_header_t *header); -void EndPage(ppd_file_t *ppd, cups_page_header_t *header); +void StartPage(ppd_file_t *ppd, cups_page_header2_t *header); +void EndPage(ppd_file_t *ppd, cups_page_header2_t *header); void CancelJob(int sig); -void OutputLine(ppd_file_t *ppd, cups_page_header_t *header, int y); +void OutputLine(ppd_file_t *ppd, cups_page_header2_t *header, int y); void PCLCompress(unsigned char *line, int length); void ZPLCompress(char repeat_char, int repeat_count); @@ -166,13 +166,10 @@ 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 */ { ppd_choice_t *choice; /* Marked choice */ int length; /* Actual label length */ -#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) - struct sigaction action; /* Actions for POSIX signals */ -#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ /* @@ -226,23 +223,6 @@ fprintf(stderr, "DEBUG: cupsRowFeed = %d\n", header->cupsRowFeed); fprintf(stderr, "DEBUG: cupsRowStep = %d\n", header->cupsRowStep); - /* - * Register a signal handler to eject the current page if the - * job is canceled. - */ - -#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 */ - switch (ModelNumber) { case DYMO_3x0 : @@ -498,7 +478,7 @@ 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 val; /* Option value */ ppd_choice_t *choice; /* Marked choice */ @@ -733,22 +713,6 @@ fflush(stdout); /* - * Unregister the signal handler... - */ - -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, SIG_IGN); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - action.sa_handler = SIG_IGN; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, SIG_IGN); -#endif /* HAVE_SIGSET */ - - /* * Free memory... */ @@ -779,7 +743,7 @@ 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 y) /* I - Line number */ { int i; /* Looping var */ @@ -1145,11 +1109,14 @@ { 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 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 */ /* @@ -1193,6 +1160,25 @@ 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 */ + + /* * Open the PPD file and apply options... */ @@ -1214,15 +1200,17 @@ * Process pages as needed... */ - Page = 0; - Canceled = 0; + 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); @@ -1243,6 +1231,9 @@ * Let the user know how far we have progressed... */ + if (Canceled) + break; + if ((y & 15) == 0) fprintf(stderr, _("INFO: Printing page %d, %d%% complete...\n"), Page, 100 * y / header.cupsHeight); Index: filter/rastertoepson.c =================================================================== --- filter/rastertoepson.c (revision 7402) +++ filter/rastertoepson.c (working copy) @@ -77,7 +77,8 @@ LineCount, /* # of lines processed */ EvenOffset, /* Offset into 'even' buffers */ OddOffset, /* Offset into 'odd' buffers */ - Shingling; /* Shingle output? */ + Shingling, /* Shingle output? */ + Canceled; /* Has the current job been canceled? */ /* @@ -85,15 +86,15 @@ */ void Setup(void); -void StartPage(const ppd_file_t *ppd, const cups_page_header_t *header); -void EndPage(const cups_page_header_t *header); +void StartPage(const ppd_file_t *ppd, const cups_page_header2_t *header); +void EndPage(const cups_page_header2_t *header); void Shutdown(void); void CancelJob(int sig); void CompressData(const unsigned char *line, int length, int plane, int type, int xstep, int ystep); -void OutputLine(const cups_page_header_t *header); -void OutputRows(const cups_page_header_t *header, int row); +void OutputLine(const cups_page_header2_t *header); +void OutputRows(const cups_page_header2_t *header, int row); /* @@ -123,33 +124,13 @@ void StartPage(const ppd_file_t *ppd, /* I - PPD file */ - const cups_page_header_t *header) /* I - Page header */ + const cups_page_header2_t *header) /* I - Page header */ { int n, t; /* Numbers */ int plane; /* Looping var */ -#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) - struct sigaction action; /* Actions for POSIX signals */ -#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ /* - * Register a signal handler to eject the current page if the - * job is cancelled. - */ - -#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 */ - - /* * Send a reset sequence. */ @@ -339,7 +320,7 @@ */ void -EndPage(const cups_page_header_t *header) /* I - Page header */ +EndPage(const cups_page_header2_t *header) /* I - Page header */ { #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) struct sigaction action; /* Actions for POSIX signals */ @@ -378,22 +359,6 @@ fflush(stdout); /* - * Unregister the signal handler... - */ - -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, SIG_IGN); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - action.sa_handler = SIG_IGN; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, SIG_IGN); -#endif /* HAVE_SIGSET */ - - /* * Free memory... */ @@ -429,31 +394,9 @@ void CancelJob(int sig) /* I - Signal */ { - int i; /* Looping var */ - - (void)sig; - /* - * Send out lots of NUL bytes to clear out any pending raster data... - */ - - if (DotBytes) - i = DotBytes * 360 * 8; - else - i = 720; - - for (; i > 0; i --) - putchar(0); - - /* - * End the current page and exit... - */ - - EndPage(NULL); - Shutdown(); - - exit(0); + Canceled = 1; } @@ -670,7 +613,7 @@ */ void -OutputLine(const cups_page_header_t *header) /* I - Page header */ +OutputLine(const cups_page_header2_t *header) /* I - Page header */ { if (header->cupsRowCount) { @@ -838,7 +781,7 @@ */ void -OutputRows(const cups_page_header_t *header, /* I - Page image header */ +OutputRows(const cups_page_header2_t *header, /* I - Page image header */ int row) /* I - Row number (0 or 1) */ { unsigned i, n; /* Looping vars */ @@ -1012,16 +955,19 @@ * 'main()' - Main entry and processing of driver. */ -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ { - int fd; /* File descriptor */ - cups_raster_t *ras; /* Raster stream for printing */ - cups_page_header_t header; /* Page header from file */ - ppd_file_t *ppd; /* PPD file */ - int page; /* Current page */ - int y; /* Current line */ + int fd; /* File descriptor */ + cups_raster_t *ras; /* Raster stream for printing */ + cups_page_header2_t header; /* Page header from file */ + ppd_file_t *ppd; /* PPD file */ + int page; /* Current page */ + int y; /* Current line */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ /* @@ -1065,6 +1011,25 @@ 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... */ @@ -1080,12 +1045,15 @@ 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); @@ -1106,6 +1074,9 @@ * 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); @@ -1129,6 +1100,9 @@ */ EndPage(&header); + + if (Canceled) + break; } /* Index: filter/rastertohp.c =================================================================== --- filter/rastertohp.c (revision 7402) +++ filter/rastertohp.c (working copy) @@ -52,7 +52,8 @@ ColorBits, /* Number of bits per color */ Feed, /* Number of lines to skip */ Duplex, /* Current duplex mode */ - Page; /* Current page number */ + Page, /* Current page number */ + Canceled; /* Has the current job been canceled? */ /* @@ -60,13 +61,13 @@ */ void Setup(void); -void StartPage(ppd_file_t *ppd, cups_page_header_t *header); +void StartPage(ppd_file_t *ppd, cups_page_header2_t *header); void EndPage(void); void Shutdown(void); void CancelJob(int sig); void CompressData(unsigned char *line, int length, int plane, int type); -void OutputLine(cups_page_header_t *header); +void OutputLine(cups_page_header2_t *header); /* @@ -91,32 +92,12 @@ 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 plane; /* Looping var */ -#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) - struct sigaction action; /* Actions for POSIX signals */ -#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ /* - * Register a signal handler to eject the current page if the - * job is cancelled. - */ - -#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 */ - - /* * Show page device dictionary... */ @@ -410,11 +391,6 @@ void EndPage(void) { -#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) - struct sigaction action; /* Actions for POSIX signals */ -#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ - - /* * Eject the current page... */ @@ -437,22 +413,6 @@ fflush(stdout); /* - * Unregister the signal handler... - */ - -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, SIG_IGN); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - action.sa_handler = SIG_IGN; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, SIG_IGN); -#endif /* HAVE_SIGSET */ - - /* * Free memory... */ @@ -489,26 +449,9 @@ void CancelJob(int sig) /* I - Signal */ { - int i; /* Looping var */ - - (void)sig; - /* - * Send out lots of NUL bytes to clear out any pending raster data... - */ - - for (i = 0; i < 600; i ++) - putchar(0); - - /* - * End the current page and exit... - */ - - EndPage(); - Shutdown(); - - exit(0); + Canceled = 1; } @@ -648,7 +591,7 @@ */ void -OutputLine(cups_page_header_t *header) /* I - Page header */ +OutputLine(cups_page_header2_t *header) /* I - Page header */ { int plane, /* Current plane */ bytes, /* Bytes to write */ @@ -731,15 +674,18 @@ * 'main()' - Main entry and processing of driver. */ -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ { - int fd; /* File descriptor */ - cups_raster_t *ras; /* Raster stream for printing */ - cups_page_header_t header; /* Page header from file */ - int y; /* Current line */ - ppd_file_t *ppd; /* PPD file */ + int fd; /* File descriptor */ + cups_raster_t *ras; /* Raster stream for printing */ + cups_page_header2_t header; /* Page header from file */ + int y; /* Current line */ + ppd_file_t *ppd; /* PPD file */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ /* @@ -783,6 +729,25 @@ 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... */ @@ -796,12 +761,15 @@ 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); @@ -822,6 +790,9 @@ * 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); @@ -849,6 +820,9 @@ */ EndPage(); + + if (Canceled) + break; } /*