| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package HTTP::MobileAgent::DoCoMo; |
|
2
|
|
|
|
|
|
|
|
|
3
|
14
|
|
|
14
|
|
83
|
use strict; |
|
|
14
|
|
|
|
|
31
|
|
|
|
14
|
|
|
|
|
506
|
|
|
4
|
14
|
|
|
14
|
|
72
|
use vars qw($VERSION); |
|
|
14
|
|
|
|
|
29
|
|
|
|
14
|
|
|
|
|
658
|
|
|
5
|
|
|
|
|
|
|
$VERSION = 0.24; |
|
6
|
|
|
|
|
|
|
|
|
7
|
14
|
|
|
14
|
|
75
|
use base qw(HTTP::MobileAgent); |
|
|
14
|
|
|
|
|
58
|
|
|
|
14
|
|
|
|
|
1681
|
|
|
8
|
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
__PACKAGE__->make_accessors( |
|
10
|
|
|
|
|
|
|
qw(version model status bandwidth |
|
11
|
|
|
|
|
|
|
serial_number is_foma card_id xhtml_compliant comment) |
|
12
|
|
|
|
|
|
|
); |
|
13
|
|
|
|
|
|
|
|
|
14
|
14
|
|
|
14
|
|
10381
|
use HTTP::MobileAgent::DoCoMoDisplayMap qw($DisplayMap); |
|
|
14
|
|
|
|
|
101
|
|
|
|
14
|
|
|
|
|
3512
|
|
|
15
|
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
# various preferences |
|
17
|
14
|
|
|
14
|
|
103
|
use vars qw($DefaultCacheSize $HTMLVerMap $GPSModelsRe); |
|
|
14
|
|
|
|
|
32
|
|
|
|
14
|
|
|
|
|
59023
|
|
|
18
|
|
|
|
|
|
|
$DefaultCacheSize = 5; |
|
19
|
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
# http://www.nttdocomo.co.jp/service/developer/make/content/spec/useragent/index.html |
|
21
|
|
|
|
|
|
|
$HTMLVerMap = [ |
|
22
|
|
|
|
|
|
|
qr/(?i-xsm:^(?:D501i|F501i|N501i|P501i)$)/, |
|
23
|
|
|
|
|
|
|
'1.0', |
|
24
|
|
|
|
|
|
|
qr/(?i-xsm:^(?:D209i|D502i|ER209i|F209i|F210i|F502i|F502it|F671i|KO209i|KO210i|N209i|N210i|N502i|N502it|N821i|NM502i|P209i|P209iS|P210i|P502i|P651ps|P821i|R209i|R691i|SH821i|SO502i|SO502iWM)$)/, |
|
25
|
|
|
|
|
|
|
'2.0', |
|
26
|
|
|
|
|
|
|
qr/(?i-xsm:^(?:D2101V|D210i|D211i|D503i|D503iS|F211i|F503i|F503iS|N2001|N2002|N211i|N211iS|N503i|N503iS|P2002|P2101V|P211i|P211iS|P503i|P503iS|R211i|R692i|SH2101V|SH251i|SH251iS|SO210i|SO211i|SO503i|SO503iS|T2101V)$)/, |
|
27
|
|
|
|
|
|
|
'3.0', |
|
28
|
|
|
|
|
|
|
qr/(?i-xsm:^(?:eggy|P751v)$)/, |
|
29
|
|
|
|
|
|
|
'3.2', |
|
30
|
|
|
|
|
|
|
qr/(?i-xsm:^(?:D251i|D251iS|D504i|F2051|F2102V|F212i|F251i|F504i|F504iS|F661i|F671iS|F672i|N2051|N2102V|N251i|N251iS|N2701|N504i|N504iS|NM705i|NM706i|NM850iG|P2102V|P251iS|P504i|P504iS|SO212i|SO213i|SO213iS|SO213iWR|SO504i)$)/, |
|
31
|
|
|
|
|
|
|
'4.0', |
|
32
|
|
|
|
|
|
|
qr/(?i-xsm:^(?:D252i|D253i|D253iWM|D505i|D505iS|D506i|D701i|D701iWM|D900i|D901i|D901iS|F505i|F505iGPS|F506i|F700i|F700iS|F880iES|F881iES|F900i|F900iC|F900iT|F901iC|F901iS|L600i|L601i|L602i|M702iG|M702iS|N252i|N253i|N505i|N505iS|N506i|N506iS|N506iSII|N600i|N700i|N701i|N701iECO|N900i|N900iG|N900iL|N900iS|N901iC|N901iS|P213i|P252i|P252iS|P253i|P253iS|P505i|P505iS|P506iC|P506iCII|P700i|P701iD|P851i|P900i|P900iV|P901i|P901iS|P901iTV|SA700iS|SA800i|SH252i|SH505i|SH505iS|SH506iC|SH700i|SH700iS|SH851i|SH900i|SH901iC|SH901iS|SO505i|SO505iS|SO506i|SO506iC|SO506iS)$)/, |
|
33
|
|
|
|
|
|
|
'5.0', |
|
34
|
|
|
|
|
|
|
qr/(?i-xsm:^(?:D702i|D702iBCL|D702iF|D800iDS|D851iWM|D902i|D902iS|F702iD|F882iES|F883i|F883iS|F902i|F902iS|L01A|L01C|L02B|L03A|L03B|L04A|L04B|L06A|L704i|L705i|L705iX|L706ie|L852i|N601i|N702iD|N702iS|N902i|N902iL|N902iS|N902iX|P702i|P702iD|P703imyu|P704imyu|P902i|P902iS|SA702i|SH702iD|SH702iS|SH902i|SH902iS|SH902iSL|SO702i|SO902i|SO902iWP+)$)/, |
|
35
|
|
|
|
|
|
|
'6.0', |
|
36
|
|
|
|
|
|
|
qr/(?i-xsm:^(?:D703i|D704i|D705i|D705imyu|D903i|D903iTV|D904i|F05A|F703i|F704i|F705i|F801i|F883iES|F883iESS|F903i|F903iBSC|F903iX|F904i|L10C|N703iD|N703imyu|N704imyu|N903i|N904i|P703i|P704i|P903i|P903iTV|P903iX|P904i|SH703i|SH704i|SH705i|SH705iII|SH706ie|SH903i|SH903iTV|SH904i|SO703i|SO704i|SO903i|SO903iTV)$)/, |
|
37
|
|
|
|
|
|
|
'7.0', |
|
38
|
|
|
|
|
|
|
qr/(?i-xsm:^(?:D905i|F07A|F10A|F884i|F884iES|F905i|F905iBiz|N03A|N05A|N06B|N705i|N705imyu|N706i|N706iII|N706ie|N905i|N905iBiz|N905imyu|N906iL|P705i|P705iCL|P705imyu|P706imyu|P905i|P905iTV|SH905i|SH905iTV|SO705i|SO706i|SO905i|SO905iCS)$)/, |
|
39
|
|
|
|
|
|
|
'7.1', |
|
40
|
|
|
|
|
|
|
qr/(?i-xsm:^(?:F01A|F02A|F03A|F04A|F06A|F08C|F09B|F706i|F906i|N01A|N02A|N04A|N906i|N906imyu|P01A|P02A|P03A|P04A|P05A|P06A|P10A|P706ie|P906i|SH01A|SH02A|SH03A|SH04A|SH706i|SH706iw|SH906i|SH906iTV|SO906i)$)/, |
|
41
|
|
|
|
|
|
|
'7.2', |
|
42
|
|
|
|
|
|
|
]; |
|
43
|
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
# http://www.nttdocomo.co.jp/binary/pdf/service/developer/make/content/spec/imode_spec.pdf |
|
45
|
|
|
|
|
|
|
$GPSModelsRe = qr/SH03D|P03D|N03D|N02D|F04D|F02D|F10C|F09C|F07C|F03C|F02C|F01C|SH11C|SH10C|SH09C|SH06C|SH05C|SH04C|SH02C|SH01C|CA01C|N05C|N03C|N02C|N01C|P05C|P04C|P03C|L01B|N05B|N04B|N02B|N01B|P06B|P04B|P02B|P01B|F09B|F07B|F06B|F04B|F03B|F02B|F01B|SH08B|SH07B|SH04B|SH03B|SH02B|SH01B|SH08A|SH07A3|SH06A3|SH05A3|SH04A|SH03A|SH02A|SH01A|N09A3|N08A3|N06A3|N02A|N01A|P09A3|P08A3|P07A3|P02A|P01A|F10A|F09A3|F06A|F05A|F03A|F01A|N906iL|N906i|F906i|N906imyu|SH906i|SO906i|P906i|F884iES|F884i|F801i|F905iBiz|SO905iCS|N905iBiz|N905imyu|SO905i|F905i|P905i|N905i|D905i|SH905i(?!TV)|P904i|D904i|F904i|N904i|SH904i|F883iESS|F883iES|F903iBSC|SO903i|F903i|D903i|N903i|P903i(?!TV|X)|SH903i|SA800i|SA702i|SA700iS|F505iGPS|F661i/; |
|
46
|
|
|
|
|
|
|
|
|
47
|
178
|
|
|
178
|
1
|
483
|
sub is_docomo { 1 } |
|
48
|
|
|
|
|
|
|
|
|
49
|
39
|
|
|
39
|
1
|
353
|
sub carrier { 'I' } |
|
50
|
|
|
|
|
|
|
|
|
51
|
36
|
|
|
36
|
1
|
133
|
sub carrier_longname { 'DoCoMo' } |
|
52
|
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
sub parse { |
|
54
|
185
|
|
|
185
|
0
|
261
|
my $self = shift; |
|
55
|
185
|
|
|
|
|
587
|
my($main, $foma_or_comment) = split / /, $self->user_agent, 2; |
|
56
|
|
|
|
|
|
|
|
|
57
|
185
|
100
|
100
|
|
|
1042
|
if ($foma_or_comment && $foma_or_comment =~ s/^\((.*)\)$/$1/) { |
|
|
|
100
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
# DoCoMo/1.0/P209is (Google CHTML Proxy/1.0) |
|
59
|
4
|
|
|
|
|
14
|
$self->{comment} = $1; |
|
60
|
4
|
|
|
|
|
14
|
$self->_parse_main($main); |
|
61
|
|
|
|
|
|
|
} elsif ($foma_or_comment) { |
|
62
|
|
|
|
|
|
|
# DoCoMo/2.0 N2001(c10;ser0123456789abcde;icc01234567890123456789) |
|
63
|
31
|
|
|
|
|
81
|
$self->{is_foma} = 1; |
|
64
|
31
|
|
|
|
|
102
|
@{$self}{qw(name version)} = split m!/!, $main; |
|
|
31
|
|
|
|
|
107
|
|
|
65
|
31
|
|
|
|
|
166
|
$self->_parse_foma($foma_or_comment); |
|
66
|
|
|
|
|
|
|
} else { |
|
67
|
|
|
|
|
|
|
# DoCoMo/1.0/R692i/c10 |
|
68
|
150
|
|
|
|
|
350
|
$self->_parse_main($main); |
|
69
|
|
|
|
|
|
|
} |
|
70
|
|
|
|
|
|
|
|
|
71
|
185
|
100
|
100
|
|
|
935
|
$self->{xhtml_compliant} = |
|
72
|
|
|
|
|
|
|
( $self->is_foma && !( $self->html_version && $self->html_version == 3.0 ) ) |
|
73
|
|
|
|
|
|
|
? 1 |
|
74
|
|
|
|
|
|
|
: 0; |
|
75
|
|
|
|
|
|
|
} |
|
76
|
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
sub _parse_main { |
|
78
|
154
|
|
|
154
|
|
233
|
my($self, $main) = @_; |
|
79
|
154
|
|
|
|
|
719
|
my($name, $version, $model, $cache, @rest) = split m!/!, $main; |
|
80
|
154
|
|
|
|
|
381
|
$self->{name} = $name; |
|
81
|
154
|
|
|
|
|
288
|
$self->{version} = $version; |
|
82
|
154
|
|
|
|
|
292
|
$self->{model} = $model; |
|
83
|
154
|
100
|
|
|
|
378
|
$self->{model} = 'SH505i' if $self->{model} eq 'SH505i2'; |
|
84
|
|
|
|
|
|
|
|
|
85
|
154
|
100
|
|
|
|
301
|
if ($cache) { |
|
86
|
105
|
50
|
|
|
|
732
|
$cache =~ s/^c// or return $self->no_match; |
|
87
|
105
|
|
|
|
|
316
|
$self->{cache_size} = $cache; |
|
88
|
|
|
|
|
|
|
} |
|
89
|
|
|
|
|
|
|
|
|
90
|
154
|
|
|
|
|
430
|
for (@rest) { |
|
91
|
37
|
100
|
|
|
|
118
|
/^ser(\w{11})$/ and do { $self->{serial_number} = $1; next }; |
|
|
5
|
|
|
|
|
17
|
|
|
|
5
|
|
|
|
|
21
|
|
|
92
|
32
|
100
|
|
|
|
121
|
/^(T[CDBJ])$/ and do { $self->{status} = $1; next }; |
|
|
19
|
|
|
|
|
52
|
|
|
|
19
|
|
|
|
|
4062
|
|
|
93
|
13
|
100
|
|
|
|
49
|
/^s(\d+)$/ and do { $self->{bandwidth} = $1; next }; |
|
|
5
|
|
|
|
|
18
|
|
|
|
5
|
|
|
|
|
9
|
|
|
94
|
8
|
100
|
|
|
|
46
|
/^W(\d+)H(\d+)$/ and do { $self->{display_bytes} = "$1*$2"; next; }; |
|
|
2
|
|
|
|
|
10
|
|
|
|
2
|
|
|
|
|
8
|
|
|
95
|
|
|
|
|
|
|
} |
|
96
|
|
|
|
|
|
|
} |
|
97
|
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
sub _parse_foma { |
|
99
|
31
|
|
|
31
|
|
78
|
my($self, $foma) = @_; |
|
100
|
|
|
|
|
|
|
|
|
101
|
31
|
50
|
|
|
|
195
|
$foma =~ s/^([^\(]+)// or return $self->no_match; |
|
102
|
31
|
|
|
|
|
100
|
$self->{model} = $1; |
|
103
|
31
|
100
|
|
|
|
202
|
$self->{model} = 'SH2101V' if $1 eq 'MST_v_SH2101V'; # Huh? |
|
104
|
|
|
|
|
|
|
|
|
105
|
31
|
100
|
|
|
|
292
|
if ($foma =~ s/^\((.*?)\)//) { |
|
106
|
28
|
|
|
|
|
114
|
my @options = split /;/, $1; |
|
107
|
28
|
|
|
|
|
67
|
for (@options) { |
|
108
|
57
|
100
|
|
|
|
291
|
/^c(\d+)$/ and $self->{cache_size} = $1, next; |
|
109
|
29
|
100
|
|
|
|
88
|
/^ser(\w{15})$/ and $self->{serial_number} = $1, next; |
|
110
|
27
|
100
|
|
|
|
79
|
/^icc(\w{20})$/ and $self->{card_id} = $1, next; |
|
111
|
25
|
100
|
|
|
|
129
|
/^(T[CDBJ])$/ and $self->{status} = $1, next; |
|
112
|
12
|
50
|
|
|
|
145
|
/^W(\d+)H(\d+)$/ and $self->{display_bytes} = "$1*$2", next; |
|
113
|
0
|
|
|
|
|
0
|
$self->no_match; |
|
114
|
|
|
|
|
|
|
} |
|
115
|
|
|
|
|
|
|
} |
|
116
|
|
|
|
|
|
|
} |
|
117
|
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
sub html_version { |
|
119
|
92
|
|
|
92
|
1
|
139
|
my $self = shift; |
|
120
|
|
|
|
|
|
|
|
|
121
|
92
|
|
|
|
|
535
|
my @map = @$HTMLVerMap; |
|
122
|
92
|
|
|
|
|
355
|
while (my($re, $version) = splice(@map, 0, 2)) { |
|
123
|
480
|
100
|
|
|
|
1609
|
return $version if $self->model =~ /$re/; |
|
124
|
|
|
|
|
|
|
} |
|
125
|
7
|
|
|
|
|
67
|
return undef; |
|
126
|
|
|
|
|
|
|
} |
|
127
|
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
sub cache_size { |
|
129
|
41
|
|
|
41
|
1
|
63
|
my $self = shift; |
|
130
|
41
|
|
66
|
|
|
315
|
return $self->{cache_size} || $DefaultCacheSize; |
|
131
|
|
|
|
|
|
|
} |
|
132
|
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
sub series { |
|
134
|
36
|
|
|
36
|
1
|
60
|
my $self = shift; |
|
135
|
36
|
|
|
|
|
103
|
my $model = $self->model; |
|
136
|
|
|
|
|
|
|
|
|
137
|
36
|
100
|
66
|
|
|
108
|
if ($self->is_foma && $model =~ /(?:\d{4}|\w\d{2}\w\d?)/) { |
|
138
|
13
|
|
|
|
|
78
|
return 'FOMA'; |
|
139
|
|
|
|
|
|
|
} |
|
140
|
|
|
|
|
|
|
|
|
141
|
23
|
|
|
|
|
115
|
$model =~ /(\d{3}i)/; |
|
142
|
23
|
|
|
|
|
122
|
return $1; |
|
143
|
|
|
|
|
|
|
} |
|
144
|
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
sub vendor { |
|
146
|
36
|
|
|
36
|
1
|
61
|
my $self = shift; |
|
147
|
36
|
|
|
|
|
110
|
my $model = $self->model; |
|
148
|
36
|
|
|
|
|
141
|
$model =~ /^([A-Z]+)\d/; |
|
149
|
36
|
|
|
|
|
186
|
return $1; |
|
150
|
|
|
|
|
|
|
} |
|
151
|
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
sub _make_display { |
|
153
|
5
|
|
|
5
|
|
9
|
my $self = shift; |
|
154
|
5
|
|
|
|
|
21
|
my $display = $DisplayMap->{uc($self->model)}; |
|
155
|
5
|
100
|
|
|
|
21
|
if ($self->{display_bytes}) { |
|
156
|
3
|
|
|
|
|
14
|
my($w, $h) = split /\*/, $self->{display_bytes}; |
|
157
|
3
|
|
|
|
|
8
|
$display->{width_bytes} = $w; |
|
158
|
3
|
|
|
|
|
16
|
$display->{height_bytes} = $h; |
|
159
|
|
|
|
|
|
|
} |
|
160
|
5
|
|
|
|
|
73
|
return HTTP::MobileAgent::Display->new(%$display); |
|
161
|
|
|
|
|
|
|
} |
|
162
|
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
sub is_gps { |
|
164
|
4
|
|
|
4
|
0
|
15
|
my $self = shift; |
|
165
|
4
|
|
|
|
|
16
|
return $self->gps_compliant; |
|
166
|
|
|
|
|
|
|
} |
|
167
|
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
sub gps_compliant { |
|
169
|
4
|
|
|
4
|
1
|
8
|
my $self = shift; |
|
170
|
4
|
|
|
|
|
15
|
return $self->model =~ qr/$GPSModelsRe/; |
|
171
|
|
|
|
|
|
|
} |
|
172
|
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
sub user_id { |
|
174
|
2
|
|
|
2
|
1
|
17
|
my $self = shift; |
|
175
|
2
|
|
|
|
|
9
|
return $self->get_header( 'x-dcmguid' ); |
|
176
|
|
|
|
|
|
|
} |
|
177
|
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
sub browser_version { |
|
179
|
5
|
|
|
5
|
1
|
35
|
my $self = shift; |
|
180
|
5
|
100
|
66
|
|
|
21
|
return $self->is_foma && $self->cache_size >= 500 ? '2.0' : '1.0'; |
|
181
|
|
|
|
|
|
|
} |
|
182
|
|
|
|
|
|
|
|
|
183
|
|
|
|
|
|
|
1; |
|
184
|
|
|
|
|
|
|
__END__ |