use Data::Dump qw/dump/;
use Carp qw/carp confess cluck croak/;
-use CWMP::Request;
+use CWMP::Parser;
use CWMP::Methods;
use CWMP::Store;
return $self;
}
+my $vendor_data = {
+ 'InternetGatewayDevice.ManagementServer.PeriodicInformEnable' => 1,
+ 'InternetGatewayDevice.ManagementServer.PeriodicInformInterval' => 17,
+ 'InternetGatewayDevice.DeviceInfo.ProvisioningCode' => 'test provision',
+};
+
+our $set_tried;
+
+sub vendor_hook {
+ my ( $self, $uid, $stored, $queue ) = @_;
+ warn "# vendor_hook $uid ",dump($stored) if $self->debug > 2;
+
+ my @refresh;
+
+ foreach my $n ( keys %$vendor_data ) {
+ if ( defined $stored->{$n} && $vendor_data->{$n} ne $stored->{$n} ) {
+ next if $set_tried->{$uid}->{$n}++;
+ push @refresh, $n;
+ $queue->enqueue( 'SetParameterValues', { $n => $vendor_data->{$n} } );
+ }
+ }
+
+ if ( @refresh ) {
+ $queue->enqueue( 'GetParameterValues', [ @refresh ] );
+ warn "vendor_hook $uid SetParameterValues ", dump( @refresh );
+ return $self->dispatch( 'GetParameterValues', [ @refresh ] );
+ }
+
+ return;
+}
+
=head2 process_request
One request from client/response from server cycle. Call multiple times to
warn "## request payload: ",length($xml)," bytes\n$xml\n" if $self->debug;
- $state = CWMP::Request->parse( $xml );
+ $state = CWMP::Parser->parse( $xml );
warn "## acquired state = ", dump( $state ), "\n" if $self->debug;
- if ( ! defined( $state->{DeviceID} ) ) {
+ if ( ! defined( $state->{DeviceId} ) ) {
if ( $self->state ) {
- warn "## state without DeviceID, using old one...\n";
- $state->{DeviceID} = $self->state->{DeviceID};
+ warn "## state without DeviceId, using old one...\n";
+ $state->{DeviceId} = $self->state->{DeviceId};
} else {
- warn "WARNING: state without DeviceID, and I don't have old one!\n";
+ warn "WARNING: state without DeviceId, and I don't have old one!\n";
warn "## state = ",dump( $state );
}
}
if ( ! defined $stored->{ParameterInfo} ) {
$xml = $self->dispatch( 'GetParameterNames', [ 'InternetGatewayDevice.', 1 ] );
} else {
- my @params = grep { m/\.$/ } keys %{ $stored->{ParameterInfo} };
+ my @params =
+ grep { m/\.$/ && ! m/\.\d+\.$/ }
+ keys %{ $stored->{ParameterInfo} }
+ ;
if ( @params ) {
warn "# GetParameterNames ", dump( @params );
my $first = shift @params;
}
$self->store->set_state( $uid, $stored );
} else {
- warn ">>> empty response $to_uid";
- $state->{NoMoreRequests} = 1;
- $xml = '';
+
+ my @params = sort
+ grep { ! exists $stored->{Parameter}->{$_} }
+ grep { ! m/\.$/ && ! m/NumberOfEntries/ }
+ keys %{ $stored->{ParameterInfo} }
+ ;
+ if ( @params ) {
+ warn "# GetParameterValues ", dump( @params );
+ my $first = shift @params;
+ $xml = $self->dispatch( 'GetParameterValues', [ $first ] );
+ while ( @params ) {
+ my @chunk = splice @params, 0, 16; # FIXME 16 seems to be max
+ $queue->enqueue( 'GetParameterValues', [ @chunk ] );
+ }
+
+ } elsif ( $xml = $self->vendor_hook( $uid, $stored, $queue ) ) {
+
+ warn "vendor_hook triggered\n";
+
+ } else {
+
+ warn ">>> empty response $to_uid";
+ $state->{NoMoreRequests} = 1;
+ $xml = '';
+
+ }
}
}
}