diff -pruN -x Makefile -x Makefile.in -x '*.m4' -x autom4te.cache -x 'config.*' -x configure -x doc -x libtool -x .deps -x .libs -x '*.ps' -x foo -x paps -x 'lib*' -x texttopaps -x '*o' -x '*.cups' -x 'test*' -x 'stamp*' paps-0.6.6.orig/configure.in paps-0.6.6/configure.in --- paps-0.6.6.orig/configure.in 2006-04-28 04:41:36.000000000 +0900 +++ paps-0.6.6/configure.in 2007-02-15 23:34:24.000000000 +0900 @@ -7,4 +7,17 @@ AC_LANG_C AC_PROG_CC AM_PROG_LIBTOOL +dnl ====================================================== +dnl check for CUPS +dnl ====================================================== +AC_PATH_PROG(CUPS_CONFIG, cups-config, no) +if test "$CUPS_CONFIG" = "no"; then + AC_MSG_ERROR([Please install cups development packages]) +fi +CUPS_CFLAGS=`$CUPS_CONFIG --cflags | sed 's/-O[0-9]*//' | sed 's/-m[^\t]*//g'` +CUPS_LIBS=`$CUPS_CONFIG --libs` + +AC_SUBST(CUPS_CFLAGS) +AC_SUBST(CUPS_LIBS) + AC_OUTPUT(Makefile src/Makefile doc/Makefile) diff -pruN -x Makefile -x Makefile.in -x '*.m4' -x autom4te.cache -x 'config.*' -x configure -x doc -x libtool -x .deps -x .libs -x '*.ps' -x foo -x paps -x 'lib*' -x texttopaps -x '*o' -x '*.cups' -x 'test*' -x 'stamp*' paps-0.6.6.orig/src/Makefile.am paps-0.6.6/src/Makefile.am --- paps-0.6.6.orig/src/Makefile.am 2007-02-15 22:59:47.000000000 +0900 +++ paps-0.6.6/src/Makefile.am 2007-02-15 23:34:24.000000000 +0900 @@ -5,10 +5,10 @@ libpaps_a_inc_HEADERS = libpaps.h libpaps_a_incdir = $(includedir) bin_PROGRAMS = paps -paps_CFLAGS = -Wall +paps_CFLAGS = -Wall $(CUPS_CFLAGS) paps_SOURCES = paps.c paps_LDADD = $(noinst_LIBRARIES) $(all_libraries) -paps_LDFLAGS = `pkg-config --libs pangoft2` +paps_LDFLAGS = `pkg-config --libs pangoft2` $(CUPS_LIBS) paps_DEPENDENCIES = $(noinst_LIBRARIES) EXTRA_DIST = test_libpaps.c paps.1 diff -pruN -x Makefile -x Makefile.in -x '*.m4' -x autom4te.cache -x 'config.*' -x configure -x doc -x libtool -x .deps -x .libs -x '*.ps' -x foo -x paps -x 'lib*' -x texttopaps -x '*o' -x '*.cups' -x 'test*' -x 'stamp*' paps-0.6.6.orig/src/paps.c paps-0.6.6/src/paps.c --- paps-0.6.6.orig/src/paps.c 2007-02-15 22:59:48.000000000 +0900 +++ paps-0.6.6/src/paps.c 2007-03-07 20:58:31.000000000 +0900 @@ -32,6 +32,7 @@ #include #include #include +#include #define BUFSIZE 1024 #define DEFAULT_FONT_FAMILY "Monospace" @@ -85,9 +86,11 @@ typedef struct { gboolean do_separation_line; gboolean do_draw_contour; gboolean do_wordwrap; + gboolean cups_mode; PangoDirection pango_dir; gchar *filename; gchar *header_font_desc; + gchar *owner; } page_layout_t; typedef struct { @@ -314,8 +317,8 @@ int main(int argc, char *argv[]) int num_pages = 1; int gutter_width = 40; int total_gutter_width; - int page_width = paper_sizes[0].width; - int page_height = paper_sizes[0].height; + int page_width = -1; + int page_height = -1; int do_tumble = -1; /* -1 means not initialized */ int do_duplex = -1; gchar *paps_header = NULL; @@ -324,6 +327,8 @@ int main(int argc, char *argv[]) int header_sep = 20; int max_width = 0, w; GIConv cvh = NULL; + gboolean cups_mode = FALSE; + gchar *page_owner = NULL; /* Set locale from environment. */ setlocale(LC_ALL, ""); @@ -333,6 +338,128 @@ int main(int argc, char *argv[]) g_option_context_add_main_entries(ctxt, entries, NULL); + /* check if the process is being invoked as CUPS filter */ + G_STMT_START { + gchar *prgname = g_path_get_basename(argv[0]); + cups_option_t *options = NULL; + ppd_file_t *ppd; + ppd_size_t *pagesize; + int num_options; + const char *val; + + if (strncmp(prgname, "texttopaps", 10) == 0 || + getenv ("CUPS_SERVER") != NULL) { + g_set_prgname(prgname); + /* argument format should be job-id user title copies options [file] */ + cups_mode = TRUE; + /* set default values */ + lpi = 6.0L; + cpi = 10.0L; + left_margin = 18; + right_margin = 18; + top_margin = 36; + bottom_margin = 36; + page_width = 612; + page_height = 792; + + if (argc < 6 || argc > 7) { + fprintf(stderr, "ERROR: %s job-id user title copies options [file]\n", prgname); + exit(1); + } + if (argc == 6) { + filename_in = "stdin"; + IN = stdin; + } else { + filename_in = argv[6]; + if ((IN = fopen(argv[6], "rb")) == NULL) { + fprintf(stderr, "ERROR: unable to open print file -\n"); + exit(1); + } + } + title = argv[3]; + page_owner = argv[2]; + num_options = cupsParseOptions(argv[5], 0, &options); + + if ((val = cupsGetOption("prettyprint", num_options, options)) != NULL && + g_ascii_strcasecmp(val, "no") && + g_ascii_strcasecmp(val, "off") && + g_ascii_strcasecmp(val, "false")) { + /* XXX: need to support the keywords highlighting */ + } + ppd = ppdOpenFile(getenv("PPD")); + ppdMarkDefaults(ppd); + cupsMarkOptions(ppd, num_options, options); + + if ((pagesize = ppdPageSize(ppd, NULL)) != NULL) { + page_width = pagesize->width; + page_height = pagesize->length; + top_margin = pagesize->length - pagesize->top; + bottom_margin = pagesize->bottom; + left_margin = pagesize->left; + right_margin = pagesize->width - pagesize->right; + } + + if ((val = cupsGetOption("landscape", num_options, options)) != NULL) { + if (g_ascii_strcasecmp(val, "no") && + g_ascii_strcasecmp(val, "off") && + g_ascii_strcasecmp(val, "false")) { + /* We don't need to process the documentation for orientation support. + * pstops certainly does. (#222137) + */ + } + } + /* XXX: need to support orientation-requested? */ + if ((val = cupsGetOption("page-left", num_options, options)) != NULL) { + left_margin = (int)atof(val); + } + if ((val = cupsGetOption("page-right", num_options, options)) != NULL) { + right_margin = (int)atof(val); + } + if ((val = cupsGetOption("page-bottom", num_options, options)) != NULL) { + bottom_margin = (int)atof(val); + } + if ((val = cupsGetOption("page-top", num_options, options)) != NULL) { + top_margin = (int)atof(val); + } + if (ppdIsMarked(ppd, "Duplex", "DuplexNoTumble") || + ppdIsMarked(ppd, "Duplex", "DuplexTumble") || + ppdIsMarked(ppd, "JCLDuplex", "DuplexNoTumble") || + ppdIsMarked(ppd, "JCLDuplex", "DuplexTumble") || + ppdIsMarked(ppd, "EFDuplex", "DuplexNoTumble") || + ppdIsMarked(ppd, "EFDuplex", "DuplexTumble") || + ppdIsMarked(ppd, "KD03Duplex", "DuplexNoTumble") || + ppdIsMarked(ppd, "KD03Duplex", "DuplexTumble")) + do_duplex = TRUE; + if ((val = cupsGetOption("wrap", num_options, options)) != NULL) { + do_wordwrap = !g_ascii_strcasecmp(val, "true") || + !g_ascii_strcasecmp(val, "on") || + !g_ascii_strcasecmp(val, "yes"); + } + if ((val = cupsGetOption("columns", num_options, options)) != NULL) { + num_columns = atoi(val); + } + if ((val = cupsGetOption("cpi", num_options, options)) != NULL) { + cpi = atof(val); + } + if ((val = cupsGetOption("lpi", num_options, options)) != NULL) { + lpi = atof(val); + } + if (getenv("CHARSET") != NULL) { + char *charset = getenv("CHARSET"); + /* Map CUPS charset names to real ones. + * http://cups.org/newsgroups.php?s9797+gcups.general+v9797+T1 + */ + if (!g_ascii_strcasecmp(charset, "windows-932")) + charset = "WINDOWS-31J"; + if (g_ascii_strcasecmp(charset, "utf-8") && + g_ascii_strcasecmp(charset, "utf8")) + encoding = g_strdup(charset); + } + } + } G_STMT_END; + + if (!cups_mode) { + /* Parse command line */ if (!g_option_context_parse(ctxt, &argc, &argv, &error)) { @@ -359,6 +486,8 @@ int main(int argc, char *argv[]) IN = stdin; } title = filename_in; + + } /* if (!cups_mode) */ paps = paps_new(); pango_context = paps_get_pango_context (paps); @@ -377,8 +506,10 @@ int main(int argc, char *argv[]) pango_context_set_font_description (pango_context, font_description); /* Page layout */ - page_width = paper_sizes[(int)paper_type].width; - page_height = paper_sizes[(int)paper_type].height; + if (page_width < 0) + page_width = paper_sizes[(int)paper_type].width; + if (page_height < 0) + page_height = paper_sizes[(int)paper_type].height; if (num_columns == 1) total_gutter_width = 0; @@ -439,6 +570,8 @@ int main(int argc, char *argv[]) page_layout.pango_dir = pango_dir; page_layout.filename = filename_in; page_layout.header_font_desc = header_font_desc; + page_layout.owner = page_owner; + page_layout.cups_mode = cups_mode; /* calculate x-coordinate scale */ if (cpi > 0.0L) @@ -584,6 +717,12 @@ split_text_into_paragraphs (PangoContext if (wc == (gunichar)-1) { fprintf (stderr, "%s: Invalid character in input\n", g_get_prgname ()); + if (page_layout->cups_mode) + { + /* try to continue parsing texts */ + p = next; + continue; + } wc = 0; } if (!*p || !wc || wc == '\n' || wc == '\f') @@ -810,6 +949,7 @@ void print_postscript_header(FILE *OUT, int orientation = page_layout->page_width > page_layout->page_height; int bb_page_width = page_layout->page_width; int bb_page_height = page_layout->page_height; + char *owner = NULL; /* Keep bounding box non-rotated to make ggv happy */ if (orientation) @@ -819,12 +959,20 @@ void print_postscript_header(FILE *OUT, bb_page_height = tmp; } + if (page_layout->owner) + { + owner = g_strdup_printf("%%%%For: %s\n", page_layout->owner); + } + else + { + owner = g_strdup(""); + } fprintf(OUT, "%%!PS-Adobe-3.0\n" "%%%%Title: %s\n" "%%%%Creator: paps version 0.6.3 by Dov Grobgeld\n" "%%%%Pages: (atend)\n" - "%%%%BoundingBox: 0 0 %d %d\n" + "%%%%BoundingBox: 0 0 %d %d\n%s" "%%%%BeginProlog\n" "%%%%Orientation: %s\n" "/papsdict 1 dict def\n" @@ -874,8 +1022,10 @@ void print_postscript_header(FILE *OUT, title, bb_page_width, bb_page_height, + owner, orientation_names[orientation] ); + g_free(owner); fprintf(OUT, "%% User settings\n"