summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/python/py_spoolss.c14
-rw-r--r--source3/python/py_spoolss_printerdata.c160
-rw-r--r--source3/python/py_spoolss_proto.h6
3 files changed, 180 insertions, 0 deletions
diff --git a/source3/python/py_spoolss.c b/source3/python/py_spoolss.c
index a8372fd213..d57867dd7c 100644
--- a/source3/python/py_spoolss.c
+++ b/source3/python/py_spoolss.c
@@ -213,6 +213,20 @@ Set the form given by the dictionary argument.
METH_VARARGS | METH_KEYWORDS,
"Notify spooler that a document is about to be printed." },
+ /* Printer data */
+
+ { "getprinterdata", spoolss_getprinterdata,
+ METH_VARARGS | METH_KEYWORDS,
+ "Get printer data." },
+
+ { "setprinterdata", spoolss_setprinterdata,
+ METH_VARARGS | METH_KEYWORDS,
+ "Set printer data." },
+
+ { "enumprinterdata", spoolss_enumprinterdata,
+ METH_VARARGS | METH_KEYWORDS,
+ "Enumerate printer data." },
+
{ NULL }
};
diff --git a/source3/python/py_spoolss_printerdata.c b/source3/python/py_spoolss_printerdata.c
new file mode 100644
index 0000000000..622c487b8c
--- /dev/null
+++ b/source3/python/py_spoolss_printerdata.c
@@ -0,0 +1,160 @@
+/*
+ Python wrappers for DCERPC/SMB client routines.
+
+ Copyright (C) Tim Potter, 2002
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "python/py_spoolss.h"
+
+static BOOL py_from_printerdata(PyObject **dict, char *value,
+ uint32 data_type, char *data,
+ uint32 data_size)
+{
+ *dict = PyDict_New();
+
+ PyDict_SetItemString(*dict, "type", Py_BuildValue("i", data_type));
+ PyDict_SetItemString(*dict, "value", Py_BuildValue("s", value));
+
+ PyDict_SetItemString(*dict, "data",
+ Py_BuildValue("s#", data, data_size));
+
+ return True;
+}
+
+static BOOL py_to_printerdata(char **value, uint32 *data_type,
+ char **data, uint32 *data_size,
+ PyObject *dict)
+{
+ PyObject *obj;
+
+ if ((obj = PyDict_GetItemString(dict, "type"))) {
+
+ if (!PyInt_Check(obj)) {
+ PyErr_SetString(spoolss_error,
+ "type not an integer");
+ return False;
+ }
+
+ *data_type = PyInt_AsLong(obj);
+ } else {
+ PyErr_SetString(spoolss_error, "no type present");
+ return False;
+ }
+
+ if ((obj = PyDict_GetItemString(dict, "value"))) {
+
+ if (!PyString_Check(obj)) {
+ PyErr_SetString(spoolss_error,
+ "value not a string");
+ return False;
+ }
+
+ *value = PyString_AsString(obj);
+ } else {
+ PyErr_SetString(spoolss_error, "no value present");
+ return False;
+ }
+
+ if ((obj = PyDict_GetItemString(dict, "data"))) {
+
+ if (!PyString_Check(obj)) {
+ PyErr_SetString(spoolss_error,
+ "data not a string");
+ return False;
+ }
+
+ *data = PyString_AsString(obj);
+ *data_size = PyString_Size(obj);
+ } else {
+ PyErr_SetString(spoolss_error, "no data present");
+ return False;
+ }
+
+ return True;
+}
+
+PyObject *spoolss_getprinterdata(PyObject *self, PyObject *args, PyObject *kw)
+{
+ spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
+ static char *kwlist[] = { "value", NULL };
+ char *value;
+ WERROR werror;
+ uint32 needed, data_type, data_size;
+ char *data;
+ PyObject *result;
+
+ /* Parse parameters */
+
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s", kwlist, &value))
+ return NULL;
+
+ /* Call rpc function */
+
+ werror = cli_spoolss_getprinterdata(
+ hnd->cli, hnd->mem_ctx, 0, &needed, &hnd->pol, value,
+ &data_type, &data, &data_size);
+
+ if (W_ERROR_V(werror) == ERRmoredata)
+ werror = cli_spoolss_getprinterdata(
+ hnd->cli, hnd->mem_ctx, needed, NULL, &hnd->pol, value,
+ &data_type, &data, &data_size);
+
+ if (!W_ERROR_IS_OK(werror)) {
+ PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
+ return NULL;
+ }
+
+ py_from_printerdata(&result, value, data_type, data, needed);
+
+ return result;
+}
+
+PyObject *spoolss_setprinterdata(PyObject *self, PyObject *args, PyObject *kw)
+{
+ spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
+ static char *kwlist[] = { "data", NULL };
+ PyObject *py_data;
+ char *value, *data;
+ uint32 data_size, data_type;
+ WERROR werror;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "O!", kwlist,
+ &PyDict_Type, &py_data))
+ return NULL;
+
+ if (!py_to_printerdata(&value, &data_type, &data, &data_size, py_data))
+ return NULL;
+
+ /* Call rpc function */
+
+ werror = cli_spoolss_setprinterdata(
+ hnd->cli, hnd->mem_ctx, &hnd->pol, value, data_type,
+ data, data_size);
+
+ if (!W_ERROR_IS_OK(werror)) {
+ PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
+ return NULL;
+ }
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+PyObject *spoolss_enumprinterdata(PyObject *self, PyObject *args, PyObject *kw)
+{
+ return NULL;
+}
diff --git a/source3/python/py_spoolss_proto.h b/source3/python/py_spoolss_proto.h
index ae9abf5351..1f08b1b615 100644
--- a/source3/python/py_spoolss_proto.h
+++ b/source3/python/py_spoolss_proto.h
@@ -75,6 +75,12 @@ BOOL py_to_PORT_INFO_1(PORT_INFO_1 *info, PyObject *dict);
BOOL py_from_PORT_INFO_2(PyObject **dict, PORT_INFO_2 *info);
BOOL py_to_PORT_INFO_2(PORT_INFO_2 *info, PyObject *dict);
+/* The following definitions come from python/py_spoolss_printerdata.c */
+
+PyObject *spoolss_getprinterdata(PyObject *self, PyObject *args, PyObject *kw);
+PyObject *spoolss_setprinterdata(PyObject *self, PyObject *args, PyObject *kw);
+PyObject *spoolss_enumprinterdata(PyObject *self, PyObject *args, PyObject *kw);
+
/* The following definitions come from python/py_spoolss_printers.c */
PyObject *spoolss_openprinter(PyObject *self, PyObject *args, PyObject *kw);