5ed508dc9397af647d6eaea37c2838b1580f02cf
[samba.git] / source / build / pidl / odl.pm
1 ##########################################
2 # Converts ODL stuctures to IDL structures
3 # (C) 2004-2005 Jelmer Vernooij <jelmer@samba.org>
4
5 package ODL;
6
7 use strict;
8
9 sub FunctionAddObjArgs($)
10 {
11         my $e = shift;
12         
13         unshift(@{$e->{ELEMENTS}}, {
14                 'NAME' => 'ORPCthis',
15                 'POINTERS' => 0,
16                 'PROPERTIES' => { 'in' => '1' },
17                 'TYPE' => 'ORPCTHIS'
18         });
19         unshift(@{$e->{ELEMENTS}}, {
20                 'NAME' => 'ORPCthat',
21                 'POINTERS' => 0,
22                 'PROPERTIES' => { 'out' => '1' },
23                 'TYPE' => 'ORPCTHAT'
24         });
25 }
26
27 sub ReplaceInterfacePointers($)
28 {
29         my $e = shift;
30
31         foreach my $x (@{$e->{ELEMENTS}}) {
32                 next unless (typelist::hasType($x->{TYPE}));
33                 next unless typelist::getType($x->{TYPE})->{DATA}->{TYPE} eq "INTERFACE";
34                 
35                 $x->{TYPE} = "MInterfacePointer";
36         }
37 }
38
39 # Add ORPC specific bits to an interface.
40 sub ODL2IDL($)
41 {
42         my $odl = shift;
43         
44         foreach my $x (@{$odl}) {
45                 # Add [in] ORPCTHIS *this, [out] ORPCTHAT *that
46                 # and replace interfacepointers with MInterfacePointer
47                 # for 'object' interfaces
48                 if (util::has_property($x, "object")) {
49                         foreach my $e (@{$x->{DATA}}) {
50                                 ($e->{TYPE} eq "FUNCTION") && FunctionAddObjArgs($e);
51                                 ReplaceInterfacePointers($e);
52                         }
53                         # Object interfaces use ORPC
54                         my @depends = ();
55                         if(util::has_property($x, "depends")) {
56                                 @depends = split /,/, $x->{PROPERTIES}->{depends};
57                         }
58                         push @depends, "orpc";
59                         $x->{PROPERTIES}->{depends} = join(',',@depends);
60                 }
61
62                 if ($x->{BASE}) {
63                         my $base = util::get_interface($odl, $x->{BASE});
64
65                         foreach my $fn (reverse @{$base->{DATA}}) {
66                                 next unless ($fn->{TYPE} eq "FUNCTION");
67                                 unshift (@{$x->{DATA}}, $fn);
68                         }
69                 }
70         }
71
72         return $odl;
73 }
74
75 1;