jpmobile 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. data/README +41 -4
  2. data/Rakefile +11 -9
  3. data/lib/jpmobile.rb +0 -6
  4. data/lib/jpmobile/emoticon.rb +105 -0
  5. data/lib/jpmobile/emoticon/au.rb +644 -0
  6. data/lib/jpmobile/emoticon/conversion_table.rb +3908 -0
  7. data/lib/jpmobile/emoticon/docomo.rb +255 -0
  8. data/lib/jpmobile/emoticon/softbank.rb +477 -0
  9. data/lib/jpmobile/emoticon/z_combine.rb +20 -0
  10. data/lib/jpmobile/filter.rb +73 -51
  11. data/lib/jpmobile/helpers.rb +4 -4
  12. data/lib/jpmobile/hook_abstract_request.rb +6 -2
  13. data/lib/jpmobile/hook_action_controller.rb +10 -0
  14. data/lib/jpmobile/hook_action_view.rb +7 -0
  15. data/lib/jpmobile/mobile/abstract_mobile.rb +5 -1
  16. data/lib/jpmobile/mobile/au.rb +1 -1
  17. data/lib/jpmobile/mobile/docomo.rb +2 -5
  18. data/lib/jpmobile/mobile/softbank.rb +9 -1
  19. data/lib/jpmobile/mobile/z_display_info_docomo.rb +32 -10
  20. data/lib/jpmobile/mobile/z_ip_addresses.rb +6 -6
  21. data/lib/jpmobile/mobile/z_ip_addresses_au.rb +2 -1
  22. data/lib/jpmobile/mobile/z_ip_addresses_willcom.rb +6 -1
  23. data/lib/jpmobile/trans_sid.rb +5 -2
  24. data/lib/jpmobile/version.rb +1 -1
  25. data/test/au_test.rb +1 -0
  26. data/test/docomo_test.rb +8 -0
  27. data/test/emoticon_functional_test.rb +166 -0
  28. data/test/emoticon_test.rb +58 -0
  29. data/test/filter_functional_test.rb +146 -0
  30. data/test/filter_test.rb +8 -8
  31. data/test/softbank_test.rb +18 -0
  32. data/tools/generate_au_emoticon_table.rb +25 -0
  33. data/tools/{update_emoji_docomo.rb → generate_docomo_emoticon_table.rb} +4 -8
  34. data/tools/generate_emoticon_conversion_table.rb +107 -0
  35. data/tools/generate_softbank_emoticon_table.rb +32 -0
  36. data/tools/update_display_info_docomo.rb +3 -5
  37. metadata +18 -75
  38. data/NOTES +0 -21
  39. data/TODO +0 -16
  40. data/doc/classes/ActionController.html +0 -107
  41. data/doc/classes/ActionController/AbstractRequest.html +0 -216
  42. data/doc/classes/ActionView.html +0 -101
  43. data/doc/classes/DatumConv.html +0 -324
  44. data/doc/classes/Jpmobile/Display.html +0 -333
  45. data/doc/classes/Jpmobile/Filter.html +0 -119
  46. data/doc/classes/Jpmobile/Filter/Base.html +0 -269
  47. data/doc/classes/Jpmobile/Filter/Emoji.html +0 -130
  48. data/doc/classes/Jpmobile/Filter/Emoji/Inner.html +0 -183
  49. data/doc/classes/Jpmobile/Filter/Emoji/Outer.html +0 -187
  50. data/doc/classes/Jpmobile/Filter/FilterTable.html +0 -178
  51. data/doc/classes/Jpmobile/Filter/HankakuKana.html +0 -170
  52. data/doc/classes/Jpmobile/Filter/Sjis.html +0 -244
  53. data/doc/classes/Jpmobile/Helpers.html +0 -558
  54. data/doc/classes/Jpmobile/Mobile.html +0 -141
  55. data/doc/classes/Jpmobile/Mobile/AbstractMobile.html +0 -324
  56. data/doc/classes/Jpmobile/Mobile/Au.html +0 -415
  57. data/doc/classes/Jpmobile/Mobile/Ddipocket.html +0 -138
  58. data/doc/classes/Jpmobile/Mobile/Docomo.html +0 -366
  59. data/doc/classes/Jpmobile/Mobile/Jphone.html +0 -212
  60. data/doc/classes/Jpmobile/Mobile/Softbank.html +0 -300
  61. data/doc/classes/Jpmobile/Mobile/Vodafone.html +0 -176
  62. data/doc/classes/Jpmobile/Mobile/Willcom.html +0 -210
  63. data/doc/classes/Jpmobile/Position.html +0 -384
  64. data/doc/created.rid +0 -1
  65. data/doc/files/CHANGELOG.html +0 -110
  66. data/doc/files/NOTES.html +0 -163
  67. data/doc/files/README.html +0 -345
  68. data/doc/files/TODO.html +0 -138
  69. data/doc/files/lib/jpmobile/datum_conv_rb.html +0 -110
  70. data/doc/files/lib/jpmobile/filter_rb.html +0 -115
  71. data/doc/files/lib/jpmobile/helpers_rb.html +0 -105
  72. data/doc/files/lib/jpmobile/hook_abstract_request_rb.html +0 -109
  73. data/doc/files/lib/jpmobile/hook_action_view_rb.html +0 -119
  74. data/doc/files/lib/jpmobile/mobile/abstract_mobile_rb.html +0 -108
  75. data/doc/files/lib/jpmobile/mobile/au_rb.html +0 -112
  76. data/doc/files/lib/jpmobile/mobile/display_rb.html +0 -111
  77. data/doc/files/lib/jpmobile/mobile/docomo_rb.html +0 -105
  78. data/doc/files/lib/jpmobile/mobile/softbank_rb.html +0 -115
  79. data/doc/files/lib/jpmobile/mobile/willcom_rb.html +0 -108
  80. data/doc/files/lib/jpmobile/mobile/z_display_info_docomo_rb.html +0 -114
  81. data/doc/files/lib/jpmobile/mobile/z_emoji_docomo_rb.html +0 -119
  82. data/doc/files/lib/jpmobile/mobile/z_ip_addresses_au_rb.html +0 -114
  83. data/doc/files/lib/jpmobile/mobile/z_ip_addresses_rb.html +0 -117
  84. data/doc/files/lib/jpmobile/mobile/z_ip_addresses_willcom_rb.html +0 -114
  85. data/doc/files/lib/jpmobile/position_rb.html +0 -105
  86. data/doc/files/lib/jpmobile/trans_sid_rb.html +0 -114
  87. data/doc/files/lib/jpmobile/version_rb.html +0 -101
  88. data/doc/files/lib/jpmobile_rb.html +0 -101
  89. data/doc/fr_class_index.html +0 -50
  90. data/doc/fr_file_index.html +0 -50
  91. data/doc/fr_method_index.html +0 -113
  92. data/doc/index.html +0 -24
  93. data/doc/rdoc-style.css +0 -208
  94. data/lib/jpmobile/mobile/z_emoji_docomo.rb +0 -508
  95. data/test/firefox_test.rb +0 -8
  96. data/test/transitsid_test.rb +0 -86
@@ -0,0 +1,20 @@
1
+ $KCODE='u'
2
+ module Jpmobile
3
+ module Emoticon
4
+ SJIS_TO_UNICODE = {}
5
+ SJIS_TO_UNICODE.update(DOCOMO_SJIS_TO_UNICODE)
6
+ SJIS_TO_UNICODE.update(AU_SJIS_TO_UNICODE)
7
+ SJIS_TO_UNICODE.freeze
8
+ UNICODE_TO_SJIS = SJIS_TO_UNICODE.invert.freeze
9
+
10
+ SJIS_REGEXP = Regexp.union(*SJIS_TO_UNICODE.keys.map{|s| Regexp.compile(Regexp.escape([s].pack('n'),"s"),nil,'s')})
11
+ SOFTBANK_WEBCODE_REGEXP = Regexp.union(*([/(?!)/n]+SOFTBANK_WEBCODE_TO_UNICODE.keys.map{|x| "\x1b\x24#{x}\x0f"}))
12
+
13
+ DOCOMO_SJIS_REGEXP = Regexp.union(*DOCOMO_SJIS_TO_UNICODE.keys.map{|s| Regexp.compile(Regexp.escape([s].pack('n'),"s"),nil,'s')})
14
+ AU_SJIS_REGEXP = Regexp.union(*AU_SJIS_TO_UNICODE.keys.map{|s| Regexp.compile(Regexp.escape([s].pack('n'),"s"),nil,'s')})
15
+ SOFTBANK_UNICODE_REGEXP = Regexp.union(*SOFTBANK_UNICODE_TO_WEBCODE.keys.map{|x| [x].pack('U')}).freeze
16
+
17
+ EMOTICON_UNICODES = UNICODE_TO_SJIS.keys|SOFTBANK_UNICODE_TO_WEBCODE.keys.map{|k|k+0x1000}
18
+ UTF8_REGEXP = Regexp.union(*EMOTICON_UNICODES.map{|x| [x].pack('U')}).freeze
19
+ end
20
+ end
@@ -5,10 +5,18 @@ require 'scanf'
5
5
 
6
6
  class ActionController::Base #:nodoc:
7
7
  def self.mobile_filter(options={})
8
- #around_filter Jpmobile::Filter::Emoji::Outer.new
8
+ options = {:emoticon=>true, :hankaku=>false}.update(options)
9
+
10
+ if options[:emoticon]
11
+ around_filter Jpmobile::Filter::Emoticon::Outer.new # 外部エンコーディング<->数値文字参照
12
+ end
9
13
  around_filter Jpmobile::Filter::Sjis.new
10
- #around_filter Jpmobile::Filter::Emoji::Inner.new
11
- around_filter Jpmobile::Filter::HankakuKana.new
14
+ if options[:emoticon]
15
+ around_filter Jpmobile::Filter::Emoticon::Inner.new # 数値文字参照<->UTF-8
16
+ end
17
+ if options[:hankaku]
18
+ around_filter Jpmobile::Filter::HankakuKana.new
19
+ end
12
20
  end
13
21
  end
14
22
 
@@ -26,7 +34,7 @@ module Jpmobile
26
34
  return unless @counter == 1
27
35
  if respond_to?(:to_internal) && apply_incoming?(controller)
28
36
  deep_each(controller.params) do |value|
29
- value = to_internal(value)
37
+ value = to_internal(value, controller)
30
38
  end
31
39
  end
32
40
  end
@@ -35,7 +43,7 @@ module Jpmobile
35
43
  @counter -= 1
36
44
  return unless @counter.zero?
37
45
  if respond_to?(:to_external) && apply_outgoing?(controller)
38
- controller.response.body = to_external(controller.response.body)
46
+ controller.response.body = to_external(controller.response.body, controller)
39
47
  after_after(controller) if respond_to? :after_after
40
48
  end
41
49
  end
@@ -59,33 +67,51 @@ module Jpmobile
59
67
  end
60
68
  end
61
69
 
70
+ # 携帯電話の場合にのみ適用したい場合に Jpmobile::Base の派生クラスに include する。
71
+ module ApplyOnlyForMobile
72
+ def apply_incoming?(controller)
73
+ controller.request.mobile?
74
+ end
75
+ def apply_outgoing?(controller)
76
+ [nil, "text/html", "application/xhtml+xml"].include?(controller.response.content_type) &&
77
+ controller.request.mobile?
78
+ end
79
+ end
80
+
62
81
  # Shift_JISとUnicodeのフィルタ(NKFを使用)
63
82
  class Sjis < Base
64
- def to_external(str)
83
+ # UTF-8からShift_JISに変換する。
84
+ def to_external(str, controller)
65
85
  NKF.nkf('-m0 -x -Ws', str)
66
86
  end
67
- def to_internal(str)
68
- NKF.nkf('-m0 -Sw', str)
87
+ # Shift_JISからUTF-8に変換する。
88
+ def to_internal(str, controller)
89
+ NKF.nkf('-m0 -x -Sw', str)
69
90
  end
91
+ # afterfilterを実行した後に実行する。
70
92
  def after_after(controller)
71
93
  controller.response.charset = "Shift_JIS"
72
94
  end
95
+ # to_internalを適用するべきかどうかを返す。
73
96
  def apply_incoming?(controller)
74
97
  # Vodafone 3G/Softbank(Shift-JISにすると絵文字で不具合が生じる)以外の
75
98
  # 携帯電話の場合に適用する。
76
99
  mobile = controller.request.mobile
77
100
  mobile && !(mobile.instance_of?(Jpmobile::Mobile::Vodafone)||mobile.instance_of?(Jpmobile::Mobile::Softbank))
78
101
  end
79
- alias apply_outgoing? apply_incoming?
102
+ def apply_outgoing?(controller)
103
+ [nil, "text/html", "application/xhtml+xml"].include?(controller.response.content_type) &&
104
+ apply_incoming?(controller)
105
+ end
80
106
  end
81
107
 
82
108
  # テーブルに基づくフィルタ
83
109
  class FilterTable < Base
84
110
  cattr_reader :internal, :external
85
- def to_internal(str)
111
+ def to_internal(str, controller)
86
112
  filter(str, external, internal)
87
113
  end
88
- def to_external(str)
114
+ def to_external(str, controller)
89
115
  filter(str, internal, external)
90
116
  end
91
117
  private
@@ -100,60 +126,56 @@ module Jpmobile
100
126
 
101
127
  # 半角カナと全角カナのフィルタ
102
128
  class HankakuKana < FilterTable
129
+ include ApplyOnlyForMobile
103
130
  @@internal = %w(ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ ヴ ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン ャ ュ ョ ァ ィ ゥ ェ ォ ッ ゛ ゜ ー ).freeze
104
131
  @@external = %w(ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ ヴ ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン ャ ュ ョ ァ ィ ゥ ェ ォ ッ ゙ ゚ ー).freeze
105
- def apply_incoming?(controller)
106
- # 携帯電話の場合に適用する。
107
- controller.request.mobile?
108
- end
109
- alias apply_outgoing? apply_incoming?
110
132
  end
111
133
 
112
- module Emoji
113
- DOCOMO_EMOJI_SJIS_REGEXP = /\xf8[\x9f-\xfc]|
114
- \xf9[\x40-\x49\x50-\x52\x55-\x57\x5b-\x5e\x72-\x7e\x80-\xfc]/x.freeze
115
- DOCOMO_EMOJI_UTF8_REGEXP = /\xee(?:\x98[\xbe-\xbf]|
116
- \x99[\x80-\xbf]|
117
- \x9a[\x80-\xa5\xac-\xae\xb1-\xb3\xb7-\xba]|
118
- \x9b[\x8e-\xbf]|
119
- \x9c[\x80-\xbf]|
120
- \x9d[\x80-\x97])/x.freeze
121
-
134
+ # 絵文字変換フィルタ
135
+ module Emoticon
122
136
  # 絵文字Outer
123
- # TODO: 機種依存の変換コードはここに載せる
137
+ # 外部エンコーディング(携帯電話側)とUnicode数値文字参照を相互に変換。
124
138
  class Outer < Base
125
- def to_internal(str)
126
- # DoCoMo Shift_JISバイナリ絵文字 を DoCoMo Unicode絵文字実体参照 に変換
127
- str.gsub(DOCOMO_EMOJI_SJIS_REGEXP) do |match|
128
- sjis = match.unpack('n').first
129
- unicode = DOCOMO_SJIS_TO_UNICODE[sjis]
130
- unicode ? ("&#x%04x;"%unicode) : match
139
+ include ApplyOnlyForMobile
140
+ def to_internal(str, controller)
141
+ method_name = "external_to_unicodecr_" +
142
+ controller.request.mobile.class.name[/::(\w*)$/, 1].downcase
143
+ if Jpmobile::Emoticon.respond_to?(method_name)
144
+ Jpmobile::Emoticon.send(method_name, str)
145
+ else
146
+ str # 対応する変換メソッドが定義されていない場合は素通し
131
147
  end
132
148
  end
133
- def to_external(str)
134
- # DoCoMo Unicode絵文字実体参照 を DoCoMo Shift_JISバイナリ絵文字 に変換
135
- str.gsub(/&#x([0-9a-fA-F]{4});/) do |match|
136
- unicode = $1.scanf("%x").first
137
- sjis = DOCOMO_UNICODE_TO_SJIS[unicode]
138
- sjis ? [sjis].pack('n') : match
149
+ def to_external(str, controller)
150
+ # 使用する変換テーブルの決定
151
+ table = nil
152
+ to_sjis = false
153
+ case controller.request.mobile
154
+ when Jpmobile::Mobile::Docomo
155
+ table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_DOCOMO
156
+ to_sjis = true
157
+ when Jpmobile::Mobile::Au
158
+ table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_AU
159
+ to_sjis = true
160
+ when Jpmobile::Mobile::Jphone
161
+ table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_SOFTBANK
162
+ to_sjis = true
163
+ when Jpmobile::Mobile::Softbank
164
+ table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_SOFTBANK
139
165
  end
166
+
167
+ Jpmobile::Emoticon::unicodecr_to_external(str, table, to_sjis)
140
168
  end
141
169
  end
142
-
143
170
  # 絵文字Inner
171
+ # Unicode数値文字参照とUTF-8を相互に変換
144
172
  class Inner < Base
145
- def to_internal(str)
146
- # DoCoMo Unicode絵文字実体参照 を DoCoMo UTF-8絵文字バイナリ に置換
147
- str.gsub(/&#x([0-9a-fA-F]{4});/) do |match|
148
- unicode = $1.scanf("%x").first
149
- DOCOMO_UNICODE_TO_SJIS[unicode] ? [unicode].pack('U') : match
150
- end
173
+ include ApplyOnlyForMobile
174
+ def to_internal(str, controller)
175
+ Jpmobile::Emoticon::unicodecr_to_utf8(str)
151
176
  end
152
- def to_external(str)
153
- # DoCoMo UTF-8絵文字バイナリ を DoCoMo Unicode絵文字実体参照 に置換
154
- str.gsub(DOCOMO_EMOJI_UTF8_REGEXP) do |match|
155
- "&#x%04x;" % match.unpack('U').first
156
- end
177
+ def to_external(str, controller)
178
+ Jpmobile::Emoticon::utf8_to_unicodecr(str)
157
179
  end
158
180
  end
159
181
  end
@@ -45,7 +45,7 @@ module Jpmobile
45
45
  def docomo_foma_gps_link_to(str, options={})
46
46
  options = options.symbolize_keys
47
47
  options[:only_path] = false
48
- return %{<a href="#{url_for(options)}" lcs>#{CGI.escapeHTML(str)}</a>}
48
+ return %{<a href="#{url_for(options)}" lcs>#{str}</a>}
49
49
  end
50
50
 
51
51
  # DoCoMoでオープンiエリアを取得するためのURLを返す。
@@ -64,7 +64,7 @@ module Jpmobile
64
64
  def docomo_utn_link_to(str, options={})
65
65
  options = options.symbolize_keys
66
66
  options[:only_path] = false
67
- return %{<a href="#{url_for(options)}" utn>#{CGI.escapeHTML(str)}</a>}
67
+ return %{<a href="#{url_for(options)}" utn>#{str}</a>}
68
68
  end
69
69
 
70
70
  # au GPS位置情報を取得するためのURLを返す。
@@ -97,7 +97,7 @@ module Jpmobile
97
97
  def jphone_location_link_to(str,options={})
98
98
  options = options.symbolize_keys
99
99
  options[:only_path] = false
100
- return %{<a z href="#{url_for(options)}">#{CGI.escapeHTML(str)}</a>}
100
+ return %{<a z href="#{url_for(options)}">#{str}</a>}
101
101
  end
102
102
 
103
103
  # Softbank(含むVodafone 3G)で位置情報を取得するためのURLを返す。
@@ -128,7 +128,7 @@ module Jpmobile
128
128
  private
129
129
  # 外部へのリンク
130
130
  def link_to_url(str, url)
131
- %{<a href="#{url}">#{CGI.escapeHTML(str)}</a>}
131
+ %{<a href="#{url}">#{str}</a>}
132
132
  end
133
133
  end
134
134
  end
@@ -4,12 +4,16 @@ class ActionController::AbstractRequest
4
4
  def user_agent
5
5
  env['HTTP_USER_AGENT']
6
6
  end
7
-
7
+ # 環境変数 HTTP_USER_AGENT を設定する。
8
+ def user_agent=(str)
9
+ self.env["HTTP_USER_AGENT"] = str
10
+ end
11
+
8
12
  # 携帯電話からであれば +true+を、そうでなければ +false+ を返す。
9
13
  def mobile?
10
14
  mobile != nil
11
15
  end
12
-
16
+
13
17
  # 携帯電話の機種に応じて Mobile::xxx を返す。
14
18
  # 携帯電話でない場合はnilを返す。
15
19
  def mobile
@@ -0,0 +1,10 @@
1
+ class ActionController::Base
2
+ before_filter :gettext_force_ja_for_mobile
3
+ # gettextが組み込まれている場合、携帯電話からのアクセスをjaロケール強制する。
4
+ def gettext_force_ja_for_mobile
5
+ begin
6
+ ::GetText.locale = request.mobile? ? 'ja' : nil
7
+ rescue NameError
8
+ end
9
+ end
10
+ end
@@ -1,3 +1,8 @@
1
+ #:stopdoc:
2
+ # helperを追加
3
+ ActionView::Base.class_eval { include Jpmobile::Helpers }
4
+ #:startdoc:
5
+
1
6
  # ActionView::Base を拡張して携帯からのアクセスの場合に携帯向けビューを優先表示する。
2
7
  # Vodafone携帯(request.mobile == Jpmobile::Mobile::Vodafone)の場合、
3
8
  # index_mobile_vodafone.rhtml
@@ -5,6 +10,8 @@
5
10
  # index_mobile.rhtml
6
11
  # index.rhtml
7
12
  # の順にテンプレートが検索される。
13
+ # BUG: 現状、上記の例では index.rhtml が存在しない場合に振り分けが行われない
14
+ # (ダミーファイルを置くことで回避可能)。
8
15
  class ActionView::Base #:nodoc:
9
16
  alias render_file_without_mobile render_file #:nodoc:
10
17
  def render_file(template_path, use_full_path = true, local_assigns = {})
@@ -14,7 +14,11 @@ module Jpmobile::Mobile
14
14
  def position; return nil; end
15
15
 
16
16
  # 契約者又は端末を識別する文字列があれば返す。
17
- def ident; return nil; end
17
+ def ident; ident_subscriber || ident_device; end
18
+ # 契約者を識別する文字列があれば返す。
19
+ def ident_subscriber; nil; end
20
+ # 端末を識別する文字列があれば返す。
21
+ def ident_device; nil; end
18
22
 
19
23
  # IPアドレスデータ
20
24
  IP_ADDRESSES = nil
@@ -18,7 +18,7 @@ module Jpmobile::Mobile
18
18
  def subno
19
19
  @request.env["HTTP_X_UP_SUBNO"]
20
20
  end
21
- alias :ident :subno
21
+ alias :ident_subscriber :subno
22
22
 
23
23
  # 位置情報があれば Position のインスタンスを返す。無ければ +nil+ を返す。
24
24
  def position
@@ -38,17 +38,14 @@ module Jpmobile::Mobile
38
38
  return nil
39
39
  end
40
40
  end
41
+ alias :ident_device :serial_number
41
42
 
42
43
  # FOMAカード製造番号があれば返す。無ければ +nil+ を返す。
43
44
  def icc
44
45
  @request.user_agent =~ /icc([0-9a-zA-Z]{20})\)/
45
46
  return $1
46
47
  end
47
-
48
- # Docomo#icc、Docomo#serial_number の順で有効なものが有れば返す。無ければ +nil+ を返す。
49
- def ident
50
- icc || serial_number
51
- end
48
+ alias :ident_subscriber :icc
52
49
 
53
50
  # 画面情報を +Display+ クラスのインスタンスで返す。
54
51
  def display
@@ -15,6 +15,14 @@ module Jpmobile::Mobile
15
15
  @request.user_agent =~ /SN(.+?) /
16
16
  return $1
17
17
  end
18
+ alias :ident_device :serial_number
19
+
20
+ # UIDを返す。
21
+ def x_jphone_uid
22
+ @request.env["HTTP_X_JPHONE_UID"]
23
+ end
24
+ alias :ident_subscriber :x_jphone_uid
25
+
18
26
  # 位置情報があれば Position のインスタンスを返す。無ければ +nil+ を返す。
19
27
  def position
20
28
  if params["pos"] =~ /^([NS])(\d+)\.(\d+)\.(\d+\.\d+)([WE])(\d+)\.(\d+)\.(\d+\.\d+)$/
@@ -28,6 +36,7 @@ module Jpmobile::Mobile
28
36
  return nil
29
37
  end
30
38
  end
39
+
31
40
  # 画面情報を +Display+ クラスのインスタンスで返す。
32
41
  def display
33
42
  p_w = p_h = col_p = cols = nil
@@ -47,7 +56,6 @@ module Jpmobile::Mobile
47
56
  end
48
57
  Jpmobile::Display.new(p_w, p_h, nil, nil, col_p, cols)
49
58
  end
50
- alias :ident :serial_number
51
59
 
52
60
  # cookieに対応しているか?
53
61
  def supports_cookie?
@@ -5,6 +5,8 @@ Jpmobile::Mobile::Docomo::DISPLAY_INFO =
5
5
  {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>266},
6
6
  "P703imyu"=>
7
7
  {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>270},
8
+ "SH704i"=>
9
+ {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>320},
8
10
  "F503iS"=>
9
11
  {:color_p=>true, :colors=>4096, :browser_width=>120, :browser_height=>130},
10
12
  "F505i"=>
@@ -59,6 +61,8 @@ Jpmobile::Mobile::Docomo::DISPLAY_INFO =
59
61
  {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>252},
60
62
  "F703i"=>
61
63
  {:color_p=>true, :colors=>262144, :browser_width=>230, :browser_height=>240},
64
+ "N704imyu"=>
65
+ {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>270},
62
66
  "N505iS"=>
63
67
  {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>270},
64
68
  "P903iX"=>
@@ -71,10 +75,14 @@ Jpmobile::Mobile::Docomo::DISPLAY_INFO =
71
75
  {:color_p=>true, :colors=>65536, :browser_width=>176, :browser_height=>198},
72
76
  "P253i"=>
73
77
  {:color_p=>true, :colors=>65536, :browser_width=>132, :browser_height=>144},
78
+ "SO903iTV"=>
79
+ {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>368},
74
80
  "F903iX"=>
75
81
  {:color_p=>true, :colors=>262144, :browser_width=>230, :browser_height=>240},
76
82
  "SH702iD"=>
77
83
  {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>240},
84
+ "P704i"=>
85
+ {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>270},
78
86
  "SH851i"=>
79
87
  {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>252},
80
88
  "N211iS"=>
@@ -101,6 +109,8 @@ Jpmobile::Mobile::Docomo::DISPLAY_INFO =
101
109
  {:color_p=>true, :colors=>65536, :browser_width=>230, :browser_height=>240},
102
110
  "P821i"=>
103
111
  {:color_p=>false, :colors=>4, :browser_width=>118, :browser_height=>128},
112
+ "L602i"=>
113
+ {:color_p=>true, :colors=>65536, :browser_width=>170, :browser_height=>189},
104
114
  "D251i"=>
105
115
  {:color_p=>true, :colors=>262144, :browser_width=>132, :browser_height=>144},
106
116
  "D251iS"=>
@@ -199,12 +209,12 @@ Jpmobile::Mobile::Docomo::DISPLAY_INFO =
199
209
  {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>256},
200
210
  "F881iES"=>
201
211
  {:color_p=>true, :colors=>65536, :browser_width=>240, :browser_height=>256},
212
+ "N904i"=>
213
+ {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>352},
202
214
  "P2002"=>
203
215
  {:color_p=>true, :colors=>65536, :browser_width=>118, :browser_height=>128},
204
216
  "R691i"=>
205
217
  {:color_p=>false, :colors=>4, :browser_width=>96, :browser_height=>72},
206
- "N904i"=>
207
- {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>352},
208
218
  "N902iL"=>
209
219
  {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>270},
210
220
  "P252i"=>
@@ -213,6 +223,8 @@ Jpmobile::Mobile::Docomo::DISPLAY_INFO =
213
223
  {:color_p=>false, :colors=>4, :browser_width=>96, :browser_height=>87},
214
224
  "P703i"=>
215
225
  {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>270},
226
+ "SH904i"=>
227
+ {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>320},
216
228
  "SH902iSL"=>
217
229
  {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>240},
218
230
  "N506iS"=>
@@ -221,8 +233,6 @@ Jpmobile::Mobile::Docomo::DISPLAY_INFO =
221
233
  {:color_p=>false, :colors=>2, :browser_width=>96, :browser_height=>120},
222
234
  "SO212i"=>
223
235
  {:color_p=>true, :colors=>65536, :browser_width=>120, :browser_height=>112},
224
- "SH904i"=>
225
- {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>320},
226
236
  "F661i"=>
227
237
  {:color_p=>true, :colors=>65536, :browser_width=>132, :browser_height=>136},
228
238
  "F671iS"=>
@@ -234,7 +244,7 @@ Jpmobile::Mobile::Docomo::DISPLAY_INFO =
234
244
  "N2051"=>
235
245
  {:color_p=>true, :colors=>65536, :browser_width=>176, :browser_height=>198},
236
246
  "L601i"=>
237
- {:color_p=>true, :colors=>65536, :browser_width=>176, :browser_height=>189},
247
+ {:color_p=>true, :colors=>65536, :browser_width=>170, :browser_height=>189},
238
248
  "N703iD"=>
239
249
  {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>270},
240
250
  "SH902iS"=>
@@ -273,6 +283,10 @@ Jpmobile::Mobile::Docomo::DISPLAY_INFO =
273
283
  {:color_p=>true, :colors=>262144, :browser_width=>176, :browser_height=>198},
274
284
  "SH505i"=>
275
285
  {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>252},
286
+ "D704i"=>
287
+ {:color_p=>true, :colors=>262144, :browser_width=>230, :browser_height=>240},
288
+ "SO704i"=>
289
+ {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>368},
276
290
  "SH251i"=>
277
291
  {:color_p=>true, :colors=>65536, :browser_width=>120, :browser_height=>130},
278
292
  "N902iX"=>
@@ -285,6 +299,8 @@ Jpmobile::Mobile::Docomo::DISPLAY_INFO =
285
299
  {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>270},
286
300
  "R209i"=>
287
301
  {:color_p=>false, :colors=>4, :browser_width=>96, :browser_height=>72},
302
+ "L704i"=>
303
+ {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>280},
288
304
  "P210i"=>
289
305
  {:color_p=>true, :colors=>256, :browser_width=>96, :browser_height=>91},
290
306
  "M702iG"=>
@@ -319,14 +335,14 @@ Jpmobile::Mobile::Docomo::DISPLAY_INFO =
319
335
  {:color_p=>true, :colors=>262144, :browser_width=>230, :browser_height=>240},
320
336
  "P902iS"=>
321
337
  {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>270},
338
+ "N703imyu"=>
339
+ {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>270},
322
340
  "D901iS"=>
323
341
  {:color_p=>true, :colors=>262144, :browser_width=>230, :browser_height=>240},
324
342
  "P213i"=>
325
343
  {:color_p=>true, :colors=>65536, :browser_width=>132, :browser_height=>144},
326
344
  "SO902i"=>
327
345
  {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>256},
328
- "N703imyu"=>
329
- {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>270},
330
346
  "N601i"=>
331
347
  {:color_p=>true, :colors=>65536, :browser_width=>240, :browser_height=>270},
332
348
  "F506i"=>
@@ -361,6 +377,8 @@ Jpmobile::Mobile::Docomo::DISPLAY_INFO =
361
377
  {:color_p=>true, :colors=>65536, :browser_width=>160, :browser_height=>180},
362
378
  "D800iDS"=>
363
379
  {:color_p=>true, :colors=>262144, :browser_width=>230, :browser_height=>240},
380
+ "F704i"=>
381
+ {:color_p=>true, :colors=>262144, :browser_width=>230, :browser_height=>240},
364
382
  "D211i"=>
365
383
  {:color_p=>true, :colors=>4096, :browser_width=>100, :browser_height=>91},
366
384
  "SO211i"=>
@@ -382,13 +400,15 @@ Jpmobile::Mobile::Docomo::DISPLAY_INFO =
382
400
  "N900iS"=>
383
401
  {:color_p=>true, :colors=>65536, :browser_width=>240, :browser_height=>269},
384
402
  "L600i"=>
385
- {:color_p=>true, :colors=>65536, :browser_width=>176, :browser_height=>189},
403
+ {:color_p=>true, :colors=>65536, :browser_width=>170, :browser_height=>189},
386
404
  "SA700iS"=>
387
405
  {:color_p=>true, :colors=>65536, :browser_width=>240, :browser_height=>252},
388
406
  "F671i"=>
389
407
  {:color_p=>true, :colors=>256, :browser_width=>120, :browser_height=>126},
390
408
  "P503i"=>
391
409
  {:color_p=>true, :colors=>256, :browser_width=>120, :browser_height=>130},
410
+ "F883iES"=>
411
+ {:color_p=>true, :colors=>65536, :browser_width=>240, :browser_height=>256},
392
412
  "P900i"=>
393
413
  {:color_p=>true, :colors=>65536, :browser_width=>240, :browser_height=>266},
394
414
  "P251iS"=>
@@ -415,14 +435,16 @@ Jpmobile::Mobile::Docomo::DISPLAY_INFO =
415
435
  {:color_p=>true, :colors=>262144, :browser_width=>120, :browser_height=>130},
416
436
  "D209i"=>
417
437
  {:color_p=>true, :colors=>256, :browser_width=>96, :browser_height=>90},
438
+ "SO703i"=>
439
+ {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>368},
418
440
  "SO506iS"=>
419
441
  {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>256},
420
442
  "D703i"=>
421
443
  {:color_p=>true, :colors=>262144, :browser_width=>230, :browser_height=>240},
422
- "SO703i"=>
423
- {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>368},
424
444
  "D702iBCL"=>
425
445
  {:color_p=>true, :colors=>262144, :browser_width=>230, :browser_height=>240},
446
+ "P704imyu"=>
447
+ {:color_p=>true, :colors=>262144, :browser_width=>240, :browser_height=>270},
426
448
  "D501i"=>
427
449
  {:color_p=>false, :colors=>2, :browser_width=>96, :browser_height=>72},
428
450
  "P701iD"=>