diff options
-rw-r--r-- | source4/pidl/lib/Parse/Pidl/Samba4/Python.pm | 51 | ||||
-rwxr-xr-x | source4/pidl/pidl | 3 |
2 files changed, 30 insertions, 24 deletions
diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/Python.pm b/source4/pidl/lib/Parse/Pidl/Samba4/Python.pm index d0a5bbd7e3..fc5480b661 100644 --- a/source4/pidl/lib/Parse/Pidl/Samba4/Python.pm +++ b/source4/pidl/lib/Parse/Pidl/Samba4/Python.pm @@ -89,37 +89,39 @@ sub EnumAndBitmapConsts($$$) } } -sub FromUnionToPythonFunction($$) +sub FromUnionToPythonFunction($$$) { - my ($self, $type) = @_; + my ($self, $type, $name) = @_; #FIXME $self->pidl("return NULL;"); } -sub FromStructToPythonFunction($$) +sub FromStructToPythonFunction($$$) { - my ($self, $type) = @_; + my ($self, $type, $name) = @_; - #FIXME - $self->pidl("return NULL;"); + $self->pidl("$type->{NAME}\_Object *ret;"); + $self->pidl("ret = PyObject_New($type->{NAME}\_Object, &$type->{NAME}\_ObjectType);"); + $self->pidl("ret->object = talloc_reference(NULL, $name);"); + $self->pidl("return (PyObject *) ret;"); } -sub FromPythonToUnionFunction($$) +sub FromPythonToUnionFunction($$$$) { - my ($self, $type) = @_; + my ($self, $type, $mem_ctx, $name) = @_; #FIXME $self->pidl("return NULL;"); } -sub FromPythonToStructFunction($$) +sub FromPythonToStructFunction($$$$) { - my ($self, $type) = @_; + my ($self, $type, $mem_ctx, $name) = @_; - #FIXME - $self->pidl("return NULL;"); + $self->pidl("$type->{NAME}\_Object *py_object = ($type->{NAME}_Object *)$name;"); + $self->pidl("return talloc_reference($mem_ctx, py_object->object);"); } sub PythonStruct($$$$) @@ -222,7 +224,7 @@ sub PythonFunction($$$) $self->pidl("$iface\_InterfaceObject *iface = ($iface\_InterfaceObject *)self;"); $self->pidl("NTSTATUS status;"); $self->pidl("TALLOC_CTX *mem_ctx = talloc_new(NULL);"); - $self->pidl("struct dcerpc_$fn->{NAME} r;"); + $self->pidl("struct $fn->{NAME} r;"); $self->pidl("PyObject *result;"); my $result_size = 0; @@ -234,11 +236,13 @@ sub PythonFunction($$$) $result_size++; } } + if ($result_size > 0) { + $self->pidl(""); + $self->pidl("ZERO_STRUCT(r.out);"); + } if ($fn->{RETURN_TYPE}) { $result_size++; } - $self->pidl(""); - $self->pidl("ZERO_STRUCT(r.out);"); foreach my $e (@{$fn->{ELEMENTS}}) { if (grep(/in/,@{$e->{DIRECTION}})) { @@ -322,8 +326,8 @@ sub PythonType($$$) $self->pidl("PyObject *py_import_$d->{NAME}(" .mapTypeName($d) . " *in)"); $self->pidl("{"); $self->indent; - $self->FromStructToPythonFunction($d) if ($actual_ctype->{TYPE} eq "STRUCT"); - $self->FromUnionToPythonFunction($d) if ($actual_ctype->{TYPE} eq "UNION"); + $self->FromStructToPythonFunction($d, "in") if ($actual_ctype->{TYPE} eq "STRUCT"); + $self->FromUnionToPythonFunction($d, "in") if ($actual_ctype->{TYPE} eq "UNION"); $self->deindent; $self->pidl("}"); $self->pidl(""); @@ -331,8 +335,8 @@ sub PythonType($$$) $self->pidl(mapTypeName($d) . " *py_export_$d->{NAME}(TALLOC_CTX *mem_ctx, PyObject *in)"); $self->pidl("{"); $self->indent; - $self->FromPythonToStructFunction($d) if ($actual_ctype->{TYPE} eq "STRUCT"); - $self->FromPythonToUnionFunction($d) if ($actual_ctype->{TYPE} eq "UNION"); + $self->FromPythonToStructFunction($d, "mem_ctx", "in") if ($actual_ctype->{TYPE} eq "STRUCT"); + $self->FromPythonToUnionFunction($d, "mem_ctx", "in") if ($actual_ctype->{TYPE} eq "UNION"); $self->deindent; $self->pidl("}"); $self->pidl(""); @@ -414,8 +418,8 @@ sub Interface($$$) $self->pidl("PyObject_HEAD_INIT(NULL) 0,"); $self->pidl(".tp_name = \"$interface->{NAME}\","); $self->pidl(".tp_basicsize = sizeof($interface->{NAME}_InterfaceObject),"); - $self->pidl(".tp_dealloc = interface_$interface->{NAME}_dealloc,"); - $self->pidl(".tp_getattr = interface_$interface->{NAME}_getattr,"); + $self->pidl(".tp_dealloc = (destructor)interface_$interface->{NAME}_dealloc,"); + $self->pidl(".tp_getattr = (getattrfunc)interface_$interface->{NAME}_getattr,"); $self->deindent; $self->pidl("};"); @@ -567,9 +571,9 @@ sub ConvertObjectToPython($$$) die("unknown type ".mapTypeName($ctype) . ": $cvar"); } -sub Parse($$$$) +sub Parse($$$$$) { - my($self,$basename,$ndr,$hdr) = @_; + my($self,$basename,$ndr,$ndr_hdr,$hdr) = @_; my $py_hdr = $hdr; $py_hdr =~ s/ndr_([^\/]+)$/py_$1/g; @@ -582,6 +586,7 @@ sub Parse($$$$) #include <Python.h> #include \"librpc/rpc/dcerpc.h\" #include \"$hdr\" +#include \"$ndr_hdr\" #include \"$py_hdr\" "); diff --git a/source4/pidl/pidl b/source4/pidl/pidl index 500b4dcbfc..4dfd57dc20 100755 --- a/source4/pidl/pidl +++ b/source4/pidl/pidl @@ -671,7 +671,8 @@ sub process_file($) if (defined($opt_python)) { require Parse::Pidl::Samba4::Python; my $generator = new Parse::Pidl::Samba4::Python(); - my ($hdr,$prsr) = $generator->Parse($basename, $ndr, $h_filename); + my ($hdr,$prsr) = $generator->Parse($basename, $ndr, + "$outputdir/ndr_$basename\_c.h", $h_filename); FileSave("$outputdir/py_$basename.c", $prsr); FileSave("$outputdir/py_$basename.h", $hdr); } |