jpmobile 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README +32 -10
- data/Rakefile +8 -8
- data/doc/classes/ActionController.html +120 -0
- data/doc/classes/ActionController/AbstractRequest.html +118 -0
- data/doc/classes/ActionController/CgiRequest.html +160 -0
- data/doc/classes/ActionView.html +101 -0
- data/doc/classes/DatumConv.html +324 -0
- data/doc/classes/Jpmobile/Display.html +333 -0
- data/doc/classes/Jpmobile/Emoticon.html +467 -0
- data/doc/classes/Jpmobile/Filter.html +120 -0
- data/doc/classes/Jpmobile/Filter/ApplyOnlyForMobile.html +172 -0
- data/doc/classes/Jpmobile/Filter/Base.html +269 -0
- data/doc/classes/Jpmobile/Filter/Emoticon.html +118 -0
- data/doc/classes/Jpmobile/Filter/Emoticon/Inner.html +184 -0
- data/doc/classes/Jpmobile/Filter/Emoticon/Outer.html +207 -0
- data/doc/classes/Jpmobile/Filter/FilterTable.html +178 -0
- data/doc/classes/Jpmobile/Filter/HankakuKana.html +126 -0
- data/doc/classes/Jpmobile/Filter/Sjis.html +271 -0
- data/doc/classes/Jpmobile/Helpers.html +588 -0
- data/doc/classes/Jpmobile/Mobile.html +150 -0
- data/doc/classes/Jpmobile/Mobile/AbstractMobile.html +389 -0
- data/doc/classes/Jpmobile/Mobile/Au.html +420 -0
- data/doc/classes/Jpmobile/Mobile/Ddipocket.html +138 -0
- data/doc/classes/Jpmobile/Mobile/Docomo.html +411 -0
- data/doc/classes/Jpmobile/Mobile/Emobile.html +183 -0
- data/doc/classes/Jpmobile/Mobile/Jphone.html +212 -0
- data/doc/classes/Jpmobile/Mobile/Softbank.html +344 -0
- data/doc/classes/Jpmobile/Mobile/Vodafone.html +176 -0
- data/doc/classes/Jpmobile/Mobile/Willcom.html +211 -0
- data/doc/classes/Jpmobile/Position.html +384 -0
- data/doc/classes/Jpmobile/RequestWithMobile.html +263 -0
- data/doc/created.rid +1 -0
- data/doc/files/CHANGELOG.html +110 -0
- data/doc/files/README.html +455 -0
- data/doc/files/lib/jpmobile/datum_conv_rb.html +110 -0
- data/doc/files/lib/jpmobile/emoticon/au_rb.html +124 -0
- data/doc/files/lib/jpmobile/emoticon/conversion_table_rb.html +124 -0
- data/doc/files/lib/jpmobile/emoticon/docomo_rb.html +119 -0
- data/doc/files/lib/jpmobile/emoticon/softbank_rb.html +119 -0
- data/doc/files/lib/jpmobile/emoticon/z_combine_rb.html +101 -0
- data/doc/files/lib/jpmobile/emoticon_rb.html +101 -0
- data/doc/files/lib/jpmobile/filter_rb.html +115 -0
- data/doc/files/lib/jpmobile/helpers_rb.html +105 -0
- data/doc/files/lib/jpmobile/hook_abstract_request_rb.html +108 -0
- data/doc/files/lib/jpmobile/hook_action_controller_rb.html +101 -0
- data/doc/files/lib/jpmobile/hook_action_view_rb.html +110 -0
- data/doc/files/lib/jpmobile/mobile/abstract_mobile_rb.html +108 -0
- data/doc/files/lib/jpmobile/mobile/au_rb.html +112 -0
- data/doc/files/lib/jpmobile/mobile/display_rb.html +111 -0
- data/doc/files/lib/jpmobile/mobile/docomo_rb.html +105 -0
- data/doc/files/lib/jpmobile/mobile/emobile_rb.html +105 -0
- data/doc/files/lib/jpmobile/mobile/softbank_rb.html +115 -0
- data/doc/files/lib/jpmobile/mobile/willcom_rb.html +108 -0
- data/doc/files/lib/jpmobile/mobile/z_display_info_docomo_rb.html +114 -0
- data/doc/files/lib/jpmobile/mobile/z_ip_addresses_au_rb.html +114 -0
- data/doc/files/lib/jpmobile/mobile/z_ip_addresses_docomo_rb.html +124 -0
- data/doc/files/lib/jpmobile/mobile/z_ip_addresses_emobile_rb.html +111 -0
- data/doc/files/lib/jpmobile/mobile/z_ip_addresses_softbank_rb.html +124 -0
- data/doc/files/lib/jpmobile/mobile/z_ip_addresses_willcom_rb.html +114 -0
- data/doc/files/lib/jpmobile/position_rb.html +105 -0
- data/doc/files/lib/jpmobile/request_with_mobile_rb.html +111 -0
- data/doc/files/lib/jpmobile/trans_sid_rb.html +118 -0
- data/doc/files/lib/jpmobile/version_rb.html +101 -0
- data/doc/files/lib/jpmobile_rb.html +101 -0
- data/doc/fr_class_index.html +55 -0
- data/doc/fr_file_index.html +58 -0
- data/doc/fr_method_index.html +134 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/lib/jpmobile.rb +32 -1
- data/lib/jpmobile/emoticon.rb +18 -0
- data/lib/jpmobile/emoticon/au.rb +643 -0
- data/lib/jpmobile/filter.rb +5 -1
- data/lib/jpmobile/helpers.rb +9 -1
- data/lib/jpmobile/hook_abstract_request.rb +3 -24
- data/lib/jpmobile/hook_action_controller.rb +2 -2
- data/lib/jpmobile/hook_action_view.rb +41 -8
- data/lib/jpmobile/mobile/abstract_mobile.rb +18 -12
- data/lib/jpmobile/mobile/au.rb +11 -5
- data/lib/jpmobile/mobile/docomo.rb +27 -11
- data/lib/jpmobile/mobile/emobile.rb +15 -0
- data/lib/jpmobile/mobile/softbank.rb +11 -7
- data/lib/jpmobile/mobile/willcom.rb +5 -2
- data/lib/jpmobile/mobile/z_display_info_docomo.rb +343 -219
- data/lib/jpmobile/mobile/z_ip_addresses_au.rb +4 -1
- data/lib/jpmobile/mobile/z_ip_addresses_docomo.rb +10 -0
- data/lib/jpmobile/mobile/z_ip_addresses_emobile.rb +10 -0
- data/lib/jpmobile/mobile/{z_ip_addresses.rb → z_ip_addresses_softbank.rb} +2 -13
- data/lib/jpmobile/mobile/z_ip_addresses_willcom.rb +20 -1
- data/lib/jpmobile/position.rb +2 -2
- data/lib/jpmobile/request_with_mobile.rb +44 -0
- data/lib/jpmobile/trans_sid.rb +52 -14
- data/lib/jpmobile/version.rb +1 -1
- data/test/au_test.rb +94 -63
- data/test/autoload_test.rb +49 -0
- data/test/docomo_test.rb +92 -59
- data/test/emoticon_functional_test.rb +30 -3
- data/test/filter_test.rb +0 -64
- data/test/helper.rb +8 -1
- data/test/helpers_test.rb +14 -13
- data/test/softbank_test.rb +113 -85
- data/test/willcom_test.rb +30 -20
- data/tools/generate_au_emoticon_table.rb +12 -3
- data/tools/update_display_info_docomo.rb +0 -0
- data/tools/update_ip_addresses_au.rb +1 -1
- data/tools/update_ip_addresses_willcom.rb +1 -1
- metadata +135 -54
- data/test/filter_functional_test.rb +0 -146
data/lib/jpmobile/filter.rb
CHANGED
@@ -90,7 +90,11 @@ module Jpmobile
|
|
90
90
|
end
|
91
91
|
# afterfilterを実行した後に実行する。
|
92
92
|
def after_after(controller)
|
93
|
-
controller.response.
|
93
|
+
unless controller.response.body.blank?
|
94
|
+
# 500.htmlなどをUTF-8で書いたとき、docomoで文字化けするのを防ぐため
|
95
|
+
# response_bodyが空の場合はShift_JISを指定しない
|
96
|
+
controller.response.charset = "Shift_JIS"
|
97
|
+
end
|
94
98
|
end
|
95
99
|
# to_internalを適用するべきかどうかを返す。
|
96
100
|
def apply_incoming?(controller)
|
data/lib/jpmobile/helpers.rb
CHANGED
@@ -52,7 +52,8 @@ module Jpmobile
|
|
52
52
|
def docomo_openiarea_url_for(options={})
|
53
53
|
options = options.symbolize_keys
|
54
54
|
options[:only_path] = false
|
55
|
-
|
55
|
+
posinfo = options.delete(:posinfo) || "1" # 基地局情報を元に測位した緯度経度情報を要求
|
56
|
+
"http://w1m.docomo.ne.jp/cp/iarea?ecode=OPENAREACODE&msn=OPENAREAKEY&posinfo=#{posinfo}&nl=#{CGI.escape(url_for(options))}"
|
56
57
|
end
|
57
58
|
|
58
59
|
# DoCoMoでオープンiエリアを取得するためのリンクを返す。
|
@@ -67,6 +68,13 @@ module Jpmobile
|
|
67
68
|
return %{<a href="#{url_for(options)}" utn>#{str}</a>}
|
68
69
|
end
|
69
70
|
|
71
|
+
# DoCoMoでiモードIDを取得するためのリンクを返す。
|
72
|
+
def docomo_guid_link_to(str, options={})
|
73
|
+
options = options.symbolize_keys
|
74
|
+
options[:guid] = "ON"
|
75
|
+
link_to_url(str, url_for(options))
|
76
|
+
end
|
77
|
+
|
70
78
|
# au GPS位置情報を取得するためのURLを返す。
|
71
79
|
def au_gps_url_for(options={})
|
72
80
|
options = options.symbolize_keys
|
@@ -1,26 +1,5 @@
|
|
1
|
-
|
2
|
-
class ActionController::AbstractRequest
|
3
|
-
# 環境変数 HTTP_USER_AGENT を返す。
|
4
|
-
def user_agent
|
5
|
-
env['HTTP_USER_AGENT']
|
6
|
-
end
|
7
|
-
# 環境変数 HTTP_USER_AGENT を設定する。
|
8
|
-
def user_agent=(str)
|
9
|
-
self.env["HTTP_USER_AGENT"] = str
|
10
|
-
end
|
11
|
-
|
12
|
-
# 携帯電話からであれば +true+を、そうでなければ +false+ を返す。
|
13
|
-
def mobile?
|
14
|
-
mobile != nil
|
15
|
-
end
|
1
|
+
require 'jpmobile/request_with_mobile'
|
16
2
|
|
17
|
-
|
18
|
-
|
19
|
-
def mobile
|
20
|
-
Jpmobile::Mobile.constants.each do |const|
|
21
|
-
c = Jpmobile::Mobile.const_get(const)
|
22
|
-
return c.new(self) if c::USER_AGENT_REGEXP && user_agent =~ c::USER_AGENT_REGEXP
|
23
|
-
end
|
24
|
-
nil
|
25
|
-
end
|
3
|
+
class ActionController::AbstractRequest
|
4
|
+
include Jpmobile::RequestWithMobile
|
26
5
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
class ActionController::Base
|
2
2
|
before_filter :gettext_force_ja_for_mobile
|
3
|
-
# gettextが組み込まれている場合、携帯電話からのアクセスをja
|
3
|
+
# gettextが組み込まれている場合、携帯電話からのアクセスをjaロケールに強制する。
|
4
4
|
def gettext_force_ja_for_mobile
|
5
5
|
begin
|
6
|
-
::GetText.locale =
|
6
|
+
::GetText.locale = 'ja' if request.mobile?
|
7
7
|
rescue NameError
|
8
8
|
end
|
9
9
|
end
|
@@ -1,3 +1,8 @@
|
|
1
|
+
# = viewの自動切り替え
|
2
|
+
#
|
3
|
+
# Rails 2.1.0 対応 http://d.hatena.ne.jp/kusakari/20080620/1213931903
|
4
|
+
# thanks to id:kusakari
|
5
|
+
#
|
1
6
|
#:stopdoc:
|
2
7
|
# helperを追加
|
3
8
|
ActionView::Base.class_eval { include Jpmobile::Helpers }
|
@@ -12,25 +17,53 @@ ActionView::Base.class_eval { include Jpmobile::Helpers }
|
|
12
17
|
# の順にテンプレートが検索される。
|
13
18
|
# BUG: 現状、上記の例では index.rhtml が存在しない場合に振り分けが行われない
|
14
19
|
# (ダミーファイルを置くことで回避可能)。
|
20
|
+
|
15
21
|
class ActionView::Base #:nodoc:
|
16
|
-
alias
|
22
|
+
alias render_file_without_jpmobile render_file #:nodoc:
|
23
|
+
alias render_partial_without_jpmobile render_partial #:nodoc:
|
24
|
+
|
17
25
|
def render_file(template_path, use_full_path = true, local_assigns = {})
|
26
|
+
mobile_path = mobile_template_path(template_path)
|
27
|
+
return mobile_path.nil? ? render_file_without_jpmobile(template_path, use_full_path, local_assigns) :
|
28
|
+
render_file_without_jpmobile(mobile_path, use_full_path, local_assigns)
|
29
|
+
end
|
30
|
+
|
31
|
+
def render_partial(partial_path, object_assigns = nil, local_assigns = {}) #:nodoc:
|
32
|
+
mobile_path = mobile_template_path(partial_path, true) if partial_path.class === "String"
|
33
|
+
return mobile_path.nil? ? render_partial_without_jpmobile(partial_path, object_assigns, local_assigns) :
|
34
|
+
render_partial_without_jpmobile(mobile_path, object_assigns, local_assigns)
|
35
|
+
end
|
36
|
+
|
37
|
+
def mobile_template_path(template_path, partial=false)
|
18
38
|
if controller.is_a?(ActionController::Base) && m = controller.request.mobile
|
19
|
-
|
39
|
+
candidates = []
|
20
40
|
c = m.class
|
21
41
|
while c != Jpmobile::Mobile::AbstractMobile
|
22
|
-
|
42
|
+
candidates << "mobile_"+c.to_s.split(/::/).last.downcase
|
23
43
|
c = c.superclass
|
24
44
|
end
|
25
|
-
|
45
|
+
candidates << "mobile"
|
26
46
|
|
27
|
-
|
47
|
+
candidates.each do |v|
|
28
48
|
mobile_path = "#{template_path}_#{v}"
|
29
|
-
if
|
30
|
-
|
49
|
+
if partial
|
50
|
+
# ActionView::PartialTemplate#extract_partial_name_and_path の動作を模倣
|
51
|
+
if mobile_path.include?('/')
|
52
|
+
path = File.dirname(mobile_path)
|
53
|
+
partial_name = File.basename(mobile_path)
|
54
|
+
else
|
55
|
+
path = self.controller.class.controller_path
|
56
|
+
partial_name = mobile_path
|
57
|
+
end
|
58
|
+
full_path = File.join(path, "_#{partial_name}")
|
59
|
+
else
|
60
|
+
full_path = mobile_path
|
61
|
+
end
|
62
|
+
if finder.file_exists?(full_path)
|
63
|
+
return mobile_path
|
31
64
|
end
|
32
65
|
end
|
33
66
|
end
|
34
|
-
|
67
|
+
return nil
|
35
68
|
end
|
36
69
|
end
|
@@ -20,25 +20,27 @@ module Jpmobile::Mobile
|
|
20
20
|
# 端末を識別する文字列があれば返す。
|
21
21
|
def ident_device; nil; end
|
22
22
|
|
23
|
-
# IPアドレスデータ
|
24
|
-
IP_ADDRESSES = nil
|
25
|
-
|
26
23
|
# 当該キャリアのIPアドレス帯域からのアクセスであれば +true+ を返す。
|
27
24
|
# そうでなければ +false+ を返す。
|
28
25
|
# IP空間が定義されていない場合は +nil+ を返す。
|
29
|
-
def valid_ip?
|
30
|
-
addrs =
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
return
|
26
|
+
def self.valid_ip? remote_addr
|
27
|
+
addrs = nil
|
28
|
+
begin
|
29
|
+
addrs = self::IP_ADDRESSES
|
30
|
+
rescue NameError => e
|
31
|
+
return nil
|
35
32
|
end
|
36
|
-
|
33
|
+
remote = IPAddr.new(remote_addr)
|
34
|
+
addrs.any? {|ip| ip.include? remote }
|
35
|
+
end
|
36
|
+
|
37
|
+
def valid_ip?
|
38
|
+
@__valid_ip ||= self.class.valid_ip? @request.remote_addr
|
37
39
|
end
|
38
40
|
|
39
41
|
# 画面情報を +Display+ クラスのインスタンスで返す。
|
40
42
|
def display
|
41
|
-
Jpmobile::Display.new
|
43
|
+
@__displlay ||= Jpmobile::Display.new
|
42
44
|
end
|
43
45
|
|
44
46
|
# クッキーをサポートしているか。
|
@@ -49,7 +51,11 @@ module Jpmobile::Mobile
|
|
49
51
|
private
|
50
52
|
# リクエストのパラメータ。
|
51
53
|
def params
|
52
|
-
@request.parameters
|
54
|
+
if @request.respond_to? :parameters
|
55
|
+
@request.parameters
|
56
|
+
else
|
57
|
+
@request.params
|
58
|
+
end
|
53
59
|
end
|
54
60
|
end
|
55
61
|
end
|
data/lib/jpmobile/mobile/au.rb
CHANGED
@@ -6,7 +6,10 @@ module Jpmobile::Mobile
|
|
6
6
|
# ==au携帯電話
|
7
7
|
# CDMA 1X, CDMA 1X WINを含む。
|
8
8
|
class Au < AbstractMobile
|
9
|
+
autoload :IP_ADDRESSES, 'jpmobile/mobile/z_ip_addresses_au'
|
10
|
+
|
9
11
|
# 対応するUser-Agentの正規表現
|
12
|
+
# User-Agent文字列中に "UP.Browser" を含むVodafoneの端末があるので注意が必要
|
10
13
|
USER_AGENT_REGEXP = /^(?:KDDI|UP.Browser\/.+?)-(.+?) /
|
11
14
|
# 簡易位置情報取得に対応していないデバイスID
|
12
15
|
# http://www.au.kddi.com/ezfactory/tec/spec/eznavi.html
|
@@ -22,7 +25,8 @@ module Jpmobile::Mobile
|
|
22
25
|
|
23
26
|
# 位置情報があれば Position のインスタンスを返す。無ければ +nil+ を返す。
|
24
27
|
def position
|
25
|
-
return
|
28
|
+
return @__posotion if defined? @__posotion
|
29
|
+
return @__posotion = nil if ( params["lat"].nil? || params['lat'] == '' || params["lon"].nil? || params["lon"] == '' )
|
26
30
|
l = Jpmobile::Position.new
|
27
31
|
l.options = params.reject {|x,v| !["ver", "datum", "unit", "lat", "lon", "alt", "time", "smaj", "smin", "vert", "majaa", "fm"].include?(x) }
|
28
32
|
case params["unit"]
|
@@ -35,7 +39,7 @@ module Jpmobile::Mobile
|
|
35
39
|
raise "Invalid dms form" unless params["lon"] =~ /^([+-]?\d+)\.(\d+)\.(\d+\.\d+)$/
|
36
40
|
l.lon = Jpmobile::Position.dms2deg($1,$2,$3)
|
37
41
|
else
|
38
|
-
return nil
|
42
|
+
return @__posotion = nil
|
39
43
|
end
|
40
44
|
if params["datum"] == "1"
|
41
45
|
# ただし、params["datum"]=="tokyo"のとき(簡易位置情報)のときは、
|
@@ -43,11 +47,13 @@ module Jpmobile::Mobile
|
|
43
47
|
# http://www.au.kddi.com/ezfactory/tec/spec/eznavi.html
|
44
48
|
l.tokyo2wgs84!
|
45
49
|
end
|
46
|
-
return l
|
50
|
+
return @__posotion = l
|
47
51
|
end
|
48
52
|
|
49
53
|
# 画面情報を +Display+ クラスのインスタンスで返す。
|
50
54
|
def display
|
55
|
+
return @__display if @__display
|
56
|
+
|
51
57
|
p_w = p_h = col_p = cols = nil
|
52
58
|
if r = @request.env['HTTP_X_UP_DEVCAP_SCREENPIXELS']
|
53
59
|
p_w, p_h = r.split(/,/,2).map {|x| x.to_i}
|
@@ -59,12 +65,12 @@ module Jpmobile::Mobile
|
|
59
65
|
a = r.split(/,/)
|
60
66
|
cols = 2 ** a[0].to_i
|
61
67
|
end
|
62
|
-
Jpmobile::Display.new(p_w, p_h, nil, nil, col_p, cols)
|
68
|
+
@__display = Jpmobile::Display.new(p_w, p_h, nil, nil, col_p, cols)
|
63
69
|
end
|
64
70
|
|
65
71
|
# デバイスIDを返す
|
66
72
|
def device_id
|
67
|
-
if @request.
|
73
|
+
if @request.env['HTTP_USER_AGENT'] =~ USER_AGENT_REGEXP
|
68
74
|
return $1
|
69
75
|
else
|
70
76
|
nil
|
@@ -3,6 +3,9 @@
|
|
3
3
|
module Jpmobile::Mobile
|
4
4
|
# ==DoCoMo携帯電話
|
5
5
|
class Docomo < AbstractMobile
|
6
|
+
autoload :IP_ADDRESSES, 'jpmobile/mobile/z_ip_addresses_docomo'
|
7
|
+
autoload :DISPLAY_INFO, 'jpmobile/mobile/z_display_info_docomo'
|
8
|
+
|
6
9
|
# 対応するUser-Agentの正規表現
|
7
10
|
USER_AGENT_REGEXP = /^DoCoMo/
|
8
11
|
|
@@ -17,19 +20,23 @@ module Jpmobile::Mobile
|
|
17
20
|
|
18
21
|
# 位置情報があれば Position のインスタンスを返す。無ければ +nil+ を返す。
|
19
22
|
def position
|
20
|
-
return
|
21
|
-
|
23
|
+
return @__position if defined? @__position
|
24
|
+
lat = params["lat"] || params["LAT"]
|
25
|
+
lon = params["lon"] || params["LON"]
|
26
|
+
geo = params["geo"] || params["GEO"]
|
27
|
+
return @__position = nil if ( lat.nil? || lat == '' || lon.nil? || lon == '' )
|
28
|
+
raise "Unsuppoted datum" if geo.downcase != "wgs84"
|
22
29
|
pos = Jpmobile::Position.new
|
23
|
-
raise "Unsuppoted" unless
|
30
|
+
raise "Unsuppoted" unless lat =~ /^([+-]\d+)\.(\d+)\.(\d+\.\d+)/
|
24
31
|
pos.lat = Jpmobile::Position.dms2deg($1,$2,$3)
|
25
|
-
raise "Unsuppoted" unless
|
32
|
+
raise "Unsuppoted" unless lon =~ /^([+-]\d+)\.(\d+)\.(\d+\.\d+)/
|
26
33
|
pos.lon = Jpmobile::Position.dms2deg($1,$2,$3)
|
27
|
-
return pos
|
34
|
+
return @__position = pos
|
28
35
|
end
|
29
36
|
|
30
37
|
# 端末製造番号があれば返す。無ければ +nil+ を返す。
|
31
38
|
def serial_number
|
32
|
-
case @request.
|
39
|
+
case @request.env["HTTP_USER_AGENT"]
|
33
40
|
when /ser([0-9a-zA-Z]{11})$/ # mova
|
34
41
|
return $1
|
35
42
|
when /ser([0-9a-zA-Z]{15});/ # FOMA
|
@@ -42,14 +49,23 @@ module Jpmobile::Mobile
|
|
42
49
|
|
43
50
|
# FOMAカード製造番号があれば返す。無ければ +nil+ を返す。
|
44
51
|
def icc
|
45
|
-
@request.
|
52
|
+
@request.env['HTTP_USER_AGENT'] =~ /icc([0-9a-zA-Z]{20})\)/
|
46
53
|
return $1
|
47
54
|
end
|
48
|
-
|
55
|
+
|
56
|
+
# iモードIDを返す。
|
57
|
+
def guid
|
58
|
+
@request.env['HTTP_X_DCMGUID']
|
59
|
+
end
|
60
|
+
|
61
|
+
# iモードID, FOMAカード製造番号の順で調べ、あるものを返す。なければ +nil+ を返す。
|
62
|
+
def ident_subscriber
|
63
|
+
guid || icc
|
64
|
+
end
|
49
65
|
|
50
66
|
# 画面情報を +Display+ クラスのインスタンスで返す。
|
51
67
|
def display
|
52
|
-
Jpmobile::Display.new(nil,nil,
|
68
|
+
@__display ||= Jpmobile::Display.new(nil,nil,
|
53
69
|
display_info[:browser_width],
|
54
70
|
display_info[:browser_height],
|
55
71
|
display_info[:color_p],
|
@@ -63,9 +79,9 @@ module Jpmobile::Mobile
|
|
63
79
|
private
|
64
80
|
# モデル名を返す。
|
65
81
|
def model_name
|
66
|
-
if @request.
|
82
|
+
if @request.env["HTTP_USER_AGENT"] =~ /^DoCoMo\/2.0 (.+)\(/
|
67
83
|
return $1
|
68
|
-
elsif @request.
|
84
|
+
elsif @request.env["HTTP_USER_AGENT"] =~ /^DoCoMo\/1.0\/(.+?)\//
|
69
85
|
return $1
|
70
86
|
end
|
71
87
|
return nil
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# =EMOBILE携帯電話
|
2
|
+
|
3
|
+
module Jpmobile::Mobile
|
4
|
+
# ==EMOBILE携帯電話
|
5
|
+
class Emobile < AbstractMobile
|
6
|
+
autoload :IP_ADDRESSES, 'jpmobile/mobile/z_ip_addresses_emobile'
|
7
|
+
|
8
|
+
USER_AGENT_REGEXP = %r{^emobile/|^Mozilla/5.0 \(H11T; like Gecko; OpenBrowser\) NetFront/3.4$|^Mozilla/4.0 \(compatible; MSIE 6.0; Windows CE; IEMobile 7.7\) S11HT$}
|
9
|
+
# EMnet対応端末から通知されるユニークなユーザIDを取得する。
|
10
|
+
def em_uid
|
11
|
+
@request.env['HTTP_X_EM_UID']
|
12
|
+
end
|
13
|
+
alias :ident_subscriber :em_uid
|
14
|
+
end
|
15
|
+
end
|
@@ -7,12 +7,14 @@ module Jpmobile::Mobile
|
|
7
7
|
# ==Softbank携帯電話
|
8
8
|
# Vodafone, Jphoneのスーパクラス。
|
9
9
|
class Softbank < AbstractMobile
|
10
|
+
autoload :IP_ADDRESSES, 'jpmobile/mobile/z_ip_addresses_softbank'
|
11
|
+
|
10
12
|
# 対応するuser-agentの正規表現
|
11
|
-
USER_AGENT_REGEXP = /^SoftBank/
|
13
|
+
USER_AGENT_REGEXP = /^(SoftBank|Semulator)/
|
12
14
|
|
13
15
|
# 製造番号を返す。無ければ +nil+ を返す。
|
14
16
|
def serial_number
|
15
|
-
@request.
|
17
|
+
@request.env['HTTP_USER_AGENT'] =~ /SN(.+?) /
|
16
18
|
return $1
|
17
19
|
end
|
18
20
|
alias :ident_device :serial_number
|
@@ -25,20 +27,22 @@ module Jpmobile::Mobile
|
|
25
27
|
|
26
28
|
# 位置情報があれば Position のインスタンスを返す。無ければ +nil+ を返す。
|
27
29
|
def position
|
30
|
+
return @__position if defined? @__position
|
28
31
|
if params["pos"] =~ /^([NS])(\d+)\.(\d+)\.(\d+\.\d+)([WE])(\d+)\.(\d+)\.(\d+\.\d+)$/
|
29
32
|
raise "Unsupported datum" if params["geo"] != "wgs84"
|
30
33
|
l = Jpmobile::Position.new
|
31
34
|
l.lat = ($1=="N" ? 1 : -1) * Jpmobile::Position.dms2deg($2,$3,$4)
|
32
35
|
l.lon = ($5=="E" ? 1 : -1) * Jpmobile::Position.dms2deg($6,$7,$8)
|
33
36
|
l.options = params.reject {|x,v| !["pos","geo","x-acr"].include?(x) }
|
34
|
-
return l
|
37
|
+
return @__position = l
|
35
38
|
else
|
36
|
-
return nil
|
39
|
+
return @__position = nil
|
37
40
|
end
|
38
41
|
end
|
39
42
|
|
40
43
|
# 画面情報を +Display+ クラスのインスタンスで返す。
|
41
44
|
def display
|
45
|
+
return @__display if @__display
|
42
46
|
p_w = p_h = col_p = cols = nil
|
43
47
|
if r = @request.env['HTTP_X_JPHONE_DISPLAY']
|
44
48
|
p_w, p_h = r.split(/\*/,2).map {|x| x.to_i}
|
@@ -54,7 +58,7 @@ module Jpmobile::Mobile
|
|
54
58
|
cols = $1.to_i
|
55
59
|
end
|
56
60
|
end
|
57
|
-
Jpmobile::Display.new(p_w, p_h, nil, nil, col_p, cols)
|
61
|
+
@__display = Jpmobile::Display.new(p_w, p_h, nil, nil, col_p, cols)
|
58
62
|
end
|
59
63
|
|
60
64
|
# cookieに対応しているか?
|
@@ -66,7 +70,7 @@ module Jpmobile::Mobile
|
|
66
70
|
# スーパクラスはSoftbank。
|
67
71
|
class Vodafone < Softbank
|
68
72
|
# 対応するUser-Agentの正規表現
|
69
|
-
USER_AGENT_REGEXP = /^Vodafone/
|
73
|
+
USER_AGENT_REGEXP = /^(Vodafone|Vemulator)/
|
70
74
|
|
71
75
|
# cookieに対応しているか?
|
72
76
|
def supports_cookie?
|
@@ -77,7 +81,7 @@ module Jpmobile::Mobile
|
|
77
81
|
# スーパクラスはVodafone。
|
78
82
|
class Jphone < Vodafone
|
79
83
|
# 対応するUser-Agentの正規表現
|
80
|
-
USER_AGENT_REGEXP = /^J-PHONE/
|
84
|
+
USER_AGENT_REGEXP = /^(J-PHONE|J-EMULATOR)/
|
81
85
|
|
82
86
|
# 位置情報があれば Position のインスタンスを返す。無ければ +nil+ を返す。
|
83
87
|
def position
|
@@ -5,18 +5,21 @@ module Jpmobile::Mobile
|
|
5
5
|
# ==Willcom携帯電話
|
6
6
|
# Ddipocketのスーパクラス。
|
7
7
|
class Willcom < AbstractMobile
|
8
|
+
autoload :IP_ADDRESSES, 'jpmobile/mobile/z_ip_addresses_willcom'
|
9
|
+
|
8
10
|
# 対応するUser-Agentの正規表現
|
9
11
|
USER_AGENT_REGEXP = /^Mozilla\/3.0\(WILLCOM/
|
10
12
|
|
11
13
|
# 位置情報があれば Position のインスタンスを返す。無ければ +nil+ を返す。
|
12
14
|
def position
|
13
|
-
return
|
15
|
+
return @__position if defined? @__position
|
16
|
+
return @__position = nil if ( params["pos"].nil? || params['pos'] == '' )
|
14
17
|
raise "unsupported format" unless params["pos"] =~ /^N(\d\d)\.(\d\d)\.(\d\d\.\d\d\d)E(\d\d\d)\.(\d\d)\.(\d\d\.\d\d\d)$/
|
15
18
|
pos = Jpmobile::Position.new
|
16
19
|
pos.lat = Jpmobile::Position.dms2deg($1,$2,$3)
|
17
20
|
pos.lon = Jpmobile::Position.dms2deg($4,$5,$6)
|
18
21
|
pos.tokyo2wgs84!
|
19
|
-
return pos
|
22
|
+
return @__position = pos
|
20
23
|
end
|
21
24
|
# cookieに対応しているか?
|
22
25
|
def supports_cookie?
|