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 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 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 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