jpmobile 0.1.6 → 1.0.0.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. data/README +0 -0
  2. data/README.rdoc +58 -29
  3. data/Rakefile +1 -1
  4. data/VERSION.yml +4 -4
  5. data/lib/jpmobile.rb +3 -0
  6. data/lib/jpmobile/email.rb +17 -2
  7. data/lib/jpmobile/emoticon.rb +87 -23
  8. data/lib/jpmobile/emoticon/au.rb +644 -0
  9. data/lib/jpmobile/emoticon/softbank.rb +488 -0
  10. data/lib/jpmobile/emoticon/z_combine.rb +16 -13
  11. data/lib/jpmobile/hook_action_controller.rb +1 -13
  12. data/lib/jpmobile/hook_action_view.rb +3 -62
  13. data/lib/jpmobile/mail.rb +316 -0
  14. data/lib/jpmobile/mailer.rb +31 -0
  15. data/lib/jpmobile/mobile/abstract_mobile.rb +66 -0
  16. data/lib/jpmobile/mobile/au.rb +25 -2
  17. data/lib/jpmobile/mobile/docomo.rb +23 -1
  18. data/lib/jpmobile/mobile/emobile.rb +1 -1
  19. data/lib/jpmobile/mobile/softbank.rb +33 -1
  20. data/lib/jpmobile/mobile/vodafone.rb +1 -1
  21. data/lib/jpmobile/mobile/willcom.rb +1 -1
  22. data/lib/jpmobile/path_set.rb +40 -0
  23. data/lib/jpmobile/rails.rb +24 -0
  24. data/lib/jpmobile/resolver.rb +38 -0
  25. data/lib/jpmobile/util.rb +223 -14
  26. data/lib/tasks/jpmobile_tasks.rake +41 -48
  27. data/spec/rack/jpmobile/emoticon_spec.rb +3 -8
  28. data/spec/rack/jpmobile/filter_spec.rb +1 -1
  29. data/spec/rack/jpmobile/params_filter_spec.rb +4 -4
  30. data/spec/rack_helper.rb +5 -9
  31. data/spec/unit/detect_by_email_spec.rb +29 -0
  32. data/spec/unit/emoticon_spec.rb +90 -0
  33. data/spec/unit/encoding_spec.rb +102 -0
  34. data/spec/unit/mail_spec.rb +117 -0
  35. data/spec/unit/receive_mail_spec.rb +289 -0
  36. data/spec/unit/spec_helper.rb +8 -0
  37. data/spec/unit/util_spec.rb +5 -0
  38. data/test/rails/overrides/app/controllers/application_controller.rb +3 -2
  39. data/test/rails/overrides/app/controllers/template_path_controller.rb +8 -0
  40. data/test/rails/overrides/app/models/mobile_mailer.rb +19 -0
  41. data/test/rails/overrides/app/models/normal_mailer.rb +9 -0
  42. data/test/rails/overrides/spec/models/mobile_mailer_spec.rb +737 -0
  43. data/test/rails/overrides/spec/models/normal_mailer_spec.rb +34 -0
  44. data/test/rails/overrides/spec/requests/template_path_spec.rb +13 -7
  45. data/test/rails/overrides/spec/spec_helper.rb +6 -0
  46. data/test/rails/rails_root/app/controllers/application_controller.rb +3 -2
  47. data/test/rails/rails_root/app/controllers/template_path_controller.rb +8 -0
  48. data/test/rails/rails_root/app/models/mobile_mailer.rb +2 -1
  49. data/test/rails/rails_root/app/models/normal_mailer.rb +9 -0
  50. data/test/rails/rails_root/config/initializers/secret_token.rb +1 -1
  51. data/test/rails/rails_root/spec/models/mobile_mailer_spec.rb +73 -80
  52. data/test/rails/rails_root/spec/models/normal_mailer_spec.rb +34 -0
  53. data/test/rails/rails_root/spec/requests/template_path_spec.rb +13 -7
  54. data/test/rails/rails_root/spec/spec_helper.rb +1 -1
  55. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile.rb +2 -1
  56. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon.rb +7 -5
  57. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/hook_action_controller.rb +1 -13
  58. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/hook_action_view.rb +3 -62
  59. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mail.rb +162 -111
  60. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mailer.rb +31 -0
  61. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/abstract_mobile.rb +34 -3
  62. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/au.rb +2 -5
  63. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/docomo.rb +4 -5
  64. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/softbank.rb +7 -8
  65. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/path_set.rb +40 -0
  66. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/rack/params_filter.rb +1 -1
  67. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/rails.rb +24 -0
  68. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/resolver.rb +38 -0
  69. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/util.rb +33 -23
  70. metadata +43 -14
  71. data/test/legacy/emoticon_test.rb +0 -63
  72. data/test/legacy/helper.rb +0 -8
  73. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/hook_action_mailer.rb +0 -22
@@ -0,0 +1,34 @@
1
+ # -*- coding: utf-8 -*-
2
+ require File.dirname(__FILE__) + '/../spec_helper'
3
+
4
+ describe NormalMailer do
5
+ include Jpmobile::Util
6
+
7
+ before(:each) do
8
+ ActionMailer::Base.deliveries = []
9
+
10
+ @to = ["outer@jp.mobile", "outer1@jp.mobile"]
11
+ @subject = "日本語題名"
12
+ @text = "日本語テキスト"
13
+ end
14
+
15
+ context "PC宛メール" do
16
+ it "正常に送信できること" do
17
+ email = NormalMailer.msg(@to, "題名", "本文").deliver
18
+
19
+ ActionMailer::Base.deliveries.size.should == 1
20
+ (email.to - @to).should be_empty
21
+ end
22
+
23
+ it "UTF-8のままであること" do
24
+ email = NormalMailer.msg(@to, @subject, @text).deliver
25
+
26
+ ActionMailer::Base.deliveries.size.should == 1
27
+
28
+ raw_mail = ascii_8bit(email.to_s)
29
+ raw_mail.should match(/UTF-8/i)
30
+ raw_mail.should match(Regexp.escape("=E6=97=A5=E6=9C=AC=E8=AA=9E=E9=A1=8C=E5=90=8D"))
31
+ raw_mail.should match(Regexp.escape([@text].pack("m").strip))
32
+ end
33
+ end
34
+ end
@@ -13,7 +13,7 @@ describe TemplatePathController, "DoCoMo SH902i からのアクセス" do
13
13
  it 'テンプレートの探索順が正しいこと' do
14
14
  get "/template_path/index", {}, { "HTTP_USER_AGENT" => @user_agent}
15
15
 
16
- controller.view_paths.mobile_template_candidates.should == [ 'mobile_docomo', 'mobile' ]
16
+ controller.lookup_context.mobile.should == [ 'mobile_docomo', 'mobile' ]
17
17
  end
18
18
  end
19
19
 
@@ -24,7 +24,7 @@ describe TemplatePathController, "au CA32 からのアクセス" do
24
24
  it 'テンプレートの探索順が正しいこと' do
25
25
  get "/template_path/index", {}, { "HTTP_USER_AGENT" => @user_agent}
26
26
 
27
- controller.view_paths.mobile_template_candidates.should == [ 'mobile_au', 'mobile' ]
27
+ controller.lookup_context.mobile.should == [ 'mobile_au', 'mobile' ]
28
28
  end
29
29
  end
30
30
 
@@ -35,7 +35,7 @@ describe TemplatePathController, "Vodafone V903T からのアクセス" do
35
35
  it 'テンプレートの探索順が正しいこと' do
36
36
  get "/template_path/index", {}, { "HTTP_USER_AGENT" => @user_agent}
37
37
 
38
- controller.view_paths.mobile_template_candidates.should == [ 'mobile_vodafone', 'mobile_softbank', 'mobile' ]
38
+ controller.lookup_context.mobile.should == [ 'mobile_vodafone', 'mobile_softbank', 'mobile' ]
39
39
  end
40
40
  end
41
41
 
@@ -46,7 +46,7 @@ describe TemplatePathController, "SoftBank 910T からのアクセス" do
46
46
  it 'テンプレートの探索順が正しいこと' do
47
47
  get "/template_path/index", {}, { "HTTP_USER_AGENT" => @user_agent}
48
48
 
49
- controller.view_paths.mobile_template_candidates.should == [ 'mobile_softbank', 'mobile' ]
49
+ controller.lookup_context.mobile.should == [ 'mobile_softbank', 'mobile' ]
50
50
  end
51
51
  end
52
52
 
@@ -57,7 +57,7 @@ describe TemplatePathController, "iPhone からのアクセス" do
57
57
  it 'テンプレートの探索順が正しいこと' do
58
58
  get "/template_path/index", {}, { "HTTP_USER_AGENT" => @user_agent}
59
59
 
60
- controller.view_paths.mobile_template_candidates.should == [ 'smart_phone_iphone', 'smart_phone' ]
60
+ controller.lookup_context.mobile.should == [ 'smart_phone_iphone', 'smart_phone' ]
61
61
  end
62
62
  end
63
63
 
@@ -68,7 +68,7 @@ describe TemplatePathController, "Android からのアクセス" do
68
68
  it 'テンプレートの探索順が正しいこと' do
69
69
  get "/template_path/index", {}, { "HTTP_USER_AGENT" => @user_agent}
70
70
 
71
- controller.view_paths.mobile_template_candidates.should == [ 'smart_phone_android', 'smart_phone' ]
71
+ controller.lookup_context.mobile.should == [ 'smart_phone_android', 'smart_phone' ]
72
72
  end
73
73
  end
74
74
 
@@ -79,7 +79,7 @@ describe TemplatePathController, "Windows Phone からのアクセス" do
79
79
  it 'テンプレートの探索順が正しいこと' do
80
80
  get "/template_path/index", {}, { "HTTP_USER_AGENT" => @user_agent}
81
81
 
82
- controller.view_paths.mobile_template_candidates.should == [ 'smart_phone_windows_phone', 'smart_phone' ]
82
+ controller.lookup_context.mobile.should == [ 'smart_phone_windows_phone', 'smart_phone' ]
83
83
  end
84
84
  end
85
85
 
@@ -111,6 +111,12 @@ describe TemplatePathController, "integrated_views" do
111
111
 
112
112
  response.should have_tag("h1", :content => "show_mobile_docomo.html.erb")
113
113
  end
114
+
115
+ it 'disable_mobile_view! のときには index.html.erb が使用されること' do
116
+ get "/template_path/index", {:pc => true}, { "HTTP_USER_AGENT" => @user_agent}
117
+
118
+ response.should have_tag("h1", :content => "index.html.erb")
119
+ end
114
120
  end
115
121
 
116
122
  context "SoftBankからのアクセスの場合" do
@@ -32,7 +32,7 @@ RSpec.configure do |config|
32
32
  config.run_all_when_everything_filtered = true
33
33
  config.color_enabled = true
34
34
  config.filter_run_excluding :broken => true
35
- config.full_backtrace = true
35
+ # config.full_backtrace = true
36
36
  end
37
37
 
38
38
  require 'pp'
@@ -50,7 +50,8 @@ module Jpmobile
50
50
  end
51
51
  autoload :Configuration, 'jpmobile/rack'
52
52
 
53
- autoload :Mailer, 'jpmobile/hook_action_mailer'
53
+ autoload :Mailer, 'jpmobile/mailer'
54
+ autoload :Resolver, 'jpmobile/resolver'
54
55
  end
55
56
 
56
57
  if defined?(Rails)
@@ -9,7 +9,7 @@ module Jpmobile
9
9
  %w( DOCOMO_SJIS_TO_UNICODE DOCOMO_UNICODE_TO_SJIS ).each do |const|
10
10
  autoload const, 'jpmobile/emoticon/docomo'
11
11
  end
12
- %w( AU_SJIS_TO_UNICODE AU_UNICODE_TO_EMAILJIS AU_SJIS_TO_EMAIL_JIS ).each do |const|
12
+ %w( AU_SJIS_TO_UNICODE AU_UNICODE_TO_EMAILJIS AU_SJIS_TO_EMAIL_JIS AU_EMAILJIS_TO_UNICODE ).each do |const|
13
13
  autoload const, 'jpmobile/emoticon/au'
14
14
  end
15
15
  %w(
@@ -51,10 +51,12 @@ module Jpmobile
51
51
  # +str+ のなかでau絵文字をUnicode数値文字参照に置換した文字列を返す。(メール専用)
52
52
  def self.external_to_unicodecr_au_mail(in_str)
53
53
  str = Jpmobile::Util.ascii_8bit(in_str)
54
- str.gsub(AU_EMAILJIS_REGEXP) do |match|
55
- jis = match.unpack('n').first
56
- unicode = AU_EMAILJIS_TO_UNICODE[jis]
57
- unicode ? Jpmobile::Util.ascii_8bit("\x1b\x28\x42&#x%04x;\x1b\x24\x42"%unicode) : match
54
+ str.gsub(Jpmobile::Util.jis_string_regexp) do |jis_string|
55
+ jis_string.gsub(/[\x21-\x7e]{2}/) do |match|
56
+ jis = match.unpack('n').first
57
+ unicode = AU_EMAILJIS_TO_UNICODE[jis]
58
+ unicode ? Jpmobile::Util.ascii_8bit("\x1b\x28\x42&#x%04x;\x1b\x24\x42"%unicode) : match
59
+ end
58
60
  end
59
61
  end
60
62
 
@@ -1,17 +1,4 @@
1
1
  # -*- coding: utf-8 -*-
2
- module AbstractController
3
- module ViewPaths
4
- def lookup_context_with_jpmobile
5
- jpmobile_context = lookup_context_without_jpmobile
6
- jpmobile_context.view_paths.controller = self
7
-
8
- jpmobile_context
9
- end
10
-
11
- alias_method_chain :lookup_context, :jpmobile
12
- end
13
- end
14
-
15
2
  module ActionController
16
3
  class Base
17
4
  include Jpmobile::Helpers
@@ -29,3 +16,4 @@ module ActionController
29
16
  end
30
17
 
31
18
  ActionController::Request.send :include, Jpmobile::Encoding
19
+ ActionView::LookupContext.register_detail(:mobile) {nil}
@@ -1,72 +1,12 @@
1
1
  # -*- coding: utf-8 -*-
2
- # = viewの自動切り替え
3
- #
4
2
  #:stopdoc:
5
3
  # helperを追加
6
4
  ActionView::Base.class_eval { include Jpmobile::Helpers }
7
5
  #:startdoc:
8
6
 
9
- # ActionView を拡張して携帯からのアクセスの場合に携帯向けビューを優先表示する。
10
- # Vodafone携帯(request.mobile == Jpmobile::Mobile::Vodafone)の場合、
11
- # index_mobile_vodafone.html.erb
12
- # index_mobile_softbank.html.erb
13
- # index_mobile.html.erb
14
- # index.html.erb
15
- # の順にテンプレートが検索される。
16
- # BUG: 現状、上記の例では index.html.erb が存在しない場合に振り分けが行われない
17
- # (ダミーファイルを置くことで回避可能)。
7
+ # :stopdoc:
8
+ # accept-charset charset を変更できるようにする
18
9
  module ActionView
19
- class PathSet
20
- attr_accessor :controller
21
-
22
- def find_with_jpmobile(path, prefix = nil, partial = false, details = {}, key = nil) #:nodoc:
23
- if controller and controller.kind_of?(ActionController::Base) and
24
- (controller.request.mobile? or controller.request.smart_phone?)
25
- return path if path.respond_to?(:render)
26
- template_candidates = mobile_template_candidates
27
-
28
- each do |load_path|
29
- template_candidates.each do |template_postfix|
30
- templates = load_path.find_all("#{path}_#{template_postfix}", prefix, partial, details, key)
31
- return templates.first unless templates.empty?
32
- end
33
- end
34
- end
35
-
36
- find_without_jpmobile(path, prefix, partial, details, key)
37
- end
38
-
39
- alias_method_chain :find, :jpmobile #:nodoc:
40
-
41
- def mobile_template_candidates #:nodoc:
42
- candidates = []
43
-
44
- view_class, parent_class, template_prefix = case controller.request.mobile
45
- when ::Jpmobile::Mobile::SmartPhone
46
- [controller.request.mobile.class, ::Jpmobile::Mobile::SmartPhone, "smart_phone"]
47
- when ::Jpmobile::Mobile::AbstractMobile
48
- [controller.request.mobile.class, ::Jpmobile::Mobile::AbstractMobile, "mobile"]
49
- else
50
- [nil, nil, nil]
51
- end
52
-
53
- if view_class and parent_class
54
- find_mobile_template(view_class, parent_class, template_prefix).push(template_prefix)
55
- else
56
- []
57
- end
58
- end
59
-
60
- private
61
- def find_mobile_template(klass, parent, prefix)
62
- if klass == parent
63
- []
64
- else
65
- find_mobile_template(klass.superclass, parent, prefix).unshift("#{prefix}_#{klass.to_s.split(/::/).last.underscore}")
66
- end
67
- end
68
- end
69
-
70
10
  module Helpers
71
11
  module FormTagHelper
72
12
  private
@@ -85,3 +25,4 @@ module ActionView
85
25
  end
86
26
  end
87
27
  end
28
+ #:startdoc:
@@ -38,34 +38,27 @@ module Mail
38
38
  class Message
39
39
  attr_accessor :mobile
40
40
 
41
+ def mobile=(m)
42
+ @mobile = m
43
+ @charset = m.mail_charset(@charset)
44
+
45
+ if @body
46
+ @body.charset = @charset
47
+ @body.mobile = m
48
+ end
49
+ end
50
+
41
51
  def encoded_with_jpmobile
42
52
  if @mobile
43
53
  header['subject'].mobile = @mobile if header['subject']
44
- self.charset = @mobile.mail_charset
54
+ self.charset = @mobile.mail_charset(@charset)
45
55
 
46
56
  ready_to_send!
47
57
 
48
- self.body.mobile = @mobile
58
+ self.body.charset = @charset
59
+ self.body.mobile = @mobile
49
60
  self.header['Content-Transfer-Encoding'] = '8bit'
50
61
 
51
- if self.header['Content-Type']
52
- pp self.body.charset = case self.header['Content-Type'].value
53
- when /iso-2022-jp/i
54
- "ISO-2022-JP"
55
- when /shift_jis/i
56
- "Shift_JIS"
57
- else
58
- "UTF-8"
59
- end
60
- unless self.header['Content-Type'] == self.body.charset
61
- self.header['Content-Type'] = self.body.charset
62
- end
63
- pp self.header['Content-Type'].charset
64
- pp self.header['Content-Type'].value
65
- pp self.header['Content-Type']
66
- pp self.body.charset
67
- end
68
-
69
62
  buffer = header.encoded
70
63
  buffer << "\r\n"
71
64
  buffer = @mobile.utf8_to_mail_encode(buffer)
@@ -77,56 +70,48 @@ pp self.body.charset
77
70
  end
78
71
 
79
72
  def parse_message_with_jpmobile
80
- parse_message_without_jpmobile
81
-
82
- if !multipart? and self.header['Content-Type']
83
- self.body.charset = case self.header['Content-Type'].value
84
- when /iso-2022-jp/i
85
- "ISO-2022-JP"
86
- when /shift_jis/i
87
- "Shift_JIS"
88
- else
89
- "UTF-8"
90
- end
91
- end
92
- self.header['subject'].mobile = @mobile if self.header['subject']
73
+ header_part, body_part = raw_source.split(/#{CRLF}#{WSP}*#{CRLF}/m, 2)
74
+
75
+ self.header = header_part
76
+
77
+ @body_part_jpmobile = body_part
78
+ convert_encoding_jpmobile
79
+ body_part = @body_part_jpmobile
80
+
81
+ self.body = body_part
93
82
  end
94
83
 
95
- def init_with_string_with_jpmobile(string)
96
- # Jpmobile::Mobile class from 'From: ' header
84
+ def init_with_string(string)
85
+ # convert to ASCII-8BIT for ascii incompatible encodings
97
86
  s = Jpmobile::Util.ascii_8bit(string)
87
+ self.raw_source = s
88
+ set_envelope_header
89
+ parse_message
90
+ @separate_parts = multipart?
91
+ end
98
92
 
99
- mobile_class = nil
100
- content_has_from = false
101
- s.split(/\n|\r/).each do |line|
102
- if line =~ /^From:/
103
- content_has_from = true
104
- break if mobile_class = Jpmobile::Email.detect_from_mail_header(line)
105
- end
106
- end
93
+ def process_body_raw_with_jpmobile
94
+ process_body_raw_without_jpmobile
107
95
 
108
- if content_has_from
109
- @mobile = (mobile_class || Jpmobile::Mobile::AbstractMobile).new(nil, nil)
96
+ @body.charset = @charset
97
+ @body.mobile = @mobile
110
98
 
111
- init_with_string_without_jpmobile(s)
99
+ if has_content_transfer_encoding? and
100
+ ["base64", "quoted-printable"].include?(content_transfer_encoding) and
101
+ ["text", nil].include?(@mobile_main_type)
102
+ @body.decode_transfer_encoding
103
+ end
112
104
 
113
- self.body.mobile = @mobile
114
- self.body.set_encoding_jpmobile
115
- if self.body.multipart?
116
- self.body.parts.each do |part|
117
- part.body.mobile = @mobile
118
- part.body.set_encoding_jpmobile
119
- end
105
+ if @body.multipart?
106
+ @body.parts.each do |p|
107
+ p.charset = @charset
108
+ p.mobile = @mobile
120
109
  end
121
- else
122
- init_with_string_without_jpmobile(s)
123
110
  end
124
111
  end
125
112
 
126
- def process_body_raw_with_jpmobile
127
- process_body_raw_without_jpmobile
128
-
129
- self.body.mobile = @mobile
113
+ def body_lazy_with_jpmobile(value, index)
114
+ body_lazy_without_jpmobile(value, index)
130
115
  end
131
116
 
132
117
  alias_method :encoded_without_jpmobile, :encoded
@@ -135,28 +120,71 @@ pp self.body.charset
135
120
  alias_method :parse_message_without_jpmobile, :parse_message
136
121
  alias_method :parse_message, :parse_message_with_jpmobile
137
122
 
138
- alias_method :init_with_string_without_jpmobile, :init_with_string
139
- alias_method :init_with_string, :init_with_string_with_jpmobile
140
-
141
123
  alias_method :process_body_raw_without_jpmobile, :process_body_raw
142
124
  alias_method :process_body_raw, :process_body_raw_with_jpmobile
125
+
126
+ alias_method :body_lazy_without_jpmobile, :body_lazy
127
+ alias_method :body_lazy, :body_lazy_with_jpmobile
128
+
129
+ private
130
+ def convert_encoding_jpmobile
131
+ # decide mobile carrier
132
+ if self.header['From']
133
+ mobile_class = Jpmobile::Email.detect_from_mail_header(self.header['From'].value)
134
+ @mobile ||= (mobile_class || Jpmobile::Mobile::AbstractMobile ).new(nil, nil)
135
+ end
136
+
137
+ # override charset
138
+ if self.header['Content-Type']
139
+ @charset = Jpmobile::Util.extract_charset(self.header['Content-Type'].value)
140
+ self.header['Content-Type'].parameters[:charset] = @charset
141
+ @mobile_main_type = self.header['Content-Type'].main_type
142
+ end
143
+
144
+ # convert header(s)
145
+ if self.header['Subject']
146
+ subject_charset = Jpmobile::Util.extract_charset(self.header['Subject'].value)
147
+
148
+ # override subject encoding if @charset is blank
149
+ @charset = subject_charset if !subject_charset.blank? and @charset.blank?
150
+
151
+ self.header['Subject'].charset = subject_charset
152
+
153
+ if @mobile
154
+ v = @mobile.to_mail_internal(
155
+ Encodings.value_decode(self.header['Subject'].value), subject_charset)
156
+ self.header['Subject'].value = Jpmobile::Util.force_encode(v, @mobile.mail_charset(@charset), Jpmobile::Util::UTF8)
157
+ end
158
+ end
159
+
160
+ if @body_part_jpmobile and @mobile
161
+ @body_part_jpmobile = @mobile.decode_transfer_encoding(@body_part_jpmobile, @charset)
162
+ end
163
+ end
143
164
  end
144
165
 
145
166
  class Part
167
+ def init_with_string(string)
168
+ self.raw_source = string
169
+ set_envelope_header
170
+ parse_message
171
+ @separate_parts = multipart?
172
+ end
173
+
146
174
  def parse_message_with_jpmobile
147
- parse_message_without_jpmobile
148
-
149
- if !multipart? and self.header['Content-Type']
150
- @charset = case self.header['Content-Type'].value
151
- when /iso-2022-jp/i
152
- "ISO-2022-JP"
153
- when /shift_jis/i
154
- "Shift_JIS"
155
- else
156
- "UTF-8"
157
- end
158
- self.body.charset = @charset
175
+ header_part, body_part = raw_source.split(/#{CRLF}#{WSP}*#{CRLF}/m, 2)
176
+
177
+ if header_part =~ HEADER_LINE
178
+ self.header = header_part
179
+ else
180
+ self.header = "Content-Type: text/plain\r\n"
159
181
  end
182
+
183
+ @body_part_jpmobile = body_part
184
+ convert_encoding_jpmobile
185
+ body_part = @body_part_jpmobile
186
+
187
+ self.body = body_part
160
188
  end
161
189
 
162
190
  alias_method :parse_message_without_jpmobile, :parse_message
@@ -169,25 +197,17 @@ pp self.body.charset
169
197
  # convert encoding
170
198
  def encoded_with_jpmobile(transfer_encoding = '8bit')
171
199
  if @mobile and !multipart?
172
- if @mobile.to_mail_body_encoded?(raw_source)
173
- raw_source
200
+ if @mobile.to_mail_body_encoded?(@raw_source)
201
+ @raw_source
174
202
  else
175
- @mobile.to_mail_body(Jpmobile::Util.force_encode(raw_source, @charset, Jpmobile::Util::UTF8))
203
+ @mobile.to_mail_body(Jpmobile::Util.force_encode(@raw_source, @charset, Jpmobile::Util::UTF8))
176
204
  end
177
205
  else
178
206
  encoded_without_jpmobile(transfer_encoding)
179
207
  end
180
208
  end
181
- def decoded_with_jpmobile
182
- if @mobile and !multipart?
183
- @raw_source = @mobile.to_mail_internal(@raw_source, nil) unless @jpmobile_decoded
184
- @jpmobile_decoded = true
185
- end
186
-
187
- if @charset
188
- @raw_source = Jpmobile::Util.force_encode(@raw_source, @charset, Jpmobile::Util::UTF8)
189
- end
190
209
 
210
+ def decoded_with_jpmobile
191
211
  decoded_without_jpmobile
192
212
  end
193
213
 
@@ -196,21 +216,56 @@ pp self.body.charset
196
216
  @charset ||= only_us_ascii? ? 'US-ASCII' : nil
197
217
  end
198
218
 
199
- # set encoding to @raw_source in init
200
- def set_encoding_jpmobile
201
- @raw_source = Jpmobile::Util.set_encoding(@raw_source, @charset)
202
- end
203
-
204
219
  def mobile=(m)
220
+ @mobile = m
221
+
205
222
  if self.multipart?
206
223
  self.parts.each do |part|
207
- part.body.mobile = @mobile
208
- part.body.set_encoding_jpmobile
224
+ part.charset = @charset
225
+ part.mobile = @mobile
226
+ part.body.charset = @charset
227
+ part.body.mobile = @mobile
209
228
  end
210
229
  end
230
+ end
211
231
 
212
- @mobile = m
213
- self.set_encoding_jpmobile
232
+ def decode_transfer_encoding
233
+ _raw_source = Encodings.get_encoding(encoding).decode(@raw_source)
234
+ _raw_source = Jpmobile::Util.set_encoding(_raw_source, @charset)
235
+
236
+ @raw_source = @mobile.decode_transfer_encoding(_raw_source, @charset)
237
+ end
238
+
239
+ def preamble_with_jpmobile
240
+ if @mobile
241
+ Jpmobile::Util.encode(@preamble, @charset)
242
+ else
243
+ preamble_without_jpmobile
244
+ end
245
+ end
246
+
247
+ def epilogue_with_jpmobile
248
+ if @mobile
249
+ Jpmobile::Util.encode(@epilogue, @charset)
250
+ else
251
+ epilogue_without_jpmobile
252
+ end
253
+ end
254
+
255
+ def crlf_boundary_with_jpmobile
256
+ if @mobile
257
+ Jpmobile::Util.encode(crlf_boundary_without_jpmobile, @charset)
258
+ else
259
+ epilogue_without_jpmobile
260
+ end
261
+ end
262
+
263
+ def end_boundary_with_jpmobile
264
+ if @mobile
265
+ Jpmobile::Util.encode(end_boundary_without_jpmobile, @charset)
266
+ else
267
+ epilogue_without_jpmobile
268
+ end
214
269
  end
215
270
 
216
271
  alias_method :encoded_without_jpmobile, :encoded
@@ -221,19 +276,22 @@ pp self.body.charset
221
276
 
222
277
  alias_method :set_charset_without_jpmobile, :set_charset
223
278
  alias_method :set_charset, :set_charset_with_jpmobile
224
- end
225
279
 
226
- class UnstructuredField
227
- attr_accessor :mobile
280
+ alias_method :preamble_without_jpmobile, :preamble
281
+ alias_method :preamble, :preamble_with_jpmobile
228
282
 
229
- def do_decode
230
- result = value.blank? ? nil : Encodings.decode_encode(value, :decode)
283
+ alias_method :crlf_boundary_without_jpmobile, :crlf_boundary
284
+ alias_method :crlf_boundary, :crlf_boundary_with_jpmobile
231
285
 
232
- result = @mobile.to_mail_internal(result, value) if @mobile
286
+ alias_method :end_boundary_without_jpmobile, :end_boundary
287
+ alias_method :end_boundary, :end_boundary_with_jpmobile
233
288
 
234
- # result.encode!(value.encoding || "UTF-8") if RUBY_VERSION >= '1.9' && !result.blank?
235
- result.blank? ? result : Jpmobile::Util.force_encode(result, nil, Jpmobile::Util::UTF8)
236
- end
289
+ alias_method :epilogue_without_jpmobile, :epilogue
290
+ alias_method :epilogue, :epilogue_with_jpmobile
291
+ end
292
+
293
+ class UnstructuredField
294
+ attr_accessor :mobile
237
295
  end
238
296
 
239
297
  # for subject
@@ -252,14 +310,7 @@ pp self.body.charset
252
310
  end
253
311
  end
254
312
 
255
- # def decoded_with_jpmobile
256
- # decoded_without_jpmobile
257
- # end
258
-
259
313
  alias_method :encoded_without_jpmobile, :encoded
260
314
  alias_method :encoded, :encoded_with_jpmobile
261
-
262
- # alias_method :decoded_without_jpmobile, :decoded
263
- # alias_method :decoded, :decoded_with_jpmobile
264
315
  end
265
316
  end