mms2r 1.0.0
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.
- data/History.txt +4 -0
- data/Manifest.txt +54 -0
- data/README.txt +81 -0
- data/Rakefile +30 -0
- data/conf/mms2r_cingularmedia_transform.yml +6 -0
- data/conf/mms2r_sprintmedia_ignore.yml +10 -0
- data/conf/mms2r_tmobilemedia_ignore.yml +17 -0
- data/conf/mms2r_verizonmedia_ignore.yml +3 -0
- data/lib/mms2r.rb +3 -0
- data/lib/mms2r/cingular_media.rb +11 -0
- data/lib/mms2r/media.rb +345 -0
- data/lib/mms2r/mmode_media.rb +13 -0
- data/lib/mms2r/sprint_media.rb +50 -0
- data/lib/mms2r/tmobile_media.rb +11 -0
- data/lib/mms2r/verizon_media.rb +11 -0
- data/lib/mms2r/version.rb +12 -0
- data/lib/vendor/text/format.rb +1466 -0
- data/lib/vendor/tmail.rb +3 -0
- data/lib/vendor/tmail/address.rb +242 -0
- data/lib/vendor/tmail/attachments.rb +39 -0
- data/lib/vendor/tmail/base64.rb +71 -0
- data/lib/vendor/tmail/config.rb +69 -0
- data/lib/vendor/tmail/encode.rb +467 -0
- data/lib/vendor/tmail/facade.rb +552 -0
- data/lib/vendor/tmail/header.rb +914 -0
- data/lib/vendor/tmail/info.rb +35 -0
- data/lib/vendor/tmail/loader.rb +1 -0
- data/lib/vendor/tmail/mail.rb +447 -0
- data/lib/vendor/tmail/mailbox.rb +433 -0
- data/lib/vendor/tmail/mbox.rb +1 -0
- data/lib/vendor/tmail/net.rb +280 -0
- data/lib/vendor/tmail/obsolete.rb +135 -0
- data/lib/vendor/tmail/parser.rb +1522 -0
- data/lib/vendor/tmail/port.rb +377 -0
- data/lib/vendor/tmail/quoting.rb +131 -0
- data/lib/vendor/tmail/scanner.rb +41 -0
- data/lib/vendor/tmail/scanner_r.rb +263 -0
- data/lib/vendor/tmail/stringio.rb +277 -0
- data/lib/vendor/tmail/tmail.rb +1 -0
- data/lib/vendor/tmail/utils.rb +238 -0
- data/test/files/dot.jpg +0 -0
- data/test/files/sprint-image-01.mail +195 -0
- data/test/files/sprint-text-01.mail +8 -0
- data/test/files/sprint-video-01.mail +195 -0
- data/test/files/sprint.mov +0 -0
- data/test/files/verizon-image-01.mail +815 -0
- data/test/files/verizon-text-01.mail +11 -0
- data/test/files/verizon-video-01.mail +336 -0
- data/test/test_mms2r_cingular.rb +52 -0
- data/test/test_mms2r_media.rb +311 -0
- data/test/test_mms2r_mmode.rb +52 -0
- data/test/test_mms2r_sprint.rb +154 -0
- data/test/test_mms2r_tmobile.rb +169 -0
- data/test/test_mms2r_verizon.rb +74 -0
- metadata +130 -0
data/History.txt
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
History.txt
|
2
|
+
Manifest.txt
|
3
|
+
README.txt
|
4
|
+
Rakefile
|
5
|
+
conf/mms2r_cingularmedia_transform.yml
|
6
|
+
conf/mms2r_sprintmedia_ignore.yml
|
7
|
+
conf/mms2r_tmobilemedia_ignore.yml
|
8
|
+
conf/mms2r_verizonmedia_ignore.yml
|
9
|
+
lib/mms2r.rb
|
10
|
+
lib/mms2r/cingular_media.rb
|
11
|
+
lib/mms2r/media.rb
|
12
|
+
lib/mms2r/mmode_media.rb
|
13
|
+
lib/mms2r/sprint_media.rb
|
14
|
+
lib/mms2r/tmobile_media.rb
|
15
|
+
lib/mms2r/verizon_media.rb
|
16
|
+
lib/mms2r/version.rb
|
17
|
+
lib/vendor/text/format.rb
|
18
|
+
lib/vendor/tmail.rb
|
19
|
+
lib/vendor/tmail/address.rb
|
20
|
+
lib/vendor/tmail/attachments.rb
|
21
|
+
lib/vendor/tmail/base64.rb
|
22
|
+
lib/vendor/tmail/config.rb
|
23
|
+
lib/vendor/tmail/encode.rb
|
24
|
+
lib/vendor/tmail/facade.rb
|
25
|
+
lib/vendor/tmail/header.rb
|
26
|
+
lib/vendor/tmail/info.rb
|
27
|
+
lib/vendor/tmail/loader.rb
|
28
|
+
lib/vendor/tmail/mail.rb
|
29
|
+
lib/vendor/tmail/mailbox.rb
|
30
|
+
lib/vendor/tmail/mbox.rb
|
31
|
+
lib/vendor/tmail/net.rb
|
32
|
+
lib/vendor/tmail/obsolete.rb
|
33
|
+
lib/vendor/tmail/parser.rb
|
34
|
+
lib/vendor/tmail/port.rb
|
35
|
+
lib/vendor/tmail/quoting.rb
|
36
|
+
lib/vendor/tmail/scanner.rb
|
37
|
+
lib/vendor/tmail/scanner_r.rb
|
38
|
+
lib/vendor/tmail/stringio.rb
|
39
|
+
lib/vendor/tmail/tmail.rb
|
40
|
+
lib/vendor/tmail/utils.rb
|
41
|
+
test/files/dot.jpg
|
42
|
+
test/files/sprint-image-01.mail
|
43
|
+
test/files/sprint-text-01.mail
|
44
|
+
test/files/sprint-video-01.mail
|
45
|
+
test/files/sprint.mov
|
46
|
+
test/files/verizon-image-01.mail
|
47
|
+
test/files/verizon-text-01.mail
|
48
|
+
test/files/verizon-video-01.mail
|
49
|
+
test/test_mms2r_cingular.rb
|
50
|
+
test/test_mms2r_media.rb
|
51
|
+
test/test_mms2r_mmode.rb
|
52
|
+
test/test_mms2r_sprint.rb
|
53
|
+
test/test_mms2r_tmobile.rb
|
54
|
+
test/test_mms2r_verizon.rb
|
data/README.txt
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
mms2r
|
2
|
+
|
3
|
+
by Mike Mondragon
|
4
|
+
|
5
|
+
http://mms2r.rubyforge.org/
|
6
|
+
|
7
|
+
== DESCRIPTION:
|
8
|
+
|
9
|
+
MMS2R is a library that decodes the parts of an MMS message to disk while
|
10
|
+
stripping out advertising injected by the cellphone carriers. MMS messages are
|
11
|
+
multipart email and the carriers often inject branding into these messages.
|
12
|
+
|
13
|
+
If MMS2R is not aware of a particular carrier no extra processing is done
|
14
|
+
to the MMS other than decoding and consolidating its media.
|
15
|
+
|
16
|
+
Contact the author to add additional carriers to be processed by the library.
|
17
|
+
|
18
|
+
== FEATURES/PROBLEMS:
|
19
|
+
|
20
|
+
Corpus of carriers currently processed by MMS2R:
|
21
|
+
|
22
|
+
* AT&T/Cingular => mmode.com
|
23
|
+
* Cingular => mms.mycingular.com
|
24
|
+
* Sprint => pm.sprint.com
|
25
|
+
* Sprint => messaging.sprintpcs.com
|
26
|
+
* T-Mobile => tmomail.net
|
27
|
+
* Verizon => vzwpix.com
|
28
|
+
|
29
|
+
== SYNOPSIS:
|
30
|
+
|
31
|
+
require 'rubygems'
|
32
|
+
require 'mms2r'
|
33
|
+
require 'tmail'
|
34
|
+
media = TMail::Media.parse(IO.readlines("mymail.file").join)
|
35
|
+
mms = MMS2R::Media.create(mail,Logger.new(STDOUT))
|
36
|
+
mms.process
|
37
|
+
# mms.media is a hash that is indexed by mime-type
|
38
|
+
# the mime-type key returns an array of filepaths
|
39
|
+
# to media in the MMS that was of that type
|
40
|
+
mms.media['image/jpeg'].each {|f| puts "${f}"}
|
41
|
+
mms.media['text/plain'].each {|f| puts "${f}"}
|
42
|
+
text = File.open(mms.media['text/plain'][0], 'rb') { |file|
|
43
|
+
file.read
|
44
|
+
}
|
45
|
+
puts text
|
46
|
+
#remove the media that was put to temporary disk
|
47
|
+
#mms.purge
|
48
|
+
|
49
|
+
== REQUIREMENTS:
|
50
|
+
|
51
|
+
* TMail
|
52
|
+
* Hpricot
|
53
|
+
|
54
|
+
== INSTALL:
|
55
|
+
|
56
|
+
* sudo gem install mms2r
|
57
|
+
|
58
|
+
== LICENSE:
|
59
|
+
|
60
|
+
(The MIT License)
|
61
|
+
|
62
|
+
Copyright (c) 2007 Mike Mondragon. All rights reserved.
|
63
|
+
|
64
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
65
|
+
a copy of this software and associated documentation files (the
|
66
|
+
'Software'), to deal in the Software without restriction, including
|
67
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
68
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
69
|
+
permit persons to whom the Software is furnished to do so, subject to
|
70
|
+
the following conditions:
|
71
|
+
|
72
|
+
The above copyright notice and this permission notice shall be
|
73
|
+
included in all copies or substantial portions of the Software.
|
74
|
+
|
75
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
76
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
77
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
78
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
79
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
80
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
81
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
require 'rcov/rcovtask'
|
6
|
+
|
7
|
+
$LOAD_PATH.unshift 'lib'
|
8
|
+
require 'mms2r'
|
9
|
+
require 'mms2r/media'
|
10
|
+
|
11
|
+
Hoe.new('mms2r', MMS2R::Media::VERSION) do |p|
|
12
|
+
p.rubyforge_name = 'mms2r'
|
13
|
+
p.author = 'Mike Mondragon'
|
14
|
+
p.email = 'mike@mondragon.cc'
|
15
|
+
p.summary = 'Extract media from MMS '
|
16
|
+
p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
|
17
|
+
p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
|
18
|
+
p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
19
|
+
p.extra_deps << ['hpricot']
|
20
|
+
p.extra_deps << ['rcov']
|
21
|
+
p.clean_globs << 'coverage'
|
22
|
+
end
|
23
|
+
|
24
|
+
Rcov::RcovTask.new do |t|
|
25
|
+
t.test_files = FileList['test/test*.rb']
|
26
|
+
t.verbose = true
|
27
|
+
t.rcov_opts << "--exclude rcov.rb,hpricot.rb,hpricot/.*\.rb"
|
28
|
+
end
|
29
|
+
|
30
|
+
# vim: syntax=Ruby
|
@@ -0,0 +1,17 @@
|
|
1
|
+
---
|
2
|
+
text/html:
|
3
|
+
- |
|
4
|
+
<html>
|
5
|
+
<head>
|
6
|
+
<title>T-Mobile</title>
|
7
|
+
image/gif:
|
8
|
+
- dottedline350.gif
|
9
|
+
- dottedline600.gif
|
10
|
+
- dottedLine_350.gif
|
11
|
+
- dottedLine_600.gif
|
12
|
+
- masthead.jpg
|
13
|
+
- spacer.gif
|
14
|
+
- video.gif
|
15
|
+
- audio.gif
|
16
|
+
- tmobilelogo.gif
|
17
|
+
- tmobilespace.gif
|
data/lib/mms2r.rb
ADDED
data/lib/mms2r/media.rb
ADDED
@@ -0,0 +1,345 @@
|
|
1
|
+
# Copyright (c) 2007 by Mike Mondragon ()
|
2
|
+
#
|
3
|
+
# Please see the LICENSE file for licensing.
|
4
|
+
|
5
|
+
require 'fileutils'
|
6
|
+
require 'pathname'
|
7
|
+
require 'tmpdir'
|
8
|
+
require 'yaml'
|
9
|
+
require 'mms2r'
|
10
|
+
require 'mms2r/version'
|
11
|
+
require 'mms2r/cingular_media'
|
12
|
+
require 'mms2r/mmode_media'
|
13
|
+
require 'mms2r/sprint_media'
|
14
|
+
require 'mms2r/tmobile_media'
|
15
|
+
require 'mms2r/verizon_media'
|
16
|
+
|
17
|
+
##
|
18
|
+
# MMS2R is a library to collect media files from MMS messages. MMS messages
|
19
|
+
# are multipart emails and cellphone carriers often inject branding into these
|
20
|
+
# messages. MMS2R strips the advertising from an MMS leaving the actual user
|
21
|
+
# generated media.
|
22
|
+
#
|
23
|
+
# If you encounter MMS from a carrier that contains advertising other non-
|
24
|
+
# standard media features submit a sample to the author for inclusion in this
|
25
|
+
# project.
|
26
|
+
#
|
27
|
+
# The create method is a factory method to create MMS2R::Media
|
28
|
+
# Custom media producers can be pushed into the factory via the
|
29
|
+
# MMS2R::CARRIER_CLASSES Hash, e.g.
|
30
|
+
#
|
31
|
+
# class MMS2R::FakeCarrier < MMS2R::Media; end
|
32
|
+
# MMS2R::CARRIER_CLASSES['mms.fakecarrier.com'] = MMS2R::FakeCarrier
|
33
|
+
# ...
|
34
|
+
# media = MMS2R::Media.create(some_tmail) #media will be a MMS2R::FakeCarrier
|
35
|
+
|
36
|
+
module MMS2R
|
37
|
+
|
38
|
+
##
|
39
|
+
# A hash of file extentions for common mimetypes
|
40
|
+
EXT = {
|
41
|
+
'text/plain' => 'txt',
|
42
|
+
'text/html' => 'html',
|
43
|
+
'image/png' => 'png',
|
44
|
+
'image/gif' => 'gif',
|
45
|
+
'image/jpeg' => 'jpg',
|
46
|
+
'video/quicktime' => 'mov',
|
47
|
+
'video/3gpp2' => '3g2'
|
48
|
+
}
|
49
|
+
|
50
|
+
##
|
51
|
+
# A hash of carriers that MMS2r is currently aware of.
|
52
|
+
# The factory create method uses the hostname portion
|
53
|
+
# of an MMS's from to select the correct type of MMS2R::Media
|
54
|
+
# product. If a specific media product is not available
|
55
|
+
# MMS2R::Media should be used.
|
56
|
+
|
57
|
+
CARRIER_CLASSES = {
|
58
|
+
'mms.mycingular.com' => MMS2R::CingularMedia,
|
59
|
+
'mmode.com' => MMS2R::MModeMedia,
|
60
|
+
'pm.sprint.com' => MMS2R::SprintMedia,
|
61
|
+
'messaging.sprintpcs.com' => MMS2R::SprintMedia,
|
62
|
+
'tmomail.net' => MMS2R::TMobileMedia,
|
63
|
+
'vzwpix.com' => MMS2R::VerizonMedia
|
64
|
+
}
|
65
|
+
|
66
|
+
class MMS2R::Media
|
67
|
+
|
68
|
+
##
|
69
|
+
# TMail object that the media files were derived from.
|
70
|
+
attr_reader :mail
|
71
|
+
|
72
|
+
##
|
73
|
+
# media returns the hash of media. The media hash
|
74
|
+
# is keyed by mimetype such as 'text/plain' and the
|
75
|
+
# value mapped to the key is an array of media that
|
76
|
+
# are of that type.
|
77
|
+
attr_reader :media
|
78
|
+
|
79
|
+
##
|
80
|
+
# Creates a new Media comprised of a mail
|
81
|
+
# a logger. Logger is an instance attribute allowing
|
82
|
+
# for a logging strategy per carrier type
|
83
|
+
|
84
|
+
def initialize(mail, logger=nil)
|
85
|
+
@mail = mail
|
86
|
+
@logger = logger
|
87
|
+
@logger.info("#{self.class} created") unless @logger.nil?
|
88
|
+
@media = Hash.new
|
89
|
+
@dir_count = 0
|
90
|
+
@media_dir = File.join(self.class.tmp_dir(),
|
91
|
+
self.class.safe_message_id(@mail.message_id))
|
92
|
+
end
|
93
|
+
|
94
|
+
##
|
95
|
+
# Helper for process template method to decode the part based
|
96
|
+
# on its type and write its content to a temporary file. Returns
|
97
|
+
# path to temporary file that holds the content. Parts with a main
|
98
|
+
# type of text will have their contents transformed with a call to
|
99
|
+
# transform_text
|
100
|
+
#
|
101
|
+
# Producers should only override this method if the parts of
|
102
|
+
# the MMS need special treatment besides what is expected for
|
103
|
+
# a normal mime part.
|
104
|
+
#
|
105
|
+
# Returns a tupple of content type, file path
|
106
|
+
|
107
|
+
def process_media(part)
|
108
|
+
# TMail body auto-magically decodes quoted
|
109
|
+
# printable for text/html type.
|
110
|
+
# base64_decode is safe in TMail facade, no work is performed
|
111
|
+
# if the part is not base64 encoded.
|
112
|
+
part.base64_decode
|
113
|
+
file = temp_file(part)
|
114
|
+
content = part.body
|
115
|
+
content = transform_text(self.class.part_type?(part),content) if self.class.main_type?(part).eql?('text')
|
116
|
+
@logger.info("#{self.class} writing file #{file}") unless @logger.nil?
|
117
|
+
File.open(file,'w'){ |f|
|
118
|
+
f.write(content)
|
119
|
+
}
|
120
|
+
type = self.class.part_type?(part)
|
121
|
+
return type, file
|
122
|
+
end
|
123
|
+
|
124
|
+
##
|
125
|
+
# Helper for process_media template method to transform text.
|
126
|
+
|
127
|
+
def transform_text(type,text)
|
128
|
+
f = "#{self.class.name.downcase.gsub(/::/,'_')}_transform.yml"
|
129
|
+
yf = File.join(self.class.conf_dir(), "#{f}")
|
130
|
+
return text unless File::exist?(yf)
|
131
|
+
h = YAML::load_file(yf)
|
132
|
+
a = h[type]
|
133
|
+
return text if a.nil?
|
134
|
+
a.each do |from,to|
|
135
|
+
text.gsub!(/#{from}/m,to)
|
136
|
+
end
|
137
|
+
text
|
138
|
+
end
|
139
|
+
|
140
|
+
##
|
141
|
+
# Helper for process template method to determine if
|
142
|
+
# media contained in a part should be ignored. Producers
|
143
|
+
# should override this method to return true for media such
|
144
|
+
# as images that are advertising, carrier logos, etc.
|
145
|
+
|
146
|
+
def ignore_media?(type,part)
|
147
|
+
f = "#{self.class.name.downcase.gsub(/::/,'_')}_ignore.yml"
|
148
|
+
yf = File.join(self.class.conf_dir(), "#{f}")
|
149
|
+
return false unless File::exist?(yf)
|
150
|
+
h = YAML::load_file(yf)
|
151
|
+
a = h[type]
|
152
|
+
return false if a.nil?
|
153
|
+
m = /^([^\/]+)\//.match(type)[1]
|
154
|
+
a.each do |i|
|
155
|
+
if m.eql?('text')
|
156
|
+
return true if part.body =~ /#{Regexp.escape("#{i}")}/m
|
157
|
+
else
|
158
|
+
return true if filename?(part).eql?(i)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
false
|
162
|
+
end
|
163
|
+
|
164
|
+
##
|
165
|
+
# Helper for process template method to name a temporary
|
166
|
+
# filepath based on information in the part. This version
|
167
|
+
# attempts to honor the name of the media as labeled in the part
|
168
|
+
# header and creates a unique temporary directory for writing
|
169
|
+
# the file so filename collision does not occur.
|
170
|
+
# Consumers of this method expect the directory
|
171
|
+
# structure to the file exists, if the method is overriden it
|
172
|
+
# is mandatory that this behavior is retained.
|
173
|
+
|
174
|
+
def temp_file(part)
|
175
|
+
file_name = filename?(part)
|
176
|
+
File.join(msg_tmp_dir(),File.basename(file_name))
|
177
|
+
end
|
178
|
+
|
179
|
+
##
|
180
|
+
# Purges the unique directory created for this producer and
|
181
|
+
# all of the media that it contains. This implementation is
|
182
|
+
# based on an instance variable called @media_dir
|
183
|
+
|
184
|
+
def purge()
|
185
|
+
@logger.info("#{self.class} purging #{@media_dir} and all its contents") unless @logger.nil?
|
186
|
+
FileUtils.rm_rf(@media_dir)
|
187
|
+
end
|
188
|
+
|
189
|
+
##
|
190
|
+
# process is a template method and collects all the media in a MMS.
|
191
|
+
# Override helper methods to this template to clean out advertising
|
192
|
+
# and/or ignore media that are advertising. This method should not be
|
193
|
+
# overridden unless there is an extreme special case in processing the
|
194
|
+
# media of a MMS.
|
195
|
+
#
|
196
|
+
# Helpers methods for the process template:
|
197
|
+
# ignore_media? true if the media contained a is part should
|
198
|
+
# be ignored.
|
199
|
+
# process_media retrieves media to temporary file, returns path
|
200
|
+
# to file.
|
201
|
+
# transform_text called by process_media, strips out advertising.
|
202
|
+
# temp_file creates a temporary filepath based on information from
|
203
|
+
# the part.
|
204
|
+
|
205
|
+
def process()
|
206
|
+
@logger.info("#{self.class} processing") unless @logger.nil?
|
207
|
+
|
208
|
+
parts = @mail.parts
|
209
|
+
if !@mail.multipart?
|
210
|
+
parts = Array.new()
|
211
|
+
parts << @mail
|
212
|
+
end
|
213
|
+
parts.each do |p|
|
214
|
+
t = self.class.part_type?(p)
|
215
|
+
unless ignore_media?(t,p)
|
216
|
+
t,f = process_media(p)
|
217
|
+
add_file(t,f) unless f.nil?
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
##
|
223
|
+
# Helper to add a file to the media hash.
|
224
|
+
|
225
|
+
def add_file(type, file)
|
226
|
+
if @media[type].nil?
|
227
|
+
@media[type] = Array.new
|
228
|
+
end
|
229
|
+
@media[type] << file
|
230
|
+
end
|
231
|
+
|
232
|
+
##
|
233
|
+
# Helper to temp_file to create a unique temporary directory that is
|
234
|
+
# a child of tmp_dir This version is based on the message_id of the
|
235
|
+
# mail.
|
236
|
+
|
237
|
+
def msg_tmp_dir()
|
238
|
+
@dir_count += 1
|
239
|
+
dir = File.join(@media_dir, "#{@dir_count}")
|
240
|
+
FileUtils.mkdir_p(dir)
|
241
|
+
dir
|
242
|
+
end
|
243
|
+
|
244
|
+
##
|
245
|
+
# Factory method that creates MMS2R::Media products.
|
246
|
+
#
|
247
|
+
# Returns a MMS2R::Media product based on the characteristics
|
248
|
+
# of the carrier from which the the MMS originated.
|
249
|
+
# mail is a TMail object, logger is a Logger and may be
|
250
|
+
# nil.
|
251
|
+
|
252
|
+
def self.create(mail, logger=nil)
|
253
|
+
d = lambda{['',MMS2R::Media]}
|
254
|
+
cc = MMS2R::CARRIER_CLASSES.detect(d) do |n, c|
|
255
|
+
/[^@]+@(.+)/.match(mail.from[0])[1] =~ /#{Regexp.escape("#{n}")}/
|
256
|
+
end
|
257
|
+
cls = cc[1]
|
258
|
+
cls.new(mail, logger)
|
259
|
+
end
|
260
|
+
|
261
|
+
##
|
262
|
+
# returns a filename declared for a part, or a default if its not defined
|
263
|
+
|
264
|
+
def filename?(part)
|
265
|
+
part.sub_header("content-type", "name") ||
|
266
|
+
part.sub_header("content-disposition", "filename") ||
|
267
|
+
(part['content-location'] && part['content-location'].body) ||
|
268
|
+
"#{Time.now.to_i}.#{self.class.default_ext(self.class.part_type?(part))}"
|
269
|
+
end
|
270
|
+
|
271
|
+
@@tmp_dir = File.join(Dir.tmpdir, ENV['USER'],'mms2r')
|
272
|
+
|
273
|
+
##
|
274
|
+
# Get the temporary directory where media files are written to.
|
275
|
+
|
276
|
+
def self.tmp_dir
|
277
|
+
@@tmp_dir
|
278
|
+
end
|
279
|
+
|
280
|
+
##
|
281
|
+
# Set the temporary directory where media files are written to.
|
282
|
+
def self.tmp_dir=(d)
|
283
|
+
@@tmp_dir=d
|
284
|
+
end
|
285
|
+
|
286
|
+
@@conf_dir = File.join(File.dirname(__FILE__), '..', '..', 'conf')
|
287
|
+
|
288
|
+
##
|
289
|
+
# Set the directory where conf files are stored.
|
290
|
+
|
291
|
+
def self.conf_dir
|
292
|
+
@@conf_dir
|
293
|
+
end
|
294
|
+
|
295
|
+
##
|
296
|
+
# Set the directory where conf files are stored.
|
297
|
+
def self.conf_dir=(d)
|
298
|
+
@@conf_dir=d
|
299
|
+
end
|
300
|
+
|
301
|
+
##
|
302
|
+
# Helper to created a safe directory path element based on the
|
303
|
+
# mail message id.
|
304
|
+
|
305
|
+
def self.safe_message_id(mid)
|
306
|
+
return "#{Time.now.to_i}" if mid.nil?
|
307
|
+
mid.gsub(/<|>|@|\./, "")
|
308
|
+
end
|
309
|
+
|
310
|
+
##
|
311
|
+
# Returns a default file extension based on a content_type
|
312
|
+
|
313
|
+
def self.default_ext(content_type)
|
314
|
+
ext = MMS2R::EXT[content_type]
|
315
|
+
return /[^\/]+\/(.+)/.match(content_type)[1] if ext.nil?
|
316
|
+
ext
|
317
|
+
end
|
318
|
+
|
319
|
+
##
|
320
|
+
# Determines the mimetype of a part. Gauruntees a type is returned.
|
321
|
+
|
322
|
+
def self.part_type?(part)
|
323
|
+
if part.content_type.nil?
|
324
|
+
return 'text/plain'
|
325
|
+
end
|
326
|
+
part.content_type
|
327
|
+
end
|
328
|
+
|
329
|
+
##
|
330
|
+
# Determines the main type of the part's mimetype
|
331
|
+
|
332
|
+
def self.main_type?(part)
|
333
|
+
/^([^\/]+)\//.match(self.part_type?(part))[1]
|
334
|
+
end
|
335
|
+
|
336
|
+
##
|
337
|
+
# Determines the sub type of the part's mimetype
|
338
|
+
|
339
|
+
def self.sub_type?(part)
|
340
|
+
/\/([^\/]+)$/.match(self.part_type?(part))[1]
|
341
|
+
end
|
342
|
+
|
343
|
+
end
|
344
|
+
|
345
|
+
end
|