r25598: Add missing become_root/unbecome_root around calls of add_aliases.
[samba.git] / source / python / py_spoolss_jobs.c
index 3d2295b88e8bc295cb207b082fecd98117568315..3c160025bab48ad50a9b8f6ea8499de74dc8f648 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"
 
 /* Enumerate jobs */
 
-PyObject *spoolss_enumjobs(PyObject *self, PyObject *args, PyObject *kw)
+PyObject *spoolss_hnd_enumjobs(PyObject *self, PyObject *args, PyObject *kw)
 {
        spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
        WERROR werror;
        PyObject *result;
        int level = 1;
-       uint32 i, needed, num_jobs;
+       uint32 i, num_jobs;
        static char *kwlist[] = {"level", NULL};
        JOB_INFO_CTR ctr;
 
@@ -39,21 +38,18 @@ PyObject *spoolss_enumjobs(PyObject *self, PyObject *args, PyObject *kw)
        
        /* Call rpc function */
        
-       werror = cli_spoolss_enumjobs(
-               hnd->cli, hnd->mem_ctx, 0, &needed, &hnd->pol, level, 0,
-               1000, &num_jobs, &ctr);
-
-       if (W_ERROR_V(werror) == ERRinsufficientbuffer)
-               werror = cli_spoolss_enumjobs(
-                       hnd->cli, hnd->mem_ctx, needed, NULL, &hnd->pol,
-                       level, 0, 1000, &num_jobs, &ctr);
+       werror = rpccli_spoolss_enumjobs(
+               hnd->cli, hnd->mem_ctx, &hnd->pol, level, 0, 1000, 
+               &num_jobs, &ctr);
 
        /* Return value */
        
        result = Py_None;
 
-       if (!W_ERROR_IS_OK(werror))
+       if (!W_ERROR_IS_OK(werror)) {
+               PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
                goto done;
+       }
 
        result = PyList_New(num_jobs);
 
@@ -87,7 +83,7 @@ PyObject *spoolss_enumjobs(PyObject *self, PyObject *args, PyObject *kw)
 
 /* Set job command */
 
-PyObject *spoolss_setjob(PyObject *self, PyObject *args, PyObject *kw)
+PyObject *spoolss_hnd_setjob(PyObject *self, PyObject *args, PyObject *kw)
 {
        spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
        WERROR werror;
@@ -96,14 +92,14 @@ PyObject *spoolss_setjob(PyObject *self, PyObject *args, PyObject *kw)
 
        /* Parse parameters */
 
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "ii|i", kwlist, &jobid,
-                                        &command, &level))
+       if (!PyArg_ParseTupleAndKeywords(
+                   args, kw, "ii|i", kwlist, &jobid, &command, &level))
                return NULL;
        
        /* Call rpc function */
        
-       werror = cli_spoolss_setjob(hnd->cli, hnd->mem_ctx, &hnd->pol,
-                                   jobid, level, command);
+       werror = rpccli_spoolss_setjob(
+               hnd->cli, hnd->mem_ctx, &hnd->pol, jobid, level, command);
 
        if (!W_ERROR_IS_OK(werror)) {
                PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
@@ -116,30 +112,25 @@ PyObject *spoolss_setjob(PyObject *self, PyObject *args, PyObject *kw)
 
 /* Get job */
 
-PyObject *spoolss_getjob(PyObject *self, PyObject *args, PyObject *kw)
+PyObject *spoolss_hnd_getjob(PyObject *self, PyObject *args, PyObject *kw)
 {
        spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
        WERROR werror;
        PyObject *result;
-       uint32 level = 1, jobid, needed;
+       uint32 level = 1, jobid;
        static char *kwlist[] = {"jobid", "level", NULL};
        JOB_INFO_CTR ctr;
 
        /* Parse parameters */
 
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "i|i", kwlist, &jobid,
-                                        &level))
+       if (!PyArg_ParseTupleAndKeywords(
+                   args, kw, "i|i", kwlist, &jobid, &level))
                return NULL;
        
        /* Call rpc function */
        
-       werror = cli_spoolss_getjob(hnd->cli, hnd->mem_ctx, 0, &needed,
-                                   &hnd->pol, jobid, level, &ctr);
-
-       if (W_ERROR_V(werror) == ERRinsufficientbuffer)
-               werror = cli_spoolss_getjob(
-                       hnd->cli, hnd->mem_ctx, needed, NULL, &hnd->pol,
-                       jobid, level, &ctr);
+       werror = rpccli_spoolss_getjob(
+               hnd->cli, hnd->mem_ctx, &hnd->pol, jobid, level, &ctr);
 
        if (!W_ERROR_IS_OK(werror)) {
                PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
@@ -148,10 +139,10 @@ PyObject *spoolss_getjob(PyObject *self, PyObject *args, PyObject *kw)
 
        switch(level) {
        case 1:
-               py_from_JOB_INFO_1(&result, ctr.job.job_info_1);
+               py_from_JOB_INFO_1(&result, &ctr.job.job_info_1[0]);
                break;
        case 2:
-               py_from_JOB_INFO_2(&result, ctr.job.job_info_2);
+               py_from_JOB_INFO_2(&result, &ctr.job.job_info_2[0]);
                break;
        }
 
@@ -161,7 +152,7 @@ PyObject *spoolss_getjob(PyObject *self, PyObject *args, PyObject *kw)
 /* Start page printer.  This notifies the spooler that a page is about to be
    printed on the specified printer. */
 
-PyObject *spoolss_startpageprinter(PyObject *self, PyObject *args, PyObject *kw)
+PyObject *spoolss_hnd_startpageprinter(PyObject *self, PyObject *args, PyObject *kw)
 {
        spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
        WERROR werror;
@@ -174,7 +165,7 @@ PyObject *spoolss_startpageprinter(PyObject *self, PyObject *args, PyObject *kw)
        
        /* Call rpc function */
        
-       werror = cli_spoolss_startpageprinter(
+       werror = rpccli_spoolss_startpageprinter(
                hnd->cli, hnd->mem_ctx, &hnd->pol);
 
        if (!W_ERROR_IS_OK(werror)) {
@@ -189,7 +180,7 @@ PyObject *spoolss_startpageprinter(PyObject *self, PyObject *args, PyObject *kw)
 /* End page printer.  This notifies the spooler that a page has finished
    being printed on the specified printer. */
 
-PyObject *spoolss_endpageprinter(PyObject *self, PyObject *args, PyObject *kw)
+PyObject *spoolss_hnd_endpageprinter(PyObject *self, PyObject *args, PyObject *kw)
 {
        spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
        WERROR werror;
@@ -202,7 +193,7 @@ PyObject *spoolss_endpageprinter(PyObject *self, PyObject *args, PyObject *kw)
        
        /* Call rpc function */
        
-       werror = cli_spoolss_endpageprinter(
+       werror = rpccli_spoolss_endpageprinter(
                hnd->cli, hnd->mem_ctx, &hnd->pol);
 
        if (!W_ERROR_IS_OK(werror)) {
@@ -217,47 +208,34 @@ PyObject *spoolss_endpageprinter(PyObject *self, PyObject *args, PyObject *kw)
 /* Start doc printer.  This notifies the spooler that a document is about to be
    printed on the specified printer. */
 
-PyObject *spoolss_startdocprinter(PyObject *self, PyObject *args, PyObject *kw)
+PyObject *spoolss_hnd_startdocprinter(PyObject *self, PyObject *args, PyObject *kw)
 {
        spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
        WERROR werror;
        static char *kwlist[] = { "document_info", NULL };
-       PyObject *doc_info, *obj;
+       PyObject *info, *obj;
        uint32 level, jobid;
        char *document_name = NULL, *output_file = NULL, *data_type = NULL;
 
        /* Parse parameters */
 
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "O!", kwlist,
-               &PyDict_Type, &doc_info))
+       if (!PyArg_ParseTupleAndKeywords(
+                   args, kw, "O!", kwlist, &PyDict_Type, &info))
                return NULL;
        
        /* Check document_info parameter */
 
-       if ((obj = PyDict_GetItemString(doc_info, "level"))) {
-
-               if (!PyInt_Check(obj)) {
-                       PyErr_SetString(spoolss_error,
-                                       "level not an integer");
-                       return NULL;
-               }
-
-               level = PyInt_AsLong(obj);
-
-               /* Only level 1 supported by Samba! */
-
-               if (level != 1) {
-                       PyErr_SetString(spoolss_error,
-                                       "unsupported info level");
-                       return NULL;
-               }
+       if (!get_level_value(info, &level)) {
+               PyErr_SetString(spoolss_error, "invalid info level");
+               return NULL;
+       }
 
-       } else {
-               PyErr_SetString(spoolss_error, "no info level present");
+       if (level != 1) {
+               PyErr_SetString(spoolss_error, "unsupported info level");
                return NULL;
        }
 
-       if ((obj = PyDict_GetItemString(doc_info, "document_name"))) {
+       if ((obj = PyDict_GetItemString(info, "document_name"))) {
 
                if (!PyString_Check(obj) && obj != Py_None) {
                        PyErr_SetString(spoolss_error,
@@ -273,7 +251,7 @@ PyObject *spoolss_startdocprinter(PyObject *self, PyObject *args, PyObject *kw)
                return NULL;
        }
 
-       if ((obj = PyDict_GetItemString(doc_info, "output_file"))) {
+       if ((obj = PyDict_GetItemString(info, "output_file"))) {
 
                if (!PyString_Check(obj) && obj != Py_None) {
                        PyErr_SetString(spoolss_error,
@@ -289,7 +267,7 @@ PyObject *spoolss_startdocprinter(PyObject *self, PyObject *args, PyObject *kw)
                return NULL;
        }
 
-       if ((obj = PyDict_GetItemString(doc_info, "data_type"))) {
+       if ((obj = PyDict_GetItemString(info, "data_type"))) {
                
                if (!PyString_Check(obj) && obj != Py_None) {
                        PyErr_SetString(spoolss_error,
@@ -307,7 +285,7 @@ PyObject *spoolss_startdocprinter(PyObject *self, PyObject *args, PyObject *kw)
 
        /* Call rpc function */
        
-       werror = cli_spoolss_startdocprinter(
+       werror = rpccli_spoolss_startdocprinter(
                hnd->cli, hnd->mem_ctx, &hnd->pol, document_name,
                output_file, data_type, &jobid);
 
@@ -326,7 +304,7 @@ PyObject *spoolss_startdocprinter(PyObject *self, PyObject *args, PyObject *kw)
 /* End doc printer.  This notifies the spooler that a document has finished
    being printed on the specified printer. */
 
-PyObject *spoolss_enddocprinter(PyObject *self, PyObject *args, PyObject *kw)
+PyObject *spoolss_hnd_enddocprinter(PyObject *self, PyObject *args, PyObject *kw)
 {
        spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
        WERROR werror;
@@ -339,7 +317,8 @@ PyObject *spoolss_enddocprinter(PyObject *self, PyObject *args, PyObject *kw)
        
        /* Call rpc function */
        
-       werror = cli_spoolss_enddocprinter(hnd->cli, hnd->mem_ctx, &hnd->pol);
+       werror = rpccli_spoolss_enddocprinter(
+               hnd->cli, hnd->mem_ctx, &hnd->pol);
 
        if (!W_ERROR_IS_OK(werror)) {
                PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
@@ -349,3 +328,40 @@ PyObject *spoolss_enddocprinter(PyObject *self, PyObject *args, PyObject *kw)
        Py_INCREF(Py_None);
        return Py_None;
 }
+
+/* Write data to a printer */
+
+PyObject *spoolss_hnd_writeprinter(PyObject *self, PyObject *args, PyObject *kw)
+{
+       spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
+       WERROR werror;
+       static char *kwlist[] = { "data", NULL };
+       PyObject *data;
+       uint32 num_written;
+
+       /* Parse parameters */
+
+       if (!PyArg_ParseTupleAndKeywords(
+                   args, kw, "O!", kwlist, &PyString_Type, &data))
+               return NULL;
+       
+       /* Call rpc function */
+       
+       werror = rpccli_spoolss_writeprinter(
+               hnd->cli, hnd->mem_ctx, &hnd->pol, PyString_Size(data),
+               PyString_AsString(data), &num_written);
+
+       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_hnd_addjob(PyObject *self, PyObject *args, PyObject *kw)
+{
+       PyErr_SetString(spoolss_error, "Not implemented");
+       return NULL;
+}