1 /* Copyright (C) 2004 artofcode LLC. All rights reserved.
2
3 This software is provided AS-IS with no warranty, either express or
4 implied.
5
6 This software is distributed under license and may not be copied,
7 modified or distributed except as expressly authorized under the terms
8 of the license contained in the file LICENSE in this distribution.
9
10 For more information about licensing, please refer to
11 http://www.ghostscript.com/licensing/. For information on
12 commercial licensing, go to http://www.artifex.com/licensing/ or
13 contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14 San Rafael, CA 94903, U.S.A., +1(415)492-9861.
15 */
16
17 /* $Id: gp_os2pr.c,v 1.1 2004/09/14 06:45:55 ghostgum Exp $ */
18 /* %printer% IODevice */
19
20 #define INCL_DOS
21 #define INCL_SPL
22 #define INCL_SPLDOSPRINT
23 #define INCL_SPLERRORS
24 #define INCL_BASE
25 #define INCL_ERRORS
26 #define INCL_WIN
27 #include <os2.h>
28
29 #include "errno_.h"
30 #include "stdio_.h"
31 #include "string_.h"
32 #include "gp.h"
33 #include "gscdefs.h"
34 #include "gserrors.h"
35 #include "gserror.h"
36 #include "gstypes.h"
37 #include "gsmemory.h" /* for gxiodev.h */
38 #include "gxiodev.h"
39
40 /* The OS/2 printer IODevice */
41
42 /*
43 * This allows an OS/2 printer to be specified as an
44 * output using
45 * -sOutputFile="%printer%AppleLas"
46 * where "AppleLas" is the physical name of the queue.
47 *
48 * If you don't supply a printer name you will get
49 * Error: /undefinedfilename in --.outputpage--
50 * If the printer name is invalid you will get
51 * Error: /invalidfileaccess in --.outputpage--
52 *
53 * This is implemented by writing to a temporary file
54 * then copying it to the spooler.
55 *
56 * A better method would be to return a file pointer
57 * to the write end of a pipe, and starting a thread
58 * which reads the pipe and writes to an OS/2 printer.
59 * This method didn't work properly on the second
60 * thread within ghostscript.
61 */
62
63 private iodev_proc_init(os2_printer_init);
64 private iodev_proc_fopen(os2_printer_fopen);
65 private iodev_proc_fclose(os2_printer_fclose);
66 const gx_io_device gs_iodev_printer = {
67 "%printer%", "FileSystem",
68 {os2_printer_init, iodev_no_open_device,
69 NULL /*iodev_os_open_file */ , os2_printer_fopen, os2_printer_fclose,
70 iodev_no_delete_file, iodev_no_rename_file, iodev_no_file_status,
71 iodev_no_enumerate_files, NULL, NULL,
72 iodev_no_get_params, iodev_no_put_params
73 }
74 };
75
76 typedef struct os2_printer_s {
77 char queue[gp_file_name_sizeof];
78 char filename[gp_file_name_sizeof];
79 } os2_printer_t;
80
81 /* The file device procedures */
82 private int
os2_printer_init(gx_io_device * iodev,gs_memory_t * mem)83 os2_printer_init(gx_io_device * iodev, gs_memory_t * mem)
84 {
85 /* state -> structure containing thread handle */
86 iodev->state = gs_alloc_bytes(mem, sizeof(os2_printer_t),
87 "os2_printer_init");
88 if (iodev->state == NULL)
89 return_error(gs_error_VMerror);
90 memset(iodev->state, 0, sizeof(os2_printer_t));
91 return 0;
92 }
93
94
95 private int
os2_printer_fopen(gx_io_device * iodev,const char * fname,const char * access,FILE ** pfile,char * rfname,uint rnamelen)96 os2_printer_fopen(gx_io_device * iodev, const char *fname, const char *access,
97 FILE ** pfile, char *rfname, uint rnamelen)
98 {
99 os2_printer_t *pr = (os2_printer_t *)iodev->state;
100 char driver_name[256];
101
102 /* Make sure that printer exists. */
103 if (pm_find_queue(fname, driver_name)) {
104 /* error, list valid queue names */
105 eprintf("Invalid queue name. Use one of:\n");
106 pm_find_queue(NULL, NULL);
107 return_error(gs_error_undefinedfilename);
108 }
109
110 strncpy(pr->queue, fname, sizeof(pr->queue)-1);
111
112 /* Create a temporary file */
113 *pfile = gp_open_scratch_file("gs", pr->filename, access);
114 if (*pfile == NULL)
115 return_error(gs_fopen_errno_to_code(errno));
116
117 return 0;
118 }
119
120 private int
os2_printer_fclose(gx_io_device * iodev,FILE * file)121 os2_printer_fclose(gx_io_device * iodev, FILE * file)
122 {
123 os2_printer_t *pr = (os2_printer_t *)iodev->state;
124 fclose(file);
125 pm_spool(pr->filename, pr->queue);
126 unlink(pr->filename);
127 return 0;
128 }
129
130