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 3 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, see <http://www.gnu.org/licenses/>.
20 #include "python/py_spoolss.h"
21 #include "python/py_conv.h"
23 static BOOL py_from_printerdata(PyObject **dict, char *key, char *value,
24 uint16 data_type, uint8 *data,
29 PyDict_SetItemString(*dict, "key", Py_BuildValue("s", key ? key : ""));
30 PyDict_SetItemString(*dict, "value", Py_BuildValue("s", value));
31 PyDict_SetItemString(*dict, "type", Py_BuildValue("i", data_type));
33 PyDict_SetItemString(*dict, "data",
34 Py_BuildValue("s#", data, data_size));
39 static BOOL py_to_printerdata(char **key, char **value, uint16 *data_type,
40 uint8 **data, uint32 *data_size,
45 if ((obj = PyDict_GetItemString(dict, "key"))) {
47 if (!PyString_Check(obj)) {
48 PyErr_SetString(spoolss_error,
54 *key = PyString_AsString(obj);
62 if ((obj = PyDict_GetItemString(dict, "value"))) {
64 if (!PyString_Check(obj)) {
65 PyErr_SetString(spoolss_error,
66 "value not a string");
70 *value = PyString_AsString(obj);
72 PyErr_SetString(spoolss_error, "no value present");
76 if ((obj = PyDict_GetItemString(dict, "type"))) {
78 if (!PyInt_Check(obj)) {
79 PyErr_SetString(spoolss_error,
80 "type not an integer");
84 *data_type = PyInt_AsLong(obj);
86 PyErr_SetString(spoolss_error, "no type present");
90 if ((obj = PyDict_GetItemString(dict, "data"))) {
92 if (!PyString_Check(obj)) {
93 PyErr_SetString(spoolss_error,
98 *data = PyString_AsString(obj);
99 *data_size = PyString_Size(obj);
101 PyErr_SetString(spoolss_error, "no data present");
108 PyObject *spoolss_hnd_getprinterdata(PyObject *self, PyObject *args, PyObject *kw)
110 spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
111 static char *kwlist[] = { "value", NULL };
115 REGISTRY_VALUE value;
117 /* Parse parameters */
119 if (!PyArg_ParseTupleAndKeywords(args, kw, "s", kwlist, &valuename))
122 /* Call rpc function */
124 werror = rpccli_spoolss_getprinterdata(
125 hnd->cli, hnd->mem_ctx, &hnd->pol, valuename,
128 if (!W_ERROR_IS_OK(werror)) {
129 PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
134 &result, NULL, valuename, value.type, value.data_p,
140 PyObject *spoolss_hnd_setprinterdata(PyObject *self, PyObject *args, PyObject *kw)
142 spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
143 static char *kwlist[] = { "data", NULL };
147 REGISTRY_VALUE value;
149 if (!PyArg_ParseTupleAndKeywords(
150 args, kw, "O!", kwlist, &PyDict_Type, &py_data))
153 if (!py_to_printerdata(
154 NULL, &valuename, &value.type, &value.data_p,
155 &value.size, py_data))
158 fstrcpy(value.valuename, valuename);
160 /* Call rpc function */
162 werror = rpccli_spoolss_setprinterdata(
163 hnd->cli, hnd->mem_ctx, &hnd->pol, &value);
165 if (!W_ERROR_IS_OK(werror)) {
166 PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
174 PyObject *spoolss_hnd_enumprinterdata(PyObject *self, PyObject *args, PyObject *kw)
176 spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
177 static char *kwlist[] = { NULL };
178 uint32 data_needed, value_needed, ndx = 0;
181 REGISTRY_VALUE value;
183 if (!PyArg_ParseTupleAndKeywords(args, kw, "", kwlist))
186 /* Get max buffer sizes for value and data */
188 werror = rpccli_spoolss_enumprinterdata(
189 hnd->cli, hnd->mem_ctx, &hnd->pol, ndx, 0, 0,
190 &value_needed, &data_needed, NULL);
192 if (!W_ERROR_IS_OK(werror)) {
193 PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
197 /* Iterate over all printerdata */
199 result = PyDict_New();
201 while (W_ERROR_IS_OK(werror)) {
204 werror = rpccli_spoolss_enumprinterdata(
205 hnd->cli, hnd->mem_ctx, &hnd->pol, ndx,
206 value_needed, data_needed, NULL, NULL, &value);
208 if (py_from_printerdata(
209 &obj, NULL, value.valuename, value.type,
210 value.data_p, value.size))
211 PyDict_SetItemString(result, value.valuename, obj);
219 PyObject *spoolss_hnd_deleteprinterdata(PyObject *self, PyObject *args, PyObject *kw)
221 spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
222 static char *kwlist[] = { "value", NULL };
226 /* Parse parameters */
228 if (!PyArg_ParseTupleAndKeywords(args, kw, "s", kwlist, &value))
231 /* Call rpc function */
233 werror = rpccli_spoolss_deleteprinterdata(
234 hnd->cli, hnd->mem_ctx, &hnd->pol, value);
236 if (!W_ERROR_IS_OK(werror)) {
237 PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
245 PyObject *spoolss_hnd_getprinterdataex(PyObject *self, PyObject *args, PyObject *kw)
247 spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
248 static char *kwlist[] = { "key", "value", NULL };
249 char *key, *valuename;
252 REGISTRY_VALUE value;
254 /* Parse parameters */
256 if (!PyArg_ParseTupleAndKeywords(args, kw, "ss", kwlist, &key, &valuename))
259 /* Call rpc function */
261 werror = rpccli_spoolss_getprinterdataex(
262 hnd->cli, hnd->mem_ctx, &hnd->pol, key,
265 if (!W_ERROR_IS_OK(werror)) {
266 PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
271 &result, key, valuename, value.type, value.data_p, value.size);
276 PyObject *spoolss_hnd_setprinterdataex(PyObject *self, PyObject *args, PyObject *kw)
278 spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
279 static char *kwlist[] = { "data", NULL };
281 char *keyname, *valuename;
283 REGISTRY_VALUE value;
285 if (!PyArg_ParseTupleAndKeywords(
286 args, kw, "O!", kwlist, &PyDict_Type, &py_data))
289 if (!py_to_printerdata(
290 &keyname, &valuename, &value.type, &value.data_p, &value.size, py_data))
293 fstrcpy(value.valuename, valuename);
295 /* Call rpc function */
297 werror = rpccli_spoolss_setprinterdataex(
298 hnd->cli, hnd->mem_ctx, &hnd->pol, keyname, &value);
300 if (!W_ERROR_IS_OK(werror)) {
301 PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
309 PyObject *spoolss_hnd_enumprinterdataex(PyObject *self, PyObject *args, PyObject *kw)
311 spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
312 static char *kwlist[] = { "key", NULL };
319 if (!PyArg_ParseTupleAndKeywords(args, kw, "s", kwlist, &key))
322 if (!(ctr = TALLOC_ZERO_P(hnd->mem_ctx, REGVAL_CTR))) {
323 PyErr_SetString(spoolss_error, "talloc failed");
327 /* Get max buffer sizes for value and data */
329 werror = rpccli_spoolss_enumprinterdataex(
330 hnd->cli, hnd->mem_ctx, &hnd->pol, key, &ctr);
332 if (!W_ERROR_IS_OK(werror)) {
333 PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
337 /* Iterate over all printerdata */
339 result = PyDict_New();
341 for (i = 0; i < regval_ctr_numvals(&ctr); i++) {
342 REGISTRY_VALUE *value;
346 value = regval_ctr_specific_value(&ctr, i);
348 if (py_from_printerdata(
349 &item, key, value->valuename, value->type,
350 value->data_p, value->size))
351 PyDict_SetItemString(result, value->valuename, item);
357 PyObject *spoolss_hnd_deleteprinterdataex(PyObject *self, PyObject *args, PyObject *kw)
359 spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
360 static char *kwlist[] = { "key", "value", NULL };
364 /* Parse parameters */
366 if (!PyArg_ParseTupleAndKeywords(args, kw, "ss", kwlist, &key, &value))
369 /* Call rpc function */
371 werror = rpccli_spoolss_deleteprinterdataex(
372 hnd->cli, hnd->mem_ctx, &hnd->pol, key, value);
374 if (!W_ERROR_IS_OK(werror)) {
375 PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
383 PyObject *spoolss_hnd_enumprinterkey(PyObject *self, PyObject *args,
386 spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
387 static char *kwlist[] = { "key", NULL };
394 /* Parse parameters */
396 if (!PyArg_ParseTupleAndKeywords(args, kw, "s", kwlist, &keyname))
399 /* Call rpc function */
401 werror = rpccli_spoolss_enumprinterkey(
402 hnd->cli, hnd->mem_ctx, &hnd->pol, keyname, &keylist,
405 if (!W_ERROR_IS_OK(werror)) {
406 PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
410 result = from_unistr_list(keylist);
417 PyObject *spoolss_hnd_deleteprinterkey(PyObject *self, PyObject *args,
420 spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
421 static char *kwlist[] = { "key", NULL };
425 if (!PyArg_ParseTupleAndKeywords(args, kw, "s", kwlist, &keyname))