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 static BOOL
py_from_printerdata(PyObject
**dict
, char *key
, char *value
,
25 uint16 data_type
, uint8
*data
,
30 PyDict_SetItemString(*dict
, "key", Py_BuildValue("s", key
? key
: ""));
31 PyDict_SetItemString(*dict
, "value", Py_BuildValue("s", value
));
32 PyDict_SetItemString(*dict
, "type", Py_BuildValue("i", data_type
));
34 PyDict_SetItemString(*dict
, "data",
35 Py_BuildValue("s#", data
, data_size
));
40 static BOOL
py_to_printerdata(char **key
, char **value
, uint16
*data_type
,
41 uint8
**data
, uint32
*data_size
,
46 if ((obj
= PyDict_GetItemString(dict
, "key"))) {
48 if (!PyString_Check(obj
)) {
49 PyErr_SetString(spoolss_error
,
55 *key
= PyString_AsString(obj
);
63 if ((obj
= PyDict_GetItemString(dict
, "value"))) {
65 if (!PyString_Check(obj
)) {
66 PyErr_SetString(spoolss_error
,
67 "value not a string");
71 *value
= PyString_AsString(obj
);
73 PyErr_SetString(spoolss_error
, "no value present");
77 if ((obj
= PyDict_GetItemString(dict
, "type"))) {
79 if (!PyInt_Check(obj
)) {
80 PyErr_SetString(spoolss_error
,
81 "type not an integer");
85 *data_type
= PyInt_AsLong(obj
);
87 PyErr_SetString(spoolss_error
, "no type present");
91 if ((obj
= PyDict_GetItemString(dict
, "data"))) {
93 if (!PyString_Check(obj
)) {
94 PyErr_SetString(spoolss_error
,
99 *data
= PyString_AsString(obj
);
100 *data_size
= PyString_Size(obj
);
102 PyErr_SetString(spoolss_error
, "no data present");
109 PyObject
*spoolss_hnd_getprinterdata(PyObject
*self
, PyObject
*args
, PyObject
*kw
)
111 spoolss_policy_hnd_object
*hnd
= (spoolss_policy_hnd_object
*)self
;
112 static char *kwlist
[] = { "value", NULL
};
116 REGISTRY_VALUE value
;
118 /* Parse parameters */
120 if (!PyArg_ParseTupleAndKeywords(args
, kw
, "s", kwlist
, &valuename
))
123 /* Call rpc function */
125 werror
= cli_spoolss_getprinterdata(
126 hnd
->cli
, hnd
->mem_ctx
, &hnd
->pol
, valuename
,
129 if (!W_ERROR_IS_OK(werror
)) {
130 PyErr_SetObject(spoolss_werror
, py_werror_tuple(werror
));
135 &result
, NULL
, valuename
, value
.type
, value
.data_p
,
141 PyObject
*spoolss_hnd_setprinterdata(PyObject
*self
, PyObject
*args
, PyObject
*kw
)
143 spoolss_policy_hnd_object
*hnd
= (spoolss_policy_hnd_object
*)self
;
144 static char *kwlist
[] = { "data", NULL
};
148 REGISTRY_VALUE value
;
150 if (!PyArg_ParseTupleAndKeywords(
151 args
, kw
, "O!", kwlist
, &PyDict_Type
, &py_data
))
154 if (!py_to_printerdata(
155 NULL
, &valuename
, &value
.type
, &value
.data_p
,
156 &value
.size
, py_data
))
159 fstrcpy(value
.valuename
, valuename
);
161 /* Call rpc function */
163 werror
= cli_spoolss_setprinterdata(
164 hnd
->cli
, hnd
->mem_ctx
, &hnd
->pol
, &value
);
166 if (!W_ERROR_IS_OK(werror
)) {
167 PyErr_SetObject(spoolss_werror
, py_werror_tuple(werror
));
175 PyObject
*spoolss_hnd_enumprinterdata(PyObject
*self
, PyObject
*args
, PyObject
*kw
)
177 spoolss_policy_hnd_object
*hnd
= (spoolss_policy_hnd_object
*)self
;
178 static char *kwlist
[] = { NULL
};
179 uint32 data_needed
, value_needed
, ndx
= 0;
182 REGISTRY_VALUE value
;
184 if (!PyArg_ParseTupleAndKeywords(args
, kw
, "", kwlist
))
187 /* Get max buffer sizes for value and data */
189 werror
= cli_spoolss_enumprinterdata(
190 hnd
->cli
, hnd
->mem_ctx
, &hnd
->pol
, ndx
, 0, 0,
191 &value_needed
, &data_needed
, NULL
);
193 if (!W_ERROR_IS_OK(werror
)) {
194 PyErr_SetObject(spoolss_werror
, py_werror_tuple(werror
));
198 /* Iterate over all printerdata */
200 result
= PyDict_New();
202 while (W_ERROR_IS_OK(werror
)) {
205 werror
= cli_spoolss_enumprinterdata(
206 hnd
->cli
, hnd
->mem_ctx
, &hnd
->pol
, ndx
,
207 value_needed
, data_needed
, NULL
, NULL
, &value
);
209 if (py_from_printerdata(
210 &obj
, NULL
, value
.valuename
, value
.type
,
211 value
.data_p
, value
.size
))
212 PyDict_SetItemString(result
, value
.valuename
, obj
);
220 PyObject
*spoolss_hnd_deleteprinterdata(PyObject
*self
, PyObject
*args
, PyObject
*kw
)
222 spoolss_policy_hnd_object
*hnd
= (spoolss_policy_hnd_object
*)self
;
223 static char *kwlist
[] = { "value", NULL
};
227 /* Parse parameters */
229 if (!PyArg_ParseTupleAndKeywords(args
, kw
, "s", kwlist
, &value
))
232 /* Call rpc function */
234 werror
= cli_spoolss_deleteprinterdata(
235 hnd
->cli
, hnd
->mem_ctx
, &hnd
->pol
, value
);
237 if (!W_ERROR_IS_OK(werror
)) {
238 PyErr_SetObject(spoolss_werror
, py_werror_tuple(werror
));
246 PyObject
*spoolss_hnd_getprinterdataex(PyObject
*self
, PyObject
*args
, PyObject
*kw
)
248 spoolss_policy_hnd_object
*hnd
= (spoolss_policy_hnd_object
*)self
;
249 static char *kwlist
[] = { "key", "value", NULL
};
250 char *key
, *valuename
;
253 REGISTRY_VALUE value
;
255 /* Parse parameters */
257 if (!PyArg_ParseTupleAndKeywords(args
, kw
, "ss", kwlist
, &key
, &valuename
))
260 /* Call rpc function */
262 werror
= cli_spoolss_getprinterdataex(
263 hnd
->cli
, hnd
->mem_ctx
, &hnd
->pol
, key
,
266 if (!W_ERROR_IS_OK(werror
)) {
267 PyErr_SetObject(spoolss_werror
, py_werror_tuple(werror
));
272 &result
, key
, valuename
, value
.type
, value
.data_p
, value
.size
);
277 PyObject
*spoolss_hnd_setprinterdataex(PyObject
*self
, PyObject
*args
, PyObject
*kw
)
279 spoolss_policy_hnd_object
*hnd
= (spoolss_policy_hnd_object
*)self
;
280 static char *kwlist
[] = { "data", NULL
};
282 char *keyname
, *valuename
;
284 REGISTRY_VALUE value
;
286 if (!PyArg_ParseTupleAndKeywords(
287 args
, kw
, "O!", kwlist
, &PyDict_Type
, &py_data
))
290 if (!py_to_printerdata(
291 &keyname
, &valuename
, &value
.type
, &value
.data_p
, &value
.size
, py_data
))
294 fstrcpy(value
.valuename
, valuename
);
296 /* Call rpc function */
298 werror
= cli_spoolss_setprinterdataex(
299 hnd
->cli
, hnd
->mem_ctx
, &hnd
->pol
, keyname
, &value
);
301 if (!W_ERROR_IS_OK(werror
)) {
302 PyErr_SetObject(spoolss_werror
, py_werror_tuple(werror
));
310 PyObject
*spoolss_hnd_enumprinterdataex(PyObject
*self
, PyObject
*args
, PyObject
*kw
)
312 spoolss_policy_hnd_object
*hnd
= (spoolss_policy_hnd_object
*)self
;
313 static char *kwlist
[] = { "key", NULL
};
320 if (!PyArg_ParseTupleAndKeywords(args
, kw
, "s", kwlist
, &key
))
323 /* Get max buffer sizes for value and data */
325 werror
= cli_spoolss_enumprinterdataex(hnd
->cli
, hnd
->mem_ctx
, &hnd
->pol
, key
, &ctr
);
327 if (!W_ERROR_IS_OK(werror
)) {
328 PyErr_SetObject(spoolss_werror
, py_werror_tuple(werror
));
332 /* Iterate over all printerdata */
334 result
= PyDict_New();
336 for (i
= 0; i
< regval_ctr_numvals(&ctr
); i
++) {
337 REGISTRY_VALUE
*value
;
341 value
= regval_ctr_specific_value(&ctr
, i
);
343 if (py_from_printerdata(
344 &item
, key
, value
->valuename
, value
->type
,
345 value
->data_p
, value
->size
))
346 PyDict_SetItemString(result
, value
->valuename
, item
);
352 PyObject
*spoolss_hnd_deleteprinterdataex(PyObject
*self
, PyObject
*args
, PyObject
*kw
)
354 spoolss_policy_hnd_object
*hnd
= (spoolss_policy_hnd_object
*)self
;
355 static char *kwlist
[] = { "key", "value", NULL
};
359 /* Parse parameters */
361 if (!PyArg_ParseTupleAndKeywords(args
, kw
, "ss", kwlist
, &key
, &value
))
364 /* Call rpc function */
366 werror
= cli_spoolss_deleteprinterdataex(
367 hnd
->cli
, hnd
->mem_ctx
, &hnd
->pol
, key
, value
);
369 if (!W_ERROR_IS_OK(werror
)) {
370 PyErr_SetObject(spoolss_werror
, py_werror_tuple(werror
));
378 PyObject
*spoolss_hnd_enumprinterkey(PyObject
*self
, PyObject
*args
,
381 spoolss_policy_hnd_object
*hnd
= (spoolss_policy_hnd_object
*)self
;
382 static char *kwlist
[] = { "key", NULL
};
389 /* Parse parameters */
391 if (!PyArg_ParseTupleAndKeywords(args
, kw
, "s", kwlist
, &keyname
))
394 /* Call rpc function */
396 werror
= cli_spoolss_enumprinterkey(
397 hnd
->cli
, hnd
->mem_ctx
, &hnd
->pol
,
398 keyname
, &keylist
, &keylist_len
);
400 if (!W_ERROR_IS_OK(werror
)) {
401 PyErr_SetObject(spoolss_werror
, py_werror_tuple(werror
));
405 result
= from_unistr_list(keylist
);
412 PyObject
*spoolss_hnd_deleteprinterkey(PyObject
*self
, PyObject
*args
,
415 spoolss_policy_hnd_object
*hnd
= (spoolss_policy_hnd_object
*)self
;
416 static char *kwlist
[] = { "key", NULL
};
420 if (!PyArg_ParseTupleAndKeywords(args
, kw
, "s", kwlist
, &keyname
))