diff options
-rw-r--r-- | source3/python/py_spoolss.c | 302 | ||||
-rw-r--r-- | source3/python/py_spoolss.h | 8 |
2 files changed, 99 insertions, 211 deletions
diff --git a/source3/python/py_spoolss.c b/source3/python/py_spoolss.c index 3edc622901..4d64ab0a76 100644 --- a/source3/python/py_spoolss.c +++ b/source3/python/py_spoolss.c @@ -20,80 +20,17 @@ #include "includes.h" #include "Python.h" + #include "python/py_common.h" +#include "python/py_conv.h" #include "python/py_spoolss.h" #include "python/py_spoolss_forms.h" +#include "python/py_spoolss_ports.h" /* Exceptions this module can raise */ PyObject *spoolss_error, *spoolss_werror; -static void py_policy_hnd_dealloc(PyObject* self) -{ - PyObject_Del(self); -} - - - -static PyMethodDef spoolss_hnd_methods[] = { - - /* Forms */ - - { "enumforms", spoolss_enumforms, METH_VARARGS | METH_KEYWORDS, - "Enumerate forms" }, - - { "setform", spoolss_setform, METH_VARARGS | METH_KEYWORDS, - "Modify properties of a form" }, - - { "addform", spoolss_addform, METH_VARARGS | METH_KEYWORDS, - "Insert a form" }, - - { "getform", spoolss_getform, METH_VARARGS | METH_KEYWORDS, - "Fetch form properties" }, - - { "deleteform", spoolss_deleteform, METH_VARARGS | METH_KEYWORDS, - "Delete a form" }, - - { NULL } - -}; -static PyObject *py_policy_hnd_getattr(PyObject *self, char *attrname) -{ - return Py_FindMethod(spoolss_hnd_methods, self, attrname); -} - -static PyObject *new_policy_hnd_object(struct cli_state *cli, - TALLOC_CTX *mem_ctx, POLICY_HND *pol) -{ - spoolss_policy_hnd_object *o; - - o = PyObject_New(spoolss_policy_hnd_object, &spoolss_policy_hnd_type); - - o->cli = cli; - o->mem_ctx = mem_ctx; - memcpy(&o->pol, pol, sizeof(POLICY_HND)); - - return (PyObject*)o; -} - -PyTypeObject spoolss_policy_hnd_type = { - PyObject_HEAD_INIT(NULL) - 0, - "Policy Handle", - sizeof(spoolss_policy_hnd_object), - 0, - py_policy_hnd_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - py_policy_hnd_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ -}; - /* * Routines to convert from python hashes to Samba structures */ @@ -274,107 +211,6 @@ struct pyconv py_DRIVER_INFO_6[] = { { NULL } }; -static void fstr_pull(fstring str, UNISTR *uni) -{ - rpcstr_pull(str, uni->buffer, sizeof(fstring), 0, STR_TERMINATE); -} - -/* Convert a structure to a Python dict */ - -PyObject *from_struct(void *s, struct pyconv *conv) -{ - PyObject *obj, *item; - int i; - - obj = PyDict_New(); - - for (i = 0; conv[i].name; i++) { - switch (conv[i].type) { - case PY_UNISTR: { - UNISTR *u = (UNISTR *)((char *)s + conv[i].offset); - fstring s = ""; - - if (u->buffer) - fstr_pull(s, u); - - item = PyString_FromString(s); - PyDict_SetItemString(obj, conv[i].name, item); - - break; - } - case PY_UINT32: { - uint32 *u = (uint32 *)((char *)s + conv[i].offset); - - item = PyInt_FromLong(*u); - PyDict_SetItemString(obj, conv[i].name, item); - - break; - } - case PY_UINT16: { - uint16 *u = (uint16 *)((char *)s + conv[i].offset); - - item = PyInt_FromLong(*u); - PyDict_SetItemString(obj, conv[i].name, item); - - break; - } - default: - break; - } - } - - return obj; -} - -/* Convert a Python dict to a structure */ - -void to_struct(void *s, PyObject *dict, struct pyconv *conv) -{ - int i; - - for (i = 0; conv[i].name; i++) { - PyObject *obj; - - obj = PyDict_GetItemString(dict, conv[i].name); - - switch (conv[i].type) { - case PY_UNISTR: { - UNISTR *u = (UNISTR *)((char *)s + conv[i].offset); - char *s = ""; - - if (obj && PyString_Check(obj)) - s = PyString_AsString(obj); - - init_unistr(u, s); - - break; - } - case PY_UINT32: { - uint32 *u = (uint32 *)((char *)s + conv[i].offset); - - if (obj && PyInt_Check(obj)) - *u = PyInt_AsLong(obj); - else - *u = 0; - - break; - } - case PY_UINT16: { - uint16 *u = (uint16 *)((char *)s + conv[i].offset); - - if (obj && PyInt_Check(obj)) - *u = PyInt_AsLong(obj); - else - *u = 0; - - break; - } - default: - break; - } - } -} - /* Return a cli_state struct opened on the SPOOLSS pipe. If credentials are passed use them. */ @@ -452,6 +288,20 @@ static struct cli_state *open_pipe_creds(char *system_name, PyObject *creds, return cli; } +static PyObject *new_policy_hnd_object(struct cli_state *cli, + TALLOC_CTX *mem_ctx, POLICY_HND *pol) +{ + spoolss_policy_hnd_object *o; + + o = PyObject_New(spoolss_policy_hnd_object, &spoolss_policy_hnd_type); + + o->cli = cli; + o->mem_ctx = mem_ctx; + memcpy(&o->pol, pol, sizeof(POLICY_HND)); + + return (PyObject*)o; +} + /* Open a printer */ static PyObject *spoolss_openprinter(PyObject *self, PyObject *args, @@ -549,24 +399,21 @@ static PyObject *spoolss_closeprinter(PyObject *self, PyObject *args) static PyObject *spoolss_getprinterdriver(PyObject *self, PyObject *args, PyObject *kw) { - PyObject *po; - spoolss_policy_hnd_object *hnd; + spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self; WERROR werror; PyObject *result; PRINTER_DRIVER_CTR ctr; int level = 1; uint32 needed; char *arch = "Windows NT x86"; - static char *kwlist[] = {"hnd", "level", "arch", NULL}; + static char *kwlist[] = {"level", "arch", NULL}; /* Parse parameters */ - if (!PyArg_ParseTupleAndKeywords(args, kw, "O!|is", kwlist, - &spoolss_policy_hnd_type, &po, &level, &arch)) + if (!PyArg_ParseTupleAndKeywords(args, kw, "|is", kwlist, + &level, &arch)) return NULL; - hnd = (spoolss_policy_hnd_object *)po; - /* Call rpc function */ werror = cli_spoolss_getprinterdriver( @@ -608,24 +455,21 @@ static PyObject *spoolss_getprinterdriver(PyObject *self, PyObject *args, static PyObject *spoolss_enumprinterdrivers(PyObject *self, PyObject *args, PyObject *kw) { - PyObject *po; - spoolss_policy_hnd_object *hnd; + spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self; WERROR werror; PyObject *result; PRINTER_DRIVER_CTR ctr; int level = 1, i; uint32 needed, num_drivers; char *arch = "Windows NT x86"; - static char *kwlist[] = {"hnd", "level", "arch", NULL}; + static char *kwlist[] = {"level", "arch", NULL}; /* Parse parameters */ - if (!PyArg_ParseTupleAndKeywords(args, kw, "O!|is", kwlist, - &spoolss_policy_hnd_type, &po, &level, &arch)) + if (!PyArg_ParseTupleAndKeywords(args, kw, "|is", kwlist, + &level, &arch)) return NULL; - hnd = (spoolss_policy_hnd_object *)po; - /* Call rpc function */ werror = cli_spoolss_enumprinterdrivers( @@ -784,23 +628,19 @@ PyObject *PyDEVICEMODE_FromDEVICEMODE(DEVICEMODE *devmode) static PyObject *spoolss_getprinter(PyObject *self, PyObject *args, PyObject *kw) { - PyObject *po; - spoolss_policy_hnd_object *hnd; + spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self; WERROR werror; PyObject *result; PRINTER_INFO_CTR ctr; int level = 1; uint32 needed; - static char *kwlist[] = {"hnd", "level", NULL}; + static char *kwlist[] = {"level", NULL}; /* Parse parameters */ - if (!PyArg_ParseTupleAndKeywords(args, kw, "O!|i", kwlist, - &spoolss_policy_hnd_type, &po, &level)) + if (!PyArg_ParseTupleAndKeywords(args, kw, "|i", kwlist, &level)) return NULL; - hnd = (spoolss_policy_hnd_object *)po; - /* Call rpc function */ werror = cli_spoolss_getprinter( @@ -865,13 +705,12 @@ static PyObject *spoolss_getprinter(PyObject *self, PyObject *args, static PyObject *spoolss_setprinter(PyObject *self, PyObject *args, PyObject *kw) { - PyObject *po; - spoolss_policy_hnd_object *hnd; + spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self; WERROR werror; PyObject *result, *info; PRINTER_INFO_CTR ctr; int level = 1; - static char *kwlist[] = { "hnd", "dict", "level", NULL }; + static char *kwlist[] = {"dict", "level", NULL}; union { PRINTER_INFO_0 printers_0; PRINTER_INFO_1 printers_1; @@ -883,13 +722,10 @@ static PyObject *spoolss_setprinter(PyObject *self, PyObject *args, /* Parse parameters */ - if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!|i", kwlist, - &spoolss_policy_hnd_type, &po, + if (!PyArg_ParseTupleAndKeywords(args, kw, "O!|i", kwlist, &PyDict_Type, &info, &level)) return NULL; - hnd = (spoolss_policy_hnd_object *)po; - /* Fill in printer info */ ZERO_STRUCT(ctr); @@ -1024,8 +860,6 @@ static PyObject *spoolss_enumprinters(PyObject *self, PyObject *args, * Method dispatch table */ -#include "python/py_spoolss_forms.h" - static PyMethodDef spoolss_methods[] = { /* Open/close printer handles */ @@ -1036,6 +870,31 @@ static PyMethodDef spoolss_methods[] = { { "closeprinter", spoolss_closeprinter, METH_VARARGS, "Close printer" }, + /* Enumerate printers */ + + { "enumprinters", spoolss_enumprinters, METH_VARARGS | METH_KEYWORDS, + "Enumerate printers" }, + + /* Ports */ + + { "enumports", spoolss_enumports, METH_VARARGS, + "Enumerate ports" }, + + { NULL } +}; + +/* Methods attached to a spoolss handle object */ + +static PyMethodDef spoolss_hnd_methods[] = { + + /* Printer info */ + + { "getprinter", spoolss_getprinter, METH_VARARGS | METH_KEYWORDS, + "Fetch printer information" }, + + { "setprinter", spoolss_setprinter, METH_VARARGS | METH_KEYWORDS, + "Set printer information" }, + /* Printer drivers */ { "getprinterdriver", spoolss_getprinterdriver, @@ -1044,16 +903,53 @@ static PyMethodDef spoolss_methods[] = { { "enumprinterdrivers", spoolss_enumprinterdrivers, METH_VARARGS | METH_KEYWORDS, "Enumerate printer drivers" }, - { "getprinter", spoolss_getprinter, METH_VARARGS | METH_KEYWORDS, - "Fetch printer information" }, + /* Forms */ - { "setprinter", spoolss_setprinter, METH_VARARGS | METH_KEYWORDS, - "Set printer information" }, + { "enumforms", spoolss_enumforms, METH_VARARGS | METH_KEYWORDS, + "Enumerate forms" }, - { "enumprinters", spoolss_enumprinters, METH_VARARGS | METH_KEYWORDS, - "Enumerate printers" }, + { "setform", spoolss_setform, METH_VARARGS | METH_KEYWORDS, + "Modify properties of a form" }, + + { "addform", spoolss_addform, METH_VARARGS | METH_KEYWORDS, + "Insert a form" }, + + { "getform", spoolss_getform, METH_VARARGS | METH_KEYWORDS, + "Fetch form properties" }, + + { "deleteform", spoolss_deleteform, METH_VARARGS | METH_KEYWORDS, + "Delete a form" }, { NULL } + +}; + +static void py_policy_hnd_dealloc(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject *py_policy_hnd_getattr(PyObject *self, char *attrname) +{ + return Py_FindMethod(spoolss_hnd_methods, self, attrname); +} + +PyTypeObject spoolss_policy_hnd_type = { + PyObject_HEAD_INIT(NULL) + 0, + "Policy Handle", + sizeof(spoolss_policy_hnd_object), + 0, + py_policy_hnd_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + py_policy_hnd_getattr, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ }; /* Initialise constants */ diff --git a/source3/python/py_spoolss.h b/source3/python/py_spoolss.h index ebe6daa5cc..766e420c6e 100644 --- a/source3/python/py_spoolss.h +++ b/source3/python/py_spoolss.h @@ -26,14 +26,6 @@ #undef offsetof #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) -enum pyconv_types { PY_UNISTR, PY_UINT32, PY_UINT16 }; - -struct pyconv { - char *name; /* Name of member */ - enum pyconv_types type; /* Type */ - size_t offset; /* Offset into structure */ -}; - typedef struct { PyObject_HEAD struct cli_state *cli; |