summaryrefslogtreecommitdiff
path: root/source4/build/pidl/odl.pm
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2005-02-21 01:16:47 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:10:49 -0500
commit7e400d38ecfdbf2b0ba744b182db14fe286da404 (patch)
tree60117d7f2c282e2959e6d199f96bc445871c42fb /source4/build/pidl/odl.pm
parente770d5696ee0265661fd6cc2fa24a24b19a0b889 (diff)
downloadsamba-7e400d38ecfdbf2b0ba744b182db14fe286da404.tar.gz
samba-7e400d38ecfdbf2b0ba744b182db14fe286da404.tar.bz2
samba-7e400d38ecfdbf2b0ba744b182db14fe286da404.zip
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 used to be commit a339765d99c90c46f29e2bd71a6aa271febb096d)
Diffstat (limited to 'source4/build/pidl/odl.pm')
-rw-r--r--source4/build/pidl/odl.pm59
1 files changed, 59 insertions, 0 deletions
diff --git a/source4/build/pidl/odl.pm b/source4/build/pidl/odl.pm
new file mode 100644
index 0000000000..37c8a5a687
--- /dev/null
+++ b/source4/build/pidl/odl.pm
@@ -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;