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