summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Potter <tpot@samba.org>2004-09-14 12:19:59 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:58:44 -0500
commit31288d654552736ee96a0c7edbbc0b0cdcf1a3f5 (patch)
tree75516f41196e8fc8b8a8c0b1c07bb9c813961e23
parentd203c7899dbdb7b0b2a321215f3c67e6c9320e1c (diff)
downloadsamba-31288d654552736ee96a0c7edbbc0b0cdcf1a3f5.tar.gz
samba-31288d654552736ee96a0c7edbbc0b0cdcf1a3f5.tar.bz2
samba-31288d654552736ee96a0c7edbbc0b0cdcf1a3f5.zip
r2336: Add another conversion function to allow union arms that contain structures
not pointers to structures. Do some renaming of hand-written functions as a result. Include lsa interface before samr interface as samr depends on some lsa structures. Build up a nice hashed index of interfaces, functions, structs and unions. Add test for samr_Connect5() function which contains a union. (This used to be commit 30f068164a5125f84a34f28ed0f2586a2bdec7e4)
-rw-r--r--source4/build/pidl/swig.pm64
-rw-r--r--source4/scripting/swig/dcerpc.i8
-rwxr-xr-xsource4/scripting/swig/torture/samr.py13
3 files changed, 66 insertions, 19 deletions
diff --git a/source4/build/pidl/swig.pm b/source4/build/pidl/swig.pm
index 9fb08c49c9..7d2621a9b8 100644
--- a/source4/build/pidl/swig.pm
+++ b/source4/build/pidl/swig.pm
@@ -8,8 +8,8 @@ package IdlSwig;
use strict;
use Data::Dumper;
-my($res);
-my($name);
+my(%interfaces, %functions, %structs, %unions);
+my($res, $name);
sub DebugElement($)
{
@@ -75,7 +75,7 @@ sub XFromPython($$)
# Non-scalar type, no pointer
$result .= DebugElement($e);
} elsif ($e->{POINTERS} == 1) {
- $result .= "\ts->$prefix$e->{NAME} = $e->{TYPE}_from_python(mem_ctx, $obj);\n";
+ $result .= "\ts->$prefix$e->{NAME} = $e->{TYPE}_ptr_from_python(mem_ctx, $obj);\n";
} else {
# Non-scalar type, multiple pointers
$result .= DebugElement($e);
@@ -122,7 +122,7 @@ sub XToPython($$)
# Non-scalar type, no pointer
$result .= DebugElement($e);
} elsif ($e->{POINTERS} == 1) {
- $result .= "\ts->$prefix$e->{NAME} = $e->{TYPE}_from_python(mem_ctx, obj);\n";
+ $result .= "\ts->$prefix$e->{NAME} = $e->{TYPE}_ptr_from_python(mem_ctx, obj);\n";
} else {
# Non-scalar type, multiple pointers
$result .= DebugElement($e);
@@ -140,7 +140,7 @@ sub ParseFunction($)
$res .= "/* Convert Python dict to struct $fn->{NAME}.in */\n\n";
- $res .= "struct $fn->{NAME} *$fn->{NAME}_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)\n";
+ $res .= "struct $fn->{NAME} *$fn->{NAME}_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)\n";
$res .= "{\n";
$res .= "\tstruct $fn->{NAME} *s = talloc(mem_ctx, sizeof(struct $fn->{NAME}));\n\n";
@@ -177,7 +177,7 @@ sub ParseFunction($)
$res .= "%typemap(in) struct $fn->{NAME} * {\n";
$res .= "\tTALLOC_CTX *mem_ctx = talloc_init(\"typemap(int) $fn->{NAME}\");\n\n";
- $res .= "\t\$1 = $fn->{NAME}_from_python(mem_ctx, \$input);\n";
+ $res .= "\t\$1 = $fn->{NAME}_ptr_from_python(mem_ctx, \$input);\n";
$res .= "}\n\n";
# Output typemap
@@ -208,9 +208,9 @@ sub ParseStruct($)
my($s) = shift;
$res .= "%{\n\n";
- $res .= "/* Convert Python dict to struct $s->{NAME} */\n\n";
+ $res .= "/* Convert Python dict to struct $s->{NAME} pointer */\n\n";
- $res .= "struct $s->{NAME} *$s->{NAME}_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)\n";
+ $res .= "struct $s->{NAME} *$s->{NAME}_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)\n";
$res .= "{\n";
$res .= "\tstruct $s->{NAME} *s = talloc(mem_ctx, sizeof(struct $s->{NAME}));\n\n";
@@ -222,6 +222,17 @@ sub ParseStruct($)
$res .= "\treturn s;\n";
$res .= "}\n\n";
+ $res .= "/* Convert Python dict to struct $s->{NAME} */\n\n";
+
+ $res .= "void $s->{NAME}_from_python(TALLOC_CTX *mem_ctx, struct $s->{NAME} *s, PyObject *obj)\n";
+ $res .= "{\n";
+
+ foreach my $e (@{$s->{DATA}{ELEMENTS}}) {
+ $res .= XFromPython($e, "");
+ }
+
+ $res .= "}\n\n";
+
$res .= "/* Convert struct $s->{NAME} to Python dict */\n\n";
$res .= "PyObject *$s->{NAME}_to_python(TALLOC_CTX *mem_ctx, struct $s->{NAME} *s)\n";
@@ -247,20 +258,22 @@ sub ParseUnion($)
$res .= "%{\n\n";
$res .= "/* Convert Python dict to union $u->{NAME} */\n\n";
- $res .= "union $u->{NAME} *$u->{NAME}_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)\n";
+ $res .= "union $u->{NAME} *$u->{NAME}_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)\n";
$res .= "{\n";
- $res .= "\tunion $u->{NAME} *u = talloc(mem_ctx, sizeof(struct $u->{NAME}));\n";
+ $res .= "\tunion $u->{NAME} *u = talloc(mem_ctx, sizeof(union $u->{NAME}));\n";
$res .= "\tPyObject *dict;\n\n";
for my $e (@{$u->{DATA}{DATA}}) {
$res .= "\tif ((dict = PyDict_GetItem(obj, PyString_FromString(\"$e->{DATA}{NAME}\")))) {\n";
-# if ($e->{DATA}{POINTERS} == 0) {
-# $res .= "\t\t// $e->{TYPE} pointers=$e->{DATA}{POINTERS}\n";
-# } else {
-# $res .= "\t\t// $e->{TYPE} pointers=$e->{DATA}{POINTERS}\n";
-# }
+ if ($e->{DATA}{POINTERS} == 0) {
+ $res .= "\t\t$e->{DATA}{TYPE}_from_python(mem_ctx, &u->$e->{DATA}{NAME}, dict);\n";
+ } elsif ($e->{DATA}{POINTERS} == 1) {
+ $res .= "\t\tu->$e->{DATA}{NAME} = $e->{DATA}{TYPE}_ptr_from_python(mem_ctx, dict);\n";
+ } else {
+ $res .= "\t\t// $e->{DATA}{TYPE} pointers=$e->{DATA}{POINTERS}\n";
+ }
$res .= "\t\treturn u;\n";
$res .= "\t}\n\n";
@@ -316,6 +329,27 @@ sub Parse($)
{
my($idl) = shift;
+ # Make index of functions, structs and unions
+
+ %interfaces = ();
+ %functions = ();
+ %structs = ();
+ %unions = ();
+
+ foreach my $x (@{$idl}) {
+ my($iname) = $x->{NAME};
+ $interfaces{$iname} = $x->{PROPERTIES};
+ foreach my $i (@{$x->{INHERITED_DATA}}) {
+ $functions{$iname}{$i->{NAME}} = $i if $i->{TYPE} eq "FUNCTION";
+ if ($i->{TYPE} eq "TYPEDEF") {
+ $structs{$iname}{$i->{NAME}} = $i->{DATA} if $i->{DATA}{TYPE} eq "STRUCT";
+ $unions{$iname}{$i->{NAME}} = $i->{DATA} if $i->{DATA}{TYPE} eq "UNION";
+ }
+ }
+ }
+
+ # Generate interface
+
$res = "/* auto-generated by pidl */\n\n";
foreach my $x (@{$idl}) {
diff --git a/source4/scripting/swig/dcerpc.i b/source4/scripting/swig/dcerpc.i
index 6ad8f8b631..7679b773f4 100644
--- a/source4/scripting/swig/dcerpc.i
+++ b/source4/scripting/swig/dcerpc.i
@@ -127,7 +127,7 @@ PyObject *policy_handle_to_python(struct policy_handle *handle)
return PyString_FromStringAndSize((char *)handle, sizeof(*handle));
}
-struct security_descriptor *security_descriptor_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)
+struct security_descriptor *security_descriptor_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)
{
return NULL;
}
@@ -137,7 +137,7 @@ PyObject *security_descriptor_to_python(struct security_descriptor *obj)
return Py_None;
}
-struct dom_sid2 *dom_sid2_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)
+struct dom_sid2 *dom_sid2_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)
{
return NULL;
}
@@ -163,7 +163,7 @@ PyObject *string_to_python(char *obj)
return PyString_FromString(obj);
}
-struct samr_Password *samr_Password_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)
+struct samr_Password *samr_Password_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)
{
return NULL;
}
@@ -228,5 +228,5 @@ NTSTATUS dcerpc_pipe_connect(struct dcerpc_pipe **OUT,
const char *username,
const char *password);
-%include "librpc/gen_ndr/samr.i"
%include "librpc/gen_ndr/lsa.i"
+%include "librpc/gen_ndr/samr.i"
diff --git a/source4/scripting/swig/torture/samr.py b/source4/scripting/swig/torture/samr.py
index d7edbbcef5..ca9c7e9597 100755
--- a/source4/scripting/swig/torture/samr.py
+++ b/source4/scripting/swig/torture/samr.py
@@ -42,6 +42,19 @@ def test_Connect(handle):
result = dcerpc.samr_Connect4(pipe, r)
dcerpc.samr_Close(pipe, result)
+
+ print 'testing samr_Connect5'
+
+ r = {}
+ r['system_name'] = None
+ r['access_mask'] = 0x02000000
+ r['level'] = 1
+ r['info'] = {}
+ r['info']['info1'] = {}
+ r['info']['info1']['unknown1'] = 0
+ r['info']['info1']['unknown2'] = 0
+
+ result = dcerpc.samr_Connect5(pipe, r)
# Connect to server