diff options
-rw-r--r-- | source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm | 37 | ||||
-rw-r--r-- | source4/pidl/lib/Parse/Pidl/Samba4.pm | 41 | ||||
-rw-r--r-- | source4/pidl/lib/Parse/Pidl/Samba4/SWIG.pm | 48 | ||||
-rw-r--r-- | source4/pidl/lib/Parse/Pidl/Typelist.pm | 2 |
4 files changed, 80 insertions, 48 deletions
diff --git a/source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm b/source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm index eda2ab99d7..3b8c92ebe4 100644 --- a/source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm +++ b/source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm @@ -10,6 +10,7 @@ use strict; use Parse::Pidl::Typelist qw(hasType getType mapType scalar_is_reference); use Parse::Pidl::Util qw(has_property ParseExpr is_constant); use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred); +use Parse::Pidl::Samba4 qw(DeclLong); use vars qw($VERSION); $VERSION = '0.01'; @@ -46,42 +47,6 @@ sub CopyLevel($$$$) } } -sub DeclLong($) -{ - my($element) = shift; - my $ret = ""; - - if (has_property($element, "represent_as")) { - $ret.=mapType($element->{PROPERTIES}->{represent_as})." "; - } else { - if (has_property($element, "charset")) { - $ret.="const char"; - } else { - $ret.=mapType($element->{TYPE}); - } - - $ret.=" "; - my $numstar = $element->{ORIGINAL}->{POINTERS}; - if ($numstar >= 1) { - $numstar-- if scalar_is_reference($element->{TYPE}); - } - foreach (@{$element->{ORIGINAL}->{ARRAY_LEN}}) - { - next if is_constant($_) and - not has_property($element, "charset"); - $numstar++; - } - $ret.="*" foreach (1..$numstar); - } - $ret.=$element->{NAME}; - foreach (@{$element->{ARRAY_LEN}}) { - next unless (is_constant($_) and not has_property($element, "charset")); - $ret.="[$_]"; - } - - return $ret; -} - sub ParseFunction($$) { my ($if,$fn) = @_; diff --git a/source4/pidl/lib/Parse/Pidl/Samba4.pm b/source4/pidl/lib/Parse/Pidl/Samba4.pm index 0a284aa85b..2d710f3eb6 100644 --- a/source4/pidl/lib/Parse/Pidl/Samba4.pm +++ b/source4/pidl/lib/Parse/Pidl/Samba4.pm @@ -7,9 +7,10 @@ package Parse::Pidl::Samba4; require Exporter; @ISA = qw(Exporter); -@EXPORT = qw(is_intree choose_header); +@EXPORT = qw(is_intree choose_header DeclLong); -use Parse::Pidl::Util qw(has_property); +use Parse::Pidl::Util qw(has_property is_constant); +use Parse::Pidl::Typelist qw(mapType scalar_is_reference); use strict; use vars qw($VERSION); @@ -29,4 +30,40 @@ sub choose_header($$) return "#include <$out>"; } +sub DeclLong($) +{ + my($element) = shift; + my $ret = ""; + + if (has_property($element, "represent_as")) { + $ret.=mapType($element->{PROPERTIES}->{represent_as})." "; + } else { + if (has_property($element, "charset")) { + $ret.="const char"; + } else { + $ret.=mapType($element->{TYPE}); + } + + $ret.=" "; + my $numstar = $element->{ORIGINAL}->{POINTERS}; + if ($numstar >= 1) { + $numstar-- if scalar_is_reference($element->{TYPE}); + } + foreach (@{$element->{ORIGINAL}->{ARRAY_LEN}}) + { + next if is_constant($_) and + not has_property($element, "charset"); + $numstar++; + } + $ret.="*" foreach (1..$numstar); + } + $ret.=$element->{NAME}; + foreach (@{$element->{ARRAY_LEN}}) { + next unless (is_constant($_) and not has_property($element, "charset")); + $ret.="[$_]"; + } + + return $ret; +} + 1; diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/SWIG.pm b/source4/pidl/lib/Parse/Pidl/Samba4/SWIG.pm index d42960be28..22061f46af 100644 --- a/source4/pidl/lib/Parse/Pidl/Samba4/SWIG.pm +++ b/source4/pidl/lib/Parse/Pidl/Samba4/SWIG.pm @@ -7,6 +7,8 @@ package Parse::Pidl::Samba4::SWIG; use vars qw($VERSION); +use Parse::Pidl::Samba4 qw(DeclLong); +use Parse::Pidl::Typelist qw(mapType); $VERSION = '0.01'; use strict; @@ -23,9 +25,9 @@ sub pidl($) sub indent() { $tabs.="\t"; } sub deindent() { $tabs = substr($tabs,0,-1); } -sub ParseInterface($) +sub ParseInterface($$) { - my $if = shift; + my ($basename,$if) = @_; pidl "\%{"; pidl "struct $if->{NAME} {"; @@ -36,8 +38,6 @@ sub ParseInterface($) pidl "%}"; pidl ""; - # FIXME: Generate ignores for all manual functions - pidl "\%extend $if->{NAME} {"; indent(); pidl "struct $if->{NAME} *$if->{NAME} (const char *binding, struct cli_credentials *cred = NULL, TALLOC_CTX *mem_ctx = NULL, struct event_context *event = NULL)"; @@ -61,8 +61,39 @@ sub ParseInterface($) pidl "}"; pidl ""; - foreach (@{$if->{FUNCTIONS}}) { - pidl "/* $_->{NAME} */"; + foreach my $fn (@{$if->{FUNCTIONS}}) { + pidl "/* $fn->{NAME} */"; + my $args = ""; + foreach (@{$fn->{ELEMENTS}}) { + $args .= DeclLong($_) . ", "; + } + my $name = $fn->{NAME}; + $name =~ s/^$if->{NAME}_//g; + $name =~ s/^$basename\_//g; + $args .= "TALLOC_CTX *mem_ctx = NULL"; + pidl mapType($fn->{RETURN_TYPE}) . " $name($args)"; + pidl "{"; + indent; + pidl "struct $fn->{NAME} r;"; + my $assign = ""; + if (defined($fn->{RETURN_TYPE})) { + pidl mapType($fn->{RETURN_TYPE}) . " ret;"; + $assign = "ret = "; + } + pidl ""; + pidl "/* Fill r structure */"; + pidl "/* FIXME */"; + pidl ""; + pidl $assign."dcerpc_$fn->{NAME}(self->pipe, mem_ctx, &r);"; + pidl ""; + pidl "/* Set out arguments */"; + pidl "/* FIXME */"; + if (defined($fn->{RETURN_TYPE})) { + pidl "return ret;"; + } + deindent; + pidl "}"; + pidl ""; } deindent(); @@ -70,7 +101,7 @@ sub ParseInterface($) pidl ""; foreach (@{$if->{TYPES}}) { - pidl "/* $_->{NAME} */"; + pidl "/* $_->{NAME} */"; } pidl ""; @@ -98,12 +129,11 @@ sub Parse($$$$) pidl ""; foreach (@$ndr) { - ParseInterface($_) if ($_->{TYPE} eq "INTERFACE"); + ParseInterface($basename, $_) if ($_->{TYPE} eq "INTERFACE"); } #FIXME: Foreach ref pointer, set NONNULL #FIXME: Foreach unique/full pointer, set MAYBENULL #FIXME: Foreach [out] parameter, set OUTPARAM - # return $ret; } diff --git a/source4/pidl/lib/Parse/Pidl/Typelist.pm b/source4/pidl/lib/Parse/Pidl/Typelist.pm index cf68345517..ff8f18ee48 100644 --- a/source4/pidl/lib/Parse/Pidl/Typelist.pm +++ b/source4/pidl/lib/Parse/Pidl/Typelist.pm @@ -194,7 +194,7 @@ sub bitmap_type_fn($) sub mapType($) { my $t = shift; - die("Undef passed to mapType") unless defined($t); + return "void" unless defined($t); my $dt; unless ($dt or ($dt = getType($t))) { |