Re-Import ODL support.
authorJelmer Vernooij <jelmer@samba.org>
Fri, 12 Sep 2008 12:33:20 +0000 (14:33 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Mon, 15 Sep 2008 15:39:42 +0000 (17:39 +0200)
source4/pidl/lib/Parse/Pidl/ODL.pm [new file with mode: 0644]
source4/pidl/pidl

diff --git a/source4/pidl/lib/Parse/Pidl/ODL.pm b/source4/pidl/lib/Parse/Pidl/ODL.pm
new file mode 100644 (file)
index 0000000..897d921
--- /dev/null
@@ -0,0 +1,106 @@
+##########################################
+# Converts ODL stuctures to IDL structures
+# (C) 2004-2005, 2008 Jelmer Vernooij <jelmer@samba.org>
+
+package Parse::Pidl::ODL;
+
+use Parse::Pidl qw(error);
+use Parse::Pidl::Util qw(has_property);
+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;
+       
+       unshift(@{$e->{ELEMENTS}}, {
+               'NAME' => 'ORPCthis',
+               'POINTERS' => 0,
+               'PROPERTIES' => { 'in' => '1' },
+               'TYPE' => 'ORPCTHIS',
+               'FILE' => $e->{FILE},
+               'LINE' => $e->{LINE}
+       });
+       unshift(@{$e->{ELEMENTS}}, {
+               'NAME' => 'ORPCthat',
+               'POINTERS' => 1,
+               'PROPERTIES' => { 'out' => '1', 'ref' => '1' },
+               'TYPE' => 'ORPCTHAT',
+               'FILE' => $e->{FILE},
+               'LINE' => $e->{LINE}
+       });
+}
+
+sub ReplaceInterfacePointers($)
+{
+       my $e = shift;
+       foreach my $x (@{$e->{ELEMENTS}}) {
+               next unless (hasType($x->{TYPE}));
+               next unless getType($x->{TYPE})->{DATA}->{TYPE} eq "INTERFACE";
+               
+               $x->{TYPE} = "MInterfacePointer";
+       }
+}
+
+# Add ORPC specific bits to an interface.
+sub ODL2IDL($)
+{
+       my $odl = shift;
+       my $addedorpc = 0;
+
+       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);
+                       }
+                       $addedorpc = 1;
+               }
+
+               if ($x->{BASE}) {
+                       my $base = get_interface($odl, $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});
+                               }
+                       }
+               }
+       }
+
+       unshift (@$odl, {
+               TYPE => "IMPORT", 
+               PATHS => [ "\"orpc.idl\"" ],
+               FILE => undef,
+               LINE => undef
+       }) if ($addedorpc);
+
+       return $odl;
+}
+
+1;
index af6c6cca89afb2c16aafdfc36d90ec7e426dbd23..646f7952e9fbc928d8a11bd0ade3f8ad81ead102 100755 (executable)
@@ -409,6 +409,7 @@ use Getopt::Long;
 use File::Basename;
 use Parse::Pidl qw ( $VERSION );
 use Parse::Pidl::Util;
+use Parse::Pidl::ODL;
 
 #####################################################################
 # save a data structure into a file
@@ -650,12 +651,13 @@ sub process_file($)
                }
        }
 
-
        if ($opt_warn_compat) {
                require Parse::Pidl::Compat;
                Parse::Pidl::Compat::Check($pidl);
        }
 
+       $pidl = Parse::Pidl::ODL::ODL2IDL($pidl);
+
        if (defined($opt_ws_parser) or 
            defined($opt_client) or
            defined($opt_server) or