r1736: - Pidl updates:
authorJelmer Vernooij <jelmer@samba.org>
Wed, 11 Aug 2004 19:48:36 +0000 (19:48 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:57:51 +0000 (12:57 -0500)
 - Support for "object oriented" interfaces in pidl
 - Support for inherited interfaces in pidl
 - Simplification of the support for properties on an interface
- Start on dcom rpc torture tests
(This used to be commit 45c3d0036b8510102816f9cdff9210098259cc5f)

17 files changed:
source4/build/dcom/procedure
source4/build/pidl/Makefile
source4/build/pidl/dump.pm
source4/build/pidl/eparser.pm
source4/build/pidl/header.pm
source4/build/pidl/idl.pm
source4/build/pidl/idl.yp
source4/build/pidl/parser.pm
source4/build/pidl/pidl.pl
source4/build/pidl/util.pm
source4/librpc/idl/dcerpc.idl
source4/librpc/idl/dcom.idl
source4/librpc/idl/misc.idl
source4/librpc/idl/schannel.idl
source4/librpc/ndr/ndr_basic.c
source4/torture/config.mk
source4/torture/rpc/dcom.c [new file with mode: 0644]

index 3ee1738ba92c4032a1e3aa7e42cc4e1ec18bf5d9..09fcc5946f211781cffe72bde1d3ee29e90ac63a 100644 (file)
@@ -2,6 +2,13 @@
 - ServerAlive2()
 - Bind to ISystemActivator
 
+with dcom, there is a new attribute for interfaces, 'object'. these 
+object-oriented interfaces support inheritance. Everything that has the 
+attribute 'object' has ([in] ORPCTHIS *this, [out] ORPCTHAT *that) as first 
+arguments.
+
+OXID = Object Exporter ID
+
 Everything based on IDispatch implements:
 
 /*****************/
@@ -9,7 +16,7 @@ Everything based on IDispatch implements:
 HRESULT QueryInterface(
                                           [in] ORPCTHIS *this,
                                           [out] ORPCTHAT *that,
-                                          [in]  REFIID riid,
+                                          [in]  IID *riid,
                                           [out] /* [iid_is] */ void **ppvObject);
 
 /*****************/
@@ -47,7 +54,7 @@ HRESULT GetTypeInfo (
 HRESULT GetIDsOfNames(
                                          [in] ORPCTHIS *this,
                                          [out] ORPCTHAT *that,
-                                         [in] REFIID riid,
+                                         [in] IID *riid,
                                          [size_is][in] LPOLESTR *rgszNames,
                                          [in] UINT cNames,
                                          [in] LCID lcid,
@@ -59,11 +66,10 @@ HRESULT Invoke(
                           [in] ORPCTHIS *this,
                           [out] ORPCTHAT *that,
                           [in] DISPID dispIdMember,
-                          [in] REFIID riid,
+                          [in] IID *riid,
                           [in] LCID lcid,
                           [in] WORD wFlags,
                           [out][in] DISPPARAMS *pDispParams,
                           [out] VARIANT *pVarResult,
                           [out] EXCEPINFO *pExcepInfo,
                           [out] UINT *puArgErr);
-
index e2cc7be3eb333aa33ce91cf55a4326c9bd77f981..944f3db8afeb8d1ee7ca48d5be0e87f4a47caa5c 100644 (file)
@@ -1,3 +1,5 @@
+all: idl.pm
+
 idl.pm: idl.yp
        yapp -s idl.yp
 
index e74ffe6203db425095bdf5df3ac93c0abe7d9e65..640bc3a12057366b09575a701d8af43c2feb1926 100644 (file)
@@ -183,7 +183,7 @@ sub DumpFunction($)
 
 #####################################################################
 # dump a module header
-sub DumpModuleHeader($)
+sub DumpInterfaceProperties($)
 {
     my($header) = shift;
     my($data) = $header->{DATA};
@@ -208,6 +208,8 @@ sub DumpInterface($)
     my($data) = $interface->{DATA};
     my($res);
 
+       $res .= DumpInterfaceProperties($interface->{PROPERTIES});
+
     $res .= "interface $interface->{NAME}\n{\n";
     foreach my $d (@{$data}) {
        ($d->{TYPE} eq "TYPEDEF") &&
@@ -230,8 +232,6 @@ sub Dump($)
 
     $res = "/* Dumped by pidl */\n\n";
     foreach my $x (@{$idl}) {
-       ($x->{TYPE} eq "MODULEHEADER") && 
-           ($res .= DumpModuleHeader($x));
        ($x->{TYPE} eq "INTERFACE") && 
            ($res .= DumpInterface($x));
     }
index 0711790d23e1341d1fb77a5e0a7cbd46edfefb56..acc8fddc8065df2bd8a0b41c971922d3e8460c54 100644 (file)
@@ -14,9 +14,6 @@ my %needed;
 my %structs;
 
 my $module;
-my $if_uuid;
-my $if_version;
-my $if_endpoints;
 
 sub pidl($)
 {
@@ -933,17 +930,6 @@ sub BuildNeeded($)
        }
 }
 
-#####################################################################
-# parse the interface definitions
-sub ModuleHeader($)
-{
-    my($h) = shift;
-
-    $if_uuid = $h->{PROPERTIES}->{uuid};
-    $if_version = $h->{PROPERTIES}->{version};
-    $if_endpoints = $h->{PROPERTIES}->{endpoints};
-}
-
 sub ParseHeader($$)
 {
        my($idl) = shift;
@@ -989,9 +975,6 @@ sub Parse($$)
        open(OUT, ">$filename") || die "can't open $filename";    
 
        foreach my $x (@{$idl}) {
-               ($x->{TYPE} eq "MODULEHEADER") && 
-                   ModuleHeader($x);
-               
                if ($x->{TYPE} eq "INTERFACE") { 
                    $module = $x->{NAME};
                    BuildNeeded($x);
@@ -1001,16 +984,14 @@ sub Parse($$)
        pidl "/* parser auto-generated by pidl */\n\n";
        pidl "#ifdef HAVE_CONFIG_H\n";
        pidl "#include \"config.h\"\n";
-        pidl "#endif\n\n";
+       pidl "#endif\n\n";
 
-        pidl "#include \"packet-dcerpc.h\"\n";
-        pidl "#include \"packet-dcerpc-nt.h\"\n\n";
-        pidl "#include \"packet-dcerpc-eparser.h\"\n\n";
+       pidl "#include \"packet-dcerpc.h\"\n";
+       pidl "#include \"packet-dcerpc-nt.h\"\n\n";
+       pidl "#include \"packet-dcerpc-eparser.h\"\n\n";
 
        pidl "extern const value_string NT_errors[];\n\n";
 
-       pidl "static int proto_dcerpc_$module = -1;\n\n";
-
        pidl "static gint ett_dcerpc_$module = -1;\n\n";
 
        pidl "static int hf_opnum = -1;\n";
@@ -1033,6 +1014,7 @@ sub Parse($$)
        # Declarations for ett variables
 
        foreach my $y (keys(%needed)) {
+               
            pidl "static gint $y = -1;\n", if $y =~ /^ett_/;
        }
 
@@ -1043,24 +1025,26 @@ sub Parse($$)
        }
 
        # Only perform module initialisation if we found a uuid
-
-       if (defined($if_uuid)) {
-
-           pidl "static e_uuid_t uuid_dcerpc_$module = {\n";
-           pidl "\t0x" . substr($if_uuid, 0, 8);
-           pidl ", 0x" . substr($if_uuid, 9, 4);
-           pidl ", 0x" . substr($if_uuid, 14, 4) . ",\n";
-           pidl "\t{ 0x" . substr($if_uuid, 19, 2);
-           pidl ", 0x" . substr($if_uuid, 21, 2);
-           pidl ", 0x" . substr($if_uuid, 24, 2);
-           pidl ", 0x" . substr($if_uuid, 26, 2);
-           pidl ", 0x" . substr($if_uuid, 28, 2);
-           pidl ", 0x" . substr($if_uuid, 30, 2);
-           pidl ", 0x" . substr($if_uuid, 32, 2);
-           pidl ", 0x" . substr($if_uuid, 34, 2) . " }\n";
-           pidl "};\n\n";
-
-           pidl "static guint16 ver_dcerpc_$module = " . $if_version . ";\n\n";
+       
+       for my $x (@{$idl}) {
+               pidl "static int proto_dcerpc_" . $x->{NAME} ." = -1;\n\n";
+               if ((my $if_uuid = $x->{PROPERTIES}->{uuid})) {
+                       pidl "static e_uuid_t uuid_dcerpc_" . $x->{NAME} ." = {\n";
+                       pidl "\t0x" . substr($if_uuid, 0, 8);
+                       pidl ", 0x" . substr($if_uuid, 9, 4);
+                       pidl ", 0x" . substr($if_uuid, 14, 4) . ",\n";
+                       pidl "\t{ 0x" . substr($if_uuid, 19, 2);
+                       pidl ", 0x" . substr($if_uuid, 21, 2);
+                       pidl ", 0x" . substr($if_uuid, 24, 2);
+                       pidl ", 0x" . substr($if_uuid, 26, 2);
+                       pidl ", 0x" . substr($if_uuid, 28, 2);
+                       pidl ", 0x" . substr($if_uuid, 30, 2);
+                       pidl ", 0x" . substr($if_uuid, 32, 2);
+                       pidl ", 0x" . substr($if_uuid, 34, 2) . " }\n";
+                       pidl "};\n\n";
+
+                       pidl "static guint16 ver_dcerpc_" . $x->{NAME} . " = " . $x->{PROPERTIES}->{version}. ";\n\n";
+               }
        }
 
        pidl "void proto_register_dcerpc_$module(void)\n";
@@ -1092,31 +1076,33 @@ sub Parse($$)
        }
        pidl "\t};\n\n";
        
-       if (defined($if_uuid)) {
-
-           pidl "\tproto_dcerpc_$module = proto_register_protocol(\"$module\", \"$module\", \"$module\");\n\n";
+       for my $x (@{$idl}) {
+               if (defined($x->{PROPERTIES}->{uuid})) {
+                       $module = $x->{NAME};
 
-           pidl "\tproto_register_field_array(proto_dcerpc_$module, hf, array_length (hf));\n";
-           pidl "\tproto_register_subtree_array(ett, array_length(ett));\n";
+                       pidl "\tproto_dcerpc_$module = proto_register_protocol(\"$module\", \"$module\", \"$module\");\n\n";
 
-           pidl "}\n\n";
+                       pidl "\tproto_register_field_array(proto_dcerpc_$module, hf, array_length (hf));\n";
+                       pidl "\tproto_register_subtree_array(ett, array_length(ett));\n";
 
-           pidl "void proto_reg_handoff_dcerpc_$module(void)\n";
-           pidl "{\n";
-           pidl "\tdcerpc_init_uuid(proto_dcerpc_$module, ett_dcerpc_$module, \n";
-           pidl "\t\t&uuid_dcerpc_$module, ver_dcerpc_$module, \n";
-           pidl "\t\tdcerpc_" . $module . "_dissectors, hf_opnum);\n";
-           pidl "}\n";
+                       pidl "}\n\n";
 
-       } else {
+                       pidl "void proto_reg_handoff_dcerpc_$module(void)\n";
+                       pidl "{\n";
+                       pidl "\tdcerpc_init_uuid(proto_dcerpc_$module, ett_dcerpc_$module, \n";
+                       pidl "\t\t&uuid_dcerpc_$module, ver_dcerpc_$module, \n";
+                       pidl "\t\tdcerpc_" . $module . "_dissectors, hf_opnum);\n";
+                       pidl "}\n";
 
-           pidl "\tint proto_dcerpc;\n\n";
-           pidl "\tproto_dcerpc = proto_get_id_by_filter_name(\"dcerpc\");\n";
-           pidl "\tproto_register_field_array(proto_dcerpc, hf, array_length(hf));\n";
-           pidl "\tproto_register_subtree_array(ett, array_length(ett));\n";
+               } else {
 
-           pidl "}\n";
+                       pidl "\tint proto_dcerpc;\n\n";
+                       pidl "\tproto_dcerpc = proto_get_id_by_filter_name(\"dcerpc\");\n";
+                       pidl "\tproto_register_field_array(proto_dcerpc, hf, array_length(hf));\n";
+                       pidl "\tproto_register_subtree_array(ett, array_length(ett));\n";
 
+                       pidl "}\n";
+               }
        }
 
        close(OUT);
index 7618886bc232f0d971871bd419e6cb612195c741..589f9c6b542954702933501326d71c4a1246dbb6 100644 (file)
@@ -9,8 +9,6 @@ use strict;
 
 my($res);
 my($tab_depth);
-my $if_uuid;
-my $if_version;
 
 sub tabs()
 {
@@ -187,6 +185,7 @@ sub HeaderFunctionInOut($$)
 {
     my($fn) = shift;
     my($prop) = shift;
+
     foreach my $e (@{$fn->{DATA}}) {
            if (util::has_property($e, $prop)) {
                    HeaderElement($e);
@@ -220,6 +219,7 @@ sub HeaderFunctionInOut_needed($$)
 sub HeaderFunction($)
 {
     my($fn) = shift;
+
     $res .= "\nstruct $fn->{NAME} {\n";
     $tab_depth++;
     my $needed = 0;
@@ -272,12 +272,12 @@ sub HeaderInterface($)
     $res .= "#ifndef _HEADER_NDR_$interface->{NAME}\n";
     $res .= "#define _HEADER_NDR_$interface->{NAME}\n\n";
 
-    if (defined $if_uuid) {
+    if (defined $interface->{PROPERTIES}->{uuid}) {
            my $name = uc $interface->{NAME};
-           $res .= "#define DCERPC_$name\_UUID \"$if_uuid\"\n";
+           $res .= "#define DCERPC_$name\_UUID \"$interface->{PROPERTIES}->{uuid}\"\n";
 
-               if(!defined $if_version) { $if_version = "0.0"; }
-           $res .= "#define DCERPC_$name\_VERSION $if_version\n";
+               if(!defined $interface->{PROPERTIES}->{version}) { $interface->{PROPERTIES}->{version} = "0.0"; }
+           $res .= "#define DCERPC_$name\_VERSION $interface->{PROPERTIES}->{version}\n";
            $res .= "#define DCERPC_$name\_NAME \"$interface->{NAME}\"\n\n";
            $res .= "extern const struct dcerpc_interface_table dcerpc_table_$interface->{NAME};\n";
            $res .= "NTSTATUS dcerpc_$interface->{NAME}_init(void);\n\n";
@@ -305,17 +305,6 @@ sub HeaderInterface($)
     $res .= "#endif /* _HEADER_NDR_$interface->{NAME} */\n";
 }
 
-#####################################################################
-# parse the interface definitions
-sub ModuleHeader($)
-{
-    my($h) = shift;
-
-    $if_uuid = $h->{PROPERTIES}->{uuid};
-    $if_version = $h->{PROPERTIES}->{version};
-}
-
-
 #####################################################################
 # parse a parsed IDL into a C header
 sub Parse($)
@@ -325,9 +314,6 @@ sub Parse($)
 
     $res = "/* header auto-generated by pidl */\n\n";
     foreach my $x (@{$idl}) {
-       ($x->{TYPE} eq "MODULEHEADER") && 
-           ModuleHeader($x);
-
        ($x->{TYPE} eq "INTERFACE") && 
            HeaderInterface($x);
     }
index e469c0fdc8ce0d8cdfcddd4f715250a422720185..29e3cae9eb4cd96e7fcc38c820704871ac809460 100644 (file)
@@ -500,88 +500,85 @@ sub new {
                                   yystates =>
 [
        {#State 0
-               ACTIONS => {
-                       "[" => 2
-               },
+               DEFAULT => -1,
                GOTOS => {
-                       'idl_interface' => 1,
-                       'idl' => 3,
-                       'module_header' => 4
+                       'idl' => 1
                }
        },
        {#State 1
-               DEFAULT => -1
-       },
-       {#State 2
                ACTIONS => {
-                       'IDENTIFIER' => 5
+                       '' => 2
                },
-               DEFAULT => -5,
+               DEFAULT => -44,
                GOTOS => {
-                       'module_params' => 7,
-                       'identifier' => 6,
-                       'module_param' => 8
+                       'interface' => 3,
+                       'property_list' => 4
                }
        },
+       {#State 2
+               DEFAULT => 0
+       },
        {#State 3
+               DEFAULT => -2
+       },
+       {#State 4
                ACTIONS => {
-                       '' => 9,
-                       "[" => 2
-               },
-               GOTOS => {
-                       'idl_interface' => 10,
-                       'module_header' => 4
+                       "interface" => 6,
+                       "[" => 5
                }
        },
-       {#State 4
+       {#State 5
                ACTIONS => {
-                       "interface" => 12
+                       'IDENTIFIER' => 7
                },
                GOTOS => {
-                       'interface' => 11
+                       'identifier' => 8,
+                       'properties' => 10,
+                       'property' => 9
                }
        },
-       {#State 5
-               DEFAULT => -69
-       },
        {#State 6
                ACTIONS => {
-                       "(" => 13
+                       'IDENTIFIER' => 7
+               },
+               GOTOS => {
+                       'identifier' => 11
                }
        },
        {#State 7
-               ACTIONS => {
-                       "," => 14,
-                       "]" => 15
-               }
+               DEFAULT => -65
        },
        {#State 8
-               DEFAULT => -6
+               ACTIONS => {
+                       "(" => 12
+               },
+               DEFAULT => -48
        },
        {#State 9
-               DEFAULT => 0
+               DEFAULT => -46
        },
        {#State 10
-               DEFAULT => -2
+               ACTIONS => {
+                       "," => 13,
+                       "]" => 14
+               }
        },
        {#State 11
-               DEFAULT => -3
-       },
-       {#State 12
                ACTIONS => {
-                       'IDENTIFIER' => 5
+                       ":" => 15
                },
+               DEFAULT => -4,
                GOTOS => {
-                       'identifier' => 16
+                       'base_interface' => 16
                }
        },
-       {#State 13
+       {#State 12
                ACTIONS => {
-                       'IDENTIFIER' => 5,
+                       'IDENTIFIER' => 7,
                        'CONSTANT' => 23,
                        'TEXT' => 17
                },
-               DEFAULT => -56,
+               DEFAULT => -52,
                GOTOS => {
                        'identifier' => 18,
                        'listtext' => 21,
@@ -590,97 +587,94 @@ sub new {
                        'constant' => 22
                }
        },
-       {#State 14
+       {#State 13
                ACTIONS => {
-                       'IDENTIFIER' => 5
+                       'IDENTIFIER' => 7
                },
                GOTOS => {
-                       'identifier' => 6,
-                       'module_param' => 24
+                       'identifier' => 8,
+                       'property' => 24
                }
        },
+       {#State 14
+               DEFAULT => -45
+       },
        {#State 15
-               DEFAULT => -4
+               ACTIONS => {
+                       'IDENTIFIER' => 7
+               },
+               GOTOS => {
+                       'identifier' => 25
+               }
        },
        {#State 16
                ACTIONS => {
-                       "{" => 25
+                       "{" => 26
                }
        },
        {#State 17
-               DEFAULT => -71
+               DEFAULT => -67
        },
        {#State 18
-               DEFAULT => -57
+               DEFAULT => -53
        },
        {#State 19
-               DEFAULT => -59
+               DEFAULT => -55
        },
        {#State 20
                ACTIONS => {
-                       "-" => 26,
-                       "+" => 27,
-                       "&" => 28,
-                       "/" => 29,
-                       "|" => 30,
-                       "(" => 31,
-                       "*" => 32,
-                       "." => 33,
-                       ">" => 34
+                       "-" => 27,
+                       "+" => 28,
+                       "&" => 29,
+                       "/" => 30,
+                       "|" => 31,
+                       "(" => 32,
+                       "*" => 33,
+                       "." => 34,
+                       ">" => 35
                },
-               DEFAULT => -54
+               DEFAULT => -50
        },
        {#State 21
                ACTIONS => {
-                       "," => 35,
-                       ")" => 36
+                       "," => 36,
+                       ")" => 37
                }
        },
        {#State 22
-               DEFAULT => -58
+               DEFAULT => -54
        },
        {#State 23
-               DEFAULT => -70
+               DEFAULT => -66
        },
        {#State 24
-               DEFAULT => -7
+               DEFAULT => -47
        },
        {#State 25
-               ACTIONS => {
-                       "typedef" => 37,
-                       "const" => 43
-               },
-               DEFAULT => -48,
-               GOTOS => {
-                       'const' => 42,
-                       'function' => 38,
-                       'typedef' => 44,
-                       'definitions' => 39,
-                       'definition' => 41,
-                       'property_list' => 40
-               }
+               DEFAULT => -5
        },
        {#State 26
                ACTIONS => {
-                       'CONSTANT' => 23,
-                       'TEXT' => 17,
-                       'IDENTIFIER' => 5
+                       "typedef" => 38,
+                       "const" => 44
                },
-               DEFAULT => -56,
+               DEFAULT => -44,
                GOTOS => {
-                       'identifier' => 18,
-                       'text' => 19,
-                       'anytext' => 45,
-                       'constant' => 22
+                       'const' => 43,
+                       'function' => 39,
+                       'typedef' => 45,
+                       'definitions' => 40,
+                       'definition' => 42,
+                       'property_list' => 41
                }
        },
        {#State 27
                ACTIONS => {
                        'CONSTANT' => 23,
                        'TEXT' => 17,
-                       'IDENTIFIER' => 5
+                       'IDENTIFIER' => 7
                },
-               DEFAULT => -56,
+               DEFAULT => -52,
                GOTOS => {
                        'identifier' => 18,
                        'text' => 19,
@@ -692,9 +686,9 @@ sub new {
                ACTIONS => {
                        'CONSTANT' => 23,
                        'TEXT' => 17,
-                       'IDENTIFIER' => 5
+                       'IDENTIFIER' => 7
                },
-               DEFAULT => -56,
+               DEFAULT => -52,
                GOTOS => {
                        'identifier' => 18,
                        'text' => 19,
@@ -706,9 +700,9 @@ sub new {
                ACTIONS => {
                        'CONSTANT' => 23,
                        'TEXT' => 17,
-                       'IDENTIFIER' => 5
+                       'IDENTIFIER' => 7
                },
-               DEFAULT => -56,
+               DEFAULT => -52,
                GOTOS => {
                        'identifier' => 18,
                        'text' => 19,
@@ -720,9 +714,9 @@ sub new {
                ACTIONS => {
                        'CONSTANT' => 23,
                        'TEXT' => 17,
-                       'IDENTIFIER' => 5
+                       'IDENTIFIER' => 7
                },
-               DEFAULT => -56,
+               DEFAULT => -52,
                GOTOS => {
                        'identifier' => 18,
                        'text' => 19,
@@ -732,11 +726,11 @@ sub new {
        },
        {#State 31
                ACTIONS => {
-                       'IDENTIFIER' => 5,
                        'CONSTANT' => 23,
-                       'TEXT' => 17
+                       'TEXT' => 17,
+                       'IDENTIFIER' => 7
                },
-               DEFAULT => -56,
+               DEFAULT => -52,
                GOTOS => {
                        'identifier' => 18,
                        'text' => 19,
@@ -746,11 +740,11 @@ sub new {
        },
        {#State 32
                ACTIONS => {
+                       'IDENTIFIER' => 7,
                        'CONSTANT' => 23,
-                       'TEXT' => 17,
-                       'IDENTIFIER' => 5
+                       'TEXT' => 17
                },
-               DEFAULT => -56,
+               DEFAULT => -52,
                GOTOS => {
                        'identifier' => 18,
                        'text' => 19,
@@ -762,9 +756,9 @@ sub new {
                ACTIONS => {
                        'CONSTANT' => 23,
                        'TEXT' => 17,
-                       'IDENTIFIER' => 5
+                       'IDENTIFIER' => 7
                },
-               DEFAULT => -56,
+               DEFAULT => -52,
                GOTOS => {
                        'identifier' => 18,
                        'text' => 19,
@@ -776,9 +770,9 @@ sub new {
                ACTIONS => {
                        'CONSTANT' => 23,
                        'TEXT' => 17,
-                       'IDENTIFIER' => 5
+                       'IDENTIFIER' => 7
                },
-               DEFAULT => -56,
+               DEFAULT => -52,
                GOTOS => {
                        'identifier' => 18,
                        'text' => 19,
@@ -788,11 +782,11 @@ sub new {
        },
        {#State 35
                ACTIONS => {
-                       'IDENTIFIER' => 5,
                        'CONSTANT' => 23,
-                       'TEXT' => 17
+                       'TEXT' => 17,
+                       'IDENTIFIER' => 7
                },
-               DEFAULT => -56,
+               DEFAULT => -52,
                GOTOS => {
                        'identifier' => 18,
                        'text' => 19,
@@ -801,678 +795,621 @@ sub new {
                }
        },
        {#State 36
-               DEFAULT => -8
-       },
-       {#State 37
                ACTIONS => {
-                       'IDENTIFIER' => 5,
-                       "enum" => 55,
-                       'void' => 56
+                       'IDENTIFIER' => 7,
+                       'CONSTANT' => 23,
+                       'TEXT' => 17
                },
-               DEFAULT => -48,
+               DEFAULT => -52,
                GOTOS => {
-                       'identifier' => 58,
-                       'struct' => 59,
-                       'enum' => 60,
-                       'type' => 61,
-                       'union' => 62,
-                       'property_list' => 57
+                       'identifier' => 18,
+                       'text' => 19,
+                       'anytext' => 55,
+                       'constant' => 22
                }
        },
-       {#State 38
-               DEFAULT => -12
+       {#State 37
+               DEFAULT => -49
        },
-       {#State 39
+       {#State 38
                ACTIONS => {
-                       "}" => 63,
-                       "typedef" => 37,
-                       "const" => 43
+                       'IDENTIFIER' => 7,
+                       "enum" => 56,
+                       'void' => 57
                },
-               DEFAULT => -48,
+               DEFAULT => -44,
                GOTOS => {
-                       'const' => 42,
-                       'function' => 38,
-                       'typedef' => 44,
-                       'definition' => 64,
-                       'property_list' => 40
+                       'identifier' => 59,
+                       'struct' => 60,
+                       'enum' => 61,
+                       'type' => 62,
+                       'union' => 63,
+                       'property_list' => 58
                }
        },
+       {#State 39
+               DEFAULT => -8
+       },
        {#State 40
                ACTIONS => {
-                       'IDENTIFIER' => 5,
-                       "enum" => 55,
-                       "[" => 65,
-                       'void' => 56
+                       "}" => 64,
+                       "typedef" => 38,
+                       "const" => 44
                },
-               DEFAULT => -48,
+               DEFAULT => -44,
                GOTOS => {
-                       'identifier' => 58,
-                       'struct' => 59,
-                       'enum' => 60,
-                       'type' => 66,
-                       'union' => 62,
-                       'property_list' => 57
+                       'const' => 43,
+                       'function' => 39,
+                       'typedef' => 45,
+                       'definition' => 65,
+                       'property_list' => 41
                }
        },
        {#State 41
-               DEFAULT => -10
+               ACTIONS => {
+                       'IDENTIFIER' => 7,
+                       "enum" => 56,
+                       "[" => 5,
+                       'void' => 57
+               },
+               DEFAULT => -44,
+               GOTOS => {
+                       'identifier' => 59,
+                       'struct' => 60,
+                       'enum' => 61,
+                       'type' => 66,
+                       'union' => 63,
+                       'property_list' => 58
+               }
        },
        {#State 42
-               DEFAULT => -13
+               DEFAULT => -6
        },
        {#State 43
+               DEFAULT => -9
+       },
+       {#State 44
                ACTIONS => {
-                       'IDENTIFIER' => 5
+                       'IDENTIFIER' => 7
                },
                GOTOS => {
                        'identifier' => 67
                }
        },
-       {#State 44
-               DEFAULT => -14
-       },
        {#State 45
-               DEFAULT => -60
+               DEFAULT => -10
        },
        {#State 46
-               DEFAULT => -67
+               DEFAULT => -56
        },
        {#State 47
-               DEFAULT => -65
+               DEFAULT => -63
        },
        {#State 48
-               DEFAULT => -66
+               DEFAULT => -61
        },
        {#State 49
-               DEFAULT => -64
+               DEFAULT => -62
        },
        {#State 50
+               DEFAULT => -60
+       },
+       {#State 51
                ACTIONS => {
-                       "-" => 26,
-                       "+" => 27,
-                       "&" => 28,
-                       "/" => 29,
-                       "(" => 31,
-                       "|" => 30,
-                       "*" => 32,
-                       "." => 33,
+                       "-" => 27,
+                       "+" => 28,
+                       "&" => 29,
+                       "/" => 30,
+                       "(" => 32,
+                       "|" => 31,
+                       "*" => 33,
+                       "." => 34,
                        ")" => 68,
-                       ">" => 34
+                       ">" => 35
                }
        },
-       {#State 51
-               DEFAULT => -62
-       },
        {#State 52
-               DEFAULT => -61
+               DEFAULT => -58
        },
        {#State 53
-               DEFAULT => -63
+               DEFAULT => -57
        },
        {#State 54
+               DEFAULT => -59
+       },
+       {#State 55
                ACTIONS => {
-                       "-" => 26,
-                       "+" => 27,
-                       "&" => 28,
-                       "/" => 29,
-                       "(" => 31,
-                       "|" => 30,
-                       "*" => 32,
-                       "." => 33,
-                       ">" => 34
+                       "-" => 27,
+                       "+" => 28,
+                       "&" => 29,
+                       "/" => 30,
+                       "(" => 32,
+                       "|" => 31,
+                       "*" => 33,
+                       "." => 34,
+                       ">" => 35
                },
-               DEFAULT => -55
+               DEFAULT => -51
        },
-       {#State 55
+       {#State 56
                ACTIONS => {
                        "{" => 69
                }
        },
-       {#State 56
-               DEFAULT => -22
-       },
        {#State 57
+               DEFAULT => -18
+       },
+       {#State 58
                ACTIONS => {
                        "union" => 70,
-                       "[" => 65,
+                       "[" => 5,
                        "struct" => 71
                }
        },
-       {#State 58
-               DEFAULT => -21
-       },
        {#State 59
-               DEFAULT => -18
+               DEFAULT => -17
        },
        {#State 60
-               DEFAULT => -20
+               DEFAULT => -14
        },
        {#State 61
+               DEFAULT => -16
+       },
+       {#State 62
                ACTIONS => {
-                       'IDENTIFIER' => 5
+                       'IDENTIFIER' => 7
                },
                GOTOS => {
                        'identifier' => 72
                }
        },
-       {#State 62
-               DEFAULT => -19
-       },
        {#State 63
-               DEFAULT => -9
+               DEFAULT => -15
        },
        {#State 64
-               DEFAULT => -11
+               DEFAULT => -3
        },
        {#State 65
-               ACTIONS => {
-                       'IDENTIFIER' => 5
-               },
-               GOTOS => {
-                       'identifier' => 74,
-                       'property' => 75,
-                       'properties' => 73
-               }
+               DEFAULT => -7
        },
        {#State 66
                ACTIONS => {
-                       'IDENTIFIER' => 5
+                       'IDENTIFIER' => 7
                },
                GOTOS => {
-                       'identifier' => 76
+                       'identifier' => 73
                }
        },
        {#State 67
                ACTIONS => {
-                       'IDENTIFIER' => 5
+                       'IDENTIFIER' => 7
                },
                GOTOS => {
-                       'identifier' => 77
+                       'identifier' => 74
                }
        },
        {#State 68
                ACTIONS => {
                        'CONSTANT' => 23,
                        'TEXT' => 17,
-                       'IDENTIFIER' => 5
+                       'IDENTIFIER' => 7
                },
-               DEFAULT => -56,
+               DEFAULT => -52,
                GOTOS => {
                        'identifier' => 18,
                        'text' => 19,
-                       'anytext' => 78,
+                       'anytext' => 75,
                        'constant' => 22
                }
        },
        {#State 69
                ACTIONS => {
-                       'IDENTIFIER' => 5
+                       'IDENTIFIER' => 7
                },
                GOTOS => {
-                       'identifier' => 79,
-                       'enum_element' => 80,
-                       'enum_elements' => 81
+                       'identifier' => 76,
+                       'enum_element' => 77,
+                       'enum_elements' => 78
                }
        },
        {#State 70
                ACTIONS => {
-                       "{" => 82
+                       "{" => 79
                }
        },
        {#State 71
                ACTIONS => {
-                       "{" => 83
+                       "{" => 80
                }
        },
        {#State 72
                ACTIONS => {
-                       "[" => 85
+                       "[" => 82
                },
-               DEFAULT => -45,
+               DEFAULT => -41,
                GOTOS => {
-                       'array_len' => 84
+                       'array_len' => 81
                }
        },
        {#State 73
                ACTIONS => {
-                       "," => 86,
-                       "]" => 87
+                       "(" => 83
                }
        },
        {#State 74
                ACTIONS => {
-                       "(" => 88
-               },
-               DEFAULT => -52
+                       "=" => 84
+               }
        },
        {#State 75
-               DEFAULT => -50
+               DEFAULT => -64
        },
        {#State 76
                ACTIONS => {
-                       "(" => 89
-               }
+                       "=" => 85
+               },
+               DEFAULT => -22
        },
        {#State 77
-               ACTIONS => {
-                       "=" => 90
-               }
+               DEFAULT => -20
        },
        {#State 78
-               DEFAULT => -68
-       },
-       {#State 79
-               ACTIONS => {
-                       "=" => 91
-               },
-               DEFAULT => -26
-       },
-       {#State 80
-               DEFAULT => -24
-       },
-       {#State 81
                ACTIONS => {
-                       "}" => 92,
-                       "," => 93
+                       "}" => 86,
+                       "," => 87
                }
        },
-       {#State 82
+       {#State 79
                ACTIONS => {
-                       "[" => 96
+                       "[" => 90
                },
                GOTOS => {
-                       'union_elements' => 94,
-                       'union_element' => 95
+                       'union_elements' => 88,
+                       'union_element' => 89
                }
        },
-       {#State 83
-               DEFAULT => -39,
+       {#State 80
+               DEFAULT => -35,
                GOTOS => {
-                       'element_list1' => 97
+                       'element_list1' => 91
                }
        },
-       {#State 84
+       {#State 81
                ACTIONS => {
-                       ";" => 98
+                       ";" => 92
                }
        },
-       {#State 85
+       {#State 82
                ACTIONS => {
-                       'IDENTIFIER' => 5,
+                       'IDENTIFIER' => 7,
                        'CONSTANT' => 23,
                        'TEXT' => 17,
-                       "]" => 100
+                       "]" => 94
                },
-               DEFAULT => -56,
+               DEFAULT => -52,
                GOTOS => {
                        'identifier' => 18,
                        'text' => 19,
-                       'anytext' => 99,
+                       'anytext' => 93,
                        'constant' => 22
                }
        },
-       {#State 86
-               ACTIONS => {
-                       'IDENTIFIER' => 5
-               },
-               GOTOS => {
-                       'identifier' => 74,
-                       'property' => 101
-               }
-       },
-       {#State 87
-               DEFAULT => -49
-       },
-       {#State 88
-               ACTIONS => {
-                       'IDENTIFIER' => 5,
-                       'CONSTANT' => 23,
-                       'TEXT' => 17
-               },
-               DEFAULT => -56,
-               GOTOS => {
-                       'identifier' => 18,
-                       'text' => 19,
-                       'anytext' => 102,
-                       'constant' => 22
-               }
-       },
-       {#State 89
+       {#State 83
                ACTIONS => {
-                       "void" => 105,
-                       "," => -41,
-                       ")" => -41
+                       "void" => 97,
+                       "," => -37,
+                       ")" => -37
                },
-               DEFAULT => -48,
+               DEFAULT => -44,
                GOTOS => {
-                       'base_element' => 103,
-                       'element_list2' => 106,
-                       'property_list' => 104
+                       'base_element' => 95,
+                       'element_list2' => 98,
+                       'property_list' => 96
                }
        },
-       {#State 90
+       {#State 84
                ACTIONS => {
-                       'IDENTIFIER' => 5,
+                       'IDENTIFIER' => 7,
                        'CONSTANT' => 23,
                        'TEXT' => 17
                },
-               DEFAULT => -56,
+               DEFAULT => -52,
                GOTOS => {
                        'identifier' => 18,
                        'text' => 19,
-                       'anytext' => 107,
+                       'anytext' => 99,
                        'constant' => 22
                }
        },
-       {#State 91
+       {#State 85
                ACTIONS => {
-                       'IDENTIFIER' => 5,
+                       'IDENTIFIER' => 7,
                        'CONSTANT' => 23,
                        'TEXT' => 17
                },
-               DEFAULT => -56,
+               DEFAULT => -52,
                GOTOS => {
                        'identifier' => 18,
                        'text' => 19,
-                       'anytext' => 108,
+                       'anytext' => 100,
                        'constant' => 22
                }
        },
-       {#State 92
-               DEFAULT => -23
+       {#State 86
+               DEFAULT => -19
        },
-       {#State 93
+       {#State 87
                ACTIONS => {
-                       'IDENTIFIER' => 5
+                       'IDENTIFIER' => 7
                },
                GOTOS => {
-                       'identifier' => 79,
-                       'enum_element' => 109
+                       'identifier' => 76,
+                       'enum_element' => 101
                }
        },
-       {#State 94
+       {#State 88
                ACTIONS => {
-                       "}" => 110,
-                       "[" => 96
+                       "}" => 102,
+                       "[" => 90
                },
                GOTOS => {
-                       'union_element' => 111
+                       'union_element' => 103
                }
        },
-       {#State 95
-               DEFAULT => -30
+       {#State 89
+               DEFAULT => -26
        },
-       {#State 96
+       {#State 90
                ACTIONS => {
-                       "case" => 112,
-                       "default" => 113
+                       "case" => 104,
+                       "default" => 105
                }
        },
-       {#State 97
+       {#State 91
                ACTIONS => {
-                       "}" => 114
+                       "}" => 106
                },
-               DEFAULT => -48,
+               DEFAULT => -44,
                GOTOS => {
-                       'base_element' => 115,
-                       'property_list' => 104
+                       'base_element' => 107,
+                       'property_list' => 96
                }
        },
-       {#State 98
-               DEFAULT => -17
+       {#State 92
+               DEFAULT => -13
        },
-       {#State 99
+       {#State 93
                ACTIONS => {
-                       "-" => 26,
-                       "+" => 27,
-                       "&" => 28,
-                       "/" => 29,
-                       "(" => 31,
-                       "|" => 30,
-                       "*" => 32,
-                       "." => 33,
-                       "]" => 116,
-                       ">" => 34
+                       "-" => 27,
+                       "+" => 28,
+                       "&" => 29,
+                       "/" => 30,
+                       "(" => 32,
+                       "|" => 31,
+                       "*" => 33,
+                       "." => 34,
+                       "]" => 108,
+                       ">" => 35
                }
        },
-       {#State 100
-               DEFAULT => -46
-       },
-       {#State 101
-               DEFAULT => -51
-       },
-       {#State 102
-               ACTIONS => {
-                       "-" => 26,
-                       "+" => 27,
-                       "&" => 28,
-                       "/" => 29,
-                       "(" => 31,
-                       "|" => 30,
-                       "*" => 32,
-                       "." => 33,
-                       ")" => 117,
-                       ">" => 34
-               }
+       {#State 94
+               DEFAULT => -42
        },
-       {#State 103
-               DEFAULT => -43
+       {#State 95
+               DEFAULT => -39
        },
-       {#State 104
+       {#State 96
                ACTIONS => {
-                       'IDENTIFIER' => 5,
-                       "enum" => 55,
-                       "[" => 65,
-                       'void' => 56
+                       'IDENTIFIER' => 7,
+                       "enum" => 56,
+                       "[" => 5,
+                       'void' => 57
                },
-               DEFAULT => -48,
+               DEFAULT => -44,
                GOTOS => {
-                       'identifier' => 58,
-                       'struct' => 59,
-                       'enum' => 60,
-                       'type' => 118,
-                       'union' => 62,
-                       'property_list' => 57
+                       'identifier' => 59,
+                       'struct' => 60,
+                       'enum' => 61,
+                       'type' => 109,
+                       'union' => 63,
+                       'property_list' => 58
                }
        },
-       {#State 105
-               DEFAULT => -42
+       {#State 97
+               DEFAULT => -38
        },
-       {#State 106
+       {#State 98
                ACTIONS => {
-                       "," => 119,
-                       ")" => 120
+                       "," => 110,
+                       ")" => 111
                }
        },
-       {#State 107
+       {#State 99
                ACTIONS => {
-                       "-" => 26,
-                       "|" => 30,
-                       "(" => 31,
-                       "*" => 32,
-                       ";" => 121,
-                       "+" => 27,
-                       "&" => 28,
-                       "/" => 29,
-                       "." => 33,
-                       ">" => 34
+                       "-" => 27,
+                       "|" => 31,
+                       "(" => 32,
+                       "*" => 33,
+                       ";" => 112,
+                       "+" => 28,
+                       "&" => 29,
+                       "/" => 30,
+                       "." => 34,
+                       ">" => 35
                }
        },
-       {#State 108
+       {#State 100
                ACTIONS => {
-                       "-" => 26,
-                       "+" => 27,
-                       "&" => 28,
-                       "/" => 29,
-                       "(" => 31,
-                       "|" => 30,
-                       "*" => 32,
-                       "." => 33,
-                       ">" => 34
+                       "-" => 27,
+                       "+" => 28,
+                       "&" => 29,
+                       "/" => 30,
+                       "(" => 32,
+                       "|" => 31,
+                       "*" => 33,
+                       "." => 34,
+                       ">" => 35
                },
-               DEFAULT => -27
+               DEFAULT => -23
        },
-       {#State 109
-               DEFAULT => -25
+       {#State 101
+               DEFAULT => -21
        },
-       {#State 110
-               DEFAULT => -29
+       {#State 102
+               DEFAULT => -25
        },
-       {#State 111
-               DEFAULT => -31
+       {#State 103
+               DEFAULT => -27
        },
-       {#State 112
+       {#State 104
                ACTIONS => {
-                       "(" => 122
+                       "(" => 113
                }
        },
-       {#State 113
+       {#State 105
                ACTIONS => {
-                       "]" => 123
+                       "]" => 114
                }
        },
-       {#State 114
-               DEFAULT => -28
+       {#State 106
+               DEFAULT => -24
        },
-       {#State 115
+       {#State 107
                ACTIONS => {
-                       ";" => 124
+                       ";" => 115
                }
        },
-       {#State 116
-               DEFAULT => -47
-       },
-       {#State 117
-               DEFAULT => -53
+       {#State 108
+               DEFAULT => -43
        },
-       {#State 118
-               DEFAULT => -37,
+       {#State 109
+               DEFAULT => -33,
                GOTOS => {
-                       'pointers' => 125
+                       'pointers' => 116
                }
        },
-       {#State 119
-               DEFAULT => -48,
+       {#State 110
+               DEFAULT => -44,
                GOTOS => {
-                       'base_element' => 126,
-                       'property_list' => 104
+                       'base_element' => 117,
+                       'property_list' => 96
                }
        },
-       {#State 120
+       {#State 111
                ACTIONS => {
-                       ";" => 127
+                       ";" => 118
                }
        },
-       {#State 121
-               DEFAULT => -15
+       {#State 112
+               DEFAULT => -11
        },
-       {#State 122
+       {#State 113
                ACTIONS => {
-                       'IDENTIFIER' => 5,
+                       'IDENTIFIER' => 7,
                        'CONSTANT' => 23,
                        'TEXT' => 17
                },
-               DEFAULT => -56,
+               DEFAULT => -52,
                GOTOS => {
                        'identifier' => 18,
                        'text' => 19,
-                       'anytext' => 128,
+                       'anytext' => 119,
                        'constant' => 22
                }
        },
-       {#State 123
+       {#State 114
                ACTIONS => {
-                       ";" => 129
+                       ";" => 120
                },
-               DEFAULT => -48,
+               DEFAULT => -44,
                GOTOS => {
-                       'base_element' => 130,
-                       'property_list' => 104
+                       'base_element' => 121,
+                       'property_list' => 96
                }
        },
-       {#State 124
-               DEFAULT => -40
+       {#State 115
+               DEFAULT => -36
        },
-       {#State 125
+       {#State 116
                ACTIONS => {
-                       'IDENTIFIER' => 5,
-                       "*" => 132
+                       'IDENTIFIER' => 7,
+                       "*" => 123
                },
                GOTOS => {
-                       'identifier' => 131
+                       'identifier' => 122
                }
        },
-       {#State 126
-               DEFAULT => -44
+       {#State 117
+               DEFAULT => -40
        },
-       {#State 127
-               DEFAULT => -16
+       {#State 118
+               DEFAULT => -12
        },
-       {#State 128
+       {#State 119
                ACTIONS => {
-                       "-" => 26,
-                       "+" => 27,
-                       "&" => 28,
-                       "/" => 29,
-                       "(" => 31,
-                       "|" => 30,
-                       "*" => 32,
-                       "." => 33,
-                       ")" => 133,
-                       ">" => 34
+                       "-" => 27,
+                       "+" => 28,
+                       "&" => 29,
+                       "/" => 30,
+                       "(" => 32,
+                       "|" => 31,
+                       "*" => 33,
+                       "." => 34,
+                       ")" => 124,
+                       ">" => 35
                }
        },
-       {#State 129
-               DEFAULT => -35
+       {#State 120
+               DEFAULT => -31
        },
-       {#State 130
+       {#State 121
                ACTIONS => {
-                       ";" => 134
+                       ";" => 125
                }
        },
-       {#State 131
+       {#State 122
                ACTIONS => {
-                       "[" => 85
+                       "[" => 82
                },
-               DEFAULT => -45,
+               DEFAULT => -41,
                GOTOS => {
-                       'array_len' => 135
+                       'array_len' => 126
                }
        },
-       {#State 132
-               DEFAULT => -38
+       {#State 123
+               DEFAULT => -34
        },
-       {#State 133
+       {#State 124
                ACTIONS => {
-                       "]" => 136
+                       "]" => 127
                }
        },
-       {#State 134
-               DEFAULT => -34
+       {#State 125
+               DEFAULT => -30
        },
-       {#State 135
-               DEFAULT => -36
+       {#State 126
+               DEFAULT => -32
        },
-       {#State 136
+       {#State 127
                ACTIONS => {
-                       ";" => 137
+                       ";" => 128
                },
-               DEFAULT => -48,
+               DEFAULT => -44,
                GOTOS => {
-                       'base_element' => 138,
-                       'property_list' => 104
+                       'base_element' => 129,
+                       'property_list' => 96
                }
        },
-       {#State 137
-               DEFAULT => -33
+       {#State 128
+               DEFAULT => -29
        },
-       {#State 138
+       {#State 129
                ACTIONS => {
-                       ";" => 139
+                       ";" => 130
                }
        },
-       {#State 139
-               DEFAULT => -32
+       {#State 130
+               DEFAULT => -28
        }
 ],
                                   yyrules  =>
@@ -1481,85 +1418,62 @@ sub new {
                 '$start', 2, undef
        ],
        [#Rule 1
-                'idl', 1, undef
+                'idl', 0, undef
        ],
        [#Rule 2
                 'idl', 2,
 sub
-#line 18 "build/pidl/idl.yp"
-{ util::FlattenArray([$_[1],$_[2]]) }
+#line 19 "build/pidl/idl.yp"
+{
+               push(@{$_[1]}, $_[2]); $_[1] 
+       }
        ],
        [#Rule 3
-                'idl_interface', 2,
-sub
-#line 21 "build/pidl/idl.yp"
-{ [ $_[1], $_[2] ] }
-       ],
-       [#Rule 4
-                'module_header', 3,
+                'interface', 7,
 sub
 #line 25 "build/pidl/idl.yp"
-{{ 
-              "TYPE" => "MODULEHEADER", 
-              "PROPERTIES" => util::FlattenHash($_[2])
+{$_[3] => {
+               "TYPE" => "INTERFACE", 
+                          "PROPERTIES" => $_[1],
+                      "NAME" => $_[3],
+                          "BASE" => $_[4],
+                      "DATA" => $_[6],
           }}
        ],
-       [#Rule 5
-                'module_params', 0, undef
-       ],
-       [#Rule 6
-                'module_params', 1,
-sub
-#line 33 "build/pidl/idl.yp"
-{ [ $_[1] ] }
-       ],
-       [#Rule 7
-                'module_params', 3,
-sub
-#line 34 "build/pidl/idl.yp"
-{ push(@{$_[1]}, $_[3]); $_[1] }
-       ],
-       [#Rule 8
-                'module_param', 4,
-sub
-#line 38 "build/pidl/idl.yp"
-{ { "$_[1]" => "$_[3]" } }
+       [#Rule 4
+                'base_interface', 0, undef
        ],
-       [#Rule 9
-                'interface', 5,
+       [#Rule 5
+                'base_interface', 2,
 sub
-#line 42 "build/pidl/idl.yp"
-{{
-                       "TYPE" => "INTERFACE", 
-                      "NAME" => $_[2],
-                      "DATA" => $_[4]
-          }}
+#line 36 "build/pidl/idl.yp"
+{ $_[2] }
        ],
-       [#Rule 10
+       [#Rule 6
                 'definitions', 1,
 sub
-#line 50 "build/pidl/idl.yp"
+#line 40 "build/pidl/idl.yp"
 { [ $_[1] ] }
        ],
-       [#Rule 11
+       [#Rule 7
                 'definitions', 2,
 sub
-#line 51 "build/pidl/idl.yp"
+#line 41 "build/pidl/idl.yp"
 { push(@{$_[1]}, $_[2]); $_[1] }
        ],
-       [#Rule 12
+       [#Rule 8
                 'definition', 1, undef
        ],
-       [#Rule 13
+       [#Rule 9
                 'definition', 1, undef
        ],
-       [#Rule 14
+       [#Rule 10
                 'definition', 1, undef
        ],
-       [#Rule 15
+       [#Rule 11
                 'const', 6,
 sub
-#line 59 "build/pidl/idl.yp"
+#line 49 "build/pidl/idl.yp"
 {{
                      "TYPE"  => "CONST", 
                     "DTYPE"  => $_[2],
@@ -1567,10 +1481,10 @@ sub
                     "VALUE" => $_[5]
         }}
        ],
-       [#Rule 16
+       [#Rule 12
                 'function', 7,
 sub
-#line 69 "build/pidl/idl.yp"
+#line 59 "build/pidl/idl.yp"
 {{
                "TYPE" => "FUNCTION",
                "NAME" => $_[3],
@@ -1579,10 +1493,10 @@ sub
                "DATA" => $_[5]
         }}
        ],
-       [#Rule 17
+       [#Rule 13
                 'typedef', 5,
 sub
-#line 79 "build/pidl/idl.yp"
+#line 69 "build/pidl/idl.yp"
 {{
                      "TYPE" => "TYPEDEF", 
                     "NAME" => $_[3],
@@ -1590,128 +1504,128 @@ sub
                     "ARRAY_LEN" => $_[4]
         }}
        ],
-       [#Rule 18
+       [#Rule 14
                 'type', 1, undef
        ],
-       [#Rule 19
+       [#Rule 15
                 'type', 1, undef
        ],
-       [#Rule 20
+       [#Rule 16
                 'type', 1, undef
        ],
-       [#Rule 21
+       [#Rule 17
                 'type', 1, undef
        ],
-       [#Rule 22
+       [#Rule 18
                 'type', 1,
 sub
-#line 88 "build/pidl/idl.yp"
+#line 78 "build/pidl/idl.yp"
 { "void" }
        ],
-       [#Rule 23
+       [#Rule 19
                 'enum', 4,
 sub
-#line 93 "build/pidl/idl.yp"
+#line 83 "build/pidl/idl.yp"
 {{
                      "TYPE" => "ENUM", 
                     "ELEMENTS" => $_[3]
         }}
        ],
-       [#Rule 24
+       [#Rule 20
                 'enum_elements', 1,
 sub
-#line 100 "build/pidl/idl.yp"
+#line 90 "build/pidl/idl.yp"
 { [ $_[1] ] }
        ],
-       [#Rule 25
+       [#Rule 21
                 'enum_elements', 3,
 sub
-#line 101 "build/pidl/idl.yp"
+#line 91 "build/pidl/idl.yp"
 { push(@{$_[1]}, $_[3]); $_[1] }
        ],
-       [#Rule 26
+       [#Rule 22
                 'enum_element', 1, undef
        ],
-       [#Rule 27
+       [#Rule 23
                 'enum_element', 3,
 sub
-#line 105 "build/pidl/idl.yp"
+#line 95 "build/pidl/idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
-       [#Rule 28
+       [#Rule 24
                 'struct', 5,
 sub
-#line 109 "build/pidl/idl.yp"
+#line 99 "build/pidl/idl.yp"
 {{
                      "TYPE" => "STRUCT", 
                     "PROPERTIES" => $_[1],
                     "ELEMENTS" => $_[4]
         }}
        ],
-       [#Rule 29
+       [#Rule 25
                 'union', 5,
 sub
-#line 117 "build/pidl/idl.yp"
+#line 107 "build/pidl/idl.yp"
 {{
                "TYPE" => "UNION",
                "PROPERTIES" => $_[1],
                "DATA" => $_[4]
         }}
        ],
-       [#Rule 30
+       [#Rule 26
                 'union_elements', 1,
 sub
-#line 125 "build/pidl/idl.yp"
+#line 115 "build/pidl/idl.yp"
 { [ $_[1] ] }
        ],
-       [#Rule 31
+       [#Rule 27
                 'union_elements', 2,
 sub
-#line 126 "build/pidl/idl.yp"
+#line 116 "build/pidl/idl.yp"
 { push(@{$_[1]}, $_[2]); $_[1] }
        ],
-       [#Rule 32
+       [#Rule 28
                 'union_element', 8,
 sub
-#line 131 "build/pidl/idl.yp"
+#line 121 "build/pidl/idl.yp"
 {{
                "TYPE" => "UNION_ELEMENT",
                "CASE" => $_[4],
                "DATA" => $_[7]
         }}
        ],
-       [#Rule 33
+       [#Rule 29
                 'union_element', 7,
 sub
-#line 137 "build/pidl/idl.yp"
+#line 127 "build/pidl/idl.yp"
 {{
                "TYPE" => "EMPTY",
                "CASE" => $_[4],
         }}
        ],
-       [#Rule 34
+       [#Rule 30
                 'union_element', 5,
 sub
-#line 142 "build/pidl/idl.yp"
+#line 132 "build/pidl/idl.yp"
 {{
                "TYPE" => "UNION_ELEMENT",
                "CASE" => "default",
                "DATA" => $_[4]
         }}
        ],
-       [#Rule 35
+       [#Rule 31
                 'union_element', 4,
 sub
-#line 148 "build/pidl/idl.yp"
+#line 138 "build/pidl/idl.yp"
 {{
                "TYPE" => "EMPTY",
                "CASE" => "default",
         }}
        ],
-       [#Rule 36
+       [#Rule 32
                 'base_element', 5,
 sub
-#line 155 "build/pidl/idl.yp"
+#line 145 "build/pidl/idl.yp"
 {{
                           "NAME" => $_[4],
                           "TYPE" => $_[2],
@@ -1720,181 +1634,181 @@ sub
                           "ARRAY_LEN" => $_[5]
               }}
        ],
-       [#Rule 37
+       [#Rule 33
                 'pointers', 0,
 sub
-#line 167 "build/pidl/idl.yp"
+#line 157 "build/pidl/idl.yp"
 { 0 }
        ],
-       [#Rule 38
+       [#Rule 34
                 'pointers', 2,
 sub
-#line 168 "build/pidl/idl.yp"
+#line 158 "build/pidl/idl.yp"
 { $_[1]+1 }
        ],
-       [#Rule 39
+       [#Rule 35
                 'element_list1', 0, undef
        ],
-       [#Rule 40
+       [#Rule 36
                 'element_list1', 3,
 sub
-#line 175 "build/pidl/idl.yp"
+#line 165 "build/pidl/idl.yp"
 { push(@{$_[1]}, $_[2]); $_[1] }
        ],
-       [#Rule 41
+       [#Rule 37
                 'element_list2', 0, undef
        ],
-       [#Rule 42
+       [#Rule 38
                 'element_list2', 1, undef
        ],
-       [#Rule 43
+       [#Rule 39
                 'element_list2', 1,
 sub
-#line 181 "build/pidl/idl.yp"
+#line 171 "build/pidl/idl.yp"
 { [ $_[1] ] }
        ],
-       [#Rule 44
+       [#Rule 40
                 'element_list2', 3,
 sub
-#line 182 "build/pidl/idl.yp"
+#line 172 "build/pidl/idl.yp"
 { push(@{$_[1]}, $_[3]); $_[1] }
        ],
-       [#Rule 45
+       [#Rule 41
                 'array_len', 0, undef
        ],
-       [#Rule 46
+       [#Rule 42
                 'array_len', 2,
 sub
-#line 187 "build/pidl/idl.yp"
+#line 177 "build/pidl/idl.yp"
 { "*" }
        ],
-       [#Rule 47
+       [#Rule 43
                 'array_len', 3,
 sub
-#line 188 "build/pidl/idl.yp"
+#line 178 "build/pidl/idl.yp"
 { "$_[2]" }
        ],
-       [#Rule 48
+       [#Rule 44
                 'property_list', 0, undef
        ],
-       [#Rule 49
+       [#Rule 45
                 'property_list', 4,
 sub
-#line 194 "build/pidl/idl.yp"
+#line 184 "build/pidl/idl.yp"
 { util::FlattenHash([$_[1],$_[3]]); }
        ],
-       [#Rule 50
+       [#Rule 46
                 'properties', 1,
 sub
-#line 197 "build/pidl/idl.yp"
+#line 187 "build/pidl/idl.yp"
 { $_[1] }
        ],
-       [#Rule 51
+       [#Rule 47
                 'properties', 3,
 sub
-#line 198 "build/pidl/idl.yp"
+#line 188 "build/pidl/idl.yp"
 { util::FlattenHash([$_[1], $_[3]]); }
        ],
-       [#Rule 52
+       [#Rule 48
                 'property', 1,
 sub
-#line 201 "build/pidl/idl.yp"
+#line 191 "build/pidl/idl.yp"
 {{ "$_[1]" => "1"     }}
        ],
-       [#Rule 53
+       [#Rule 49
                 'property', 4,
 sub
-#line 202 "build/pidl/idl.yp"
+#line 192 "build/pidl/idl.yp"
 {{ "$_[1]" => "$_[3]" }}
        ],
-       [#Rule 54
+       [#Rule 50
                 'listtext', 1, undef
        ],
-       [#Rule 55
+       [#Rule 51
                 'listtext', 3,
 sub
-#line 207 "build/pidl/idl.yp"
+#line 197 "build/pidl/idl.yp"
 { "$_[1] $_[3]" }
        ],
-       [#Rule 56
+       [#Rule 52
                 'anytext', 0,
 sub
-#line 211 "build/pidl/idl.yp"
+#line 201 "build/pidl/idl.yp"
 { "" }
        ],
-       [#Rule 57
+       [#Rule 53
                 'anytext', 1, undef
        ],
-       [#Rule 58
+       [#Rule 54
                 'anytext', 1, undef
        ],
-       [#Rule 59
+       [#Rule 55
                 'anytext', 1, undef
        ],
-       [#Rule 60
+       [#Rule 56
                 'anytext', 3,
 sub
-#line 213 "build/pidl/idl.yp"
+#line 203 "build/pidl/idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
-       [#Rule 61
+       [#Rule 57
                 'anytext', 3,
 sub
-#line 214 "build/pidl/idl.yp"
+#line 204 "build/pidl/idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
-       [#Rule 62
+       [#Rule 58
                 'anytext', 3,
 sub
-#line 215 "build/pidl/idl.yp"
+#line 205 "build/pidl/idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
-       [#Rule 63
+       [#Rule 59
                 'anytext', 3,
 sub
-#line 216 "build/pidl/idl.yp"
+#line 206 "build/pidl/idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
-       [#Rule 64
+       [#Rule 60
                 'anytext', 3,
 sub
-#line 217 "build/pidl/idl.yp"
+#line 207 "build/pidl/idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
-       [#Rule 65
+       [#Rule 61
                 'anytext', 3,
 sub
-#line 218 "build/pidl/idl.yp"
+#line 208 "build/pidl/idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
-       [#Rule 66
+       [#Rule 62
                 'anytext', 3,
 sub
-#line 219 "build/pidl/idl.yp"
+#line 209 "build/pidl/idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
-       [#Rule 67
+       [#Rule 63
                 'anytext', 3,
 sub
-#line 220 "build/pidl/idl.yp"
+#line 210 "build/pidl/idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
-       [#Rule 68
+       [#Rule 64
                 'anytext', 5,
 sub
-#line 221 "build/pidl/idl.yp"
+#line 211 "build/pidl/idl.yp"
 { "$_[1]$_[2]$_[3]$_[4]$_[5]" }
        ],
-       [#Rule 69
+       [#Rule 65
                 'identifier', 1, undef
        ],
-       [#Rule 70
+       [#Rule 66
                 'constant', 1, undef
        ],
-       [#Rule 71
+       [#Rule 67
                 'text', 1,
 sub
-#line 230 "build/pidl/idl.yp"
+#line 220 "build/pidl/idl.yp"
 { "\"$_[1]\"" }
        ]
 ],
@@ -1902,7 +1816,7 @@ sub
     bless($self,$class);
 }
 
-#line 236 "build/pidl/idl.yp"
+#line 226 "build/pidl/idl.yp"
 
 
 use util;
@@ -1988,10 +1902,49 @@ sub parse_idl($$)
        my $data = `$cpp -xc $filename`;
        $/ = $saved_delim;
 
-        $self->YYData->{INPUT} = $data;
-        $self->YYData->{LINE} = 0;
-        $self->YYData->{LAST_TOKEN} = "NONE";
-       return $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
+    $self->YYData->{INPUT} = $data;
+    $self->YYData->{LINE} = 0;
+    $self->YYData->{LAST_TOKEN} = "NONE";
+
+       my $idl = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
+
+       foreach my $x (@{$idl}) {
+               # Add [in] ORPCTHIS *this, [out] ORPCTHAT *that
+               # for 'object' interfaces
+               if (defined($x->{PROPERTIES}->{object})) {
+                       foreach my $e (@{$x->{DATA}}) {
+                               if($e->{TYPE} eq "FUNCTION") {
+                                       unshift(@{$e->{DATA}}, 
+                        { 'NAME' => 'ORPCthis',
+                          'POINTERS' => 1,
+                          'PROPERTIES' => { 'in' => '1' },
+                          'TYPE' => 'ORPCTHIS'
+                        });
+                                       unshift(@{$e->{DATA}},
+                        { 'NAME' => 'ORPCthat',
+                          'POINTERS' => 1,
+                          'PROPERTIES' => { 'out' => '1' },
+                                                 'TYPE' => 'ORPCTHAT'
+                        });
+                               }
+                       }
+               }
+               
+               # Do the inheritance
+               if (defined($x->{BASE}) and $x->{BASE} ne "") {
+                       my $parent = util::get_interface($idl, $x->{BASE});
+
+                       if(not defined($parent)) { 
+                               die("No such parent interface " . $x->{BASE});
+                       }
+                       
+                       @{$x->{INHERITED_DATA}} = (@{$parent->{INHERITED_DATA}}, @{$x->{DATA}});
+               } else {
+                       $x->{INHERITED_DATA} = $x->{DATA};
+               }
+       }
+
+       return $idl;
 }
 
 1;
index cb293de2725a2dbc312520caa82c9f9f4aa886e3..77ebbc74a7f52d98438c347f26b75553fc3a6b18 100644 (file)
 ################
 # grammer
 %%
-idl: idl_interface 
-     | idl idl_interface { util::FlattenArray([$_[1],$_[2]]) }
-;
-
-idl_interface: module_header interface { [ $_[1], $_[2] ] }
+idl: 
+       #empty  { {} }
+    | idl interface {
+               push(@{$_[1]}, $_[2]); $_[1] 
+       }
 ;
 
-module_header: '[' module_params ']'
-          {{ 
-              "TYPE" => "MODULEHEADER", 
-              "PROPERTIES" => util::FlattenHash($_[2])
+interface: property_list 'interface' identifier base_interface '{' definitions '}'
+          {$_[3] => {
+               "TYPE" => "INTERFACE", 
+                          "PROPERTIES" => $_[1],
+                      "NAME" => $_[3],
+                          "BASE" => $_[4],
+                      "DATA" => $_[6],
           }}
 ;
 
-module_params: 
-    #empty
-    | module_param                    { [ $_[1] ] }            
-    | module_params ',' module_param  { push(@{$_[1]}, $_[3]); $_[1] }
-;
-
-module_param: identifier '(' listtext ')'
-{ { "$_[1]" => "$_[3]" } }
-;
-
-interface: 'interface' identifier '{' definitions '}'
-          {{
-                       "TYPE" => "INTERFACE", 
-                      "NAME" => $_[2],
-                      "DATA" => $_[4]
-          }}
+base_interface:
+       #empty
+       | ':' identifier { $_[2] }
 ;
 
 definitions: 
@@ -199,7 +189,7 @@ properties: property          { $_[1] }
 ;
 
 property: identifier                   {{ "$_[1]" => "1"     }}
-          | identifier '(' anytext ')' {{ "$_[1]" => "$_[3]" }}
+          | identifier '(' listtext ')' {{ "$_[1]" => "$_[3]" }}
 ;
 
 listtext:
@@ -318,8 +308,47 @@ sub parse_idl($$)
        my $data = `$cpp -xc $filename`;
        $/ = $saved_delim;
 
-        $self->YYData->{INPUT} = $data;
-        $self->YYData->{LINE} = 0;
-        $self->YYData->{LAST_TOKEN} = "NONE";
-       return $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
+    $self->YYData->{INPUT} = $data;
+    $self->YYData->{LINE} = 0;
+    $self->YYData->{LAST_TOKEN} = "NONE";
+
+       my $idl = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
+
+       foreach my $x (@{$idl}) {
+               # Add [in] ORPCTHIS *this, [out] ORPCTHAT *that
+               # for 'object' interfaces
+               if (defined($x->{PROPERTIES}->{object})) {
+                       foreach my $e (@{$x->{DATA}}) {
+                               if($e->{TYPE} eq "FUNCTION") {
+                                       unshift(@{$e->{DATA}}, 
+                        { 'NAME' => 'ORPCthis',
+                          'POINTERS' => 1,
+                          'PROPERTIES' => { 'in' => '1' },
+                          'TYPE' => 'ORPCTHIS'
+                        });
+                                       unshift(@{$e->{DATA}},
+                        { 'NAME' => 'ORPCthat',
+                          'POINTERS' => 1,
+                          'PROPERTIES' => { 'out' => '1' },
+                                                 'TYPE' => 'ORPCTHAT'
+                        });
+                               }
+                       }
+               }
+               
+               # Do the inheritance
+               if (defined($x->{BASE}) and $x->{BASE} ne "") {
+                       my $parent = util::get_interface($idl, $x->{BASE});
+
+                       if(not defined($parent)) { 
+                               die("No such parent interface " . $x->{BASE});
+                       }
+                       
+                       @{$x->{INHERITED_DATA}} = (@{$parent->{INHERITED_DATA}}, @{$x->{DATA}});
+               } else {
+                       $x->{INHERITED_DATA} = $x->{DATA};
+               }
+       }
+
+       return $idl;
 }
index bc9eaa627f0d6fc4d6170ea9f1ce37d043c7786a..51d561d4b2963be9c04c346b4659a9ee69ec09fd 100644 (file)
@@ -13,10 +13,6 @@ use client;
 my %needed;
 my %structs;
 
-my $if_uuid;
-my $if_version;
-my $if_endpoints;
-
 sub pidl($)
 {
        print OUT shift;
@@ -622,7 +618,7 @@ sub ParseElementPrintBuffer($$)
        }
            
        if (util::array_size($e)) {
-               ParseArrayPrint($e, $var_prefix);
+               ParseArrayPrint($e, $var_prefix)
        } elsif (my $switch = util::has_property($e, "switch_is")) {
                ParseElementPrintSwitch($e, $var_prefix, $switch);
        } else {
@@ -1340,7 +1336,7 @@ sub ParseFunctionPull($)
 sub FunctionTable($)
 {
        my($interface) = shift;
-       my($data) = $interface->{DATA};
+       my($data) = $interface->{INHERITED_DATA};
        my $count = 0;
        my $uname = uc $interface->{NAME};
 
@@ -1368,11 +1364,11 @@ sub FunctionTable($)
 
        my $endpoints;
 
-       if (! defined $if_endpoints) {
-               $if_endpoints = $interface->{NAME};
+       if (! defined $interface->{PROPERTIES}->{endpoints}) {
+               $interface->{PROPERTIES}->{endpoints} = $interface->{NAME};
        }
 
-       my @e = split / /, $if_endpoints;
+       my @e = split / /, $interface->{PROPERTIES}->{endpoints};
        my $endpoint_count = $#e + 1;
 
        pidl "static const char * const $interface->{NAME}\_endpoint_strings[] = {\n\t";
@@ -1500,17 +1496,6 @@ sub BuildNeeded($)
        }
 }
 
-#####################################################################
-# parse the interface definitions
-sub ModuleHeader($)
-{
-    my($h) = shift;
-
-    $if_uuid = $h->{PROPERTIES}->{uuid};
-    $if_version = $h->{PROPERTIES}->{version};
-    $if_endpoints = $h->{PROPERTIES}->{endpoints};
-}
-
 #####################################################################
 # parse a parsed IDL structure back into an IDL file
 sub Parse($$)
@@ -1523,9 +1508,6 @@ sub Parse($$)
        pidl "/* parser auto-generated by pidl */\n\n";
        pidl "#include \"includes.h\"\n\n";
        foreach my $x (@{$idl}) {
-               ($x->{TYPE} eq "MODULEHEADER") && 
-                   ModuleHeader($x);
-
                if ($x->{TYPE} eq "INTERFACE") { 
                        BuildNeeded($x);
                        ParseInterface($x);
index cebd545297ab07a15bc62de454857607838e01a9..616727edc632497407e1ed771c0b9d337be0e9f3 100755 (executable)
@@ -115,7 +115,7 @@ sub process_file($)
        if ($opt_parse) {
                $pidl = IdlParse($idl_file);
                defined $pidl || die "Failed to parse $idl_file";
-               IdlValidator::Validate($pidl);
+#              IdlValidator::Validate($pidl);
                if ($opt_keep && !util::SaveStructure($pidl_file, $pidl)) {
                            die "Failed to save $pidl_file\n";
                }
index f822222b4542f7ec2552c1e49b8951a5af0456f6..1341d77cccc497ec54beaae15675dca659b69498 100644 (file)
@@ -153,6 +153,20 @@ sub SaveStructure($$)
        FileSave($filename, MyDumper($v));
 }
 
+#####################################################################
+# find an interface in an array of interfaces
+sub get_interface($$)
+{
+       my($if) = shift;
+       my($n) = shift;
+
+       foreach(@{$if}) {
+               if($_->{NAME} eq $n) { return $_; }
+       }
+       
+       return 0;
+}
+
 #####################################################################
 # see if a pidl property list contains a give property
 sub has_property($$)
index 71c1b26e2a6f7b6c4d087f07501ccd61c5b55eac..3618dfbb61249444415849dca260310222099b52 100644 (file)
@@ -8,7 +8,6 @@
   see http://www.opengroup.org/onlinepubs/9629399/chap12.htm for packet
   layouts
 */
-[] 
 interface dcerpc
 {
        typedef [public] struct {
index 9d5acb6ebd99e8c02be27312ddac5c7fcec13693..dee52243a4653f59c1a531887e1d7dacafeed130 100644 (file)
@@ -10,27 +10,22 @@ interface ObjectRpcBaseTypes
 {
        WERROR stub();
        
-       typedef [public] struct {
-               uint32 upper;
-               uint32 lower;
-       } hyper;
-
        //////////////////////////////////////////////////////////////
        // Identifier Definitions
        ////////////////////////////////////////////////////////////
 
        // Machine Identifier
-#define MID hyper
+#define MID HYPER_T
 
 
         // Object Exporter Identifier
-#define OXID hyper
+#define OXID HYPER_T
        
         // Object Identifer
-#define OID hyper
+#define OID HYPER_T
        
        // Ping Set Identifier
-#define SETID hyper
+#define SETID HYPER_T
 
        // Interface Pointer Identifier
 #define IPID GUID
@@ -186,7 +181,7 @@ interface ObjectRpcBaseTypes
        const uint32 SORF_NULL = 0x0; // convenient for initializing SORF
        const uint32 SORF_NOPING = 0x1000;// Pinging is not required 
        // standard object reference
-       typedef struct 
+       typedef [public] struct 
        {
                uint32 flags; // STDOBJREF flags (see above)
                uint32 cPublicRefs; // count of references passed
@@ -241,6 +236,26 @@ interface ObjectRpcBaseTypes
        } MInterfacePointer;
 
 }
+
+[
+       object,
+       uuid(00000000-0000-0000-C000-000000000046)
+]
+interface IUnknown
+{
+       /*****************/
+       /* Function 0x00 */
+       HRESULT QueryInterface();
+
+       /*****************/
+       /* Function 0x01 */
+       uint32 AddRef();
+
+       /*****************/
+       /* Function 0x02 */
+       uint32 Release();
+}
+
 //////////////////////////////////////////////////////////////////
 
 // The remote version of Iunknown. This interface exists on every
@@ -252,9 +267,10 @@ interface ObjectRpcBaseTypes
 //
 [
        uuid(00000131-0000-0000-C000-000000000046),
+       object,
        version(0.0)
 ]
-interface IRemUnknown // : IUnknown
+interface IRemUnknown : IUnknown
 {
        typedef struct 
        {
@@ -262,7 +278,7 @@ interface IRemUnknown // : IUnknown
                STDOBJREF std; // data for returned interface
        }
        REMQIRESULT;
-       
+
        HRESULT RemQueryInterface (
                 [in] IPID *ripid, // interface to QI on
                 [in] uint32 cRefs, // count of AddRefs requested
@@ -291,15 +307,18 @@ interface IRemUnknown // : IUnknown
                );
 }
 
+
+
 // Derived from IRemUnknown, this interface supports Remote Query interface
 // for objects that supply additional data beyond the STDOBJREF in their
 // marshaled interface packets.
 [
+object,
 uuid(00000143-0000-0000-C000-000000000046),
 version(0.0)
 ]
 
-interface IRemUnknown2 //: IRemUnknown
+interface IRemUnknown2 : IRemUnknown
 {
        HRESULT RemQueryInterface2 (
                 [in] IPID *ripid,
@@ -308,7 +327,6 @@ interface IRemUnknown2 //: IRemUnknown
                 [out, size_is(cIids)] HRESULT *phr
                 //FIXME [out, size_is(cIids)] MInterfacePointer **ppMIF
                );
-
 }
 
 [ uuid(99fcfec4-5260-101b-bbcb-00aa0021347a),
@@ -339,7 +357,7 @@ interface IOXIDResolver
        // Returns S_TRUE if the SetId is known by the object exporter,
        // S_FALSE if not.
        [idempotent] WERROR SimplePing (
-                [in] policy_handle hRpc,
+                [in,ref] policy_handle *hRpc,
                 [in] SETID *pSetId // Must not be zero
                );
        
@@ -364,13 +382,13 @@ interface IOXIDResolver
        // can be used to validate the binding
        // from the client.
        [idempotent] WERROR ServerAlive (
-                                                                        [in] policy_handle hRpc
+                                                                        [in,ref] policy_handle *hRpc
                                                                        );
        // Method to get the protocol sequences, string bindings,
        // RemoteUnknown IPID and COM version for an object server
        // given its OXID. Supported by DCOM
        // version 5.2 and above.
-       [idempotent] error_status_t ResolveOxid2 (
+       [idempotent] WERROR ResolveOxid2 (
                                                                                          [in] policy_handle hRpc,
                                                                                          [in] OXID *pOxid,
                                                                                          [in] uint16 cRequestedProtseqs,
@@ -452,13 +470,10 @@ interface ISystemActivator
        /* Function 0x03 */
        NTSTATUS isa_Unknown3();
 
-
        // Binding strings and the OBJREF_SIGNATURE in this call
        /*****************/
        /* Function 0x04 */
        NTSTATUS isa_Unknown4();
-
-
 }
 
 [
index d7163839d508a826b7a7121442ccfe0d99a2c9fe..7fed02f5b13d06935e05bbe233d3ca12da1f324b 100644 (file)
@@ -4,7 +4,6 @@
   miscellaneous IDL structures
 */
 
-[] 
 interface misc
 {
        /* a NULL sid */
index a208ee89a3c11845bd9b141a0bea064f6dbcdcbe..157634ef766560207c60dacb1d7f518f49e2e16e 100644 (file)
@@ -4,7 +4,6 @@
   schannel structures
 */
 
-[] 
 interface schannel
 {
        /*
index 5d4ade096f0a084c4a7a605ca767593318d3c9a5..bf72e0ad8be3344d64adf9b3d1a908364f31b651 100644 (file)
@@ -206,6 +206,21 @@ NTSTATUS ndr_pull_array_uint32(struct ndr_pull *ndr, int ndr_flags, uint32_t *da
        return NT_STATUS_OK;
 }
 
+/*
+  pull a const array of HYPER_T
+*/
+NTSTATUS ndr_pull_array_HYPER_T(struct ndr_pull *ndr, int ndr_flags, HYPER_T *data, uint32_t n)
+{
+       uint32_t i;
+       if (!(ndr_flags & NDR_SCALARS)) {
+               return NT_STATUS_OK;
+       }
+       for (i=0;i<n;i++) {
+               NDR_CHECK(ndr_pull_HYPER_T(ndr, &data[i]));
+       }
+       return NT_STATUS_OK;
+}
+
 /*
   push a uint8
 */
@@ -346,6 +361,21 @@ NTSTATUS ndr_push_array_uint32(struct ndr_push *ndr, int ndr_flags, const uint32
        return NT_STATUS_OK;
 }
 
+/*
+  push an array of HYPER_T
+*/
+NTSTATUS ndr_push_array_HYPER_T(struct ndr_push *ndr, int ndr_flags, const HYPER_T *data, uint32_t n)
+{
+       int i;
+       if (!(ndr_flags & NDR_SCALARS)) {
+               return NT_STATUS_OK;
+       }
+       for (i=0;i<n;i++) {
+               NDR_CHECK(ndr_push_HYPER_T(ndr, data[i]));
+       }
+       return NT_STATUS_OK;
+}
+
 /*
   save the current position
  */
@@ -798,6 +828,24 @@ void ndr_print_bad_level(struct ndr_print *ndr, const char *name, uint16_t level
        ndr->print(ndr, "UNKNOWN LEVEL %u", level);
 }
 
+void ndr_print_array_HYPER_T(struct ndr_print *ndr, const char *name, 
+                           const HYPER_T *data, uint32_t count)
+{
+       int i;
+
+       ndr->print(ndr, "%s: ARRAY(%d)", name, count);
+       ndr->depth++;
+       for (i=0;i<count;i++) {
+               char *idx=NULL;
+               asprintf(&idx, "[%d]", i);
+               if (idx) {
+                       ndr_print_HYPER_T(ndr, idx, data[i]);
+                       free(idx);
+               }
+       }
+       ndr->depth--;   
+}
+
 void ndr_print_array_uint32(struct ndr_print *ndr, const char *name, 
                            const uint32_t *data, uint32_t count)
 {
index c520ef755ba9dcd6a8591a2abba626f61b886a3a..157b06b3b87323c0c2ef06ad2a069f5798cf93f0 100644 (file)
@@ -49,6 +49,7 @@ REQUIRED_SUBSYSTEMS = \
 ADD_OBJ_FILES = \
                torture/rpc/lsa.o \
                torture/rpc/echo.o \
+               torture/rpc/dcom.o \
                torture/rpc/dfs.o \
                torture/rpc/drsuapi.o \
                torture/rpc/spoolss.o \
diff --git a/source4/torture/rpc/dcom.c b/source4/torture/rpc/dcom.c
new file mode 100644 (file)
index 0000000..b42023e
--- /dev/null
@@ -0,0 +1,47 @@
+/* 
+   Unix SMB/CIFS implementation.
+   test suite for dcom rpc operations
+
+   Copyright (C) Jelmer Vernooij 2004
+   
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+
+BOOL torture_rpc_dcom(int dummy)
+{
+       NTSTATUS status;
+       struct dcerpc_pipe *p;
+       TALLOC_CTX *mem_ctx;
+       BOOL ret = True;
+
+       mem_ctx = talloc_init("torture_rpc_dcom");
+
+       status = torture_rpc_connection(&p, 
+                                                                       DCERPC_IOXIDRESOLVER_NAME,
+                                                                       DCERPC_IOXIDRESOLVER_UUID,
+                                                                       DCERPC_IOXIDRESOLVER_VERSION);
+       if (!NT_STATUS_IS_OK(status)) {
+               return False;
+       }
+
+       printf("\n");
+
+       talloc_destroy(mem_ctx);
+
+       torture_rpc_close(p);
+       return ret;
+}