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:
committed by
Gerald (Jerry) Carter
parent
fd8fc22a79
commit
a339765d99
@@ -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});
|
||||
|
||||
@@ -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});
|
||||
|
||||
@@ -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
59
source/build/pidl/odl.pm
Normal 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;
|
||||
@@ -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));
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user