2 Python wrappers for DCERPC/SMB client routines.
4 Copyright (C) Tim Potter, 2002
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "python/py_spoolss.h"
22 #include "python/py_conv.h"
24 /* Structure/hash conversions */
26 struct pyconv py_DRIVER_INFO_1
[] = {
27 { "name", PY_UNISTR
, offsetof(DRIVER_INFO_1
, name
) },
31 struct pyconv py_DRIVER_INFO_2
[] = {
32 { "version", PY_UINT32
, offsetof(DRIVER_INFO_2
, version
) },
33 { "name", PY_UNISTR
, offsetof(DRIVER_INFO_2
, name
) },
34 { "architecture", PY_UNISTR
, offsetof(DRIVER_INFO_2
, architecture
) },
35 { "driver_path", PY_UNISTR
, offsetof(DRIVER_INFO_2
, driverpath
) },
36 { "data_file", PY_UNISTR
, offsetof(DRIVER_INFO_2
, datafile
) },
37 { "config_file", PY_UNISTR
, offsetof(DRIVER_INFO_2
, configfile
) },
41 struct pyconv py_DRIVER_INFO_3
[] = {
42 { "version", PY_UINT32
, offsetof(DRIVER_INFO_3
, version
) },
43 { "name", PY_UNISTR
, offsetof(DRIVER_INFO_3
, name
) },
44 { "architecture", PY_UNISTR
, offsetof(DRIVER_INFO_3
, architecture
) },
45 { "driver_path", PY_UNISTR
, offsetof(DRIVER_INFO_3
, driverpath
) },
46 { "data_file", PY_UNISTR
, offsetof(DRIVER_INFO_3
, datafile
) },
47 { "config_file", PY_UNISTR
, offsetof(DRIVER_INFO_3
, configfile
) },
48 { "help_file", PY_UNISTR
, offsetof(DRIVER_INFO_3
, helpfile
) },
49 { "monitor_name", PY_UNISTR
, offsetof(DRIVER_INFO_3
, monitorname
) },
50 { "default_datatype", PY_UNISTR
, offsetof(DRIVER_INFO_3
, defaultdatatype
) },
54 struct pyconv py_DRIVER_INFO_6
[] = {
55 { "version", PY_UINT32
, offsetof(DRIVER_INFO_6
, version
) },
56 { "name", PY_UNISTR
, offsetof(DRIVER_INFO_6
, name
) },
57 { "architecture", PY_UNISTR
, offsetof(DRIVER_INFO_6
, architecture
) },
58 { "driver_path", PY_UNISTR
, offsetof(DRIVER_INFO_6
, driverpath
) },
59 { "data_file", PY_UNISTR
, offsetof(DRIVER_INFO_6
, datafile
) },
60 { "config_file", PY_UNISTR
, offsetof(DRIVER_INFO_6
, configfile
) },
61 { "help_file", PY_UNISTR
, offsetof(DRIVER_INFO_6
, helpfile
) },
62 { "monitor_name", PY_UNISTR
, offsetof(DRIVER_INFO_6
, monitorname
) },
63 { "default_datatype", PY_UNISTR
, offsetof(DRIVER_INFO_6
, defaultdatatype
) },
65 { "padding", PY_UINT32
, offsetof(DRIVER_INFO_6
, padding
) },
66 { "driver_version_low", PY_UINT32
, offsetof(DRIVER_INFO_6
, driver_version_low
) },
67 { "driver_version_high", PY_UINT32
, offsetof(DRIVER_INFO_6
, driver_version_high
) },
68 { "mfg_name", PY_UNISTR
, offsetof(DRIVER_INFO_6
, mfgname
) },
69 { "oem_url", PY_UNISTR
, offsetof(DRIVER_INFO_6
, oem_url
) },
70 { "hardware_id", PY_UNISTR
, offsetof(DRIVER_INFO_6
, hardware_id
) },
71 { "provider", PY_UNISTR
, offsetof(DRIVER_INFO_6
, provider
) },
76 struct pyconv py_DRIVER_DIRECTORY_1
[] = {
77 { "name", PY_UNISTR
, offsetof(DRIVER_DIRECTORY_1
, name
) },
81 static uint16
*to_dependentfiles(PyObject
*list
, TALLOC_CTX
*mem_ctx
)
83 uint32 elements
, size
=0, pos
=0, i
;
86 PyObject
*borrowedRef
;
88 if (!PyList_Check(list
)) {
92 /* calculate size for dependentfiles */
93 elements
=PyList_Size(list
);
94 for (i
= 0; i
< elements
; i
++) {
95 borrowedRef
=PyList_GetItem(list
, i
);
96 if (!PyString_Check(borrowedRef
))
97 /* non string found, return error */
99 size
+=PyString_Size(borrowedRef
)+1;
102 if (!(ret
= (uint16
*)_talloc(mem_ctx
,((size
+1)*sizeof(uint16
)))))
105 /* create null terminated sequence of null terminated strings */
106 for (i
= 0; i
< elements
; i
++) {
107 borrowedRef
=PyList_GetItem(list
, i
);
108 str
=PyString_AsString(borrowedRef
);
111 /* dependentfiles too small. miscalculated? */
115 SSVAL(&ret
[pos
], 0, str
[0]);
126 BOOL
py_from_DRIVER_INFO_1(PyObject
**dict
, DRIVER_INFO_1
*info
)
128 *dict
= from_struct(info
, py_DRIVER_INFO_1
);
129 PyDict_SetItemString(*dict
, "level", PyInt_FromLong(1));
134 BOOL
py_to_DRIVER_INFO_1(DRIVER_INFO_1
*info
, PyObject
*dict
)
139 BOOL
py_from_DRIVER_INFO_2(PyObject
**dict
, DRIVER_INFO_2
*info
)
141 *dict
= from_struct(info
, py_DRIVER_INFO_2
);
142 PyDict_SetItemString(*dict
, "level", PyInt_FromLong(2));
147 BOOL
py_to_DRIVER_INFO_2(DRIVER_INFO_2
*info
, PyObject
*dict
)
152 BOOL
py_from_DRIVER_INFO_3(PyObject
**dict
, DRIVER_INFO_3
*info
)
154 *dict
= from_struct(info
, py_DRIVER_INFO_3
);
156 PyDict_SetItemString(*dict
, "level", PyInt_FromLong(3));
158 PyDict_SetItemString(
159 *dict
, "dependent_files",
160 from_unistr_list(info
->dependentfiles
));
165 BOOL
py_to_DRIVER_INFO_3(DRIVER_INFO_3
*info
, PyObject
*dict
,
168 PyObject
*obj
, *dict_copy
= PyDict_Copy(dict
);
171 if (!(obj
= PyDict_GetItemString(dict_copy
, "dependent_files")))
174 if (!(info
->dependentfiles
= to_dependentfiles(obj
, mem_ctx
)))
177 PyDict_DelItemString(dict_copy
, "dependent_files");
179 if (!(obj
= PyDict_GetItemString(dict_copy
, "level")) ||
183 PyDict_DelItemString(dict_copy
, "level");
185 if (!to_struct(info
, dict_copy
, py_DRIVER_INFO_3
))
191 Py_DECREF(dict_copy
);
195 BOOL
py_from_DRIVER_INFO_6(PyObject
**dict
, DRIVER_INFO_6
*info
)
197 *dict
= from_struct(info
, py_DRIVER_INFO_6
);
198 PyDict_SetItemString(*dict
, "level", PyInt_FromLong(6));
199 PyDict_SetItemString(
200 *dict
, "dependent_files",
201 from_unistr_list(info
->dependentfiles
));
205 BOOL
py_to_DRIVER_INFO_6(DRIVER_INFO_6
*info
, PyObject
*dict
)
210 BOOL
py_from_DRIVER_DIRECTORY_1(PyObject
**dict
, DRIVER_DIRECTORY_1
*info
)
212 *dict
= from_struct(info
, py_DRIVER_DIRECTORY_1
);
213 PyDict_SetItemString(*dict
, "level", PyInt_FromLong(1));
217 BOOL
py_to_DRIVER_DIRECTORY_1(DRIVER_DIRECTORY_1
*info
, PyObject
*dict
)