/usr/local/CPAN/HTTP-MobileAttribute/HTTP/MobileAttribute/Agent/DoCoMo.pm


package HTTP::MobileAttribute::Agent::DoCoMo;
use strict;
use warnings;
use HTTP::MobileAttribute::Agent::Base;

__PACKAGE__->mk_accessors(qw/version model status bandwidth serial_number card_id comment name cache_size/);

sub parse {
    my ( $self, ) = @_;

    my ( $main, $foma_or_comment ) = split / /, $self->user_agent, 2;

    if ( $foma_or_comment && $foma_or_comment =~ s/^\((.*)\)$/$1/ ) {
        # DoCoMo/1.0/P209is (Google CHTML Proxy/1.0)
        $self->{comment} = $1;
        $self->_parse_main($main);
    }
    elsif ($foma_or_comment) {
        # DoCoMo/2.0 N2001(c10;ser0123456789abcde;icc01234567890123456789)
        @{$self}{qw(name version)} = split m!/!, $main;
        $self->_parse_foma($foma_or_comment);
    }
    else {
        # DoCoMo/1.0/R692i/c10
        $self->_parse_main($main);
    }

}

sub _parse_main {
    my ( $self, $main ) = @_;
    my ( $name, $version, $model, $selfache, @rest ) = split m!/!, $main;
    $self->{name}    = $name;
    $self->{version} = $version;
    $self->{model}   = $model;
    $self->{model}   = 'SH505i' if $self->{model} eq 'SH505i2';

    if ($selfache) {
        $selfache =~ s/^c// or return $self->no_match;
        $self->{cache_size} = $selfache;
    }

    for (@rest) {
        /^ser(\w{11})$/  and do { $self->{serial_number} = $1;      next };
        /^(T[CDBJ])$/    and do { $self->{status}        = $1;      next };
        /^s(\d+)$/       and do { $self->{bandwidth}     = $1;      next };
        /^W(\d+)H(\d+)$/ and do { $self->{display_bytes} = "$1*$2"; next; };
    }
}

sub _parse_foma {
    my ( $self, $foma ) = @_;

    $foma =~ s/^([^\(]+)// or return $self->no_match;
    $self->{model} = $1;
    $self->{model} = 'SH2101V' if $1 eq 'MST_v_SH2101V';    # Huh?

    $foma =~ /^\(/g or return;
    while ($foma =~ /\G
                (?:
                        c(\d+)      | # cache size
                        ser(\w{15}) | # serial_number
                        icc(\w{20}) | # card_id
                        (T[CDBJ])   | # status
                        W(\d+)H(\d+)  # display_bytes
                )
                [;\)]/gx)
    {
        $1         and $self->{cache_size}    = $1, next;
        $2         and $self->{serial_number} = $2, next;
        $3         and $self->{card_id}       = $3, next;
        $4         and $self->{status}        = $4, next;
        ($5 && $6) and $self->{display_bytes} = "$5*$6", next;
        $self->no_match;
    }
}

1;