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_parser) = 0;
my($opt_eparser) = 0;
my($opt_keep) = 0;
+my($opt_swig) = 0;
my($opt_output);
my $idl_parser = new idl;
--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";
'parser' => \$opt_parser,
'eparser' => \$opt_eparser,
'diff' => \$opt_diff,
- 'keep' => \$opt_keep
+ 'keep' => \$opt_keep,
+ 'swig' => \$opt_swig
);
if ($opt_help) {
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";
if ($opt_server) {
my($server) = util::ChangeExtension($output, "_s.c");
- util::FileSave($server, IdlServer::Parse($pidl));
+ 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) {
if ($opt_eparser) {
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) {