r26657: pidl: Add basics for generating Python modules.
[ira/wip.git] / source / pidl / pidl
index b04e2789028d72403f673023511d16e9ddd79ed5..4395df2020c25dc5961f8748e293b1a29c7541d8 100755 (executable)
@@ -17,7 +17,7 @@ pidl - An IDL compiler written in Perl
 
 pidl --help
 
-pidl [--outputdir[=OUTNAME]] [--includedir DIR...] [--parse-idl-tree] [--dump-idl-tree] [--dump-ndr-tree] [--header[=OUTPUT]] [--ejs[=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]] [<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]] [<idlfile>.idl]...
 
 =head1 DESCRIPTION
 
@@ -273,7 +273,7 @@ Datagram support (ncadg_*)
 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, represent_as, 
-transmit_as, import, include.
+transmit_as, import, include, cpp_quote.
 
 =head2 PIDL Specific properties
 
@@ -347,7 +347,7 @@ to the host format. Commonly used values are UCS2, DOS and UTF8.
 
 =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, 
@@ -468,6 +468,7 @@ my($opt_tdr_parser);
 my($opt_ws_parser);
 my($opt_swig);
 my($opt_ejs);
+my($opt_python);
 my($opt_quiet) = 0;
 my($opt_outputdir) = '.';
 my($opt_verbose) = 0;
@@ -504,6 +505,7 @@ Samba 4 output:
  --client[=OUTFILE]      create a C NDR client [ndr_BASENAME_c.c]
  --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
@@ -538,6 +540,7 @@ my $result = GetOptions (
            'client:s' => \$opt_client,
            'ws-parser:s' => \$opt_ws_parser,
            'ejs' => \$opt_ejs,
+               'python' => \$opt_python,
            'diff' => \$opt_diff,
            'swig:s' => \$opt_swig,
            'quiet' => \$opt_quiet,
@@ -601,12 +604,19 @@ sub process_file($)
        }
 
        if (defined($opt_ws_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_parser) or defined($opt_samba3_server) or 
-               defined($opt_swig) or defined($opt_samba3_ndr_client) or
-               defined($opt_samba3_ndr_server)) {
+           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;
                $ndr = Parse::Pidl::NDR::Parse($pidl);
        }
@@ -619,7 +629,7 @@ sub process_file($)
        my $gen_header = ($opt_header or "$outputdir/$basename.h");
        if (defined($opt_header)) {
                require Parse::Pidl::Samba4::Header;
-               FileSave($gen_header, Parse::Pidl::Samba4::Header::Parse($pidl));
+               FileSave($gen_header, Parse::Pidl::Samba4::Header::Parse($ndr));
        }
 
        my $h_filename = "$outputdir/ndr_$basename.h";
@@ -645,11 +655,20 @@ sub process_file($)
 
        if (defined($opt_ejs)) {
                require Parse::Pidl::Samba4::EJS;
-               my ($hdr,$prsr) = Parse::Pidl::Samba4::EJS::Parse($ndr, $h_filename);
+               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);
        }
 
+       if (defined($opt_python)) {
+               require Parse::Pidl::Samba4::Python;
+               my $generator = new Parse::Pidl::Samba4::Python(); 
+               my ($hdr,$prsr) = $generator->Parse($basename, $ndr, $h_filename);
+               FileSave("$outputdir/py_$basename.c", $prsr);
+               FileSave("$outputdir/py_$basename.h", $hdr);
+       }
+
        if (defined($opt_server)) {
                require Parse::Pidl::Samba4::NDR::Server;
 
@@ -659,8 +678,8 @@ sub process_file($)
        if (defined($opt_ndr_parser)) {
                my $parser_fname = ($opt_ndr_parser or "$outputdir/ndr_$basename.c");
                require Parse::Pidl::Samba4::NDR::Parser;
-               my ($header,$parser) = Parse::Pidl::Samba4::NDR::Parser::Parse($ndr, $gen_header, $h_filename);
-
+               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);
@@ -675,7 +694,8 @@ sub process_file($)
          my $cnffile = $idl_file;
          $cnffile =~ s/\.idl$/\.cnf/;
 
-         my ($dp, $dh) = Parse::Pidl::Wireshark::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);
        }
@@ -685,7 +705,8 @@ sub process_file($)
                my $tdr_header = $tdr_parser;
                $tdr_header =~ s/\.c$/\.h/;
                require Parse::Pidl::Samba4::TDR;
-               my ($hdr,$prsr) = Parse::Pidl::Samba4::TDR::Parser($pidl, $tdr_header, $gen_header);
+               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);
        }
@@ -699,7 +720,8 @@ sub process_file($)
                my $client = ($opt_samba3_ndr_client or "$outputdir/cli_$basename.c");
                my $header = $client; $header =~ s/\.c$/\.h/;
                require Parse::Pidl::Samba3::ClientNDR;
-               my ($c_code,$h_code) = Parse::Pidl::Samba3::ClientNDR::Parse($ndr, $header, $h_filename);
+               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);
        }