1 /* Copyright (C) 2001-2006 Artifex Software, Inc.
2    All Rights Reserved.
3 
4    This software is provided AS-IS with no warranty, either express or
5    implied.
6 
7    This software is distributed under license and may not be copied, modified
8    or distributed except as expressly authorized under the terms of that
9    license.  Refer to licensing information at http://www.artifex.com/
10    or contact Artifex Software, Inc.,  7 Mt. Lassen Drive - Suite A-134,
11    San Rafael, CA  94903, U.S.A., +1(415)492-9861, for further information.
12 */
13 
14 /* $Id: ziodev2.c 9043 2008-08-28 22:48:19Z giles $ */
15 /* (Level 2) IODevice operators */
16 #include "string_.h"
17 #include "ghost.h"
18 #include "gp.h"
19 #include "oper.h"
20 #include "stream.h"
21 #include "gxiodev.h"
22 #include "dstack.h"		/* for systemdict */
23 #include "files.h"		/* for file_open_stream */
24 #include "iparam.h"
25 #include "iutil2.h"
26 #include "store.h"
27 
28 /* ------ %null% ------ */
29 
30 /* This represents the null output file. */
31 static iodev_proc_open_device(null_open);
32 const gx_io_device gs_iodev_null = {
33     "%null%", "Special",
34     {
35 	iodev_no_init, null_open, iodev_no_open_file,
36 	iodev_os_fopen, iodev_os_fclose,
37 	iodev_no_delete_file, iodev_no_rename_file, iodev_no_file_status,
38 	iodev_no_enumerate_files, NULL, NULL,
39 	iodev_no_get_params, iodev_no_put_params
40     }
41 };
42 
43 static int
null_open(gx_io_device * iodev,const char * access,stream ** ps,gs_memory_t * mem)44 null_open(gx_io_device * iodev, const char *access, stream ** ps,
45 	  gs_memory_t * mem)
46 {
47     if (!streq1(access, 'w'))
48 	return_error(e_invalidfileaccess);
49     return file_open_stream(gp_null_file_name,
50 			    strlen(gp_null_file_name),
51 			    access, 256 /* arbitrary */ , ps,
52 			    iodev, iodev->procs.fopen, mem);
53 }
54 
55 /* ------ Operators ------ */
56 
57 /* <iodevice> .getdevparams <mark> <name> <value> ... */
58 static int
zgetdevparams(i_ctx_t * i_ctx_p)59 zgetdevparams(i_ctx_t *i_ctx_p)
60 {
61     os_ptr op = osp;
62     gx_io_device *iodev;
63     stack_param_list list;
64     gs_param_list *const plist = (gs_param_list *) & list;
65     int code;
66     ref *pmark;
67 
68     check_read_type(*op, t_string);
69     iodev = gs_findiodevice(op->value.bytes, r_size(op));
70     if (iodev == 0)
71 	return_error(e_undefined);
72     stack_param_list_write(&list, &o_stack, NULL, iimemory);
73     if ((code = gs_getdevparams(iodev, plist)) < 0) {
74 	ref_stack_pop(&o_stack, list.count * 2);
75 	return code;
76     }
77     pmark = ref_stack_index(&o_stack, list.count * 2);
78     make_mark(pmark);
79     return 0;
80 }
81 
82 /* <mark> <name> <value> ... <iodevice> .putdevparams */
83 static int
zputdevparams(i_ctx_t * i_ctx_p)84 zputdevparams(i_ctx_t *i_ctx_p)
85 {
86     os_ptr op = osp;
87     gx_io_device *iodev;
88     stack_param_list list;
89     gs_param_list *const plist = (gs_param_list *) & list;
90     int code;
91     password system_params_password;
92 
93     check_read_type(*op, t_string);
94     iodev = gs_findiodevice(op->value.bytes, r_size(op));
95     if (iodev == 0)
96 	return_error(e_undefined);
97     code = stack_param_list_read(&list, &o_stack, 1, NULL, false, iimemory);
98     if (code < 0)
99 	return code;
100     code = dict_read_password(&system_params_password, systemdict,
101 			      "SystemParamsPassword");
102     if (code < 0)
103 	return code;
104     code = param_check_password(plist, &system_params_password);
105     if (code != 0) {
106 	iparam_list_release(&list);
107 	return_error(code < 0 ? code : e_invalidaccess);
108     }
109     code = gs_putdevparams(iodev, plist);
110     iparam_list_release(&list);
111     if (code < 0)
112 	return code;
113     ref_stack_pop(&o_stack, list.count * 2 + 2);
114     return 0;
115 }
116 
117 /* ------ Initialization procedure ------ */
118 
119 const op_def ziodev2_l2_op_defs[] =
120 {
121     op_def_begin_level2(),
122     {"1.getdevparams", zgetdevparams},
123     {"2.putdevparams", zputdevparams},
124     op_def_end(0)
125 };
126