darashi / jpmobile

A Rails plugin for Japanese mobile-phones

This URL has Read+Write access

darashi (author)
Wed Jul 02 00:41:33 -0700 2008
commit  709b5254ad3d8e911d59faa0235ea1292fdf2e3f
tree    92ef6171974016725f832161ae66740c3b61d8d3
parent  5edd1ac3fdbf636570db5a79dde65c9ba930a1a0
jpmobile / lib / jpmobile / mobile / docomo.rb
100644 92 lines (81 sloc) 2.826 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# =DoCoMo携帯電話
 
module Jpmobile::Mobile
  # ==DoCoMo携帯電話
  class Docomo < AbstractMobile
    autoload :IP_ADDRESSES, 'jpmobile/mobile/z_ip_addresses_docomo'
    autoload :DISPLAY_INFO, 'jpmobile/mobile/z_display_info_docomo'
 
    # 対応するUser-Agentの正規表現
    USER_AGENT_REGEXP = /^DoCoMo/
 
    # オープンiエリアがあればエリアコードを +String+ で返す。無ければ +nil+ を返す。
    def areacode
      if params["ACTN"] == "OK"
        return params["AREACODE"]
      else
        return nil
      end
    end
 
    # 位置情報があれば Position のインスタンスを返す。無ければ +nil+ を返す。
    def position
      return @__position if defined? @__position
      lat = params["lat"] || params["LAT"]
      lon = params["lon"] || params["LON"]
      geo = params["geo"] || params["GEO"]
      return @__position = nil if lat.blank? || lon.blank?
      raise "Unsuppoted datum" if geo.downcase != "wgs84"
      pos = Jpmobile::Position.new
      raise "Unsuppoted" unless lat =~ /^([+-]\d+)\.(\d+)\.(\d+\.\d+)/
      pos.lat = Jpmobile::Position.dms2deg($1,$2,$3)
      raise "Unsuppoted" unless lon =~ /^([+-]\d+)\.(\d+)\.(\d+\.\d+)/
      pos.lon = Jpmobile::Position.dms2deg($1,$2,$3)
      return @__position = pos
    end
 
    # 端末製造番号があれば返す。無ければ +nil+ を返す。
    def serial_number
      case @request.env["HTTP_USER_AGENT"]
      when /ser([0-9a-zA-Z]{11})$/ # mova
        return $1
      when /ser([0-9a-zA-Z]{15});/ # FOMA
        return $1
      else
        return nil
      end
    end
    alias :ident_device :serial_number
 
    # FOMAカード製造番号があれば返す。無ければ +nil+ を返す。
    def icc
      @request.env['HTTP_USER_AGENT'] =~ /icc([0-9a-zA-Z]{20})\)/
      return $1
    end
    alias :ident_subscriber :icc
 
    # iモードIDを返す。
    def guid
      @request.env['HTTP_X_DCMGUID']
    end
 
    # 画面情報を +Display+ クラスのインスタンスで返す。
    def display
      @__display ||= Jpmobile::Display.new(nil,nil,
                            display_info[:browser_width],
                            display_info[:browser_height],
                            display_info[:color_p],
                            display_info[:colors])
    end
 
    # cookieに対応しているか?
    def supports_cookie?
      false
    end
    private
    # モデル名を返す。
    def model_name
      if @request.env["HTTP_USER_AGENT"] =~ /^DoCoMo\/2.0 (.+)\(/
        return $1
      elsif @request.env["HTTP_USER_AGENT"] =~ /^DoCoMo\/1.0\/(.+?)\//
        return $1
      end
      return nil
    end
 
    # 画面の情報を含むハッシュを返す。
    def display_info
      DISPLAY_INFO[model_name] || {}
    end
  end
end