summaryrefslogtreecommitdiff
path: root/source4/pidl
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2008-09-12 14:57:19 +0200
committerJelmer Vernooij <jelmer@samba.org>2008-09-15 17:39:44 +0200
commitf29220fe11a938efc93ea6b5b6ded5e612dcbcf1 (patch)
treecf2beb74d06a1dbff536db9236c24f72787688a3 /source4/pidl
parent1ca80d037d767230f28aea12f58c4afbaa86b71c (diff)
downloadsamba-f29220fe11a938efc93ea6b5b6ded5e612dcbcf1.tar.gz
samba-f29220fe11a938efc93ea6b5b6ded5e612dcbcf1.tar.bz2
samba-f29220fe11a938efc93ea6b5b6ded5e612dcbcf1.zip
Allow base classes to be defined in other files.
Diffstat (limited to 'source4/pidl')
-rw-r--r--source4/pidl/lib/Parse/Pidl/ODL.pm81
-rwxr-xr-xsource4/pidl/pidl2
2 files changed, 47 insertions, 36 deletions
diff --git a/source4/pidl/lib/Parse/Pidl/ODL.pm b/source4/pidl/lib/Parse/Pidl/ODL.pm
index 897d921485..951f7c8725 100644
--- a/source4/pidl/lib/Parse/Pidl/ODL.pm
+++ b/source4/pidl/lib/Parse/Pidl/ODL.pm
@@ -5,27 +5,14 @@
package Parse::Pidl::ODL;
use Parse::Pidl qw(error);
-use Parse::Pidl::Util qw(has_property);
+use Parse::Pidl::IDL;
+use Parse::Pidl::Util qw(has_property unmake_str);
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 undef;
-}
-
sub FunctionAddObjArgs($)
{
my $e = shift;
@@ -60,34 +47,58 @@ sub ReplaceInterfacePointers($)
}
# Add ORPC specific bits to an interface.
-sub ODL2IDL($)
+sub ODL2IDL
{
- my $odl = shift;
+ my ($odl, $basedir, $opt_incdirs) = (@_);
my $addedorpc = 0;
+ my $interfaces = {};
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);
+ if ($x->{TYPE} eq "IMPORT") {
+ foreach my $idl_file (@{$x->{PATHS}}) {
+ $idl_file = unmake_str($idl_file);
+ my $podl = Parse::Pidl::IDL::parse_file("$basedir/$idl_file", $opt_incdirs);
+ if (defined(@$podl)) {
+ require Parse::Pidl::Typelist;
+
+ Parse::Pidl::Typelist::LoadIdl($podl);
+ my $pidl = ODL2IDL($podl);
+
+ foreach my $y (@$pidl) {
+ if ($y->{TYPE} eq "INTERFACE") {
+ $interfaces->{$y->{NAME}} = $y;
+ }
+ }
+ } else {
+ error($x, "Failed to parse $idl_file");
+ }
}
- $addedorpc = 1;
}
- if ($x->{BASE}) {
- my $base = get_interface($odl, $x->{BASE});
+ if ($x->{TYPE} eq "INTERFACE") {
+ $interfaces->{$x->{NAME}} = $x;
+ # 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 = $interfaces->{$x->{BASE}};
- unless (defined($base)) {
- error($x, "Undefined base interface `$x->{BASE}'");
- } else {
- foreach my $fn (reverse @{$base->{DATA}}) {
- next unless ($fn->{TYPE} eq "FUNCTION");
- unshift (@{$x->{DATA}}, $fn);
- push (@{$x->{INHERITED_FUNCTIONS}}, $fn->{NAME});
+ unless (defined($base)) {
+ error($x, "Undefined base interface `$x->{BASE}'");
+ } else {
+ foreach my $fn (reverse @{$base->{DATA}}) {
+ next unless ($fn->{TYPE} eq "FUNCTION");
+ unshift (@{$x->{DATA}}, $fn);
+ push (@{$x->{INHERITED_FUNCTIONS}}, $fn->{NAME});
+ }
}
}
}
diff --git a/source4/pidl/pidl b/source4/pidl/pidl
index 646f7952e9..0a6b0a97ca 100755
--- a/source4/pidl/pidl
+++ b/source4/pidl/pidl
@@ -656,7 +656,7 @@ sub process_file($)
Parse::Pidl::Compat::Check($pidl);
}
- $pidl = Parse::Pidl::ODL::ODL2IDL($pidl);
+ $pidl = Parse::Pidl::ODL::ODL2IDL($pidl, dirname($idl_file), \@opt_incdirs);
if (defined($opt_ws_parser) or
defined($opt_client) or