#!/usr/bin/perl use strict; use warnings; use Getopt::Std; use Pod::Usage; use XML::SAX::Writer; use WAP::SAXDriver::wbxml; my %opts; getopts('bhp:v', \%opts); if ($opts{v}) { print "WAP::SAXDriver::wbxml $WAP::SAXDriver::wbxml::VERSION\n"; print "$0\n"; print "Perl $] on $^O\n"; exit; } pod2usage(-verbose => 1) if ($opts{h}); pod2usage() unless (@ARGV and scalar @ARGV <= 2); my $consumer = new XML::SAX::Writer::StringConsumer(); my $handler = new XML::SAX::Writer(Output => $consumer); my $error = new MyErrorHandler(); my $parser = new WAP::SAXDriver::wbxml(Handler => $handler, ErrorHandler => $error, RulesPath => $opts{p}); my $file = $ARGV[0]; my $io = new IO::File($file, 'r'); die "Can't open $file ($!).\n" unless (defined $io); binmode $io, ':raw'; my $out = $ARGV[1]; if ($out) { open STDOUT, '>', $out or die "can't open $out ($!).\n"; } my $doc = $parser->parse( Source => {ByteStream => $io} ); if ($opts{b}) { print beautify(${$consumer->finalize()}); } else { print ${$consumer->finalize()}; } sub beautify { my $out = q{}; my @tab; foreach (split /(<[^>']*(?:'[^']*'[^>']*)*>)/, shift) { next unless ($_); pop @tab if (/^<\//); $out .= "@tab$_\n"; push @tab, ' ' if (/^<[^\/?!]/ and /[^\/]>$/); } return $out; } package MyErrorHandler; sub new { my $proto = shift; my $class = ref($proto) || $proto; return bless {}, $class; } sub fatal_error { my $self = shift; my ($hash) = @_; die __PACKAGE__,": Fatal error\n\tat position $hash->{BytePosition}.\n"; } sub error { my $self = shift; my ($hash) = @_; warn __PACKAGE__,": Error: $hash->{Message}\n\tat position $hash->{BytePosition}\n"; } sub warning { my $self = shift; my ($hash) = @_; warn __PACKAGE__,": Warning: $hash->{Message}\n\tat position $hash->{BytePosition}\n"; } __END__ =head1 NAME wbxmld - WBXML Disassembler =head1 SYNOPSIS wbxmld [B<-b>] [B<-p> I] I =head1 OPTIONS =over 8 =item -b Beautify =item -h Display help. =item -p Specify the path of rules (the default is WAP/SAXDriver/wap.wbrules2.xml). =item -v Display version. =back =head1 DESCRIPTION B disassembles binarized XML (WBXML) into XML. B needs XML::SAX::Writer module. WAP Specifications, including Binary XML Content Format (WBXML) are available on Ehttp://www.wapforum.org/E. =head1 SEE ALSO WAP::SAXDriver::wbxml, WAP::wbxml, wbxmlc =head1 AUTHOR Francois PERRAD, francois.perrad@gadz.org =cut