summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm37
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4.pm41
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4/SWIG.pm48
-rw-r--r--source4/pidl/lib/Parse/Pidl/Typelist.pm2
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))) {