Install pidl by default if ExtUtils::MakeMaker is available. This should make the...
[samba.git] / source4 / pidl / pidl
index f0513546e90ae2c694ddd0ef1ad06efaddf90f6a..b7a22f04997b307dc0ea1b523215f25af3daaaeb 100755 (executable)
@@ -4,18 +4,20 @@
 # package to parse IDL files and generate code for
 # rpc functions in Samba
 # Copyright tridge@samba.org 2000-2003
-# Copyright jelmer@samba.org 2005
+# Copyright jelmer@samba.org 2005-2007
 # released under the GNU GPL
 
 =pod
+
 =head1 NAME
 
-pidl - IDL Compiler written in Perl
+pidl - An IDL compiler written in Perl
 
 =head1 SYNOPSIS
 
 pidl --help
-pidl [--outputdir[=OUTNAME]] [--parse-idl-tree] [--dump-idl-tree] [--dump-ndr-tree] [--ndr-header[=OUTPUT]] [--header[=OUTPUT]] [--ejs[=OUTPUT]] [--swig[=OUTPUT]] [--uint-enums] [--ndr-parser[=OUTPUT]] [--client] [--server] [--dcom-proxy] [--com-header] [--warn-compat] [--quiet] [--verbose] [--template] [--eth-parser[=OUTPUT]] [--diff] [--dump-idl] [--tdr-header=[OUTPUT]] [--tdr-parser[=OUTPUT]] [--samba3-header[=OUTPUT]] [--samba3-parser=[OUTPUT]] [--samba3-server=[OUTPUT]] [--samba3-template[=OUTPUT]] [--samba3-client[=OUTPUT]] [<idlfile>.idl]...
+
+pidl [--outputdir[=OUTNAME]] [--includedir DIR...] [--parse-idl-tree] [--dump-idl-tree] [--dump-ndr-tree] [--header[=OUTPUT]] [--ejs[=OUTPUT]] [--python[=OUTPUT]] [--swig[=OUTPUT]] [--ndr-parser[=OUTPUT]] [--client] [--server] [--warn-compat] [--quiet] [--verbose] [--template] [--ws-parser[=OUTPUT]] [--diff] [--dump-idl] [--tdr-parser[=OUTPUT]] [--samba3-ndr-client[=OUTPUT]] [--samba3-ndr-server[=OUTPUT]] [--typelib=[OUTPUT]] [<idlfile>.idl]...
 
 =head1 DESCRIPTION
 
@@ -24,13 +26,13 @@ compatible with the midl compiler. IDL is short for
 "Interface Definition Language".
 
 pidl can generate stubs for DCE/RPC server code, DCE/RPC 
-client code and ethereal dissectors for DCE/RPC traffic.
+client code and Wireshark dissectors for DCE/RPC traffic.
 
 IDL compilers like pidl take a description 
 of an interface as their input and use it to generate C 
 (though support for other languages may be added later) code that 
 can use these interfaces, pretty print data sent 
-using these interfaces, or even generate ethereal 
+using these interfaces, or even generate Wireshark 
 dissectors that can parse data sent over the 
 wire by these interfaces. 
 
@@ -50,16 +52,25 @@ both marshalling/unmarshalling and debugging purposes).
 =item I<--help>
 
 Show list of available options.
+
+=item I<--version>
+
+Show pidl version
                
 =item I<--outputdir OUTNAME>
 
 Write output files to the specified directory.  Defaults to the current 
 directory.
+
+=item I<--includedir DIR>
+
+Add DIR to the search path used by the preprocessor. This option can be 
+specified multiple times.
                
 =item I<--parse-idl-tree>
 
 Read internal tree structure from input files rather 
-then assuming they contain IDL.
+than assuming they contain IDL.
 
 =item I<--dump-idl>
 
@@ -69,13 +80,21 @@ Generate a new IDL file. File will be named OUTNAME.idl.
 
 Generate a C header file for the specified interface. Filename defaults to OUTNAME.h.
 
-=item I<--ndr-header>
+=item I<--ndr-parser>
 
-Generate a C header file with the prototypes for the NDR parsers. Filename defaults to ndr_OUTNAME.h.
+Generate a C file and C header containing NDR parsers. The filename for 
+the parser defaults to ndr_OUTNAME.c. The header filename will be the 
+parser filename with the extension changed from .c to .h.
 
-=item I<--ndr-parser>
+=item I<--tdr-parser>
+
+Generate a C file and C header containing TDR parsers. The filename for 
+the parser defaults to tdr_OUTNAME.c. The header filename will be the 
+parser filename with the extension changed from .c to .h.
+
+=item I<--typelib>
 
-Generate a C file containing NDR parsers. Filename defaults to ndr_OUTNAME.c.
+Write type information to the specified file.
 
 =item I<--server>
 
@@ -87,16 +106,16 @@ the interface. Filename defaults to ndr_OUTNAME_s.c.
 Generate stubs for a RPC server that implements the interface. Output will 
 be written to stdout.
 
-=item I<--eth-parser>
+=item I<--ws-parser>
 
-Generate an Ethereal dissector (in C) and header file. The dissector filename
+Generate an Wireshark dissector (in C) and header file. The dissector filename
 defaults to packet-dcerpc-OUTNAME.c while the header filename defaults to 
 packet-dcerpc-OUTNAME.h.
        
-Pidl will read additional data from an ethereal conformance file if present. 
+Pidl will read additional data from an Wireshark conformance file if present. 
 Such a file should have the same location as the IDL file but with the 
-extension I<cnf> rather then I<idl>. See below for details on the format of 
-this file.
+extension I<cnf> rather than I<idl>. See L<Parse::Pidl::Wireshark::Conformance>
+for details on the format of this file.
 
 =item I<--diff>
 
@@ -114,29 +133,17 @@ file the to disk. Useful for debugging pidl.
 Tell pidl to dump the internal NDR information tree it generated 
 from the IDL file to disk.  Useful for debugging pidl.
 
-=item I<--samba3-header>
+=item I<--samba3-ndr-client>
 
-Generate Samba3-style RPC header file. Filename defaults to rpc_BASENAME.h.
+Generate client calls for Samba3, to be placed in rpc_client/. Instead of 
+calling out to the code in Samba3's rpc_parse/, this will call out to 
+Samba4's NDR code instead.
 
-=item I<--samba3-parser>
+=item I<--samba3-ndr-server>
 
-Generate parser file for Samba3, to be placed in rpc_parse/. Filename defaults 
-to parse_BASENAME.c.
-
-=item I<--samba3-server>
-
-Generate server file for Samba3, to be placed in rpc_server/. Filename defaults 
-to srv_BASENAME.c.
-
-=item I<--samba3-template>
-
-Generate template for server-side implementation in Samba3, to be placed in 
-rpc_server/. Filename defaults to srv_BASENAME_nt.c
-
-=item I<--samba3-client>
-
-Generate client calls for Samba 3, to be placed in rpc_client/. Filename 
-defaults to cli_BASENAME.c.
+Generate server calls for Samba3, to be placed in rpc_server/. Instead of 
+calling out to the code in Samba3's rpc_parse/, this will call out to 
+Samba4's NDR code instead.
 
 =back
 
@@ -269,11 +276,12 @@ Datagram support (ncadg_*)
 
 =back
 
-=head2 Supported attributes
+=head2 Supported attributes and statements
 
 in, out, ref, length_is, switch_is, size_is, uuid, case, default, string, 
 unique, ptr, pointer_default, v1_enum, object, helpstring, range, local, 
-call_as, endpoint, switch_type, progid, coclass, iid_is.
+call_as, endpoint, switch_type, progid, coclass, iid_is, represent_as, 
+transmit_as, import, include, cpp_quote.
 
 =head2 PIDL Specific properties
 
@@ -319,6 +327,9 @@ Specifies that a size of I<length>
 bytes should be read, followed by a blob of that size, 
 which will be parsed as NDR.
 
+subcontext() is deprecated now, and should not be used in new code. 
+Instead, use represent_as() or transmit_as().
+
 =item flag
 
 Specify boolean options, mostly used for 
@@ -342,94 +353,38 @@ to the host format. Commonly used values are UCS2, DOS and UTF8.
 
 =back
 
-=head2 Unsupported MIDL properties
+=head2 Unsupported MIDL properties or statements
 
-aggregatable, appobject, async_uuid, bindable, control, cpp_quote, 
+aggregatable, appobject, async_uuid, bindable, control, 
 defaultbind, defaultcollelem, defaultvalue, defaultvtable, dispinterface, 
 displaybind, dual, entry, first_is, helpcontext, helpfile, helpstringcontext, 
 helpstringdll, hidden, idl_module, idl_quote, id, immediatebind, importlib, 
-import, include, includelib, last_is, lcid, licensed, max_is, module, 
+includelib, last_is, lcid, licensed, max_is, module, 
 ms_union, no_injected_text, nonbrowsable, noncreatable, nonextensible, odl, 
 oleautomation, optional, pragma, propget, propputref, propput, readonly, 
-requestedit, restricted, retval, source, transmit_as, uidefault, 
+requestedit, restricted, retval, source, uidefault, 
 usesgetlasterror, vararg, vi_progid, wire_marshal. 
 
-=head1 ETHEREAL CONFORMANCE FILES
-
-Pidl needs additional data for ethereal output. This data is read from 
-so-called conformance files. This section describes the format of these 
-files.
-
-Conformance files are simple text files with a single command on each line.
-Empty lines and lines starting with a '#' character are ignored.
-Arguments to commands are seperated by spaces.
-
-The following commands are currently supported:
-
-=over 4
-
-=item I<TYPE> name dissector ft_type base_type mask valsstring alignment
-
-Register new data type with specified name, what dissector function to call 
-and what properties to give header fields for elements of this type.
-
-=item I<NOEMIT> type
-
-Suppress emitting a dissect_type function for the specified type
-
-=item I<PARAM_VALUE> type param
-
-Set parameter to specify to dissector function for given type.
-
-=item I<HF_FIELD> hf title filter ft_type base_type valsstring mask description
-
-Generate a custom header field with specified properties.
-
-=item I<HF_RENAME> old_hf_name new_hf_name
-
-Force the use of new_hf_name when the parser generator was going to 
-use old_hf_name.
-
-This can be used in conjunction with HF_FIELD in order to make more then 
-one element use the same filter name.
-
-=item I<STRIP_PREFIX> prefix
-
-Remove the specified prefix from all function names (if present).
-       
-=item I<PROTOCOL> longname shortname filtername
-
-Change the short-, long- and filter-name for the current interface in
-Ethereal.
-
-=item I<FIELD_DESCRIPTION> field desc
-
-Change description for the specified header field. `field' is the hf name of the field.
-
-=item I<IMPORT> dissector code...
-
-Code to insert when generating the specified dissector. @HF@ and 
-@PARAM@ will be substituted.
-
-=back
-
 =head1 EXAMPLES
 
-       # Generating an ethereal parser
-       $ ./pidl --eth-parser -- atsvc.idl
+       # Generating an Wireshark parser
+       $ ./pidl --ws-parser -- atsvc.idl
        
-       # Generating a TDR parser
-       $ ./pidl --tdr-parser --tdr-header --header -- regf.idl
+       # Generating a TDR parser and header
+       $ ./pidl --tdr-parser --header -- regf.idl
 
-=head1 VERSION
+       # Generating a Samba3 client and server
+       $ ./pidl --samba3-ndr-client --samba3-ndr-server -- dfs.idl
 
-This man page is correct for version 4.0 of the Samba suite. L<http://www.samba.org/>.
+       # Generating a Samba4 NDR parser, client and server
+       $ ./pidl --ndr-parser --ndr-client --ndr-server -- samr.idl
 
 =head1 SEE ALSO
 
 L<http://msdn.microsoft.com/library/en-us/rpc/rpc/field_attributes.asp>,
-L<http://wiki.ethereal.com/DCE/RPC>, 
-yapp(1)
+L<http://wiki.wireshark.org/DCE/RPC>, 
+L<http://www.samba.org/>,
+L<yapp(1)>
 
 =head1 LICENSE
 
@@ -438,7 +393,7 @@ pidl is licensed under the GNU General Public License L<http://www.gnu.org/licen
 =head1 AUTHOR
 
 pidl was written by Andrew Tridgell, Stefan Metzmacher, Tim Potter and Jelmer 
-Vernooij. 
+Vernooij. The current maintainer is Jelmer Vernooij.
 
 This manpage was written by Jelmer Vernooij, partially based on the original 
 pidl README by Andrew Tridgell. 
@@ -447,14 +402,13 @@ pidl README by Andrew Tridgell.
 
 
 use strict;
-use FindBin qw($RealBin);
-use lib "$RealBin";
+use FindBin qw($RealBin $Script);
 use lib "$RealBin/lib";
+use lib "$RealBin/../share/perl5";
 use Getopt::Long;
 use File::Basename;
-use Parse::Pidl;
+use Parse::Pidl qw ( $VERSION );
 use Parse::Pidl::Util;
-use Parse::Pidl::ODL;
 
 #####################################################################
 # save a data structure into a file
@@ -501,31 +455,30 @@ sub FileSave($$)
     close(FILE);
 }
 
+my(@opt_incdirs) = (); 
 my($opt_help) = 0;
+my($opt_version) = 0;
 my($opt_parse_idl_tree) = 0;
 my($opt_dump_idl_tree);
 my($opt_dump_ndr_tree);
 my($opt_dump_idl) = 0;
-my($opt_uint_enums) = 0;
 my($opt_diff) = 0;
 my($opt_header);
-my($opt_ndr_header);
 my($opt_samba3_header);
 my($opt_samba3_parser);
 my($opt_samba3_server);
-my($opt_samba3_template);
-my($opt_samba3_client);
+my($opt_samba3_ndr_client);
+my($opt_samba3_ndr_server);
 my($opt_template) = 0;
 my($opt_client);
+my($opt_typelib);
 my($opt_server);
 my($opt_ndr_parser);
-my($opt_tdr_header);
 my($opt_tdr_parser);
-my($opt_eth_parser);
+my($opt_ws_parser);
 my($opt_swig);
-my($opt_dcom_proxy);
-my($opt_com_header);
 my($opt_ejs);
+my($opt_python);
 my($opt_quiet) = 0;
 my($opt_outputdir) = '.';
 my($opt_verbose) = 0;
@@ -535,17 +488,22 @@ my($opt_warn_compat) = 0;
 # display help text
 sub ShowHelp()
 {
-print "perl IDL parser and code generator
-Copyright (C) tridge\@samba.org
+print "perl IDL parser and code generator\n";
+ShowVersion();
+print"
+Copyright (C) Andrew Tridgell <tridge\@samba.org>
+Copyright (C) Jelmer Vernooij <jelmer\@samba.org>
 
-Usage: pidl [options] [--] <idlfile> [<idlfile>...]
+Usage: $Script [options] [--] <idlfile> [<idlfile>...]
 
 Generic Options:
  --help                  this help page
+ --version               show pidl version
  --outputdir=OUTDIR      put output in OUTDIR/ [.]
  --warn-compat           warn about incompatibility with other compilers
  --quiet                 be quiet
  --verbose               be verbose
+ --includedir DIR        search DIR for included files
 
 Debugging:
  --dump-idl-tree[=FILE]  dump internal representation to file [BASENAME.pidl]
@@ -553,66 +511,65 @@ Debugging:
  --dump-ndr-tree[=FILE]  dump internal NDR data tree to file [BASENAME.ndr]
  --dump-idl              regenerate IDL file
  --diff                  run diff on original IDL and dumped output
+ --typelib               print type information
 
 Samba 4 output:
  --header[=OUTFILE]      create generic header file [BASENAME.h]
- --uint-enums            don't use C enums, instead use uint* types
- --ndr-header[=OUTFILE]  create a C NDR-specific header file [ndr_BASENAME.h]
  --ndr-parser[=OUTFILE]  create a C NDR parser [ndr_BASENAME.c]
  --client[=OUTFILE]      create a C NDR client [ndr_BASENAME_c.c]
- --tdr-header[=OUTFILE]  create a C TDR header file [tdr_BASENAME.h]
  --tdr-parser[=OUTFILE]  create a C TDR parser [tdr_BASENAME.c]
  --ejs[=OUTFILE]         create ejs wrapper file [BASENAME_ejs.c]
+ --python[=OUTFILE]      create python wrapper file [py_BASENAME.c]
  --swig[=OUTFILE]        create swig wrapper file [BASENAME.i]
  --server[=OUTFILE]      create server boilerplate [ndr_BASENAME_s.c]
  --template              print a template for a pipe
- --dcom-proxy[=OUTFILE]  create DCOM proxy [ndr_BASENAME_p.c]
- --com-header[=OUTFILE]  create header for COM [com_BASENAME.h]
 
 Samba 3 output:
- --samba3-header[=OUTF]  create Samba3-style header [rpc_BASENAME.h]
- --samba3-parser[=OUTF]  create parser for Samba3 [parse_BASENAME.c]
- --samba3-template[=OUTF]create template implementation [srv_BASENAME_nt.c]
- --samba3-server[=OUTF]  create server side wrappers for Samba3 [srv_BASENAME.c]
- --samba3-client[=OUTF]  create client calls for Samba3 [cli_BASENAME.c]
-
-Ethereal parsers:
- --eth-parser[=OUTFILE]  create ethereal parser and header
+ --samba3-ndr-client[=OUTF] create client calls for Samba3 
+                            using Samba4's NDR code [cli_BASENAME.c]
+ --samba3-ndr-server[=OUTF] create server call wrapper for Samba3 
+                            using Samba4's NDR code [srv_BASENAME.c]
+
+Wireshark parsers:
+ --ws-parser[=OUTFILE]  create Wireshark parser and header
 \n";
     exit(0);
 }
 
+#########################################
+# Display version
+sub ShowVersion()
+{
+    print "perl IDL version $VERSION\n";
+}
+
 # main program
 my $result = GetOptions (
            'help|h|?' => \$opt_help, 
+            'version' => \$opt_version,
            'outputdir=s' => \$opt_outputdir,
            'dump-idl' => \$opt_dump_idl,
                'dump-idl-tree:s' => \$opt_dump_idl_tree,
                'parse-idl-tree' => \$opt_parse_idl_tree,
                'dump-ndr-tree:s' => \$opt_dump_ndr_tree,
-           'uint-enums' => \$opt_uint_enums,
-           'ndr-header:s' => \$opt_ndr_header,
-               'samba3-header:s' => \$opt_samba3_header,
-               'samba3-parser:s' => \$opt_samba3_parser,
-               'samba3-server:s' => \$opt_samba3_server,
-               'samba3-template:s' => \$opt_samba3_template,
-               'samba3-client:s' => \$opt_samba3_client,
+               'samba3-ndr-client:s' => \$opt_samba3_ndr_client,
+               'samba3-ndr-server:s' => \$opt_samba3_ndr_server,
                'header:s' => \$opt_header,
            'server:s' => \$opt_server,
-           'tdr-header:s' => \$opt_tdr_header,
+               'typelib:s' => \$opt_typelib,
            'tdr-parser:s' => \$opt_tdr_parser,
            'template' => \$opt_template,
            'ndr-parser:s' => \$opt_ndr_parser,
            'client:s' => \$opt_client,
-           'eth-parser:s' => \$opt_eth_parser,
+           'ws-parser:s' => \$opt_ws_parser,
            'ejs' => \$opt_ejs,
+               'python' => \$opt_python,
            'diff' => \$opt_diff,
            'swig:s' => \$opt_swig,
-           'dcom-proxy:s' => \$opt_dcom_proxy,
-           'com-header:s' => \$opt_com_header,
            'quiet' => \$opt_quiet,
                'verbose' => \$opt_verbose,
-           'warn-compat' => \$opt_warn_compat
+           'warn-compat' => \$opt_warn_compat,
+               'includedir=s@' => \@opt_incdirs
            );
 
 if (not $result) {
@@ -624,6 +581,11 @@ if ($opt_help) {
     exit(0);
 }
 
+if ($opt_version) {
+    ShowVersion();
+    exit(0);
+}
+
 sub process_file($)
 {
        my $idl_file = shift;
@@ -640,9 +602,8 @@ sub process_file($)
                defined $pidl || die "Failed to load $idl_file";
        } else {
                require Parse::Pidl::IDL;
-               my $idl_parser = new Parse::Pidl::IDL;
 
-               $pidl = $idl_parser->parse_idl($idl_file);
+               $pidl = Parse::Pidl::IDL::parse_file($idl_file, \@opt_incdirs);
                defined @$pidl || die "Failed to parse $idl_file";
                require Parse::Pidl::Typelist;
                Parse::Pidl::Typelist::LoadIdl($pidl);
@@ -653,10 +614,6 @@ sub process_file($)
                SaveStructure($pidl_file, $pidl) or die "Failed to save $pidl_file\n";
        }
 
-       if ($opt_uint_enums) {
-               Parse::Pidl::Util::setUseUintEnums(1);
-       }
-
        if ($opt_dump_idl) {
                require Parse::Pidl::Dump;
                print Parse::Pidl::Dump($pidl);
@@ -669,45 +626,26 @@ sub process_file($)
                unlink($tempfile);
        }
 
-       if (defined($opt_com_header)) {
-               require Parse::Pidl::Samba::COM::Header;
-               my $res = Parse::Pidl::Samba::COM::Header::Parse($pidl);
-               if ($res) {
-                       my $comh_filename = ($opt_com_header or "$outputdir/com_$basename.h");
-                       FileSave($comh_filename, 
-                       "#include \"librpc/gen_ndr/ndr_orpc.h\"\n" . 
-                       "#include \"$outputdir/ndr_$basename.h\"\n" . 
-                       $res);
-               }
-       }
-
-       if (defined($opt_dcom_proxy)) {
-               require Parse::Pidl::Samba::COM::Proxy;
-               my $res = Parse::Pidl::Samba::COM::Proxy::Parse($pidl);
-               if ($res) {
-                       my ($client) = ($opt_dcom_proxy or "$outputdir/$basename\_p.c");
-                       FileSave($client, 
-                       "#include \"includes.h\"\n" .
-                       "#include \"$outputdir/com_$basename.h\"\n" . 
-                       "#include \"lib/com/dcom/dcom.h\"\n" .$res);
-               }
-       }
-
        if ($opt_warn_compat) {
                require Parse::Pidl::Compat;
                Parse::Pidl::Compat::Check($pidl);
        }
 
-       $pidl = Parse::Pidl::ODL::ODL2IDL($pidl);
-
-       if (defined($opt_ndr_header) or defined($opt_eth_parser) or 
-           defined($opt_client) or defined($opt_server) or 
-           defined($opt_ndr_parser) or defined($opt_ejs) or 
-               defined($opt_dump_ndr_tree) or defined($opt_samba3_header) or 
-           defined($opt_samba3_header) or defined($opt_samba3_server) or 
-               defined($opt_samba3_template) or defined($opt_samba3_client)) {
+       if (defined($opt_ws_parser) or 
+           defined($opt_client) or
+           defined($opt_server) or 
+           defined($opt_header) or
+           defined($opt_ndr_parser) or
+           defined($opt_ejs) or 
+           defined($opt_python) or 
+           defined($opt_dump_ndr_tree) or
+           defined($opt_samba3_header) or 
+           defined($opt_samba3_parser) or 
+           defined($opt_samba3_server) or 
+           defined($opt_swig) or
+           defined($opt_samba3_ndr_client) or
+           defined($opt_samba3_ndr_server)) {
                require Parse::Pidl::NDR;
-               Parse::Pidl::NDR::Validate($pidl);
                $ndr = Parse::Pidl::NDR::Parse($pidl);
        }
 
@@ -716,137 +654,126 @@ sub process_file($)
                SaveStructure($ndr_file, $ndr) or die "Failed to save $ndr_file\n";
        }
 
+       my $gen_header = ($opt_header or "$outputdir/$basename.h");
        if (defined($opt_header)) {
-               my $header = ($opt_header or "$outputdir/$basename.h");
-               require Parse::Pidl::Samba::Header;
-               FileSave($header, Parse::Pidl::Samba::Header::Parse($pidl));
-       }
-
-       if (defined($opt_ndr_header)) {
-               my $header = ($opt_ndr_header or "$outputdir/ndr_$basename.h");
-               require Parse::Pidl::Samba::NDR::Header;
-               FileSave($header, Parse::Pidl::Samba::NDR::Header::Parse($pidl, $basename));
-               if (defined($opt_swig)) {
-                 require Parse::Pidl::Samba::SWIG;
-                 my($filename) = ($opt_swig or "$outputdir/$basename.i");
-                 Parse::Pidl::Samba::SWIG::RewriteHeader($pidl, $header, $filename);
-               }
+               require Parse::Pidl::Samba4::Header;
+               FileSave($gen_header, Parse::Pidl::Samba4::Header::Parse($ndr));
        }
 
        my $h_filename = "$outputdir/ndr_$basename.h";
        if (defined($opt_client)) {
-               require Parse::Pidl::Samba::NDR::Client;
-               my ($client) = ($opt_client or "$outputdir/ndr_$basename\_c.c");
+               require Parse::Pidl::Samba4::NDR::Client;
+               my ($c_client) = ($opt_client or "$outputdir/ndr_$basename\_c.c");
+               my ($c_header) = $c_client;
+               $c_header =~ s/\.c$/.h/;
+
+               my ($srcd,$hdrd) = Parse::Pidl::Samba4::NDR::Client::Parse(
+                       $ndr,$gen_header,$h_filename,$c_header);
 
-               FileSave($client, Parse::Pidl::Samba::NDR::Client::Parse($ndr,$h_filename));
+               FileSave($c_client, $srcd);
+               FileSave($c_header, $hdrd);
+       }
+
+       if (defined($opt_swig)) {
+                 require Parse::Pidl::Samba4::SWIG;
+                 my($filename) = ($opt_swig or "$outputdir/$basename.i");
+                 my $code = Parse::Pidl::Samba4::SWIG::Parse($ndr, $basename, "$outputdir/ndr_$basename\_c.h", $gen_header);
+                 FileSave($filename, $code);
        }
 
        if (defined($opt_ejs)) {
-               require Parse::Pidl::Samba::EJS;
-               require Parse::Pidl::Samba::EJSHeader;
-               FileSave("$outputdir/ndr_$basename\_ejs.c", Parse::Pidl::Samba::EJS::Parse($ndr, $h_filename));
+               require Parse::Pidl::Samba4::EJS;
+               my $generator = new Parse::Pidl::Samba4::EJS(); 
+               my ($hdr,$prsr) = $generator->Parse($ndr, $h_filename);
+               FileSave("$outputdir/ndr_$basename\_ejs.c", $prsr);
+               FileSave("$outputdir/ndr_$basename\_ejs.h", $hdr);
+       }
 
-               FileSave("$outputdir/ndr_$basename\_ejs.h", Parse::Pidl::Samba::EJSHeader::Parse($ndr));
+       if (defined($opt_python)) {
+               require Parse::Pidl::Samba4::Python;
+               my $generator = new Parse::Pidl::Samba4::Python(); 
+               my ($hdr,$prsr) = $generator->Parse($basename, $ndr, 
+                                       "$outputdir/ndr_$basename\_c.h", $h_filename);
+               FileSave("$outputdir/py_$basename.c", $prsr);
+               FileSave("$outputdir/py_$basename.h", $hdr);
        }
 
        if (defined($opt_server)) {
-               require Parse::Pidl::Samba::NDR::Server;
-               my $dcom = "";
-
-               foreach my $x (@{$pidl}) {
-                       next if ($x->{TYPE} ne "INTERFACE");
-
-                       if (Parse::Pidl::Util::has_property($x, "object")) {
-                               require Parse::Pidl::Samba::COM::Stub;
-                               $dcom .= Parse::Pidl::Samba::COM::Stub::ParseInterface($x);
-                       }
-               }
-
-               FileSave(($opt_server or "$outputdir/ndr_$basename\_s.c"), Parse::Pidl::Samba::NDR::Server::Parse($ndr,$h_filename));
-
-               if ($dcom ne "") {
-                       $dcom = "
-#include \"includes.h\"
-#include \"$h_filename\"
-#include \"rpc_server/dcerpc_server.h\"
-#include \"rpc_server/common/common.h\"
-
-$dcom
-";
-       FileSave("$outputdir/$basename\_d.c", $dcom);
-               }
+               require Parse::Pidl::Samba4::NDR::Server;
+
+               FileSave(($opt_server or "$outputdir/ndr_$basename\_s.c"), Parse::Pidl::Samba4::NDR::Server::Parse($ndr,$h_filename));
        }
 
        if (defined($opt_ndr_parser)) {
-               my $parser = ($opt_ndr_parser or "$outputdir/ndr_$basename.c");
-               require Parse::Pidl::Samba::NDR::Parser;
-               FileSave($parser, Parse::Pidl::Samba::NDR::Parser::Parse($ndr, $parser));
+               my $parser_fname = ($opt_ndr_parser or "$outputdir/ndr_$basename.c");
+               require Parse::Pidl::Samba4::NDR::Parser;
+               my $generator = new Parse::Pidl::Samba4::NDR::Parser();
+               my ($header,$parser) = $generator->Parse($ndr, $gen_header, $h_filename);
+
+               FileSave($parser_fname, $parser);
+               FileSave($h_filename, $header);
+
        }
 
-       if (defined($opt_eth_parser)) {
-         require Parse::Pidl::Ethereal::NDR;
-         my($eparser) = ($opt_eth_parser or "$outputdir/packet-dcerpc-$basename.c");
+       if (defined($opt_ws_parser)) {
+         require Parse::Pidl::Wireshark::NDR;
+         my($eparser) = ($opt_ws_parser or "$outputdir/packet-dcerpc-$basename.c");
          my $eheader = $eparser;
          $eheader =~ s/\.c$/\.h/;
          my $cnffile = $idl_file;
          $cnffile =~ s/\.idl$/\.cnf/;
 
-         my ($dp, $dh) = Parse::Pidl::Ethereal::NDR::Parse($ndr, $idl_file, $eheader, $cnffile);
+         my $generator = new Parse::Pidl::Wireshark::NDR();
+         my ($dp, $dh) = $generator->Parse($ndr, $idl_file, $eheader, $cnffile);
          FileSave($eparser, $dp) if defined($dp);
          FileSave($eheader, $dh) if defined($dh);
        }
 
-       my $tdr_parser = ($opt_tdr_parser or "$outputdir/tdr_$basename.c");
-       my $tdr_header = ($opt_tdr_header or "$outputdir/tdr_$basename.h");
        if (defined($opt_tdr_parser)) {
-               require Parse::Pidl::Samba::TDR;
-               FileSave($tdr_parser, Parse::Pidl::Samba::TDR::Parser($pidl, $tdr_header));
+               my $tdr_parser = ($opt_tdr_parser or "$outputdir/tdr_$basename.c");
+               my $tdr_header = $tdr_parser;
+               $tdr_header =~ s/\.c$/\.h/;
+               require Parse::Pidl::Samba4::TDR;
+               my $generator = new Parse::Pidl::Samba4::TDR();
+               my ($hdr,$prsr) = $generator->Parser($pidl, $tdr_header, $gen_header);
+               FileSave($tdr_parser, $prsr);
+               FileSave($tdr_header, $hdr);
        }
 
-       if (defined($opt_tdr_header)) {
-               require Parse::Pidl::Samba::TDR;
-               FileSave($tdr_header, Parse::Pidl::Samba::TDR::Header($pidl, $outputdir,$basename));
+       if (defined($opt_typelib)) {
+               my $typelib = ($opt_typelib or "$outputdir/$basename.tlb");
+               require Parse::Pidl::Typelist;
+               FileSave($typelib, Parse::Pidl::Typelist::GenerateTypeLib());
        }
 
        if ($opt_template) {
-               require Parse::Pidl::Samba::Template;
-               print Parse::Pidl::Samba::Template::Parse($pidl);
-       }
-
-       if (defined($opt_samba3_header)) {
-               my $header = ($opt_samba3_header or "$outputdir/rpc_$basename.h");
-               require Parse::Pidl::Samba3::Header;
-               FileSave($header, Parse::Pidl::Samba3::Header::Parse($ndr, $basename));
-       }
-
-       if (defined($opt_samba3_parser)) {
-               my $header = ($opt_samba3_parser or "$outputdir/parse_$basename.c");
-               require Parse::Pidl::Samba3::Parser;
-               FileSave($header, Parse::Pidl::Samba3::Parser::Parse($ndr, $basename));
-       }
-
-       if (defined($opt_samba3_server)) {
-               my $header = ($opt_samba3_server or "$outputdir/srv_$basename.c");
-               require Parse::Pidl::Samba3::Server;
-               FileSave($header, Parse::Pidl::Samba3::Server::Parse($ndr, $basename));
+               require Parse::Pidl::Samba4::Template;
+               print Parse::Pidl::Samba4::Template::Parse($pidl);
        }
 
-       if (defined($opt_samba3_template)) {
-               my $header = ($opt_samba3_template or "$outputdir/srv_$basename\_nt.c");
-               require Parse::Pidl::Samba3::Template;
-               FileSave($header, Parse::Pidl::Samba3::Template::Parse($ndr, $basename));
+       if (defined($opt_samba3_ndr_client)) {
+               my $client = ($opt_samba3_ndr_client or "$outputdir/cli_$basename.c");
+               my $header = $client; $header =~ s/\.c$/\.h/;
+               require Parse::Pidl::Samba3::ClientNDR;
+               my $generator = new Parse::Pidl::Samba3::ClientNDR();
+               my ($c_code,$h_code) = $generator->Parse($ndr, $header, $h_filename);
+               FileSave($client, $c_code);
+               FileSave($header, $h_code);
        }
 
-       if (defined($opt_samba3_client)) {
-               my $header = ($opt_samba3_client or "$outputdir/cli_$basename.c");
-               require Parse::Pidl::Samba3::Client;
-               FileSave($header, Parse::Pidl::Samba3::Client::Parse($ndr, $basename));
+       if (defined($opt_samba3_ndr_server)) {
+               my $server = ($opt_samba3_ndr_server or "$outputdir/srv_$basename.c");
+               my $header = $server; $header =~ s/\.c$/\.h/;
+               require Parse::Pidl::Samba3::ServerNDR;
+               my ($c_code,$h_code) = Parse::Pidl::Samba3::ServerNDR::Parse($ndr, $header, $h_filename);
+               FileSave($server, $c_code);
+               FileSave($header, $h_code);
        }
 
 }
 
 if (scalar(@ARGV) == 0) {
-       print "pidl: no input files\n";
+       print "$Script: no input files\n";
        exit(1);
 }