diff options
-rw-r--r-- | source4/build/pidl/swig.pm | 43 | ||||
-rw-r--r-- | source4/scripting/swig/dcerpc.i | 6 | ||||
-rw-r--r-- | source4/scripting/swig/torture/spoolss.py | 2 |
3 files changed, 40 insertions, 11 deletions
diff --git a/source4/build/pidl/swig.pm b/source4/build/pidl/swig.pm index cdfe90450d..b75891df17 100644 --- a/source4/build/pidl/swig.pm +++ b/source4/build/pidl/swig.pm @@ -351,8 +351,6 @@ sub ParseFunction($) $result .= "\tresultobj = temp;\n\n"; - - $result .= "\tif (NT_STATUS_IS_ERR(result)) {\n"; $result .= "\t\tset_ntstatus_exception(NT_STATUS_V(result));\n"; $result .= "\t\tgoto fail;\n"; @@ -466,19 +464,30 @@ sub ParseStruct($) # Generate function to convert DATA_BLOB to Python dict - if (util::has_property($s, "public")) { - $result .= "/* Convert DATA_BLOB to python dict of struct $s->{NAME} */\n\n"; - - $result .= "NTSTATUS DATA_BLOB_to_python_$s->{NAME}(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, PyObject **obj)\n"; + if (util::has_property($s->{DATA}, "public")) { + $result .= "/* Convert a Python string to a struct $s->{NAME} python dict */\n\n"; + $result .= "NTSTATUS unmarshall_$s->{NAME}(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, struct $s->{NAME} *s)\n"; $result .= "{\n"; - $result .= "\tstruct $s->{NAME} s;\n"; - $result .= "\tNTSTATUS result = ndr_pull_struct_blob(blob, mem_ctx, &s, ndr_pull_$s->{NAME});\n\n"; - $result .= "\treturn NT_STATUS_OK;\n"; - $result .= "}\n"; + $result .= "\treturn ndr_pull_struct_blob(blob, mem_ctx, s, ndr_pull_$s->{NAME});\n"; + $result .= "}\n\n"; } $result .= "\n%}\n\n"; + if (util::has_property($s->{DATA}, "public")) { + + $result .= "%typemap(in, numinputs=0) struct $s->{NAME} *EMPTY (struct $s->{NAME} *temp_$s->{NAME}) {\n"; + $result .= "\t\$1 = &temp_$s->{NAME};\n"; + $result .= "}\n\n"; + + $result .= "%typemap(argout) struct $s->{NAME} * {\n"; + $result .= "\tTALLOC_CTX *mem_ctx = talloc_init(\"typemap(argout) $s->{NAME}\");\n\n"; + $result .= "\tresultobj = $s->{NAME}_ptr_to_python(mem_ctx, \$1);\n"; + $result .= "}\n\n"; + + $result .= "NTSTATUS unmarshall_$s->{NAME}(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, struct $s->{NAME} *EMPTY);\n\n"; + } + return $result; } @@ -595,8 +604,22 @@ sub ParseUnion($) $result .= "}\n\n"; + # Generate function to convert DATA_BLOB to Python dict + + if (util::has_property($u->{DATA}, "public")) { + $result .= "/* Convert a Python string to a struct $u->{NAME} python dict */\n\n"; + $result .= "NTSTATUS unmarshall_$u->{NAME}(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, union $u->{NAME} *u)\n"; + $result .= "{\n"; + $result .= "\treturn NT_STATUS_OK;\n"; + $result .= "}\n\n"; + } + $result .= "\n%}\n\n"; + if (util::has_property($u->{DATA}, "public")) { + $result .= "NTSTATUS unmarshall_$u->{NAME}(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, union $u->{NAME} *EMPTY);\n\n"; + } + return $result; } diff --git a/source4/scripting/swig/dcerpc.i b/source4/scripting/swig/dcerpc.i index ab53a1dc51..1222d54766 100644 --- a/source4/scripting/swig/dcerpc.i +++ b/source4/scripting/swig/dcerpc.i @@ -346,6 +346,12 @@ NTSTATUS dcerpc_pipe_connect(struct dcerpc_pipe **OUT, const char *username, const char *password); +%typemap(in) DATA_BLOB * (DATA_BLOB temp_data_blob) { + temp_data_blob.data = PyString_AsString($input); + temp_data_blob.length = PyString_Size($input); + $1 = &temp_data_blob; +} + %include "librpc/gen_ndr/misc.i" %include "librpc/gen_ndr/lsa.i" %include "librpc/gen_ndr/samr.i" diff --git a/source4/scripting/swig/torture/spoolss.py b/source4/scripting/swig/torture/spoolss.py index 78d573a7cd..e29178a0b6 100644 --- a/source4/scripting/swig/torture/spoolss.py +++ b/source4/scripting/swig/torture/spoolss.py @@ -11,7 +11,7 @@ def test_EnumPrinters(pipe): result = dcerpc.spoolss_EnumPrinters(pipe, r) - print result + print dcerpc.unmarshall_spoolss_PrinterInfo1(result['buffer']) def runtests(binding, domain, username, password): |