r3689: Large number of COM updates:
[samba.git] / source4 / build / pidl / pidl.pl
index 30dcde929acd897ae13c8ceb5adbbf7eef3f0946..bb7f1f8ed61ef5c4b258d6169a518efc6ccf6bcf 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -w
 
 ###################################################
-# package to parse IDL files and generate code for 
+# package to parse IDL files and generate code for
 # rpc functions in Samba
 # Copyright tridge@samba.org 2000-2003
 # released under the GNU GPL
@@ -16,19 +16,26 @@ use File::Basename;
 use idl;
 use dump;
 use header;
+use server;
+use stub;
 use parser;
 use eparser;
 use validator;
 use util;
+use template;
+use swig;
 
 my($opt_help) = 0;
 my($opt_parse) = 0;
 my($opt_dump) = 0;
 my($opt_diff) = 0;
 my($opt_header) = 0;
+my($opt_template) = 0;
+my($opt_server) = 0;
 my($opt_parser) = 0;
 my($opt_eparser) = 0;
 my($opt_keep) = 0;
+my($opt_swig) = 0;
 my($opt_output);
 
 my $idl_parser = new idl;
@@ -61,7 +68,10 @@ sub ShowHelp()
              --dump                dump a pidl file back to idl
              --header              create a C header file
              --parser              create a C parser
+             --server              create server boilerplate
+             --template            print a template for a pipe
              --eparser             create an ethereal parser
+             --swig                create swig wrapper file
              --diff                run diff on the idl and dumped output
              --keep                keep the .pidl file
            \n";
@@ -75,10 +85,13 @@ GetOptions (
            'parse' => \$opt_parse,
            'dump' => \$opt_dump,
            'header' => \$opt_header,
+           'server' => \$opt_server,
+           'template' => \$opt_template,
            'parser' => \$opt_parser,
            'eparser' => \$opt_eparser,
            'diff' => \$opt_diff,
-           'keep' => \$opt_keep
+           'keep' => \$opt_keep,
+           'swig' => \$opt_swig
            );
 
 if ($opt_help) {
@@ -100,46 +113,80 @@ sub process_file($)
                $output = $opt_output . $basename;
        }
 
-       my($pidl_file) = util::ChangeExtension($output, "pidl");
+       my($pidl_file) = util::ChangeExtension($output, ".pidl");
 
        print "Compiling $idl_file\n";
 
        if ($opt_parse) {
                $pidl = IdlParse($idl_file);
-               defined $pidl || die "Failed to parse $idl_file";
+               defined @$pidl || die "Failed to parse $idl_file";
                IdlValidator::Validate($pidl);
                if ($opt_keep && !util::SaveStructure($pidl_file, $pidl)) {
                            die "Failed to save $pidl_file\n";
-               }               
+               }
        } else {
                $pidl = util::LoadStructure($pidl_file);
+               defined $pidl || die "Failed to load $pidl_file - maybe you need --parse\n";
        }
-       
+
        if ($opt_dump) {
                print IdlDump::Dump($pidl);
        }
-       
+
        if ($opt_header) {
-               my($header) = util::ChangeExtension($output, "h");
+               my($header) = util::ChangeExtension($output, ".h");
                util::FileSave($header, IdlHeader::Parse($pidl));
        }
-       
+
+       if ($opt_server) {
+               my($server) = util::ChangeExtension($output, "_s.c");
+               my $res = "";
+               foreach my $x (@{$pidl}) {
+                       next if ($x->{TYPE} ne "INTERFACE");
+
+                       if (util::has_property($x, "object")) {
+                               $res .= IdlStub::ParseInterface($x);
+                       } else {
+                               $res .= IdlServer::ParseInterface($x);
+                       }
+               }
+               util::FileSave($server, $res);
+       }
+
        if ($opt_parser) {
-               my($parser) = util::ChangeExtension($output, "c");
+               my($parser) = util::ChangeExtension($output, ".c");
                IdlParser::Parse($pidl, $parser);
        }
-       
+
        if ($opt_eparser) {
-               my($parser) = util::ChangeExtension($output, "c");
-               util::FileSave($parser, IdlEParser::Parse($pidl));
+               my($parser) = dirname($output) . "/packet-dcerpc-$basename.c";
+               IdlEParser::Parse($pidl, $parser);
+               $parser = dirname($output) . "/packet-dcerpc-proto-$basename.h";
+               IdlEParser::ParseHeader($pidl, $parser);
+               my($header) = dirname($output) . "/packet-dcerpc-proto.h";
+               open(OUT, ">>$header") || die "can't open $header";
+               print OUT "#include \"ndr_$basename.h\"\n";
+               print OUT "#include \"packet-dcerpc-proto-$basename.h\"\n";
+               close(OUT);
        }
-       
+
+       if ($opt_swig) {
+               my($filename) = $output;
+               $filename =~ s/\/ndr_/\//;
+               $filename = util::ChangeExtension($filename, ".i");
+               util::FileSave($filename, IdlSwig::Parse($pidl));
+       }
+
        if ($opt_diff) {
-               my($tempfile) = util::ChangeExtension($output, "tmp");
+               my($tempfile) = util::ChangeExtension($output, ".tmp");
                util::FileSave($tempfile, IdlDump::Dump($pidl));
                system("diff -wu $idl_file $tempfile");
                unlink($tempfile);
        }
+
+       if ($opt_template) {
+               print IdlTemplate::Parse($pidl);
+       }
 }