--- google/rules.pl 2007/06/17 22:33:45 25 +++ google/rules.pl 2007/06/17 23:02:08 26 @@ -6,11 +6,34 @@ use XML::Rules; use File::Slurp; use Data::Dump qw/dump/; +use Carp qw/confess cluck/; my $path = $ARGV[0] || 'protocol/inform.xml'; my $state; +# get tag name, case insensitive, namespace ignoring +sub _tag { + my ( $tag_hash, $name, $sub_key ) = @_; + confess "need hash as first argument" unless ( ref $tag_hash eq 'HASH' ); + $name = (grep { m/$name/i } keys %$tag_hash )[0]; +# $name =~ s/^\w+://; + if ( defined $tag_hash->{$name} ) { + if ( ! defined $sub_key ) { + return $tag_hash->{$name}; + } elsif ( defined $tag_hash->{$name}->{$sub_key} ) { + return $tag_hash->{$name}->{$sub_key}; + } else { + return if ( $name =~ m/^value$/i ); + warn "can't find '$name/$sub_key' in ", dump( $tag_hash ); + return; + } + } else { + warn "can't find '$name' in ", dump( $tag_hash ); + return; + } +} + my $parser = XML::Rules->new( # start_rules => [ # '^division_name,fax' => 'skip', @@ -26,13 +49,16 @@ my ($tag_name, $tag_hash, $context, $parent_data) = @_; warn dump( $tag_name, $tag_hash, $context ); }, + # + # Inform + # qr/DeviceId/ => sub { my ($tag_name, $tag_hash, $context, $parent_data) = @_; foreach my $name ( keys %$tag_hash ) { next if $name eq '_content'; my $key = $name; $key =~ s/^\w+://; # stip namespace - $state->{DeviceID}->{ $key } = $tag_hash->{$name}->{_content}; + $state->{DeviceID}->{ $key } = _tag( $tag_hash, $name, '_content' ); } }, qr/EventStruct/ => sub { @@ -46,10 +72,17 @@ qr/ParameterValueStruct/ => sub { my ($tag_name, $tag_hash, $context, $parent_data) = @_; # Name/Value tags must be case insnesitive - my $name = (grep( /name/i, keys %$tag_hash ))[0]; my $value = (grep( /value/i, keys %$tag_hash ))[0]; - $state->{Parameter}->{ $tag_hash->{$name}->{_content} } = $tag_hash->{$value}->{_content}; + $state->{Parameter}->{ _tag($tag_hash, 'Name', '_content') } = _tag($tag_hash, 'Value', '_content' ); }, + # + # GetRPCMethodsResponse + # + qr/^(?:^\w+:)*string$/ => 'content array', + qr/MethodList/ => sub { + my ($tag_name, $tag_hash, $context, $parent_data) = @_; + $state->{MethodList} = _tag( $tag_hash, 'string' ); + }, ] );