r23041: Remainder of fix for 4630: fix special case of unix_to_nt_time() for
[Samba/nascimento.git] / source3 / python / py_spoolss.c
blobb8df5cbf11395e58a4d579067da2cefa51c20447
1 /*
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 2 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, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "python/py_spoolss.h"
23 /* Exceptions this module can raise */
25 PyObject *spoolss_error, *spoolss_werror;
27 /*
28 * Method dispatch table
31 static PyMethodDef spoolss_methods[] = {
33 /* Open/close printer handles */
35 { "openprinter", (PyCFunction)spoolss_openprinter, METH_VARARGS | METH_KEYWORDS,
36 "Open a printer by name in UNC format.\n"
37 "\n"
38 "Optionally a dictionary of (domain, username, password) may be given in\n"
39 "which case they are used when opening the RPC pipe. An access mask may\n"
40 "also be given which defaults to MAXIMUM_ALLOWED_ACCESS.\n"
41 "\n"
42 "Example:\n"
43 "\n"
44 ">>> hnd = spoolss.openprinter(\"\\\\\\\\NPSD-PDC2\\\\meanie\")"},
46 { "closeprinter", spoolss_closeprinter, METH_VARARGS,
47 "Close a printer handle opened with openprinter or addprinter.\n"
48 "\n"
49 "Example:\n"
50 "\n"
51 ">>> spoolss.closeprinter(hnd)"},
53 { "addprinterex", (PyCFunction)spoolss_addprinterex, METH_VARARGS,
54 "addprinterex()"},
56 /* Server enumeratation functions */
58 { "enumprinters", (PyCFunction)spoolss_enumprinters,
59 METH_VARARGS | METH_KEYWORDS,
60 "Enumerate printers on a print server.\n"
61 "\n"
62 "Return a list of printers on a print server. The credentials, info level\n"
63 "and flags may be specified as keyword arguments.\n"
64 "\n"
65 "Example:\n"
66 "\n"
67 ">>> print spoolss.enumprinters(\"\\\\\\\\npsd-pdc2\")\n"
68 "[{'comment': 'i am a comment', 'printer_name': 'meanie', 'flags': 8388608, \n"
69 " 'description': 'meanie,Generic / Text Only,i am a location'}, \n"
70 " {'comment': '', 'printer_name': 'fileprint', 'flags': 8388608, \n"
71 " 'description': 'fileprint,Generic / Text Only,'}]"},
73 { "enumports", (PyCFunction)spoolss_enumports,
74 METH_VARARGS | METH_KEYWORDS,
75 "Enumerate ports on a print server.\n"
76 "\n"
77 "Return a list of ports on a print server.\n"
78 "\n"
79 "Example:\n"
80 "\n"
81 ">>> print spoolss.enumports(\"\\\\\\\\npsd-pdc2\")\n"
82 "[{'name': 'LPT1:'}, {'name': 'LPT2:'}, {'name': 'COM1:'}, \n"
83 "{'name': 'COM2:'}, {'name': 'FILE:'}, {'name': '\\\\nautilus1\\zpekt3r'}]"},
85 { "enumprinterdrivers", (PyCFunction)spoolss_enumprinterdrivers,
86 METH_VARARGS | METH_KEYWORDS,
87 "Enumerate printer drivers on a print server.\n"
88 "\n"
89 "Return a list of printer drivers."},
91 /* Miscellaneous other commands */
93 { "getprinterdriverdir", (PyCFunction)spoolss_getprinterdriverdir,
94 METH_VARARGS | METH_KEYWORDS,
95 "Return printer driver directory.\n"
96 "\n"
97 "Return the printer driver directory for a given architecture. The\n"
98 "architecture defaults to \"Windows NT x86\"."},
100 /* Other stuff - this should really go into a samba config module
101 but for the moment let's leave it here. */
103 { "setup_logging", (PyCFunction)py_setup_logging,
104 METH_VARARGS | METH_KEYWORDS,
105 "Set up debug logging.\n"
106 "\n"
107 "Initialises Samba's debug logging system. One argument is expected which\n"
108 "is a boolean specifying whether debugging is interactive and sent to stdout\n"
109 "or logged to a file.\n"
110 "\n"
111 "Example:\n"
112 "\n"
113 ">>> spoolss.setup_logging(interactive = 1)" },
115 { "get_debuglevel", (PyCFunction)get_debuglevel,
116 METH_VARARGS,
117 "Set the current debug level.\n"
118 "\n"
119 "Example:\n"
120 "\n"
121 ">>> spoolss.get_debuglevel()\n"
122 "0" },
124 { "set_debuglevel", (PyCFunction)set_debuglevel,
125 METH_VARARGS,
126 "Get the current debug level.\n"
127 "\n"
128 "Example:\n"
129 "\n"
130 ">>> spoolss.set_debuglevel(10)" },
132 /* Printer driver routines */
134 { "addprinterdriver", (PyCFunction)spoolss_addprinterdriver,
135 METH_VARARGS | METH_KEYWORDS,
136 "Add a printer driver." },
138 { "addprinterdriverex", (PyCFunction)spoolss_addprinterdriverex,
139 METH_VARARGS | METH_KEYWORDS,
140 "Add a printer driver." },
142 { "deleteprinterdriver", (PyCFunction)spoolss_deleteprinterdriver,
143 METH_VARARGS | METH_KEYWORDS,
144 "Delete a printer driver." },
146 { "deleteprinterdriverex", (PyCFunction)spoolss_deleteprinterdriverex,
147 METH_VARARGS | METH_KEYWORDS,
148 "Delete a printer driver." },
150 { NULL }
153 /* Methods attached to a spoolss handle object */
155 static PyMethodDef spoolss_hnd_methods[] = {
157 /* Printer info */
159 { "getprinter", (PyCFunction)spoolss_hnd_getprinter,
160 METH_VARARGS | METH_KEYWORDS,
161 "Get printer information.\n"
162 "\n"
163 "Return a dictionary of print information. The info level defaults to 1.\n"
164 "\n"
165 "Example:\n"
166 "\n"
167 ">>> hnd.getprinter()\n"
168 "{'comment': 'i am a comment', 'printer_name': '\\\\NPSD-PDC2\\meanie',\n"
169 " 'description': '\\\\NPSD-PDC2\\meanie,Generic / Text Only,i am a location',\n"
170 " 'flags': 8388608}"},
172 { "setprinter", (PyCFunction)spoolss_hnd_setprinter,
173 METH_VARARGS | METH_KEYWORDS,
174 "Set printer information."},
176 /* Printer drivers */
178 { "getprinterdriver", (PyCFunction)spoolss_hnd_getprinterdriver,
179 METH_VARARGS | METH_KEYWORDS,
180 "Return printer driver information.\n"
181 "\n"
182 "Return a dictionary of printer driver information for the printer driver\n"
183 "bound to this printer."},
185 /* Forms */
187 { "enumforms", (PyCFunction)spoolss_hnd_enumforms,
188 METH_VARARGS | METH_KEYWORDS,
189 "Enumerate supported forms.\n"
190 "\n"
191 "Return a list of forms supported by this printer or print server."},
193 { "setform", (PyCFunction)spoolss_hnd_setform,
194 METH_VARARGS | METH_KEYWORDS,
195 "Set form data.\n"
196 "\n"
197 "Set the form given by the dictionary argument."},
199 { "addform", (PyCFunction)spoolss_hnd_addform,
200 METH_VARARGS | METH_KEYWORDS,
201 "Add a new form." },
203 { "getform", (PyCFunction)spoolss_hnd_getform,
204 METH_VARARGS | METH_KEYWORDS,
205 "Get form properties." },
207 { "deleteform", (PyCFunction)spoolss_hnd_deleteform,
208 METH_VARARGS | METH_KEYWORDS,
209 "Delete a form." },
211 /* Job related methods */
213 { "enumjobs", (PyCFunction)spoolss_hnd_enumjobs,
214 METH_VARARGS | METH_KEYWORDS,
215 "Enumerate jobs." },
217 { "setjob", (PyCFunction)spoolss_hnd_setjob,
218 METH_VARARGS | METH_KEYWORDS,
219 "Set job information." },
221 { "getjob", (PyCFunction)spoolss_hnd_getjob,
222 METH_VARARGS | METH_KEYWORDS,
223 "Get job information." },
225 { "startpageprinter", (PyCFunction)spoolss_hnd_startpageprinter,
226 METH_VARARGS | METH_KEYWORDS,
227 "Notify spooler that a page is about to be printed." },
229 { "endpageprinter", (PyCFunction)spoolss_hnd_endpageprinter,
230 METH_VARARGS | METH_KEYWORDS,
231 "Notify spooler that a page is about to be printed." },
233 { "startdocprinter", (PyCFunction)spoolss_hnd_startdocprinter,
234 METH_VARARGS | METH_KEYWORDS,
235 "Notify spooler that a document is about to be printed." },
237 { "enddocprinter", (PyCFunction)spoolss_hnd_enddocprinter,
238 METH_VARARGS | METH_KEYWORDS,
239 "Notify spooler that a document is about to be printed." },
241 { "writeprinter", (PyCFunction)spoolss_hnd_writeprinter,
242 METH_VARARGS | METH_KEYWORDS,
243 "Write job data to a printer." },
245 { "addjob", (PyCFunction)spoolss_hnd_addjob,
246 METH_VARARGS | METH_KEYWORDS,
247 "Add a job to the list of print jobs." },
249 /* Printer data */
251 { "getprinterdata", (PyCFunction)spoolss_hnd_getprinterdata,
252 METH_VARARGS | METH_KEYWORDS,
253 "Get printer data." },
255 { "setprinterdata", (PyCFunction)spoolss_hnd_setprinterdata,
256 METH_VARARGS | METH_KEYWORDS,
257 "Set printer data." },
259 { "enumprinterdata", (PyCFunction)spoolss_hnd_enumprinterdata,
260 METH_VARARGS | METH_KEYWORDS,
261 "Enumerate printer data." },
263 { "deleteprinterdata", (PyCFunction)spoolss_hnd_deleteprinterdata,
264 METH_VARARGS | METH_KEYWORDS,
265 "Delete printer data." },
267 { "getprinterdataex", (PyCFunction)spoolss_hnd_getprinterdataex,
268 METH_VARARGS | METH_KEYWORDS,
269 "Get printer data." },
271 { "setprinterdataex", (PyCFunction)spoolss_hnd_setprinterdataex,
272 METH_VARARGS | METH_KEYWORDS,
273 "Set printer data." },
275 { "enumprinterdataex", (PyCFunction)spoolss_hnd_enumprinterdataex,
276 METH_VARARGS | METH_KEYWORDS,
277 "Enumerate printer data." },
279 { "deleteprinterdataex", (PyCFunction)spoolss_hnd_deleteprinterdataex,
280 METH_VARARGS | METH_KEYWORDS,
281 "Delete printer data." },
283 { "enumprinterkey", (PyCFunction)spoolss_hnd_enumprinterkey,
284 METH_VARARGS | METH_KEYWORDS,
285 "Enumerate printer key." },
287 #if 0
288 /* Not implemented */
290 { "deleteprinterkey", (PyCFunction)spoolss_hnd_deleteprinterkey,
291 METH_VARARGS | METH_KEYWORDS,
292 "Delete printer key." },
293 #endif
295 { NULL }
299 static void py_policy_hnd_dealloc(PyObject* self)
301 spoolss_policy_hnd_object *hnd;
303 /* Close down policy handle and free talloc context */
305 hnd = (spoolss_policy_hnd_object*)self;
307 cli_shutdown(hnd->cli);
308 talloc_destroy(hnd->mem_ctx);
310 PyObject_Del(self);
313 static PyObject *py_policy_hnd_getattr(PyObject *self, char *attrname)
315 return Py_FindMethod(spoolss_hnd_methods, self, attrname);
318 static char spoolss_type_doc[] =
319 "Python wrapper for Windows NT SPOOLSS rpc pipe.";
321 PyTypeObject spoolss_policy_hnd_type = {
322 PyObject_HEAD_INIT(NULL)
324 "spoolss.hnd",
325 sizeof(spoolss_policy_hnd_object),
327 py_policy_hnd_dealloc, /* tp_dealloc*/
328 0, /* tp_print*/
329 py_policy_hnd_getattr, /* tp_getattr*/
330 0, /* tp_setattr*/
331 0, /* tp_compare*/
332 0, /* tp_repr*/
333 0, /* tp_as_number*/
334 0, /* tp_as_sequence*/
335 0, /* tp_as_mapping*/
336 0, /* tp_hash */
337 0, /* tp_call */
338 0, /* tp_str */
339 0, /* tp_getattro */
340 0, /* tp_setattro */
341 0, /* tp_as_buffer*/
342 Py_TPFLAGS_DEFAULT, /* tp_flags */
343 spoolss_type_doc, /* tp_doc */
346 /* Initialise constants */
348 static struct const_vals {
349 char *name;
350 uint32 value;
351 } module_const_vals[] = {
353 /* Access permissions */
355 { "MAXIMUM_ALLOWED_ACCESS", MAXIMUM_ALLOWED_ACCESS },
356 { "SERVER_ALL_ACCESS", SERVER_ALL_ACCESS },
357 { "SERVER_READ", SERVER_READ },
358 { "SERVER_WRITE", SERVER_WRITE },
359 { "SERVER_EXECUTE", SERVER_EXECUTE },
360 { "SERVER_ACCESS_ADMINISTER", SERVER_ACCESS_ADMINISTER },
361 { "SERVER_ACCESS_ENUMERATE", SERVER_ACCESS_ENUMERATE },
362 { "PRINTER_ALL_ACCESS", PRINTER_ALL_ACCESS },
363 { "PRINTER_READ", PRINTER_READ },
364 { "PRINTER_WRITE", PRINTER_WRITE },
365 { "PRINTER_EXECUTE", PRINTER_EXECUTE },
366 { "PRINTER_ACCESS_ADMINISTER", PRINTER_ACCESS_ADMINISTER },
367 { "PRINTER_ACCESS_USE", PRINTER_ACCESS_USE },
368 { "JOB_ACCESS_ADMINISTER", JOB_ACCESS_ADMINISTER },
369 { "JOB_ALL_ACCESS", JOB_ALL_ACCESS },
370 { "JOB_READ", JOB_READ },
371 { "JOB_WRITE", JOB_WRITE },
372 { "JOB_EXECUTE", JOB_EXECUTE },
373 { "STANDARD_RIGHTS_ALL_ACCESS", STANDARD_RIGHTS_ALL_ACCESS },
374 { "STANDARD_RIGHTS_EXECUTE_ACCESS", STANDARD_RIGHTS_EXECUTE_ACCESS },
375 { "STANDARD_RIGHTS_READ_ACCESS", STANDARD_RIGHTS_READ_ACCESS },
376 { "STANDARD_RIGHTS_REQUIRED_ACCESS", STANDARD_RIGHTS_REQUIRED_ACCESS },
377 { "STANDARD_RIGHTS_WRITE_ACCESS", STANDARD_RIGHTS_WRITE_ACCESS },
379 /* Printer enumeration flags */
381 { "PRINTER_ENUM_DEFAULT", PRINTER_ENUM_DEFAULT },
382 { "PRINTER_ENUM_LOCAL", PRINTER_ENUM_LOCAL },
383 { "PRINTER_ENUM_CONNECTIONS", PRINTER_ENUM_CONNECTIONS },
384 { "PRINTER_ENUM_FAVORITE", PRINTER_ENUM_FAVORITE },
385 { "PRINTER_ENUM_NAME", PRINTER_ENUM_NAME },
386 { "PRINTER_ENUM_REMOTE", PRINTER_ENUM_REMOTE },
387 { "PRINTER_ENUM_SHARED", PRINTER_ENUM_SHARED },
388 { "PRINTER_ENUM_NETWORK", PRINTER_ENUM_NETWORK },
390 /* Form types */
392 { "FORM_USER", FORM_USER },
393 { "FORM_BUILTIN", FORM_BUILTIN },
394 { "FORM_PRINTER", FORM_PRINTER },
396 /* WERRORs */
398 { "WERR_OK", 0 },
399 { "WERR_BADFILE", 2 },
400 { "WERR_ACCESS_DENIED", 5 },
401 { "WERR_BADFID", 6 },
402 { "WERR_BADFUNC", 1 },
403 { "WERR_INSUFFICIENT_BUFFER", 122 },
404 { "WERR_NO_SUCH_SHARE", 67 },
405 { "WERR_ALREADY_EXISTS", 80 },
406 { "WERR_INVALID_PARAM", 87 },
407 { "WERR_NOT_SUPPORTED", 50 },
408 { "WERR_BAD_PASSWORD", 86 },
409 { "WERR_NOMEM", 8 },
410 { "WERR_INVALID_NAME", 123 },
411 { "WERR_UNKNOWN_LEVEL", 124 },
412 { "WERR_OBJECT_PATH_INVALID", 161 },
413 { "WERR_NO_MORE_ITEMS", 259 },
414 { "WERR_MORE_DATA", 234 },
415 { "WERR_UNKNOWN_PRINTER_DRIVER", 1797 },
416 { "WERR_INVALID_PRINTER_NAME", 1801 },
417 { "WERR_PRINTER_ALREADY_EXISTS", 1802 },
418 { "WERR_INVALID_DATATYPE", 1804 },
419 { "WERR_INVALID_ENVIRONMENT", 1805 },
420 { "WERR_INVALID_FORM_NAME", 1902 },
421 { "WERR_INVALID_FORM_SIZE", 1903 },
422 { "WERR_BUF_TOO_SMALL", 2123 },
423 { "WERR_JOB_NOT_FOUND", 2151 },
424 { "WERR_DEST_NOT_FOUND", 2152 },
425 { "WERR_NOT_LOCAL_DOMAIN", 2320 },
426 { "WERR_PRINTER_DRIVER_IN_USE", 3001 },
427 { "WERR_STATUS_MORE_ENTRIES ", 0x0105 },
429 /* Job control constants */
431 { "JOB_CONTROL_PAUSE", JOB_CONTROL_PAUSE },
432 { "JOB_CONTROL_RESUME", JOB_CONTROL_RESUME },
433 { "JOB_CONTROL_CANCEL", JOB_CONTROL_CANCEL },
434 { "JOB_CONTROL_RESTART", JOB_CONTROL_RESTART },
435 { "JOB_CONTROL_DELETE", JOB_CONTROL_DELETE },
437 { NULL },
440 static void const_init(PyObject *dict)
442 struct const_vals *tmp;
443 PyObject *obj;
445 for (tmp = module_const_vals; tmp->name; tmp++) {
446 obj = PyInt_FromLong(tmp->value);
447 PyDict_SetItemString(dict, tmp->name, obj);
448 Py_DECREF(obj);
452 /* Module initialisation */
454 void initspoolss(void)
456 PyObject *module, *dict;
458 /* Initialise module */
460 module = Py_InitModule("spoolss", spoolss_methods);
461 dict = PyModule_GetDict(module);
463 /* Exceptions we can raise */
465 spoolss_error = PyErr_NewException("spoolss.error", NULL, NULL);
466 PyDict_SetItemString(dict, "error", spoolss_error);
468 spoolss_werror = PyErr_NewException("spoolss.werror", NULL, NULL);
469 PyDict_SetItemString(dict, "werror", spoolss_werror);
471 /* Initialise policy handle object */
473 spoolss_policy_hnd_type.ob_type = &PyType_Type;
475 PyDict_SetItemString(dict, "spoolss.hnd",
476 (PyObject *)&spoolss_policy_hnd_type);
478 /* Initialise constants */
480 const_init(dict);
482 /* Do samba initialisation */
484 py_samba_init();