1
0
mirror of https://github.com/samba-team/samba.git synced 2025-11-02 20:23:50 +03:00

r5479: Add ODL input support.

The ODL module can convert an ODL structure to an IDL structure so that:
 - The COM subsystem can use the ODL structure
 - The DCE/RPC subsystem can use the IDL structure
This commit is contained in:
Jelmer Vernooij
2005-02-21 01:16:47 +00:00
committed by Gerald (Jerry) Carter
parent fd8fc22a79
commit a339765d99
6 changed files with 70 additions and 32 deletions

View File

@@ -2383,8 +2383,6 @@ sub parse_idl($$)
my $idl = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
foreach my $x (@{$idl}) {
NdrParser::InterfaceORPC($x);
# Do the inheritance
if (defined($x->{BASE}) and $x->{BASE} ne "") {
my $parent = util::get_interface($idl, $x->{BASE});

View File

@@ -374,8 +374,6 @@ sub parse_idl($$)
my $idl = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
foreach my $x (@{$idl}) {
NdrParser::InterfaceORPC($x);
# Do the inheritance
if (defined($x->{BASE}) and $x->{BASE} ne "") {
my $parent = util::get_interface($idl, $x->{BASE});

View File

@@ -2114,33 +2114,6 @@ sub LoadInterface($)
}
}
# Add ORPC specific bits to an interface.
sub InterfaceORPC($)
{
my $x = shift;
# Add [in] ORPCTHIS *this, [out] ORPCTHAT *that
# for 'object' interfaces
if (util::has_property($x, "object")) {
foreach my $e (@{$x->{DATA}}) {
if($e->{TYPE} eq "FUNCTION") {
$e->{PROPERTIES}->{object} = 1;
unshift(@{$e->{ELEMENTS}},
{ 'NAME' => 'ORPCthis',
'POINTERS' => 0,
'PROPERTIES' => { 'in' => '1' },
'TYPE' => 'ORPCTHIS'
});
unshift(@{$e->{ELEMENTS}},
{ 'NAME' => 'ORPCthat',
'POINTERS' => 0,
'PROPERTIES' => { 'out' => '1' },
'TYPE' => 'ORPCTHAT'
});
}
}
}
}
sub Load($)
{
my $idl = shift;

59
source/build/pidl/odl.pm Normal file
View File

@@ -0,0 +1,59 @@
##########################################
# Converts ODL stuctures to IDL structures
# (C) 2004-2005 Jelmer Vernooij <jelmer@samba.org>
package ODL;
use strict;
sub FunctionAddObjArgs($)
{
my $e = shift;
unshift(@{$e->{ELEMENTS}}, {
'NAME' => 'ORPCthis',
'POINTERS' => 0,
'PROPERTIES' => { 'in' => '1' },
'TYPE' => 'ORPCTHIS'
});
unshift(@{$e->{ELEMENTS}}, {
'NAME' => 'ORPCthat',
'POINTERS' => 0,
'PROPERTIES' => { 'out' => '1' },
'TYPE' => 'ORPCTHAT'
});
}
sub ReplaceInterfacePointers($)
{
my $e = shift;
foreach my $x (@{$e->{ELEMENTS}}) {
next unless typelist::hasType($x);
next unless typelist::getType($x)->{DATA}->{TYPE} eq "INTERFACE";
$x->{TYPE} = "MInterfacePointer";
}
}
# Add ORPC specific bits to an interface.
sub ODL2IDL($)
{
my $odl = shift;
my @idl = @{$odl};
foreach my $x (@idl) {
# Add [in] ORPCTHIS *this, [out] ORPCTHAT *that
# for 'object' interfaces
if (util::has_property($x, "object")) {
foreach my $e (@{$x->{DATA}}) {
($e->{TYPE} eq "FUNCTION") && FunctionAddObjArgs($e);
ReplaceInterfacePointers($e);
}
}
}
return \@idl;
}
1;

View File

@@ -21,6 +21,7 @@ use client;
use proxy;
use stub;
use ndr;
use odl;
use eparser;
use validator;
use typelist;
@@ -40,6 +41,7 @@ my($opt_parser) = 0;
my($opt_eparser) = 0;
my($opt_keep) = 0;
my($opt_swig) = 0;
my($opt_odl) = 0;
my($opt_output);
my $idl_parser = new idl;
@@ -79,6 +81,7 @@ sub ShowHelp()
--swig create swig wrapper file
--diff run diff on the idl and dumped output
--keep keep the .pidl file
--odl accept ODL input
\n";
exit(0);
}
@@ -96,6 +99,7 @@ GetOptions (
'client' => \$opt_client,
'eparser' => \$opt_eparser,
'diff' => \$opt_diff,
'odl' => \$opt_odl,
'keep' => \$opt_keep,
'swig' => \$opt_swig
);
@@ -109,6 +113,7 @@ sub process_file($)
{
my $idl_file = shift;
my $output;
my $podl;
my $pidl;
my $basename = basename($idl_file, ".idl");
@@ -143,6 +148,11 @@ sub process_file($)
typelist::LoadIdl($pidl);
}
if ($opt_odl) {
$podl = $pidl;
$pidl = ODL::ODL2IDL($podl);
}
if ($opt_header) {
my($header) = util::ChangeExtension($output, ".h");
util::FileSave($header, IdlHeader::Parse($pidl));

View File

@@ -4,7 +4,7 @@ FULLBUILD=$1
[ -d librpc/gen_ndr ] || mkdir -p librpc/gen_ndr || exit 1
PIDL="$PERL ./build/pidl/pidl.pl --output librpc/gen_ndr/ndr_ --parse --header --parser --server --client --swig"
PIDL="$PERL ./build/pidl/pidl.pl --output librpc/gen_ndr/ndr_ --parse --header --parser --server --client --swig --odl"
if [ x$FULLBUILD = xFULL ]; then
echo Rebuilding all idl files in librpc/idl