r23784: use the GPLv3 boilerplate as recommended by the FSF and the license text
[kai/samba.git] / source3 / python / py_spoolss_forms.c
index 75e37f3f0d817c923f7cc35253ff1fb426eccee3..df2067aa8bee8c9fa3a8092e2fa00534bac07281 100644 (file)
@@ -5,7 +5,7 @@
    
    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
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    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.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "python/py_spoolss.h"
 
-struct pyconv py_FORM[] = {
-       { "flags", PY_UINT32, offsetof(FORM, flags) },
-       { "width", PY_UINT32, offsetof(FORM, size_x) },
-       { "length", PY_UINT32, offsetof(FORM, size_y) },
-       { "top", PY_UINT32, offsetof(FORM, top) },
-       { "left", PY_UINT32, offsetof(FORM, left) },
-       { "right", PY_UINT32, offsetof(FORM, right) },
-       { "bottom", PY_UINT32, offsetof(FORM, bottom) },
-       { NULL }
-};
-
-struct pyconv py_FORM_1[] = {
-       { "flags", PY_UINT32, offsetof(FORM_1, flag) },
-       { "width", PY_UINT32, offsetof(FORM_1, width) },
-       { "length", PY_UINT32, offsetof(FORM_1, length) },
-       { "top", PY_UINT32, offsetof(FORM_1, top) },
-       { "left", PY_UINT32, offsetof(FORM_1, left) },
-       { "right", PY_UINT32, offsetof(FORM_1, right) },
-       { "bottom", PY_UINT32, offsetof(FORM_1, bottom) },
-       { "name", PY_UNISTR, offsetof(FORM_1, name) },
-       { NULL }
-};
-
 /* Add a form */
 
-PyObject *spoolss_addform(PyObject *self, PyObject *args, PyObject *kw)
+PyObject *spoolss_hnd_addform(PyObject *self, PyObject *args, PyObject *kw)
 {
        spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
        WERROR werror;
-       PyObject *py_form;
+       PyObject *info;
        FORM form;
-       int level = 1;
-       static char *kwlist[] = {"form", "level", NULL};
+       int level;
+       static char *kwlist[] = {"form", NULL};
 
        /* Parse parameters */
-
+       
        if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "O!|i", kwlist, &PyDict_Type, &py_form, &level))
+                   args, kw, "O!", kwlist, &PyDict_Type, &info))
                return NULL;
        
        /* Call rpc function */
+       
+       if (!py_to_FORM(&form, info)) {
+               PyErr_SetString(spoolss_error, "invalid form");
+               return NULL;
+       }
 
+       if (!get_level_value(info, &level)) {
+               PyErr_SetString(spoolss_error, "invalid info level");
+               return NULL;
+       }
+
+       if (level != 1) {
+               PyErr_SetString(spoolss_error, "unsupported info level");
+               return NULL;
+       }
+       
        switch (level) {
        case 1: {
-               PyObject *py_form_name;
-               char *form_name;
-
-               to_struct(&form, py_form, py_FORM);
-
-               py_form_name = PyDict_GetItemString(py_form, "name");
-               form_name = PyString_AsString(py_form_name);
-
-               init_unistr2(&form.name, form_name, strlen(form_name) + 1);
+               PyObject *obj = PyDict_GetItemString(info, "name");
+               char *form_name = PyString_AsString(obj);
 
+               init_unistr2(&form.name, form_name, UNI_STR_TERMINATE);
                break;
        }
        default:
                PyErr_SetString(spoolss_error, "unsupported info level");
                return NULL;
        }
-
-       werror = cli_spoolss_addform(hnd->cli, hnd->mem_ctx, &hnd->pol,
-                                    level, &form);
+               
+       werror = rpccli_spoolss_addform(hnd->cli, hnd->mem_ctx, &hnd->pol,
+                                       level, &form);
 
 
        if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror,
-                               PyInt_FromLong(W_ERROR_V(werror)));
+               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
                return NULL;
        }
 
@@ -97,7 +81,7 @@ PyObject *spoolss_addform(PyObject *self, PyObject *args, PyObject *kw)
 
 /* Get form properties */
 
-PyObject *spoolss_getform(PyObject *self, PyObject *args, PyObject *kw)
+PyObject *spoolss_hnd_getform(PyObject *self, PyObject *args, PyObject *kw)
 {
        spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
        WERROR werror;
@@ -105,28 +89,21 @@ PyObject *spoolss_getform(PyObject *self, PyObject *args, PyObject *kw)
        char *form_name;
        int level = 1;
        static char *kwlist[] = {"form_name", "level", NULL};
-       uint32 needed;
        FORM_1 form;
 
        /* Parse parameters */
 
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "s|i", kwlist, 
-                                        &form_name, &level))
+       if (!PyArg_ParseTupleAndKeywords(
+                   args, kw, "s|i", kwlist, &form_name, &level))
                return NULL;
        
        /* Call rpc function */
 
-       werror = cli_spoolss_getform(hnd->cli, hnd->mem_ctx, 0, &needed,
-                                    &hnd->pol, form_name, 1, &form);
-
-       if (W_ERROR_V(werror) == ERRinsufficientbuffer)
-               werror = cli_spoolss_getform(
-                       hnd->cli, hnd->mem_ctx, needed, NULL, &hnd->pol,
-                       form_name, 1, &form);
+       werror = rpccli_spoolss_getform(
+               hnd->cli, hnd->mem_ctx, &hnd->pol, form_name, level, &form);
 
        if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror,
-                               PyInt_FromLong(W_ERROR_V(werror)));
+               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
                return NULL;
        }
 
@@ -134,7 +111,7 @@ PyObject *spoolss_getform(PyObject *self, PyObject *args, PyObject *kw)
 
        switch(level) {
        case 1:
-               result = from_struct(&form, py_FORM_1);
+               py_from_FORM_1(&result, &form);
                break;
        }
 
@@ -144,35 +121,46 @@ PyObject *spoolss_getform(PyObject *self, PyObject *args, PyObject *kw)
 
 /* Set form properties */
 
-PyObject *spoolss_setform(PyObject *self, PyObject *args, PyObject *kw)
+PyObject *spoolss_hnd_setform(PyObject *self, PyObject *args, PyObject *kw)
 {
        spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
        WERROR werror;
-       PyObject *py_form;
-       int level = 1;
-       static char *kwlist[] = {"form_name", "form", "level", NULL};
-       char *form_name;
+       PyObject *info, *form_name;
+       int level;
+       static char *kwlist[] = { "form", NULL};
        FORM form;
 
        /* Parse parameters */
 
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "sO!|i", kwlist, 
-                                        &form_name, &PyDict_Type, &py_form,
-                                        &level))
+       if (!PyArg_ParseTupleAndKeywords(
+                   args, kw, "O!", kwlist, &PyDict_Type, &info))
                return NULL;
-       
+
+       if (!get_level_value(info, &level)) {
+               PyErr_SetString(spoolss_error, "invalid info level");
+               return NULL;
+       }
+
+       if (level != 1) {
+               PyErr_SetString(spoolss_error, "unsupported info level");
+               return NULL;
+       }
+
        /* Call rpc function */
 
-       to_struct(&form, py_form, py_FORM);
-       init_unistr2(&form.name, form_name, strlen(form_name) + 1);
+       if (!py_to_FORM(&form, info)) {
+               PyErr_SetString(spoolss_error, "invalid form");
+               return NULL;
+       }
+
+       form_name = PyDict_GetItemString(info, "name");
 
-       werror = cli_spoolss_setform(hnd->cli, hnd->mem_ctx, &hnd->pol,
-                                    level, form_name, &form);
+       werror = rpccli_spoolss_setform(
+               hnd->cli, hnd->mem_ctx, &hnd->pol, level, 
+               PyString_AsString(form_name), &form);
 
        if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror, 
-                               PyInt_FromLong(W_ERROR_V(werror)));
-
+               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
                return NULL;
        }
 
@@ -182,28 +170,26 @@ PyObject *spoolss_setform(PyObject *self, PyObject *args, PyObject *kw)
 
 /* Delete a form */
 
-PyObject *spoolss_deleteform(PyObject *self, PyObject *args, PyObject *kw)
+PyObject *spoolss_hnd_deleteform(PyObject *self, PyObject *args, PyObject *kw)
 {
        spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
        WERROR werror;
-       int level = 1;
-       static char *kwlist[] = {"form_name", "level", NULL};
+       static char *kwlist[] = {"form_name", NULL};
        char *form_name;
 
        /* Parse parameters */
        
        if (!PyArg_ParseTupleAndKeywords(
-                   args, kw, "s|i", kwlist, &form_name, &level))
+                   args, kw, "s", kwlist, &form_name))
                return NULL;
        
        /* Call rpc function */
 
-       werror = cli_spoolss_deleteform(
+       werror = rpccli_spoolss_deleteform(
                hnd->cli, hnd->mem_ctx, &hnd->pol, form_name);
 
        if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror,
-                               PyInt_FromLong(W_ERROR_V(werror)));
+               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
                return NULL;
        }
 
@@ -213,12 +199,12 @@ PyObject *spoolss_deleteform(PyObject *self, PyObject *args, PyObject *kw)
 
 /* Enumerate forms */
 
-PyObject *spoolss_enumforms(PyObject *self, PyObject *args, PyObject *kw)
+PyObject *spoolss_hnd_enumforms(PyObject *self, PyObject *args, PyObject *kw)
 {
        PyObject *result;
        spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
        WERROR werror;
-       uint32 level = 1, num_forms, needed, i;
+       uint32 level = 1, num_forms, i;
        static char *kwlist[] = {"level", NULL};
        FORM_1 *forms;
 
@@ -230,33 +216,37 @@ PyObject *spoolss_enumforms(PyObject *self, PyObject *args, PyObject *kw)
        
        /* Call rpc function */
 
-       werror = cli_spoolss_enumforms(
-               hnd->cli, hnd->mem_ctx, 0, &needed, &hnd->pol, level,
-               &num_forms, &forms);
-
-       if (W_ERROR_V(werror) == ERRinsufficientbuffer)
-               werror = cli_spoolss_enumforms(
-                       hnd->cli, hnd->mem_ctx, needed, NULL, &hnd->pol, level,
-                       &num_forms, &forms);
+       werror = rpccli_spoolss_enumforms(
+               hnd->cli, hnd->mem_ctx, &hnd->pol, level, &num_forms, &forms);
 
        if (!W_ERROR_IS_OK(werror)) {
-               PyErr_SetObject(spoolss_werror,
-                               PyInt_FromLong(W_ERROR_V(werror)));
+               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
                return NULL;
        }
 
-       result = PyList_New(num_forms);
+       switch(level) {
+       case 1:
+               result = PyDict_New();
+
+               for (i = 0; i < num_forms; i++) {
+                       PyObject *value;
+                       fstring name;
+
+                       rpcstr_pull(name, forms[i].name.buffer,
+                                   sizeof(fstring), -1, STR_TERMINATE);
+
+                       py_from_FORM_1(&value, &forms[i]);
 
-       for (i = 0; i < num_forms; i++) {
-               PyObject *obj = NULL;
+                       PyDict_SetItemString(
+                               value, "level", PyInt_FromLong(1));
 
-               switch(level) {
-               case 1:
-                       obj = from_struct(&forms[i], py_FORM_1);
-                       break;
+                       PyDict_SetItemString(result, name, value);
                }
 
-               PyList_SetItem(result, i, obj);
+               break;
+       default:
+               PyErr_SetString(spoolss_error, "unknown info level");
+               return NULL;
        }
 
        return result;