Blob Blame History Raw
diff -ruN 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	2006-09-30 03:13:29.000000000 +0900
@@ -7,4 +7,17 @@
 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 -ruN paps-0.6.6.orig/src/Makefile.am paps-0.6.6/src/Makefile.am
--- paps-0.6.6.orig/src/Makefile.am	2006-09-30 03:13:05.000000000 +0900
+++ paps-0.6.6/src/Makefile.am	2006-09-30 03:13:29.000000000 +0900
@@ -5,10 +5,10 @@
 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 -ruN paps-0.6.6.orig/src/paps.c paps-0.6.6/src/paps.c
--- paps-0.6.6.orig/src/paps.c	2006-09-30 03:13:05.000000000 +0900
+++ paps-0.6.6/src/paps.c	2006-09-30 03:16:10.000000000 +0900
@@ -31,6 +31,7 @@
 #include <time.h>
 #include <locale.h>
 #include <wchar.h>
+#include <cups/cups.h>
 
 #define BUFSIZE 1024
 #define DEFAULT_FONT_FAMILY	"Monospace"
@@ -84,9 +85,11 @@
   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 {
@@ -313,8 +316,8 @@
   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;
@@ -323,12 +326,124 @@
   int header_sep = 20;
   int max_width = 0, w;
   GIConv cvh = NULL;
+  gboolean cups_mode = FALSE;
+  gchar *page_owner = NULL;
 
   /* Prerequisite when using glib. */
   g_type_init();
   
   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;
+		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") != 0 &&
+			    g_ascii_strcasecmp(val, "off") != 0 &&
+			    g_ascii_strcasecmp(val, "false") != 0) {
+				/* XXX: need to support other orientations? */
+				do_landscape = TRUE;
+			}
+		}
+		/* 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))
     {
@@ -355,6 +470,8 @@
       IN = stdin;
     }
   title = filename_in;
+
+  } /* if (!cups_mode) */
   
   paps = paps_new();
   pango_context = paps_get_pango_context (paps);
@@ -373,8 +490,10 @@
   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;
@@ -435,6 +554,8 @@
   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)
@@ -571,6 +692,12 @@
       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')
@@ -784,6 +911,7 @@
   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)
@@ -793,12 +921,20 @@
       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"
@@ -848,8 +984,10 @@
           title,
           bb_page_width,
           bb_page_height,
+          owner,
           orientation_names[orientation]
           );
+  g_free(owner);
   
   fprintf(OUT,
           "%% User settings\n"