mirror of
https://github.com/samba-team/samba.git
synced 2025-11-05 04:23:51 +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 );
|
my $idl = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
|
||||||
|
|
||||||
foreach my $x (@{$idl}) {
|
foreach my $x (@{$idl}) {
|
||||||
NdrParser::InterfaceORPC($x);
|
|
||||||
|
|
||||||
# Do the inheritance
|
# Do the inheritance
|
||||||
if (defined($x->{BASE}) and $x->{BASE} ne "") {
|
if (defined($x->{BASE}) and $x->{BASE} ne "") {
|
||||||
my $parent = util::get_interface($idl, $x->{BASE});
|
my $parent = util::get_interface($idl, $x->{BASE});
|
||||||
|
|||||||
@@ -374,8 +374,6 @@ sub parse_idl($$)
|
|||||||
my $idl = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
|
my $idl = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
|
||||||
|
|
||||||
foreach my $x (@{$idl}) {
|
foreach my $x (@{$idl}) {
|
||||||
NdrParser::InterfaceORPC($x);
|
|
||||||
|
|
||||||
# Do the inheritance
|
# Do the inheritance
|
||||||
if (defined($x->{BASE}) and $x->{BASE} ne "") {
|
if (defined($x->{BASE}) and $x->{BASE} ne "") {
|
||||||
my $parent = util::get_interface($idl, $x->{BASE});
|
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($)
|
sub Load($)
|
||||||
{
|
{
|
||||||
my $idl = shift;
|
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 proxy;
|
||||||
use stub;
|
use stub;
|
||||||
use ndr;
|
use ndr;
|
||||||
|
use odl;
|
||||||
use eparser;
|
use eparser;
|
||||||
use validator;
|
use validator;
|
||||||
use typelist;
|
use typelist;
|
||||||
@@ -40,6 +41,7 @@ my($opt_parser) = 0;
|
|||||||
my($opt_eparser) = 0;
|
my($opt_eparser) = 0;
|
||||||
my($opt_keep) = 0;
|
my($opt_keep) = 0;
|
||||||
my($opt_swig) = 0;
|
my($opt_swig) = 0;
|
||||||
|
my($opt_odl) = 0;
|
||||||
my($opt_output);
|
my($opt_output);
|
||||||
|
|
||||||
my $idl_parser = new idl;
|
my $idl_parser = new idl;
|
||||||
@@ -79,6 +81,7 @@ sub ShowHelp()
|
|||||||
--swig create swig wrapper file
|
--swig create swig wrapper file
|
||||||
--diff run diff on the idl and dumped output
|
--diff run diff on the idl and dumped output
|
||||||
--keep keep the .pidl file
|
--keep keep the .pidl file
|
||||||
|
--odl accept ODL input
|
||||||
\n";
|
\n";
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
@@ -96,6 +99,7 @@ GetOptions (
|
|||||||
'client' => \$opt_client,
|
'client' => \$opt_client,
|
||||||
'eparser' => \$opt_eparser,
|
'eparser' => \$opt_eparser,
|
||||||
'diff' => \$opt_diff,
|
'diff' => \$opt_diff,
|
||||||
|
'odl' => \$opt_odl,
|
||||||
'keep' => \$opt_keep,
|
'keep' => \$opt_keep,
|
||||||
'swig' => \$opt_swig
|
'swig' => \$opt_swig
|
||||||
);
|
);
|
||||||
@@ -109,6 +113,7 @@ sub process_file($)
|
|||||||
{
|
{
|
||||||
my $idl_file = shift;
|
my $idl_file = shift;
|
||||||
my $output;
|
my $output;
|
||||||
|
my $podl;
|
||||||
my $pidl;
|
my $pidl;
|
||||||
|
|
||||||
my $basename = basename($idl_file, ".idl");
|
my $basename = basename($idl_file, ".idl");
|
||||||
@@ -143,6 +148,11 @@ sub process_file($)
|
|||||||
typelist::LoadIdl($pidl);
|
typelist::LoadIdl($pidl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($opt_odl) {
|
||||||
|
$podl = $pidl;
|
||||||
|
$pidl = ODL::ODL2IDL($podl);
|
||||||
|
}
|
||||||
|
|
||||||
if ($opt_header) {
|
if ($opt_header) {
|
||||||
my($header) = util::ChangeExtension($output, ".h");
|
my($header) = util::ChangeExtension($output, ".h");
|
||||||
util::FileSave($header, IdlHeader::Parse($pidl));
|
util::FileSave($header, IdlHeader::Parse($pidl));
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ FULLBUILD=$1
|
|||||||
|
|
||||||
[ -d librpc/gen_ndr ] || mkdir -p librpc/gen_ndr || exit 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
|
if [ x$FULLBUILD = xFULL ]; then
|
||||||
echo Rebuilding all idl files in librpc/idl
|
echo Rebuilding all idl files in librpc/idl
|
||||||
|
|||||||
Reference in New Issue
Block a user