00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "python/py_spoolss.h"
00022
00023
00024
00025 PyObject *spoolss_enumprinterdrivers(PyObject *self, PyObject *args,
00026 PyObject *kw)
00027 {
00028 WERROR werror;
00029 PyObject *result = NULL, *creds = NULL;
00030 PRINTER_DRIVER_CTR ctr;
00031 int level = 1, i;
00032 uint32 num_drivers;
00033 char *arch = "Windows NT x86", *server, *errstr;
00034 static char *kwlist[] = {"server", "level", "creds", "arch", NULL};
00035 struct cli_state *cli = NULL;
00036 TALLOC_CTX *mem_ctx = NULL;
00037
00038
00039
00040 if (!PyArg_ParseTupleAndKeywords(
00041 args, kw, "s|iOs", kwlist, &server, &level, &creds,
00042 &arch))
00043 return NULL;
00044
00045 if (server[0] != '\\' || server[1] != '\\') {
00046 PyErr_SetString(PyExc_ValueError, "UNC name required");
00047 return NULL;
00048 }
00049
00050 server += 2;
00051
00052 if (creds && creds != Py_None && !PyDict_Check(creds)) {
00053 PyErr_SetString(PyExc_TypeError,
00054 "credentials must be dictionary or None");
00055 return NULL;
00056 }
00057
00058
00059
00060 if (!(cli = open_pipe_creds(server, creds, PI_SPOOLSS, &errstr))) {
00061 PyErr_SetString(spoolss_error, errstr);
00062 free(errstr);
00063 goto done;
00064 }
00065
00066 if (!(mem_ctx = talloc_init("spoolss_enumprinterdrivers"))) {
00067 PyErr_SetString(
00068 spoolss_error, "unable to init talloc context\n");
00069 goto done;
00070 }
00071
00072 werror = rpccli_spoolss_enumprinterdrivers(
00073 cli->pipe_list, mem_ctx, level, arch,
00074 &num_drivers, &ctr);
00075
00076 if (!W_ERROR_IS_OK(werror)) {
00077 PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
00078 goto done;
00079 }
00080
00081
00082
00083 switch (level) {
00084 case 1:
00085 result = PyDict_New();
00086
00087 for (i = 0; i < num_drivers; i++) {
00088 PyObject *value;
00089 fstring name;
00090
00091 rpcstr_pull(name, ctr.info1[i].name.buffer,
00092 sizeof(fstring), -1, STR_TERMINATE);
00093
00094 py_from_DRIVER_INFO_1(&value, &ctr.info1[i]);
00095
00096 PyDict_SetItemString(result, name, value);
00097 }
00098
00099 break;
00100 case 2:
00101 result = PyDict_New();
00102
00103 for(i = 0; i < num_drivers; i++) {
00104 PyObject *value;
00105 fstring name;
00106
00107 rpcstr_pull(name, ctr.info2[i].name.buffer,
00108 sizeof(fstring), -1, STR_TERMINATE);
00109
00110 py_from_DRIVER_INFO_2(&value, &ctr.info2[i]);
00111
00112 PyDict_SetItemString(result, name, value);
00113 }
00114
00115 break;
00116 case 3:
00117 result = PyDict_New();
00118
00119 for(i = 0; i < num_drivers; i++) {
00120 PyObject *value;
00121 fstring name;
00122
00123 rpcstr_pull(name, ctr.info3[i].name.buffer,
00124 sizeof(fstring), -1, STR_TERMINATE);
00125
00126 py_from_DRIVER_INFO_3(&value, &ctr.info3[i]);
00127
00128 PyDict_SetItemString(result, name, value);
00129 }
00130
00131 break;
00132 case 6:
00133 result = PyDict_New();
00134
00135 for(i = 0; i < num_drivers; i++) {
00136 PyObject *value;
00137 fstring name;
00138
00139 rpcstr_pull(name, ctr.info6[i].name.buffer,
00140 sizeof(fstring), -1, STR_TERMINATE);
00141
00142 py_from_DRIVER_INFO_6(&value, &ctr.info6[i]);
00143
00144 PyList_SetItem(result, i, value);
00145 }
00146
00147 break;
00148 default:
00149 PyErr_SetString(spoolss_error, "unknown info level");
00150 goto done;
00151 }
00152
00153 done:
00154 if (cli)
00155 cli_shutdown(cli);
00156
00157 if (mem_ctx)
00158 talloc_destroy(mem_ctx);
00159
00160 return result;
00161 }
00162
00163
00164
00165 PyObject *spoolss_hnd_getprinterdriver(PyObject *self, PyObject *args,
00166 PyObject *kw)
00167 {
00168 spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
00169 WERROR werror;
00170 PyObject *result = Py_None;
00171 PRINTER_DRIVER_CTR ctr;
00172 int level = 1;
00173 char *arch = "Windows NT x86";
00174 int version = 2;
00175 static char *kwlist[] = {"level", "arch", NULL};
00176
00177
00178
00179 if (!PyArg_ParseTupleAndKeywords(
00180 args, kw, "|is", kwlist, &level, &arch))
00181 return NULL;
00182
00183
00184
00185 werror = rpccli_spoolss_getprinterdriver(
00186 hnd->cli, hnd->mem_ctx, &hnd->pol, level, arch, version, &ctr);
00187
00188 if (!W_ERROR_IS_OK(werror)) {
00189 PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
00190 return NULL;
00191 }
00192
00193
00194
00195 switch (level) {
00196 case 1:
00197 py_from_DRIVER_INFO_1(&result, ctr.info1);
00198 break;
00199 case 2:
00200 py_from_DRIVER_INFO_2(&result, ctr.info2);
00201 break;
00202 case 3:
00203 py_from_DRIVER_INFO_3(&result, ctr.info3);
00204 break;
00205 case 6:
00206 py_from_DRIVER_INFO_6(&result, ctr.info6);
00207 break;
00208 default:
00209 PyErr_SetString(spoolss_error, "unsupported info level");
00210 return NULL;
00211 }
00212
00213 Py_INCREF(result);
00214 return result;
00215 }
00216
00217
00218
00219 PyObject *spoolss_getprinterdriverdir(PyObject *self, PyObject *args,
00220 PyObject *kw)
00221 {
00222 WERROR werror;
00223 PyObject *result = NULL, *creds = NULL;
00224 DRIVER_DIRECTORY_CTR ctr;
00225 uint32 level = 1;
00226 char *arch = "Windows NT x86", *server, *errstr;
00227 static char *kwlist[] = {"server", "level", "arch", "creds", NULL};
00228 struct cli_state *cli = NULL;
00229 TALLOC_CTX *mem_ctx = NULL;
00230
00231
00232
00233 if (!PyArg_ParseTupleAndKeywords(
00234 args, kw, "s|isO", kwlist, &server, &level,
00235 &arch, &creds))
00236 return NULL;
00237
00238 if (server[0] != '\\' || server[1] != '\\') {
00239 PyErr_SetString(PyExc_ValueError, "UNC name required");
00240 return NULL;
00241 }
00242
00243 server += 2;
00244
00245 if (creds && creds != Py_None && !PyDict_Check(creds)) {
00246 PyErr_SetString(PyExc_TypeError,
00247 "credentials must be dictionary or None");
00248 return NULL;
00249 }
00250
00251
00252
00253 if (!(cli = open_pipe_creds(server, creds, PI_SPOOLSS, &errstr))) {
00254 PyErr_SetString(spoolss_error, errstr);
00255 free(errstr);
00256 goto done;
00257 }
00258
00259 if (!(mem_ctx = talloc_init("spoolss_getprinterdriverdir"))) {
00260 PyErr_SetString(
00261 spoolss_error, "unable to init talloc context\n");
00262 goto done;
00263 }
00264
00265 werror = rpccli_spoolss_getprinterdriverdir(
00266 cli->pipe_list, mem_ctx, level, arch, &ctr);
00267
00268 if (!W_ERROR_IS_OK(werror)) {
00269 PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
00270 goto done;
00271 }
00272
00273
00274
00275 switch (level) {
00276 case 1:
00277 py_from_DRIVER_DIRECTORY_1(&result, ctr.info1);
00278 break;
00279 default:
00280 PyErr_SetString(spoolss_error, "unknown info level");
00281 goto done;
00282 }
00283
00284 done:
00285 if (cli)
00286 cli_shutdown(cli);
00287
00288 if (mem_ctx)
00289 talloc_destroy(mem_ctx);
00290
00291 return result;
00292 }
00293
00294 PyObject *spoolss_addprinterdriver(PyObject *self, PyObject *args,
00295 PyObject *kw)
00296 {
00297 static char *kwlist[] = { "server", "info", "creds", NULL };
00298 char *server, *errstr;
00299 uint32 level;
00300 PyObject *info, *result = NULL, *creds = NULL;
00301 WERROR werror;
00302 TALLOC_CTX *mem_ctx = NULL;
00303 struct cli_state *cli = NULL;
00304 PRINTER_DRIVER_CTR ctr;
00305 union {
00306 DRIVER_INFO_3 driver_3;
00307 } dinfo;
00308
00309 if (!PyArg_ParseTupleAndKeywords(
00310 args, kw, "sO!|O", kwlist, &server, &PyDict_Type,
00311 &info, &creds))
00312 return NULL;
00313
00314 if (server[0] == '\\' || server[1] == '\\')
00315 server += 2;
00316
00317 if (creds && creds != Py_None && !PyDict_Check(creds)) {
00318 PyErr_SetString(PyExc_TypeError,
00319 "credentials must be dictionary or None");
00320 return NULL;
00321 }
00322
00323 if (!(mem_ctx = talloc_init("spoolss_addprinterdriver"))) {
00324 PyErr_SetString(
00325 spoolss_error, "unable to init talloc context\n");
00326 return NULL;
00327 }
00328
00329 if (!(cli = open_pipe_creds(server, creds, PI_SPOOLSS, &errstr))) {
00330 PyErr_SetString(spoolss_error, errstr);
00331 free(errstr);
00332 goto done;
00333 }
00334
00335 if (!get_level_value(info, &level)) {
00336 PyErr_SetString(spoolss_error, "invalid info level");
00337 goto done;
00338 }
00339
00340 if (level != 3) {
00341 PyErr_SetString(spoolss_error, "unsupported info level");
00342 goto done;
00343 }
00344
00345 ZERO_STRUCT(ctr);
00346 ZERO_STRUCT(dinfo);
00347
00348 switch(level) {
00349 case 3:
00350 ctr.info3 = &dinfo.driver_3;
00351
00352 if (!py_to_DRIVER_INFO_3(&dinfo.driver_3, info, mem_ctx)) {
00353 PyErr_SetString(spoolss_error,
00354 "error converting to driver info 3");
00355 goto done;
00356 }
00357
00358 break;
00359 default:
00360 PyErr_SetString(spoolss_error, "unsupported info level");
00361 goto done;
00362 }
00363
00364 werror = rpccli_spoolss_addprinterdriver(cli->pipe_list, mem_ctx, level, &ctr);
00365
00366 if (!W_ERROR_IS_OK(werror)) {
00367 PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
00368 goto done;
00369 }
00370
00371 Py_INCREF(Py_None);
00372 result = Py_None;
00373
00374 done:
00375 if (cli)
00376 cli_shutdown(cli);
00377
00378 if (mem_ctx)
00379 talloc_destroy(mem_ctx);
00380
00381 return result;
00382
00383 }
00384
00385 PyObject *spoolss_addprinterdriverex(PyObject *self, PyObject *args,
00386 PyObject *kw)
00387 {
00388
00389
00390 PyErr_SetString(spoolss_error, "Not implemented");
00391 return NULL;
00392 }
00393
00394 PyObject *spoolss_deleteprinterdriver(PyObject *self, PyObject *args,
00395 PyObject *kw)
00396 {
00397 PyErr_SetString(spoolss_error, "Not implemented");
00398 return NULL;
00399 }
00400
00401 PyObject *spoolss_deleteprinterdriverex(PyObject *self, PyObject *args,
00402 PyObject *kw)
00403 {
00404 PyErr_SetString(spoolss_error, "Not implemented");
00405 return NULL;
00406 }