summaryrefslogtreecommitdiff
path: root/source4/pidl
diff options
context:
space:
mode:
Diffstat (limited to 'source4/pidl')
-rw-r--r--source4/pidl/lib/Parse/Pidl/ODL.pm102
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm2
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm4
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4.pm6
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4/COM/Header.pm142
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4/COM/Proxy.pm219
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4/COM/Stub.pm327
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4/EJS.pm4
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4/Header.pm8
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm22
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4/SWIG.pm4
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4/TDR.pm65
-rw-r--r--source4/pidl/lib/Parse/Pidl/Typelist.pm51
-rwxr-xr-xsource4/pidl/pidl51
-rwxr-xr-xsource4/pidl/tests/tdr.pl48
15 files changed, 140 insertions, 915 deletions
diff --git a/source4/pidl/lib/Parse/Pidl/ODL.pm b/source4/pidl/lib/Parse/Pidl/ODL.pm
deleted file mode 100644
index ee8d030a37..0000000000
--- a/source4/pidl/lib/Parse/Pidl/ODL.pm
+++ /dev/null
@@ -1,102 +0,0 @@
-##########################################
-# Converts ODL stuctures to IDL structures
-# (C) 2004-2005 Jelmer Vernooij <jelmer@samba.org>
-
-package Parse::Pidl::ODL;
-
-use Parse::Pidl::Util qw(has_property);
-use Parse::Pidl::Typelist qw(hasType getType);
-use strict;
-
-use vars qw($VERSION);
-$VERSION = '0.01';
-
-#####################################################################
-# find an interface in an array of interfaces
-sub get_interface($$)
-{
- my($if,$n) = @_;
-
- foreach(@$if) {
- next if ($_->{TYPE} ne "INTERFACE");
- return $_ if($_->{NAME} eq $n);
- }
-
- return 0;
-}
-
-sub FunctionAddObjArgs($)
-{
- my $e = shift;
-
- unshift(@{$e->{ELEMENTS}}, {
- 'NAME' => 'ORPCthis',
- 'POINTERS' => 0,
- 'PROPERTIES' => { 'in' => '1' },
- 'TYPE' => 'ORPCTHIS',
- 'FILE' => $e->{FILE},
- 'LINE' => $e->{LINE}
- });
- unshift(@{$e->{ELEMENTS}}, {
- 'NAME' => 'ORPCthat',
- 'POINTERS' => 1,
- 'PROPERTIES' => { 'out' => '1', 'ref' => '1' },
- 'TYPE' => 'ORPCTHAT',
- 'FILE' => $e->{FILE},
- 'LINE' => $e->{LINE}
- });
-}
-
-sub ReplaceInterfacePointers($)
-{
- my $e = shift;
-
- foreach my $x (@{$e->{ELEMENTS}}) {
- next unless (hasType($x->{TYPE}));
- next unless getType($x->{TYPE})->{DATA}->{TYPE} eq "INTERFACE";
-
- $x->{TYPE} = "MInterfacePointer";
- }
-}
-
-# Add ORPC specific bits to an interface.
-sub ODL2IDL($)
-{
- my $odl = shift;
- my $addedorpc = 0;
-
- foreach my $x (@$odl) {
- next if ($x->{TYPE} ne "INTERFACE");
- # Add [in] ORPCTHIS *this, [out] ORPCTHAT *that
- # and replace interfacepointers with MInterfacePointer
- # for 'object' interfaces
- if (has_property($x, "object")) {
- foreach my $e (@{$x->{DATA}}) {
- ($e->{TYPE} eq "FUNCTION") && FunctionAddObjArgs($e);
- ReplaceInterfacePointers($e);
- }
- $addedorpc = 1;
- }
-
- if ($x->{BASE}) {
- my $base = get_interface($odl, $x->{BASE});
-
- foreach my $fn (reverse @{$base->{DATA}}) {
- next unless ($fn->{TYPE} eq "FUNCTION");
- unshift (@{$x->{DATA}}, $fn);
- push (@{$x->{INHERITED_FUNCTIONS}}, $fn->{NAME});
- }
- }
- }
-
- unshift (@$odl, {
- TYPE => "IMPORT",
- PATHS => [ "\"orpc.idl\"" ],
- FILE => undef,
- LINE => undef
- }) if ($addedorpc);
-
- return $odl;
-}
-
-1;
diff --git a/source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm b/source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm
index 0ffa321782..8fa37ca300 100644
--- a/source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm
+++ b/source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm
@@ -12,7 +12,7 @@ use Exporter;
use strict;
use Parse::Pidl qw(fatal warning);
-use Parse::Pidl::Typelist qw(hasType getType mapType scalar_is_reference);
+use Parse::Pidl::Typelist qw(hasType getType mapTypeName scalar_is_reference);
use Parse::Pidl::Util qw(has_property is_constant ParseExpr);
use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
use Parse::Pidl::Samba4 qw(DeclLong);
diff --git a/source4/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm b/source4/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm
index 52e384814d..aa4f3dd1ce 100644
--- a/source4/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm
+++ b/source4/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm
@@ -8,7 +8,7 @@ package Parse::Pidl::Samba3::ServerNDR;
use strict;
use Parse::Pidl qw(warning fatal);
-use Parse::Pidl::Typelist qw(mapType scalar_is_reference);
+use Parse::Pidl::Typelist qw(mapTypeName scalar_is_reference);
use Parse::Pidl::Util qw(ParseExpr has_property is_constant);
use Parse::Pidl::NDR qw(GetNextLevel);
use Parse::Pidl::Samba4 qw(DeclLong);
@@ -35,7 +35,7 @@ sub DeclLevel($$)
if (has_property($e, "charset")) {
$ret.="const char";
} else {
- $ret.=mapType($e->{TYPE});
+ $ret.=mapTypeName($e->{TYPE});
}
my $numstar = $e->{ORIGINAL}->{POINTERS};
diff --git a/source4/pidl/lib/Parse/Pidl/Samba4.pm b/source4/pidl/lib/Parse/Pidl/Samba4.pm
index 4ef2daa591..f0c6ae38e8 100644
--- a/source4/pidl/lib/Parse/Pidl/Samba4.pm
+++ b/source4/pidl/lib/Parse/Pidl/Samba4.pm
@@ -10,7 +10,7 @@ require Exporter;
@EXPORT = qw(is_intree choose_header DeclLong);
use Parse::Pidl::Util qw(has_property is_constant);
-use Parse::Pidl::Typelist qw(mapType scalar_is_reference);
+use Parse::Pidl::Typelist qw(mapTypeName scalar_is_reference);
use strict;
use vars qw($VERSION);
@@ -38,12 +38,12 @@ sub DeclLong($)
my $ret = "";
if (has_property($element, "represent_as")) {
- $ret.=mapType($element->{PROPERTIES}->{represent_as})." ";
+ $ret.=mapTypeName($element->{PROPERTIES}->{represent_as})." ";
} else {
if (has_property($element, "charset")) {
$ret.="const char";
} else {
- $ret.=mapType($element->{TYPE});
+ $ret.=mapTypeName($element->{TYPE});
}
$ret.=" ";
diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/COM/Header.pm b/source4/pidl/lib/Parse/Pidl/Samba4/COM/Header.pm
deleted file mode 100644
index 85dab37246..0000000000
--- a/source4/pidl/lib/Parse/Pidl/Samba4/COM/Header.pm
+++ /dev/null
@@ -1,142 +0,0 @@
-# COM Header generation
-# (C) 2005 Jelmer Vernooij <jelmer@samba.org>
-
-package Parse::Pidl::Samba4::COM::Header;
-
-use Parse::Pidl::Typelist qw(mapType);
-use Parse::Pidl::Util qw(has_property is_constant);
-
-use vars qw($VERSION);
-$VERSION = '0.01';
-
-use strict;
-
-sub GetArgumentProtoList($)
-{
- my $f = shift;
- my $res = "";
-
- foreach my $a (@{$f->{ELEMENTS}}) {
-
- $res .= ", " . mapType($a->{TYPE}) . " ";
-
- my $l = $a->{POINTERS};
- $l-- if (Parse::Pidl::Typelist::scalar_is_reference($a->{TYPE}));
- foreach my $i (1..$l) {
- $res .= "*";
- }
-
- if (defined $a->{ARRAY_LEN}[0] && !is_constant($a->{ARRAY_LEN}[0]) &&
- !$a->{POINTERS}) {
- $res .= "*";
- }
- $res .= $a->{NAME};
- if (defined $a->{ARRAY_LEN}[0] && is_constant($a->{ARRAY_LEN}[0])) {
- $res .= "[$a->{ARRAY_LEN}[0]]";
- }
- }
-
- return $res;
-}
-
-sub GetArgumentList($)
-{
- my $f = shift;
- my $res = "";
-
- foreach (@{$f->{ELEMENTS}}) { $res .= ", $_->{NAME}"; }
-
- return $res;
-}
-
-#####################################################################
-# generate vtable structure for COM interface
-sub HeaderVTable($)
-{
- my $interface = shift;
- my $res;
- $res .= "#define " . uc($interface->{NAME}) . "_METHODS \\\n";
- if (defined($interface->{BASE})) {
- $res .= "\t" . uc($interface->{BASE} . "_METHODS") . "\\\n";
- }
-
- my $data = $interface->{DATA};
- foreach my $d (@{$data}) {
- $res .= "\t" . mapType($d->{RETURN_TYPE}) . " (*$d->{NAME}) (struct $interface->{NAME} *d, TALLOC_CTX *mem_ctx" . GetArgumentProtoList($d) . ");\\\n" if ($d->{TYPE} eq "FUNCTION");
- }
- $res .= "\n";
- $res .= "struct $interface->{NAME}_vtable {\n";
- $res .= "\tstruct GUID iid;\n";
- $res .= "\t" . uc($interface->{NAME}) . "_METHODS\n";
- $res .= "};\n\n";
-
- return $res;
-}
-
-sub ParseInterface($)
-{
- my $if = shift;
- my $res;
-
- $res .="\n\n/* $if->{NAME} */\n";
-
- $res .="#define COM_" . uc($if->{NAME}) . "_UUID $if->{PROPERTIES}->{uuid}\n\n";
-
- $res .="struct $if->{NAME}_vtable;\n\n";
-
- $res .="struct $if->{NAME} {
- struct com_context *ctx;
- struct $if->{NAME}_vtable *vtable;
- void *object_data;
-};\n\n";
-
- $res.=HeaderVTable($if);
-
- foreach my $d (@{$if->{DATA}}) {
- next if ($d->{TYPE} ne "FUNCTION");
-
- $res .= "#define $if->{NAME}_$d->{NAME}(interface, mem_ctx" . GetArgumentList($d) . ") ";
-
- $res .= "((interface)->vtable->$d->{NAME}(interface, mem_ctx" . GetArgumentList($d) . "))";
-
- $res .="\n";
- }
-
- return $res;
-}
-
-sub ParseCoClass($)
-{
- my $c = shift;
- my $res = "";
- $res .= "#define CLSID_" . uc($c->{NAME}) . " $c->{PROPERTIES}->{uuid}\n";
- if (has_property($c, "progid")) {
- $res .= "#define PROGID_" . uc($c->{NAME}) . " $c->{PROPERTIES}->{progid}\n";
- }
- $res .= "\n";
- return $res;
-}
-
-sub Parse($$)
-{
- my ($idl,$ndr_header) = @_;
- my $res = "";
-
- $res .= "#include \"librpc/gen_ndr/orpc.h\"\n" .
- "#include \"$ndr_header\"\n\n";
-
- foreach (@{$idl})
- {
- if ($_->{TYPE} eq "INTERFACE" && has_property($_, "object")) {
- $res.=ParseInterface($_);
- }
-
- if ($_->{TYPE} eq "COCLASS") {
- $res.=ParseCoClass($_);
- }
- }
-
- return $res;
-}
-
-1;
diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/COM/Proxy.pm b/source4/pidl/lib/Parse/Pidl/Samba4/COM/Proxy.pm
deleted file mode 100644
index e6366f0f3d..0000000000
--- a/source4/pidl/lib/Parse/Pidl/Samba4/COM/Proxy.pm
+++ /dev/null
@@ -1,219 +0,0 @@
-###################################################
-# DCOM parser for Samba
-# Basically the glue between COM and DCE/RPC with NDR
-# Copyright jelmer@samba.org 2003-2005
-# released under the GNU GPL
-
-package Parse::Pidl::Samba4::COM::Proxy;
-
-use Parse::Pidl::Samba4::COM::Header;
-use Parse::Pidl::Util qw(has_property);
-
-use vars qw($VERSION);
-$VERSION = '0.01';
-
-use strict;
-
-my($res);
-
-sub ParseVTable($$)
-{
- my $interface = shift;
- my $name = shift;
-
- # Generate the vtable
- $res .="\tstruct $interface->{NAME}_vtable $name = {";
-
- if (defined($interface->{BASE})) {
- $res .= "\n\t\t{},";
- }
-
- my $data = $interface->{DATA};
-
- foreach my $d (@{$data}) {
- if ($d->{TYPE} eq "FUNCTION") {
- $res .= "\n\t\tdcom_proxy_$interface->{NAME}_$d->{NAME}";
- $res .= ",";
- }
- }
-
- $res .= "\n\t};\n\n";
-}
-
-sub ParseRegFunc($)
-{
- my $interface = shift;
-
- $res .= "static NTSTATUS dcom_proxy_$interface->{NAME}_init(void)
-{
- struct GUID base_iid;
- struct $interface->{NAME}_vtable *proxy_vtable = talloc(talloc_autofree_context(), struct $interface->{NAME}_vtable);
-";
-
- if (defined($interface->{BASE})) {
- $res.= "
- const void *base_vtable;
-
- base_iid = dcerpc_table_$interface->{BASE}.uuid;
-
- base_vtable = dcom_proxy_vtable_by_iid(&base_iid);
- if (base_vtable == NULL) {
- DEBUG(0, (\"No proxy registered for base interface '$interface->{BASE}'\\n\"));
- return NT_STATUS_FOOBAR;
- }
-
- memcpy(&proxy_vtable, base_vtable, sizeof(struct $interface->{BASE}_vtable));
-
-";
- }
- foreach my $x (@{$interface->{DATA}}) {
- next unless ($x->{TYPE} eq "FUNCTION");
-
- $res .= "\tproxy_vtable.$x->{NAME} = dcom_proxy_$interface->{NAME}_$x->{NAME};\n";
- }
-
- $res.= "
- proxy_vtable.iid = dcerpc_table_$interface->{NAME}.uuid;
-
- return dcom_register_proxy(&proxy_vtable);
-}\n\n";
-}
-
-#####################################################################
-# parse a function
-sub ParseFunction($$)
-{
- my $interface = shift;
- my $fn = shift;
- my $name = $fn->{NAME};
- my $uname = uc $name;
-
- $res.="
-static $fn->{RETURN_TYPE} dcom_proxy_$interface->{NAME}_$name(struct $interface->{NAME} *d, TALLOC_CTX *mem_ctx" . Parse::Pidl::Samba4::COM::Header::GetArgumentProtoList($fn) . ")
-{
- struct dcerpc_pipe *p;
- NTSTATUS status = dcom_get_pipe(d, &p);
- struct $name r;
- struct rpc_request *req;
-
- if (NT_STATUS_IS_ERR(status)) {
- return status;
- }
-
- ZERO_STRUCT(r.in.ORPCthis);
- r.in.ORPCthis.version.MajorVersion = COM_MAJOR_VERSION;
- r.in.ORPCthis.version.MinorVersion = COM_MINOR_VERSION;
-";
-
- # Put arguments into r
- foreach my $a (@{$fn->{ELEMENTS}}) {
- next unless (has_property($a, "in"));
- if (Parse::Pidl::Typelist::typeIs($a->{TYPE}, "INTERFACE")) {
- $res .="\tNDR_CHECK(dcom_OBJREF_from_IUnknown(&r.in.$a->{NAME}.obj, $a->{NAME}));\n";
- } else {
- $res .= "\tr.in.$a->{NAME} = $a->{NAME};\n";
- }
- }
-
- $res .="
- if (p->conn->flags & DCERPC_DEBUG_PRINT_IN) {
- NDR_PRINT_IN_DEBUG($name, &r);
- }
-
- status = dcerpc_ndr_request(p, &d->ipid, &dcerpc_table_$interface->{NAME}, DCERPC_$uname, mem_ctx, &r);
-
- if (NT_STATUS_IS_OK(status) && (p->conn->flags & DCERPC_DEBUG_PRINT_OUT)) {
- NDR_PRINT_OUT_DEBUG($name, r);
- }
-
-";
-
- # Put r info back into arguments
- foreach my $a (@{$fn->{ELEMENTS}}) {
- next unless (has_property($a, "out"));
-
- if (Parse::Pidl::Typelist::typeIs($a->{TYPE}, "INTERFACE")) {
- $res .="\tNDR_CHECK(dcom_IUnknown_from_OBJREF(d->ctx, &$a->{NAME}, r.out.$a->{NAME}.obj));\n";
- } else {
- $res .= "\t*$a->{NAME} = r.out.$a->{NAME};\n";
- }
-
- }
-
- if ($fn->{RETURN_TYPE} eq "NTSTATUS") {
- $res .= "\tif (NT_STATUS_IS_OK(status)) status = r.out.result;\n";
- }
-
- $res .=
- "
- return r.out.result;
-}\n\n";
-}
-
-#####################################################################
-# parse the interface definitions
-sub ParseInterface($)
-{
- my($interface) = shift;
- my($data) = $interface->{DATA};
- $res = "/* DCOM proxy for $interface->{NAME} generated by pidl */\n\n";
- foreach my $d (@{$data}) {
- ($d->{TYPE} eq "FUNCTION") &&
- ParseFunction($interface, $d);
- }
-
- ParseRegFunc($interface);
-}
-
-sub RegistrationFunction($$)
-{
- my $idl = shift;
- my $basename = shift;
-
- my $res = "\n\nNTSTATUS dcom_$basename\_init(void)\n";
- $res .= "{\n";
- $res .="\tNTSTATUS status = NT_STATUS_OK;\n";
- foreach my $interface (@{$idl}) {
- next if $interface->{TYPE} ne "INTERFACE";
- next if not has_property($interface, "object");
-
- my $data = $interface->{DATA};
- my $count = 0;
- foreach my $d (@{$data}) {
- if ($d->{TYPE} eq "FUNCTION") { $count++; }
- }
-
- next if ($count == 0);
-
- $res .= "\tstatus = dcom_$interface->{NAME}_init();\n";
- $res .= "\tif (NT_STATUS_IS_ERR(status)) {\n";
- $res .= "\t\treturn status;\n";
- $res .= "\t}\n\n";
- }
- $res .= "\treturn status;\n";
- $res .= "}\n\n";
-
- return $res;
-}
-
-sub Parse($$)
-{
- my ($pidl,$comh_filename) = @_;
- my $res = "";
-
- $res .= "#include \"includes.h\"\n" .
- "#include \"lib/com/dcom/dcom.h\"\n" .
- "#include \"$comh_filename\"\n";
-
- foreach (@{$pidl}) {
- next if ($_->{TYPE} ne "INTERFACE");
- next if has_property($_, "local");
- next unless has_property($_, "object");
-
- $res .= ParseInterface($_);
- }
-
- return $res;
-}
-
-1;
diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/COM/Stub.pm b/source4/pidl/lib/Parse/Pidl/Samba4/COM/Stub.pm
deleted file mode 100644
index 150acbfde9..0000000000
--- a/source4/pidl/lib/Parse/Pidl/Samba4/COM/Stub.pm
+++ /dev/null
@@ -1,327 +0,0 @@
-###################################################
-# DCOM stub boilerplate generator
-# Copyright jelmer@samba.org 2004-2005
-# Copyright tridge@samba.org 2003
-# Copyright metze@samba.org 2004
-# released under the GNU GPL
-
-package Parse::Pidl::Samba4::COM::Stub;
-
-use Parse::Pidl::Util qw(has_property);
-use strict;
-
-use vars qw($VERSION);
-$VERSION = '0.01';
-
-my($res);
-
-sub pidl($)
-{
- $res .= shift;
-}
-
-#####################################################
-# generate the switch statement for function dispatch
-sub gen_dispatch_switch($)
-{
- my $data = shift;
-
- my $count = 0;
- foreach my $d (@{$data}) {
- next if ($d->{TYPE} ne "FUNCTION");
-
- pidl "\tcase $count: {\n";
- if ($d->{RETURN_TYPE} && $d->{RETURN_TYPE} ne "void") {
- pidl "\t\tNTSTATUS result;\n";
- }
- pidl "\t\tstruct $d->{NAME} *r2 = r;\n";
- pidl "\t\tif (DEBUGLEVEL > 10) {\n";
- pidl "\t\t\tNDR_PRINT_FUNCTION_DEBUG($d->{NAME}, NDR_IN, r2);\n";
- pidl "\t\t}\n";
- if ($d->{RETURN_TYPE} && $d->{RETURN_TYPE} ne "void") {
- pidl "\t\tresult = vtable->$d->{NAME}(iface, mem_ctx, r2);\n";
- } else {
- pidl "\t\tvtable->$d->{NAME}(iface, mem_ctx, r2);\n";
- }
- pidl "\t\tif (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {\n";
- pidl "\t\t\tDEBUG(5,(\"function $d->{NAME} will reply async\\n\"));\n";
- pidl "\t\t}\n";
- pidl "\t\tbreak;\n\t}\n";
- $count++;
- }
-}
-
-#####################################################
-# generate the switch statement for function reply
-sub gen_reply_switch($)
-{
- my $data = shift;
-
- my $count = 0;
- foreach my $d (@{$data}) {
- next if ($d->{TYPE} ne "FUNCTION");
-
- pidl "\tcase $count: {\n";
- pidl "\t\tstruct $d->{NAME} *r2 = r;\n";
- pidl "\t\tif (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {\n";
- pidl "\t\t\tDEBUG(5,(\"function $d->{NAME} replied async\\n\"));\n";
- pidl "\t\t}\n";
- pidl "\t\tif (DEBUGLEVEL > 10 && dce_call->fault_code == 0) {\n";
- pidl "\t\t\tNDR_PRINT_FUNCTION_DEBUG($d->{NAME}, NDR_OUT | NDR_SET_VALUES, r2);\n";
- pidl "\t\t}\n";
- pidl "\t\tif (dce_call->fault_code != 0) {\n";
- pidl "\t\t\tDEBUG(2,(\"dcerpc_fault %s in $d->{NAME}\\n\", dcerpc_errstr(mem_ctx, dce_call->fault_code)));\n";
- pidl "\t\t}\n";
- pidl "\t\tbreak;\n\t}\n";
- $count++;
- }
-}
-
-#####################################################################
-# produce boilerplate code for a interface
-sub Boilerplate_Iface($)
-{
- my($interface) = shift;
- my($data) = $interface->{DATA};
- my $name = $interface->{NAME};
- my $uname = uc $name;
- my $uuid = Parse::Pidl::Util::make_str($interface->{PROPERTIES}->{uuid});
- my $if_version = $interface->{PROPERTIES}->{version};
-
- pidl "
-static NTSTATUS $name\__op_bind(struct dcesrv_call_state *dce_call, const struct dcesrv_interface *iface)
-{
-#ifdef DCESRV_INTERFACE_$uname\_BIND
- return DCESRV_INTERFACE_$uname\_BIND(dce_call,iface);
-#else
- return NT_STATUS_OK;
-#endif
-}
-
-static void $name\__op_unbind(struct dcesrv_connection_context *context, const struct dcesrv_interface *iface)
-{
-#ifdef DCESRV_INTERFACE_$uname\_UNBIND
- DCESRV_INTERFACE_$uname\_UNBIND(context, iface);
-#else
- return;
-#endif
-}
-
-static NTSTATUS $name\__op_ndr_pull(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ndr_pull *pull, void **r)
-{
- NTSTATUS status;
- uint16_t opnum = dce_call->pkt.u.request.opnum;
-
- dce_call->fault_code = 0;
-
- if (opnum >= dcerpc_table_$name.num_calls) {
- dce_call->fault_code = DCERPC_FAULT_OP_RNG_ERROR;
- return NT_STATUS_NET_WRITE_FAULT;
- }
-
- *r = talloc_size(mem_ctx, dcerpc_table_$name.calls[opnum].struct_size);
- NT_STATUS_HAVE_NO_MEMORY(*r);
-
- /* unravel the NDR for the packet */
- status = dcerpc_table_$name.calls[opnum].ndr_pull(pull, NDR_IN, *r);
- if (!NT_STATUS_IS_OK(status)) {
- dcerpc_log_packet(&dcerpc_table_$name, opnum, NDR_IN,
- &dce_call->pkt.u.request.stub_and_verifier);
- dce_call->fault_code = DCERPC_FAULT_NDR;
- return NT_STATUS_NET_WRITE_FAULT;
- }
-
- return NT_STATUS_OK;
-}
-
-static NTSTATUS $name\__op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r)
-{
- uint16_t opnum = dce_call->pkt.u.request.opnum;
- struct GUID ipid = dce_call->pkt.u.request.object.object;
- struct dcom_interface_p *iface = dcom_get_local_iface_p(&ipid);
- const struct dcom_$name\_vtable *vtable = iface->vtable;
-
- switch (opnum) {
-";
- gen_dispatch_switch($data);
-
-pidl "
- default:
- dce_call->fault_code = DCERPC_FAULT_OP_RNG_ERROR;
- break;
- }
-
- if (dce_call->fault_code != 0) {
- dcerpc_log_packet(&dcerpc_table_$name, opnum, NDR_IN,
- &dce_call->pkt.u.request.stub_and_verifier);
- return NT_STATUS_NET_WRITE_FAULT;
- }
-
- return NT_STATUS_OK;
-}
-
-static NTSTATUS $name\__op_reply(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r)
-{
- uint16_t opnum = dce_call->pkt.u.request.opnum;
-
- switch (opnum) {
-";
- gen_reply_switch($data);
-
-pidl "
- default:
- dce_call->fault_code = DCERPC_FAULT_OP_RNG_ERROR;
- break;
- }
-
- if (dce_call->fault_code != 0) {
- dcerpc_log_packet(&dcerpc_table_$name, opnum, NDR_IN,
- &dce_call->pkt.u.request.stub_and_verifier);
- return NT_STATUS_NET_WRITE_FAULT;
- }
-
- return NT_STATUS_OK;
-}
-
-static NTSTATUS $name\__op_ndr_push(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ndr_push *push, const void *r)
-{
- NTSTATUS status;
- uint16_t opnum = dce_call->pkt.u.request.opnum;
-
- status = dcerpc_table_$name.calls[opnum].ndr_push(push, NDR_OUT, r);
- if (!NT_STATUS_IS_OK(status)) {
- dce_call->fault_code = DCERPC_FAULT_NDR;
- return NT_STATUS_NET_WRITE_FAULT;
- }
-
- return NT_STATUS_OK;
-}
-
-static const struct dcesrv_interface $name\_interface = {
- .name = \"$name\",
- .uuid = $uuid,
- .if_version = $if_version,
- .bind = $name\__op_bind,
- .unbind = $name\__op_unbind,
- .ndr_pull = $name\__op_ndr_pull,
- .dispatch = $name\__op_dispatch,
- .reply = $name\__op_reply,
- .ndr_push = $name\__op_ndr_push
-};
-
-";
-}
-
-#####################################################################
-# produce boilerplate code for an endpoint server
-sub Boilerplate_Ep_Server($)
-{
- my($interface) = shift;
- my $name = $interface->{NAME};
- my $uname = uc $name;
-
- pidl "
-static NTSTATUS $name\__op_init_server(struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server *ep_server)
-{
- int i;
-
- for (i=0;i<dcerpc_table_$name.endpoints->count;i++) {
- NTSTATUS ret;
- const char *name = dcerpc_table_$name.endpoints->names[i];
-
- ret = dcesrv_interface_register(dce_ctx, name, &$name\_interface, NULL);
- if (!NT_STATUS_IS_OK(ret)) {
- DEBUG(1,(\"$name\_op_init_server: failed to register endpoint \'%s\'\\n\",name));
- return ret;
- }
- }
-
- return NT_STATUS_OK;
-}
-
-static BOOL $name\__op_interface_by_uuid(struct dcesrv_interface *iface, const char *uuid, uint32_t if_version)
-{
- if (dcerpc_table_$name.if_version == if_version &&
- strcmp(dcerpc_table_$name.uuid, uuid)==0) {
- memcpy(iface,&dcerpc_table_$name, sizeof(*iface));
- return True;
- }
-
- return False;
-}
-
-static BOOL $name\__op_interface_by_name(struct dcesrv_interface *iface, const char *name)
-{
- if (strcmp(dcerpc_table_$name.name, name)==0) {
- memcpy(iface,&dcerpc_table_$name, sizeof(*iface));
- return True;
- }
-
- return False;
-}
-
-NTSTATUS dcerpc_server_$name\_init(void)
-{
- NTSTATUS ret;
- struct dcesrv_endpoint_server ep_server;
-
- /* fill in our name */
- ep_server.name = \"$name\";
-
- /* fill in all the operations */
- ep_server.init_server = $name\__op_init_server;
-
- ep_server.interface_by_uuid = $name\__op_interface_by_uuid;
- ep_server.interface_by_name = $name\__op_interface_by_name;
-
- /* register ourselves with the DCERPC subsystem. */
- ret = dcerpc_register_ep_server(&ep_server);
-
- if (!NT_STATUS_IS_OK(ret)) {
- DEBUG(0,(\"Failed to register \'$name\' endpoint server!\\n\"));
- return ret;
- }
-
- return ret;
-}
-
-";
-}
-
-#####################################################################
-# dcom interface stub from a parsed IDL structure
-sub ParseInterface($)
-{
- my($interface) = shift;
-
- return "" if has_property($interface, "local");
-
- my($data) = $interface->{DATA};
- my $count = 0;
-
- $res = "";
-
- if (!defined $interface->{PROPERTIES}->{uuid}) {
- return $res;
- }
-
- if (!defined $interface->{PROPERTIES}->{version}) {
- $interface->{PROPERTIES}->{version} = "0.0";
- }
-
- foreach my $d (@{$data}) {
- if ($d->{TYPE} eq "FUNCTION") { $count++; }
- }
-
- if ($count == 0) {
- return $res;
- }
-
- $res = "/* dcom interface stub generated by pidl */\n\n";
- Boilerplate_Iface($interface);
- Boilerplate_Ep_Server($interface);
-
- return $res;
-}
-
-1;
diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/EJS.pm b/source4/pidl/lib/Parse/Pidl/Samba4/EJS.pm
index 1ce22d5180..59dc5f001d 100644
--- a/source4/pidl/lib/Parse/Pidl/Samba4/EJS.pm
+++ b/source4/pidl/lib/Parse/Pidl/Samba4/EJS.pm
@@ -380,7 +380,7 @@ sub EjsBitmapPull($$)
my $name = shift;
my $d = shift;
my $type_fn = $d->{BASE_TYPE};
- my($type_decl) = Parse::Pidl::Typelist::mapType($d->{BASE_TYPE});
+ my($type_decl) = Parse::Pidl::Typelist::mapTypeName($d->{BASE_TYPE});
fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, $type_decl *r)");
pidl "{";
indent;
@@ -648,7 +648,7 @@ sub EjsBitmapPush($$)
my $name = shift;
my $d = shift;
my $type_fn = $d->{BASE_TYPE};
- my($type_decl) = Parse::Pidl::Typelist::mapType($d->{BASE_TYPE});
+ my($type_decl) = Parse::Pidl::Typelist::mapTypeName($d->{BASE_TYPE});
# put the bitmap elements in the constants array
foreach my $e (@{$d->{ELEMENTS}}) {
if ($e =~ /^(\w*)\s*(.*)\s*$/) {
diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/Header.pm b/source4/pidl/lib/Parse/Pidl/Samba4/Header.pm
index fbc00d7c13..7e52dbc2ee 100644
--- a/source4/pidl/lib/Parse/Pidl/Samba4/Header.pm
+++ b/source4/pidl/lib/Parse/Pidl/Samba4/Header.pm
@@ -7,7 +7,7 @@
package Parse::Pidl::Samba4::Header;
use strict;
-use Parse::Pidl::Typelist qw(mapType);
+use Parse::Pidl::Typelist qw(mapTypeName);
use Parse::Pidl::Util qw(has_property is_constant);
use Parse::Pidl::Samba4 qw(is_intree);
@@ -55,7 +55,7 @@ sub HeaderElement($)
pidl tabs();
if (has_property($element, "represent_as")) {
- pidl mapType($element->{PROPERTIES}->{represent_as})." ";
+ pidl mapTypeName($element->{PROPERTIES}->{represent_as})." ";
} else {
HeaderType($element, $element->{TYPE}, "");
pidl " ";
@@ -209,7 +209,7 @@ sub HeaderType($$$)
if (has_property($e, "charset")) {
pidl "const char";
} else {
- pidl mapType($e->{TYPE});
+ pidl mapTypeName($e->{TYPE});
}
}
@@ -303,7 +303,7 @@ sub HeaderFunction($)
HeaderFunctionInOut($fn, "out");
HeaderFunctionInOut($fn, "inout");
if ($fn->{RETURN_TYPE} ne "void") {
- pidl tabs().mapType($fn->{RETURN_TYPE}) . " result;\n";
+ pidl tabs().mapTypeName($fn->{RETURN_TYPE}) . " result;\n";
}
$tab_depth--;
pidl tabs()."} out;\n\n";
diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm b/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
index 15618bb534..46898e6ad8 100644
--- a/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
+++ b/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
@@ -15,7 +15,7 @@ require Exporter;
NeededElement NeededType);
use strict;
-use Parse::Pidl::Typelist qw(hasType getType mapType);
+use Parse::Pidl::Typelist qw(hasType getType mapTypeName);
use Parse::Pidl::Util qw(has_property ParseExpr ParseExprExt print_uuid);
use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
use Parse::Pidl::Samba4 qw(is_intree choose_header);
@@ -636,7 +636,7 @@ sub ParseElementPushLevel
# Allow speedups for arrays of scalar types
if (is_charset_array($e,$l)) {
- pidl "NDR_CHECK(ndr_push_charset($ndr, $ndr_flags, $var_name, $length, sizeof(" . mapType($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));";
+ pidl "NDR_CHECK(ndr_push_charset($ndr, $ndr_flags, $var_name, $length, sizeof(" . mapTypeName($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));";
return;
} elsif (has_fast_array($e,$l)) {
pidl "NDR_CHECK(ndr_push_array_$nl->{DATA_TYPE}($ndr, $ndr_flags, $var_name, $length));";
@@ -707,7 +707,7 @@ sub ParseElementPush($$$$$)
pidl "{";
indent;
my $transmit_name = "_transmit_$e->{NAME}";
- pidl mapType($e->{TYPE}) ." $transmit_name;";
+ pidl mapTypeName($e->{TYPE}) ." $transmit_name;";
pidl "NDR_CHECK(ndr_$e->{REPRESENTATION_TYPE}_to_$e->{TYPE}($var_name, " . get_pointer_to($transmit_name) . "));";
$var_name = $transmit_name;
}
@@ -1014,7 +1014,7 @@ sub ParseElementPullLevel
if ($l->{IS_ZERO_TERMINATED}) {
CheckStringTerminator($ndr, $e, $l, $length);
}
- pidl "NDR_CHECK(ndr_pull_charset($ndr, $ndr_flags, ".get_pointer_to($var_name).", $length, sizeof(" . mapType($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));";
+ pidl "NDR_CHECK(ndr_pull_charset($ndr, $ndr_flags, ".get_pointer_to($var_name).", $length, sizeof(" . mapTypeName($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));";
return;
} elsif (has_fast_array($e, $l)) {
if ($l->{IS_ZERO_TERMINATED}) {
@@ -1116,7 +1116,7 @@ sub ParseElementPull($$$$$)
$represent_name = $var_name;
$transmit_name = "_transmit_$e->{NAME}";
$var_name = $transmit_name;
- pidl mapType($e->{TYPE})." $var_name;";
+ pidl mapTypeName($e->{TYPE})." $var_name;";
}
$var_name = append_prefix($e, $var_name);
@@ -1294,7 +1294,7 @@ sub ParseEnumPull($$)
{
my($enum,$name) = @_;
my($type_fn) = $enum->{BASE_TYPE};
- my($type_v_decl) = mapType($type_fn);
+ my($type_v_decl) = mapTypeName($type_fn);
pidl "$type_v_decl v;";
start_flags($enum);
@@ -1369,7 +1369,7 @@ sub ParseBitmapPull($$)
{
my($bitmap,$name) = @_;
my $type_fn = $bitmap->{BASE_TYPE};
- my($type_decl) = mapType($bitmap->{BASE_TYPE});
+ my($type_decl) = mapTypeName($bitmap->{BASE_TYPE});
pidl "$type_decl v;";
start_flags($bitmap);
@@ -1384,7 +1384,7 @@ sub ParseBitmapPull($$)
sub ParseBitmapPrintElement($$$)
{
my($e,$bitmap,$name) = @_;
- my($type_decl) = mapType($bitmap->{BASE_TYPE});
+ my($type_decl) = mapTypeName($bitmap->{BASE_TYPE});
my($type_fn) = $bitmap->{BASE_TYPE};
my($flag);
@@ -1402,7 +1402,7 @@ sub ParseBitmapPrintElement($$$)
sub ParseBitmapPrint($$)
{
my($bitmap,$name) = @_;
- my($type_decl) = mapType($bitmap->{TYPE});
+ my($type_decl) = mapTypeName($bitmap->{TYPE});
my($type_fn) = $bitmap->{BASE_TYPE};
start_flags($bitmap);
@@ -1421,7 +1421,7 @@ sub ParseBitmapPrint($$)
sub DeclBitmap($$$)
{
my ($e,$t,$name) = @_;
- return mapType(Parse::Pidl::Typelist::bitmap_type_fn($e)) .
+ return mapTypeName(Parse::Pidl::Typelist::bitmap_type_fn($e)) .
($t eq "pull"?" *":" ") . "r";
}
@@ -1771,7 +1771,7 @@ sub ParseUnionPull($$)
if (Parse::Pidl::Typelist::typeIs($switch_type, "ENUM")) {
$switch_type = Parse::Pidl::Typelist::enum_type_fn(getType($switch_type)->{DATA});
}
- pidl mapType($switch_type) . " _level;";
+ pidl mapTypeName($switch_type) . " _level;";
}
my %double_cases = ();
diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/SWIG.pm b/source4/pidl/lib/Parse/Pidl/Samba4/SWIG.pm
index 57ff007d1b..d541f318ee 100644
--- a/source4/pidl/lib/Parse/Pidl/Samba4/SWIG.pm
+++ b/source4/pidl/lib/Parse/Pidl/Samba4/SWIG.pm
@@ -8,7 +8,7 @@ package Parse::Pidl::Samba4::SWIG;
use vars qw($VERSION);
use Parse::Pidl::Samba4 qw(DeclLong);
-use Parse::Pidl::Typelist qw(mapType);
+use Parse::Pidl::Typelist qw(mapTypeName);
use Parse::Pidl::Util qw(has_property);
$VERSION = '0.01';
@@ -77,7 +77,7 @@ sub ParseInterface($$)
$name =~ s/^$if->{NAME}_//g;
$name =~ s/^$basename\_//g;
$args .= "TALLOC_CTX *mem_ctx = NULL";
- pidl mapType($fn->{RETURN_TYPE}) . " $name($args)";
+ pidl mapTypeName($fn->{RETURN_TYPE}) . " $name($args)";
pidl "{";
indent;
pidl "struct $fn->{NAME} r;";
diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/TDR.pm b/source4/pidl/lib/Parse/Pidl/Samba4/TDR.pm
index cde5da2b6b..f1f23bf84b 100644
--- a/source4/pidl/lib/Parse/Pidl/Samba4/TDR.pm
+++ b/source4/pidl/lib/Parse/Pidl/Samba4/TDR.pm
@@ -1,6 +1,6 @@
###################################################
# Trivial Parser Generator
-# Copyright jelmer@samba.org 2005
+# Copyright jelmer@samba.org 2005-2007
# released under the GNU GPL
package Parse::Pidl::Samba4::TDR;
@@ -8,13 +8,17 @@ use Parse::Pidl qw(fatal);
use Parse::Pidl::Util qw(has_property ParseExpr is_constant);
use Parse::Pidl::Samba4 qw(is_intree choose_header);
+use Exporter;
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(ParserType $ret $ret_hdr);
+
use vars qw($VERSION);
$VERSION = '0.01';
use strict;
-my $ret;
-my $ret_hdr;
+our $ret;
+our $ret_hdr;
my $tabs = "";
sub indent() { $tabs.="\t"; }
@@ -117,14 +121,14 @@ sub ParserElement($$$)
sub ParserStruct($$$$)
{
- my ($e,$n,$t,$p) = @_;
+ my ($e,$t,$p) = @_;
- fn_declare($p,,"NTSTATUS tdr_$t\_$n (struct tdr_$t *tdr".typearg($t).", struct $n *v)");
+ fn_declare($p,"NTSTATUS tdr_$t\_$e->{NAME} (struct tdr_$t *tdr".typearg($t).", struct $e->{NAME} *v)");
pidl "{"; indent;
pidl "int i;" if (ContainsArray($e));
if ($t eq "print") {
- pidl "tdr->print(tdr, \"\%-25s: struct $n\", name);";
+ pidl "tdr->print(tdr, \"\%-25s: struct $e->{NAME}\", name);";
pidl "tdr->level++;";
}
@@ -141,16 +145,16 @@ sub ParserStruct($$$$)
deindent; pidl "}";
}
-sub ParserUnion($$$$)
+sub ParserUnion($$$)
{
- my ($e,$n,$t,$p) = @_;
+ my ($e,$t,$p) = @_;
- fn_declare($p,"NTSTATUS tdr_$t\_$n(struct tdr_$t *tdr".typearg($t).", int level, union $n *v)");
+ fn_declare($p,"NTSTATUS tdr_$t\_$e->{NAME}(struct tdr_$t *tdr".typearg($t).", int level, union $e->{NAME} *v)");
pidl "{"; indent;
pidl "int i;" if (ContainsArray($e));
if ($t eq "print") {
- pidl "tdr->print(tdr, \"\%-25s: union $n\", name);";
+ pidl "tdr->print(tdr, \"\%-25s: union $e->{NAME}\", name);";
pidl "tdr->level++;";
}
@@ -174,19 +178,19 @@ sub ParserUnion($$$$)
deindent; pidl "}";
}
-sub ParserBitmap($$$$)
+sub ParserBitmap($$$)
{
- my ($e,$n,$t,$p) = @_;
+ my ($e,$t,$p) = @_;
return if ($p);
- pidl "#define tdr_$t\_$n tdr_$t\_" . Parse::Pidl::Typelist::bitmap_type_fn($e);
+ pidl "#define tdr_$t\_$e->{NAME} tdr_$t\_" . Parse::Pidl::Typelist::bitmap_type_fn($e);
}
-sub ParserEnum($$$$)
+sub ParserEnum($$$)
{
- my ($e,$n,$t,$p) = @_;
+ my ($e,$t,$p) = @_;
my $bt = ($e->{PROPERTIES}->{base_type} or "uint8");
- fn_declare($p, "NTSTATUS tdr_$t\_$n (struct tdr_$t *tdr".typearg($t).", enum $n *v)");
+ fn_declare($p, "NTSTATUS tdr_$t\_$e->{NAME} (struct tdr_$t *tdr".typearg($t).", enum $e->{NAME} *v)");
pidl "{";
if ($t eq "pull") {
pidl "\t$bt\_t r;";
@@ -201,17 +205,27 @@ sub ParserEnum($$$$)
pidl "}";
}
-sub ParserTypedef($$)
+sub ParserTypedef($$$)
+{
+ my ($e,$t,$p) = @_;
+
+ ParserType($e->{DATA},$t);
+}
+
+sub ParserType($$)
{
my ($e,$t) = @_;
return if (has_property($e, "no$t"));
- $e->{PROPERTIES} = $e->{DATA}->{PROPERTIES};
-
- { STRUCT => \&ParserStruct, UNION => \&ParserUnion,
- ENUM => \&ParserEnum, BITMAP => \&ParserBitmap
- }->{$e->{DATA}->{TYPE}}->($e->{DATA}, $e->{NAME}, $t, has_property($e, "public"));
+ my $handlers = {
+ STRUCT => \&ParserStruct, UNION => \&ParserUnion,
+ ENUM => \&ParserEnum, BITMAP => \&ParserBitmap,
+ TYPEDEF => \&ParserTypedef
+ };
+
+ $handlers->{$e->{TYPE}}->($e, $t, has_property($e, "public"))
+ if (defined($handlers->{$e->{TYPE}}));
pidl "";
}
@@ -224,10 +238,9 @@ sub ParserInterface($)
pidl_hdr "#define __TDR_$x->{NAME}_HEADER__";
foreach (@{$x->{DATA}}) {
- next if ($_->{TYPE} ne "TYPEDEF");
- ParserTypedef($_, "pull");
- ParserTypedef($_, "push");
- ParserTypedef($_, "print");
+ ParserType($_, "pull");
+ ParserType($_, "push");
+ ParserType($_, "print");
}
pidl_hdr "#endif /* __TDR_$x->{NAME}_HEADER__ */";
diff --git a/source4/pidl/lib/Parse/Pidl/Typelist.pm b/source4/pidl/lib/Parse/Pidl/Typelist.pm
index 7be7e5a5c3..a098f1ab05 100644
--- a/source4/pidl/lib/Parse/Pidl/Typelist.pm
+++ b/source4/pidl/lib/Parse/Pidl/Typelist.pm
@@ -7,14 +7,14 @@ package Parse::Pidl::Typelist;
require Exporter;
@ISA = qw(Exporter);
-@EXPORT_OK = qw(hasType getType mapType scalar_is_reference expandAlias);
+@EXPORT_OK = qw(hasType getType mapTypeName scalar_is_reference expandAlias);
use vars qw($VERSION);
$VERSION = '0.01';
use Parse::Pidl::Util qw(has_property);
use strict;
-my %typedefs = ();
+my %types = ();
my @reference_scalars = (
"string", "string_array", "nbt_string",
@@ -89,14 +89,14 @@ sub mapScalarType($)
sub addType($)
{
my $t = shift;
- $typedefs{$t->{NAME}} = $t;
+ $types{$t->{NAME}} = $t;
}
sub getType($)
{
my $t = shift;
return undef if not hasType($t);
- return $typedefs{$t};
+ return $types{$t};
}
sub typeIs($$)
@@ -110,7 +110,7 @@ sub typeIs($$)
sub hasType($)
{
my $t = shift;
- return 1 if defined($typedefs{$t});
+ return 1 if defined($types{$t});
return 0;
}
@@ -178,7 +178,22 @@ sub bitmap_type_fn($)
return "uint32";
}
-sub mapType($)
+sub mapType($$)
+{
+ sub mapType($$);
+ my ($t, $n) = @_;
+
+ return mapType($t->{DATA}, $n) if ($t->{TYPE} eq "TYPEDEF");
+ return mapType($t->{DATA}, $n) if ($t->{TYPE} eq "DECLARE");
+ return mapScalarType($n) if ($t->{TYPE} eq "SCALAR");
+ return "enum $n" if ($t->{TYPE} eq "ENUM");
+ return "struct $n" if ($t->{TYPE} eq "STRUCT");
+ return "union $n" if ($t->{TYPE} eq "UNION");
+ return mapScalarType(bitmap_type_fn($t)) if ($t->{TYPE} eq "BITMAP");
+ die("Unknown type $t->{TYPE}");
+}
+
+sub mapTypeName($)
{
my $t = shift;
return "void" unless defined($t);
@@ -189,17 +204,8 @@ sub mapType($)
# Best guess
return "struct $t";
}
- return mapScalarType($t) if ($dt->{DATA}->{TYPE} eq "SCALAR");
- return "enum $dt->{NAME}" if ($dt->{DATA}->{TYPE} eq "ENUM");
- return "struct $dt->{NAME}" if ($dt->{DATA}->{TYPE} eq "STRUCT");
- return "struct $dt->{NAME}" if ($dt->{DATA}->{TYPE} eq "INTERFACE");
- return "union $dt->{NAME}" if ($dt->{DATA}->{TYPE} eq "UNION");
-
- if ($dt->{DATA}->{TYPE} eq "BITMAP") {
- return mapScalarType(bitmap_type_fn($dt->{DATA}));
- }
- die("Unknown type $dt->{DATA}->{TYPE}");
+ return mapType($dt, $dt->{NAME});
}
sub LoadIdl($)
@@ -209,17 +215,14 @@ sub LoadIdl($)
foreach my $x (@{$idl}) {
next if $x->{TYPE} ne "INTERFACE";
- # DCOM interfaces can be types as well
- addType({
- NAME => $x->{NAME},
- TYPE => "TYPEDEF",
- DATA => $x
- }) if (has_property($x, "object"));
-
foreach my $y (@{$x->{DATA}}) {
addType($y) if (
$y->{TYPE} eq "TYPEDEF"
- or $y->{TYPE} eq "DECLARE");
+ or $y->{TYPE} eq "DECLARE"
+ or $y->{TYPE} eq "UNION"
+ or $y->{TYPE} eq "STRUCT"
+ or $y->{TYPE} eq "ENUM"
+ or $y->{TYPE} eq "BITMAP");
}
}
}
diff --git a/source4/pidl/pidl b/source4/pidl/pidl
index 0bd841a5ff..b04e278902 100755
--- a/source4/pidl/pidl
+++ b/source4/pidl/pidl
@@ -17,7 +17,7 @@ pidl - An IDL compiler written in Perl
pidl --help
-pidl [--outputdir[=OUTNAME]] [--includedir DIR...] [--parse-idl-tree] [--dump-idl-tree] [--dump-ndr-tree] [--header[=OUTPUT]] [--ejs[=OUTPUT]] [--swig[=OUTPUT]] [--ndr-parser[=OUTPUT]] [--client] [--server] [--dcom-proxy] [--com-header] [--warn-compat] [--quiet] [--verbose] [--template] [--ws-parser[=OUTPUT]] [--diff] [--dump-idl] [--tdr-parser[=OUTPUT]] [--samba3-ndr-client[=OUTPUT]] [--samba3-ndr-server[=OUTPUT]] [<idlfile>.idl]...
+pidl [--outputdir[=OUTNAME]] [--includedir DIR...] [--parse-idl-tree] [--dump-idl-tree] [--dump-ndr-tree] [--header[=OUTPUT]] [--ejs[=OUTPUT]] [--swig[=OUTPUT]] [--ndr-parser[=OUTPUT]] [--client] [--server] [--warn-compat] [--quiet] [--verbose] [--template] [--ws-parser[=OUTPUT]] [--diff] [--dump-idl] [--tdr-parser[=OUTPUT]] [--samba3-ndr-client[=OUTPUT]] [--samba3-ndr-server[=OUTPUT]] [<idlfile>.idl]...
=head1 DESCRIPTION
@@ -401,7 +401,6 @@ use Getopt::Long;
use File::Basename;
use Parse::Pidl;
use Parse::Pidl::Util;
-use Parse::Pidl::ODL;
#####################################################################
# save a data structure into a file
@@ -468,8 +467,6 @@ my($opt_ndr_parser);
my($opt_tdr_parser);
my($opt_ws_parser);
my($opt_swig);
-my($opt_dcom_proxy);
-my($opt_com_header);
my($opt_ejs);
my($opt_quiet) = 0;
my($opt_outputdir) = '.';
@@ -510,8 +507,6 @@ Samba 4 output:
--swig[=OUTFILE] create swig wrapper file [BASENAME.i]
--server[=OUTFILE] create server boilerplate [ndr_BASENAME_s.c]
--template print a template for a pipe
- --dcom-proxy[=OUTFILE] create DCOM proxy [ndr_BASENAME_p.c]
- --com-header[=OUTFILE] create header for COM [com_BASENAME.h]
Samba 3 output:
--samba3-ndr-client[=OUTF] create client calls for Samba3
@@ -545,8 +540,6 @@ my $result = GetOptions (
'ejs' => \$opt_ejs,
'diff' => \$opt_diff,
'swig:s' => \$opt_swig,
- 'dcom-proxy:s' => \$opt_dcom_proxy,
- 'com-header:s' => \$opt_com_header,
'quiet' => \$opt_quiet,
'verbose' => \$opt_verbose,
'warn-compat' => \$opt_warn_compat,
@@ -602,31 +595,11 @@ sub process_file($)
unlink($tempfile);
}
- my $comh_filename = ($opt_com_header or "$outputdir/com_$basename.h");
- if (defined($opt_com_header)) {
- require Parse::Pidl::Samba4::COM::Header;
- my $res = Parse::Pidl::Samba4::COM::Header::Parse($pidl,"$outputdir/ndr_$basename.h");
- if ($res) {
- FileSave($comh_filename, $res);
- }
- }
-
- if (defined($opt_dcom_proxy)) {
- require Parse::Pidl::Samba4::COM::Proxy;
- my $res = Parse::Pidl::Samba4::COM::Proxy::Parse($pidl,$comh_filename);
- if ($res) {
- my ($client) = ($opt_dcom_proxy or "$outputdir/$basename\_p.c");
- FileSave($client, $res);
- }
- }
-
if ($opt_warn_compat) {
require Parse::Pidl::Compat;
Parse::Pidl::Compat::Check($pidl);
}
- $pidl = Parse::Pidl::ODL::ODL2IDL($pidl);
-
if (defined($opt_ws_parser) or
defined($opt_client) or defined($opt_server) or
defined($opt_ndr_parser) or defined($opt_ejs) or
@@ -679,30 +652,8 @@ sub process_file($)
if (defined($opt_server)) {
require Parse::Pidl::Samba4::NDR::Server;
- my $dcom = "";
-
- foreach (@{$pidl}) {
- next if ($_->{TYPE} ne "INTERFACE");
-
- if (Parse::Pidl::Util::has_property($_, "object")) {
- require Parse::Pidl::Samba4::COM::Stub;
- $dcom .= Parse::Pidl::Samba4::COM::Stub::ParseInterface($_);
- }
- }
FileSave(($opt_server or "$outputdir/ndr_$basename\_s.c"), Parse::Pidl::Samba4::NDR::Server::Parse($ndr,$h_filename));
-
- if ($dcom ne "") {
- $dcom = "
-#include \"includes.h\"
-#include \"$h_filename\"
-#include \"rpc_server/dcerpc_server.h\"
-#include \"rpc_server/common/common.h\"
-
-$dcom
-";
- FileSave("$outputdir/$basename\_d.c", $dcom);
- }
}
if (defined($opt_ndr_parser)) {
diff --git a/source4/pidl/tests/tdr.pl b/source4/pidl/tests/tdr.pl
new file mode 100755
index 0000000000..35e54f53fc
--- /dev/null
+++ b/source4/pidl/tests/tdr.pl
@@ -0,0 +1,48 @@
+#!/usr/bin/perl
+# (C) 2007 Jelmer Vernooij <jelmer@samba.org>
+# Published under the GNU General Public License
+use strict;
+use warnings;
+
+use Test::More tests => 6;
+use FindBin qw($RealBin);
+use lib "$RealBin";
+use Util;
+use Parse::Pidl::Samba4::TDR qw($ret $ret_hdr ParserType);
+
+ParserType({TYPE => "STRUCT", NAME => "foo", PROPERTIES => {public => 1}}, "pull");
+is($ret, "NTSTATUS tdr_pull_foo (struct tdr_pull *tdr, TALLOC_CTX *mem_ctx, struct foo *v)
+{
+ return NT_STATUS_OK;
+}
+
+");
+is($ret_hdr, "NTSTATUS tdr_pull_foo (struct tdr_pull *tdr, TALLOC_CTX *mem_ctx, struct foo *v);\n");
+
+$ret = ""; $ret_hdr = "";
+
+ParserType({TYPE => "UNION", NAME => "bar", PROPERTIES => {public => 1}}, "pull");
+is($ret, "NTSTATUS tdr_pull_bar(struct tdr_pull *tdr, TALLOC_CTX *mem_ctx, int level, union bar *v)
+{
+ switch (level) {
+ }
+ return NT_STATUS_OK;
+
+}
+
+");
+is($ret_hdr, "NTSTATUS tdr_pull_bar(struct tdr_pull *tdr, TALLOC_CTX *mem_ctx, int level, union bar *v);\n");
+
+$ret = ""; $ret_hdr = "";
+
+ParserType({TYPE => "UNION", NAME => "bar", PROPERTIES => {}}, "pull");
+is($ret, "static NTSTATUS tdr_pull_bar(struct tdr_pull *tdr, TALLOC_CTX *mem_ctx, int level, union bar *v)
+{
+ switch (level) {
+ }
+ return NT_STATUS_OK;
+
+}
+
+");
+is($ret_hdr, "");