Allow base classes to be defined in other files.
authorJelmer Vernooij <jelmer@samba.org>
Fri, 12 Sep 2008 12:57:19 +0000 (14:57 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Mon, 15 Sep 2008 15:39:44 +0000 (17:39 +0200)
source4/librpc/idl/dcom.idl
source4/librpc/idl/wmi.idl
source4/pidl/lib/Parse/Pidl/ODL.pm
source4/pidl/pidl

index dfb8792044a8567449598075dd12592e3d13aace..64e1c1850b3b7aa67ec14e1210ecb63efff17d16 100644 (file)
@@ -3,8 +3,6 @@
   http://www.ietf.org/internet-drafts/draft-brown-dcom-v1-spec-04.txt
  */
 
-import "orpc.idl";
-
 [
        uuid("18f70770-8e64-11cf-9af1-0020af6e72f4"),
        pointer_default(unique),
index 44540b154eeae7898830158555faea5b91bb4421..c4a8ff706a228381f7c6cfbb346d174f07825bdc 100644 (file)
@@ -1,6 +1,6 @@
 #include "idl_types.h"
 
-import "orpc.idl";
+import "dcom.idl";
 
 [
        uuid("8BC3F05E-D86B-11d0-A075-00C04FB68820")
index 897d921485c97a750d95bfd0cdaf23591b48481e..951f7c8725917b04587aaddb547fd9b84f51e214 100644 (file)
@@ -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});
+                                       }
                                }
                        }
                }
index 646f7952e9fbc928d8a11bd0ade3f8ad81ead102..0a6b0a97ca1c98d0b1799af3e9cee997f0799724 100755 (executable)
@@ -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