jpmobile 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/README +32 -10
  2. data/Rakefile +8 -8
  3. data/doc/classes/ActionController.html +120 -0
  4. data/doc/classes/ActionController/AbstractRequest.html +118 -0
  5. data/doc/classes/ActionController/CgiRequest.html +160 -0
  6. data/doc/classes/ActionView.html +101 -0
  7. data/doc/classes/DatumConv.html +324 -0
  8. data/doc/classes/Jpmobile/Display.html +333 -0
  9. data/doc/classes/Jpmobile/Emoticon.html +467 -0
  10. data/doc/classes/Jpmobile/Filter.html +120 -0
  11. data/doc/classes/Jpmobile/Filter/ApplyOnlyForMobile.html +172 -0
  12. data/doc/classes/Jpmobile/Filter/Base.html +269 -0
  13. data/doc/classes/Jpmobile/Filter/Emoticon.html +118 -0
  14. data/doc/classes/Jpmobile/Filter/Emoticon/Inner.html +184 -0
  15. data/doc/classes/Jpmobile/Filter/Emoticon/Outer.html +207 -0
  16. data/doc/classes/Jpmobile/Filter/FilterTable.html +178 -0
  17. data/doc/classes/Jpmobile/Filter/HankakuKana.html +126 -0
  18. data/doc/classes/Jpmobile/Filter/Sjis.html +271 -0
  19. data/doc/classes/Jpmobile/Helpers.html +588 -0
  20. data/doc/classes/Jpmobile/Mobile.html +150 -0
  21. data/doc/classes/Jpmobile/Mobile/AbstractMobile.html +389 -0
  22. data/doc/classes/Jpmobile/Mobile/Au.html +420 -0
  23. data/doc/classes/Jpmobile/Mobile/Ddipocket.html +138 -0
  24. data/doc/classes/Jpmobile/Mobile/Docomo.html +411 -0
  25. data/doc/classes/Jpmobile/Mobile/Emobile.html +183 -0
  26. data/doc/classes/Jpmobile/Mobile/Jphone.html +212 -0
  27. data/doc/classes/Jpmobile/Mobile/Softbank.html +344 -0
  28. data/doc/classes/Jpmobile/Mobile/Vodafone.html +176 -0
  29. data/doc/classes/Jpmobile/Mobile/Willcom.html +211 -0
  30. data/doc/classes/Jpmobile/Position.html +384 -0
  31. data/doc/classes/Jpmobile/RequestWithMobile.html +263 -0
  32. data/doc/created.rid +1 -0
  33. data/doc/files/CHANGELOG.html +110 -0
  34. data/doc/files/README.html +455 -0
  35. data/doc/files/lib/jpmobile/datum_conv_rb.html +110 -0
  36. data/doc/files/lib/jpmobile/emoticon/au_rb.html +124 -0
  37. data/doc/files/lib/jpmobile/emoticon/conversion_table_rb.html +124 -0
  38. data/doc/files/lib/jpmobile/emoticon/docomo_rb.html +119 -0
  39. data/doc/files/lib/jpmobile/emoticon/softbank_rb.html +119 -0
  40. data/doc/files/lib/jpmobile/emoticon/z_combine_rb.html +101 -0
  41. data/doc/files/lib/jpmobile/emoticon_rb.html +101 -0
  42. data/doc/files/lib/jpmobile/filter_rb.html +115 -0
  43. data/doc/files/lib/jpmobile/helpers_rb.html +105 -0
  44. data/doc/files/lib/jpmobile/hook_abstract_request_rb.html +108 -0
  45. data/doc/files/lib/jpmobile/hook_action_controller_rb.html +101 -0
  46. data/doc/files/lib/jpmobile/hook_action_view_rb.html +110 -0
  47. data/doc/files/lib/jpmobile/mobile/abstract_mobile_rb.html +108 -0
  48. data/doc/files/lib/jpmobile/mobile/au_rb.html +112 -0
  49. data/doc/files/lib/jpmobile/mobile/display_rb.html +111 -0
  50. data/doc/files/lib/jpmobile/mobile/docomo_rb.html +105 -0
  51. data/doc/files/lib/jpmobile/mobile/emobile_rb.html +105 -0
  52. data/doc/files/lib/jpmobile/mobile/softbank_rb.html +115 -0
  53. data/doc/files/lib/jpmobile/mobile/willcom_rb.html +108 -0
  54. data/doc/files/lib/jpmobile/mobile/z_display_info_docomo_rb.html +114 -0
  55. data/doc/files/lib/jpmobile/mobile/z_ip_addresses_au_rb.html +114 -0
  56. data/doc/files/lib/jpmobile/mobile/z_ip_addresses_docomo_rb.html +124 -0
  57. data/doc/files/lib/jpmobile/mobile/z_ip_addresses_emobile_rb.html +111 -0
  58. data/doc/files/lib/jpmobile/mobile/z_ip_addresses_softbank_rb.html +124 -0
  59. data/doc/files/lib/jpmobile/mobile/z_ip_addresses_willcom_rb.html +114 -0
  60. data/doc/files/lib/jpmobile/position_rb.html +105 -0
  61. data/doc/files/lib/jpmobile/request_with_mobile_rb.html +111 -0
  62. data/doc/files/lib/jpmobile/trans_sid_rb.html +118 -0
  63. data/doc/files/lib/jpmobile/version_rb.html +101 -0
  64. data/doc/files/lib/jpmobile_rb.html +101 -0
  65. data/doc/fr_class_index.html +55 -0
  66. data/doc/fr_file_index.html +58 -0
  67. data/doc/fr_method_index.html +134 -0
  68. data/doc/index.html +24 -0
  69. data/doc/rdoc-style.css +208 -0
  70. data/lib/jpmobile.rb +32 -1
  71. data/lib/jpmobile/emoticon.rb +18 -0
  72. data/lib/jpmobile/emoticon/au.rb +643 -0
  73. data/lib/jpmobile/filter.rb +5 -1
  74. data/lib/jpmobile/helpers.rb +9 -1
  75. data/lib/jpmobile/hook_abstract_request.rb +3 -24
  76. data/lib/jpmobile/hook_action_controller.rb +2 -2
  77. data/lib/jpmobile/hook_action_view.rb +41 -8
  78. data/lib/jpmobile/mobile/abstract_mobile.rb +18 -12
  79. data/lib/jpmobile/mobile/au.rb +11 -5
  80. data/lib/jpmobile/mobile/docomo.rb +27 -11
  81. data/lib/jpmobile/mobile/emobile.rb +15 -0
  82. data/lib/jpmobile/mobile/softbank.rb +11 -7
  83. data/lib/jpmobile/mobile/willcom.rb +5 -2
  84. data/lib/jpmobile/mobile/z_display_info_docomo.rb +343 -219
  85. data/lib/jpmobile/mobile/z_ip_addresses_au.rb +4 -1
  86. data/lib/jpmobile/mobile/z_ip_addresses_docomo.rb +10 -0
  87. data/lib/jpmobile/mobile/z_ip_addresses_emobile.rb +10 -0
  88. data/lib/jpmobile/mobile/{z_ip_addresses.rb → z_ip_addresses_softbank.rb} +2 -13
  89. data/lib/jpmobile/mobile/z_ip_addresses_willcom.rb +20 -1
  90. data/lib/jpmobile/position.rb +2 -2
  91. data/lib/jpmobile/request_with_mobile.rb +44 -0
  92. data/lib/jpmobile/trans_sid.rb +52 -14
  93. data/lib/jpmobile/version.rb +1 -1
  94. data/test/au_test.rb +94 -63
  95. data/test/autoload_test.rb +49 -0
  96. data/test/docomo_test.rb +92 -59
  97. data/test/emoticon_functional_test.rb +30 -3
  98. data/test/filter_test.rb +0 -64
  99. data/test/helper.rb +8 -1
  100. data/test/helpers_test.rb +14 -13
  101. data/test/softbank_test.rb +113 -85
  102. data/test/willcom_test.rb +30 -20
  103. data/tools/generate_au_emoticon_table.rb +12 -3
  104. data/tools/update_display_info_docomo.rb +0 -0
  105. data/tools/update_ip_addresses_au.rb +1 -1
  106. data/tools/update_ip_addresses_willcom.rb +1 -1
  107. metadata +135 -54
  108. data/test/filter_functional_test.rb +0 -146
@@ -90,7 +90,11 @@ module Jpmobile
90
90
  end
91
91
  # afterfilterを実行した後に実行する。
92
92
  def after_after(controller)
93
- controller.response.charset = "Shift_JIS"
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)
@@ -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
- "http://w1m.docomo.ne.jp/cp/iarea?ecode=OPENAREACODE&msn=OPENAREAKEY&nl=#{CGI.escape(url_for(options))}"
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
- # ActionController::AbstractRequest を拡張して jpmobile の各機能を提供する。
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
- # 携帯電話の機種に応じて Mobile::xxx を返す。
18
- # 携帯電話でない場合はnilを返す。
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 = request.mobile? ? 'ja' : nil
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 render_file_without_mobile render_file #:nodoc:
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
- vals = []
39
+ candidates = []
20
40
  c = m.class
21
41
  while c != Jpmobile::Mobile::AbstractMobile
22
- vals << "mobile_"+c.to_s.split(/::/).last.downcase
42
+ candidates << "mobile_"+c.to_s.split(/::/).last.downcase
23
43
  c = c.superclass
24
44
  end
25
- vals << "mobile"
45
+ candidates << "mobile"
26
46
 
27
- vals.each do |v|
47
+ candidates.each do |v|
28
48
  mobile_path = "#{template_path}_#{v}"
29
- if file_exists?(mobile_path)
30
- return render_file_without_mobile(mobile_path, use_full_path, local_assigns)
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
- render_file_without_mobile(template_path, use_full_path, local_assigns)
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 = self.class::IP_ADDRESSES
31
- return nil if addrs.nil?
32
- remote = IPAddr.new(@request.remote_ip)
33
- addrs.each do |s|
34
- return true if IPAddr.new(s.chomp).include?(remote)
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
- return false
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
@@ -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 nil if params["lat"].blank? || params["lon"].blank?
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.user_agent =~ USER_AGENT_REGEXP
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 nil if params["lat"].blank? || params["lon"].blank?
21
- raise "Unsuppoted datum" if params["geo"].downcase != "wgs84"
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 params["lat"] =~ /^([+-]\d+)\.(\d+)\.(\d+\.\d+)/
30
+ raise "Unsuppoted" unless lat =~ /^([+-]\d+)\.(\d+)\.(\d+\.\d+)/
24
31
  pos.lat = Jpmobile::Position.dms2deg($1,$2,$3)
25
- raise "Unsuppoted" unless params["lon"] =~ /^([+-]\d+)\.(\d+)\.(\d+\.\d+)/
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.user_agent
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.user_agent =~ /icc([0-9a-zA-Z]{20})\)/
52
+ @request.env['HTTP_USER_AGENT'] =~ /icc([0-9a-zA-Z]{20})\)/
46
53
  return $1
47
54
  end
48
- alias :ident_subscriber :icc
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.user_agent =~ /^DoCoMo\/2.0 (.+)\(/
82
+ if @request.env["HTTP_USER_AGENT"] =~ /^DoCoMo\/2.0 (.+)\(/
67
83
  return $1
68
- elsif @request.user_agent =~ /^DoCoMo\/1.0\/(.+?)\//
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.user_agent =~ /SN(.+?) /
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 nil if params["pos"].blank?
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?