<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,5 +1,7 @@
 ### 2.3.0 / 2008-08-30 (Snakes And Barrels Greatest Hits)
-* 4 new features
+* 5 new features
+  * detect smartphone status/type based on model metadata from jpeg and tiff
+    exif data using exifr gem, access exif MMS2R::Media#exif
   * make MMS2R Rails gem packaging friendly with an init.rb - Scott Taylor,
     smtlaissezfaire
   * delegate missing methods to mms2r's tmail object so that mms2r behaves as</diff>
      <filename>History.txt</filename>
    </modified>
    <modified>
      <diff>@@ -2,22 +2,22 @@
 
   http://mms2r.rubyforge.org/
   by Mike Mondragon
-  http://rubyforge.org/tracker/?group_id=3065 
+  http://rubyforge.org/tracker/?group_id=3065
   http://github.com/monde/mms2r/tree/master
   http://peepcode.com/products/mms2r-pdf
 
 == DESCRIPTION
-  
-MMS2R is a library that decodes the parts of an MMS message to disk while 
-stripping out advertising injected by the mobile carriers.  MMS messages are 
+
+MMS2R is a library that decodes the parts of an MMS message to disk while
+stripping out advertising injected by the mobile carriers.  MMS messages are
 multipart email and the carriers often inject branding into these messages.  Use
 MMS2R if you want to get at the real user generated content from a MMS without
 having to deal with the cruft from the carriers.
 
-If MMS2R is not aware of a particular carrier no extra processing is done to the 
+If MMS2R is not aware of a particular carrier no extra processing is done to the
 MMS other than decoding and consolidating its media.
 
-Contact the author to add additional carriers to be processed by the library.  
+Contact the author to add additional carriers to be processed by the library.
 Suggestions and patches appreciated and welcomed!
 
 Corpus of carriers currently processed by MMS2R:
@@ -25,7 +25,7 @@ Corpus of carriers currently processed by MMS2R:
 * 1nbox/Idea: 1nbox.net
 * 3 Ireland: mms.3ireland.ie
 * Alltel: mms.alltel.com
-* AT&amp;T/Cingular/Legacy: mms.att.net, txt.att.net, mmode.com, mms.mycingular.com, 
+* AT&amp;T/Cingular/Legacy: mms.att.net, txt.att.net, mmode.com, mms.mycingular.com,
   cingularme.com, mobile.mycingular.com pics.cingularme.com
 * Bell Canada: txt.bell.ca
 * Bell South / Suncom: bellsouth.net
@@ -50,7 +50,7 @@ Corpus of carriers currently processed by MMS2R:
 * T-Mobile: tmomail.net, mmsreply.t-mobile.co.uk, tmo.blackberry.net
 * TELUS Corporation (Canada): mms.telusmobility.com, msg.telus.com
 * UAE MMS: mms.ae
-* Unicel: unicel.com, info2go.com 
+* Unicel: unicel.com, info2go.com
   (note: mobile number is tucked away in a text/plain part for unicel.com)
 * Verizon: vzwpix.com, vtext.com
 * Virgin Mobile: vmpix.com
@@ -59,8 +59,8 @@ Corpus of carriers currently processed by MMS2R:
 
 == FEATURES
 
-* #default_media and #default_text methods return a File that can be used in 
-  attachment_fu 
+* #default_media and #default_text methods return a File that can be used in
+  attachment_fu
 * #process supports blocks to for enumerating over the content of the MMS
 * #process can be made lazy when :process =&gt; :lazy is passed to new
 * logging is enabled when :logger =&gt; your_logger is passed to new
@@ -111,9 +111,18 @@ http://peepcode.com/products/mms2r-pdf
   FileUtils.cp mail.media['image/jpeg'].first, '/some/where/useful', :verbose =&gt; true
 
   puts &quot;does the mail have quicktime video? #{!mail.media['video/quicktime'].nil?}&quot;
-  
+
   puts &quot;plus run anything that TMail provides, e.g. #{mail.to.inspect}&quot;
 
+  # check if the mail is from a mobile phone
+  puts &quot;mail is from a mobile phone #{mail.is_mobile?}&quot;
+
+  # inspect default media's exif data if exifr gem is installed and default
+  # media is a jpeg or tiff
+  puts &quot;mail is from a mobile phone #{mail.is_mobile?}&quot;
+  puts &quot;mail's default media's exif data is:&quot;
+  puts mms.exif.inspect
+
   # Block support, process and receive all media types of video.
   mail.process do |media_type, files|
     # assumes a Clip model that is an AttachmentFu
@@ -134,6 +143,11 @@ http://peepcode.com/products/mms2r-pdf
 * Hpricot
 * TMail
 
+== OPTIONAL
+
+* exifr - install exifr for exif access on default jpeg or tiff media, and
+          smart phone detection
+
 == INSTALL
 
 conventional
@@ -148,13 +162,6 @@ github
 git clone git://github.com/monde/mms2r.git
 svn co svn://rubyforge.org/var/svn/mms2r/trunk mms2r
 
-== CONTRIBUTE
-
-If you contribute a patch that is accepted then you'll get developer rights 
-for the project on RubyForge.  Please ensure your work includes 100% test 
-converage.  The library is ZenTest autotest discovery enabled so running 
-autotest in the root of the project is very helpful during development.
-
 == AUTHORS
 
 Copyright (c) 2007-2008 by Mike Mondragon (blog[http://blog.mondragon.cc/])
@@ -176,8 +183,8 @@ MMS2R's Flickr page[http://www.flickr.com/photos/8627919@N05/]
 * Matt Conway
 * Kai Kai
 * Michael DelGaudio
-* Sai Emrys (http://saizai.com)
-* Brendan Lim
+* Sai Emrys (blog[http://saizai.com])
+* Brendan Lim (github profile[http://github.com/brendanlim])
 
 == LICENSE
 </diff>
      <filename>README.txt</filename>
    </modified>
    <modified>
      <diff>@@ -7,16 +7,16 @@
 ##
 # = Synopsis
 #
-# MMS2R is a library to collect media files from MMS messages.  MMS messages 
-# are multipart emails and mobile carriers often inject branding into these 
-# messages.  MMS2R strips the advertising from an MMS leaving the actual user 
+# MMS2R is a library to collect media files from MMS messages.  MMS messages
+# are multipart emails and mobile carriers often inject branding into these
+# messages.  MMS2R strips the advertising from an MMS leaving the actual user
 # generated media.
 #
-# The Tracker for MMS2R is located at 
+# The Tracker for MMS2R is located at
 # http://rubyforge.org/tracker/?group_id=3065
 # Please submit bugs and feature requests using the Tracker.
 #
-# If MMS from a carrier not known by MMS2R is encountered please submit a 
+# If MMS from a carrier not known by MMS2R is encountered please submit a
 # sample to the author for inclusion in this project.
 #
 # == Stand Alone Example
@@ -48,31 +48,31 @@
 # == Built In Configuration
 #
 # A custom configuration can be created for processing the MMS from carriers
-# that are not currently known by MMS2R.  In the  conf/ directory create a 
-# YAML file named by combining the domain name of the MMS sender plus a .yml 
-# extension.  For instance the configuration of senders from AT&amp;T's cellular 
-# service with a Sender pattern of 2065551212@mms.att.net have a configuration 
+# that are not currently known by MMS2R.  In the  conf/ directory create a
+# YAML file named by combining the domain name of the MMS sender plus a .yml
+# extension.  For instance the configuration of senders from AT&amp;T's cellular
+# service with a Sender pattern of 2065551212@mms.att.net have a configuration
 # named conf/mms.att.net.yml
 #
 # The YAML configuration contains a Hash with instructions for determining what
 # is content generated by the user and what is content inserted by the carrier.
 #
-# The root hash itself has two hashes under the keys 'ignore' and 'transform', 
+# The root hash itself has two hashes under the keys 'ignore' and 'transform',
 # and an array under the 'number' key.
 # Each hash is itself keyed by mime-type.  The value pointed to by the mime-type
-# key is an array.  The ignore arrays are first evaluated as a regular expressions 
+# key is an array.  The ignore arrays are first evaluated as a regular expressions
 # and if the evaluation fails as a equality for a string filename.  Ignores
 # work by filename for the multi-part of the MMS that is being inspected.  The
-# array pointed to by the 'number' key represents an alternate mail header where 
-# the sender's number can be found with a regular expression and replacement 
+# array pointed to by the 'number' key represents an alternate mail header where
+# the sender's number can be found with a regular expression and replacement
 # value for a gsub eval.
 #
 # The transform arrays are themselves an array of two element arrays.  The elements
 # are parameters for gsub and will be evaluated from within the ruby code.
 #
-# Ignore instructions are honored first then transform instructions.  In the sample, 
-# masthead.jpg is ignored as a regular expression, and spacer.gif is ignored as a 
-# filename comparison.  The transform has a match and a replacement, see the gsub 
+# Ignore instructions are honored first then transform instructions.  In the sample,
+# masthead.jpg is ignored as a regular expression, and spacer.gif is ignored as a
+# filename comparison.  The transform has a match and a replacement, see the gsub
 # documentation for more information about match and replace.
 #
 # --
@@ -92,9 +92,9 @@
 #   - /^([^\s]+)\s.*/
 #   - &quot;\1&quot;
 #
-# Carriers often provide their services under many different domain names.  
-# The conf/aliases.yml is a YAML file with a hash that maps alternative or 
-# legacy carrier names to the most common name of their service.  For example 
+# Carriers often provide their services under many different domain names.
+# The conf/aliases.yml is a YAML file with a hash that maps alternative or
+# legacy carrier names to the most common name of their service.  For example
 # in terms of MMS2R txt.att.net is an alias for mms.att.net.  Therefore when
 # an MMS with a Sender of txt.att.net is processed MMS2R will use the
 # mms.att.net configuration to process the message.
@@ -113,27 +113,27 @@ module MMS2R
         klass.orig_new(mail, opts)
       end
     end
-    
+
     # Pass off everything we don't do to the TMail object
     # TODO: refactor to explicit addition a la http://blog.jayfields.com/2008/02/ruby-replace-methodmissing-with-dynamic.html
     def method_missing method, *args, &amp;block
       mail.send method, *args, &amp;block
     end
-    
+
     ##
     # TMail object that the media files were derived from.
 
     attr_reader :mail
 
     ##
-    # media returns the hash of media.  The media hash is keyed by mime-type 
-    # such as 'text/plain' and the value mapped to the key is an array of 
+    # media returns the hash of media.  The media hash is keyed by mime-type
+    # such as 'text/plain' and the value mapped to the key is an array of
     # media that are of that type.
 
     attr_reader :media
 
     ##
-    # Carrier is the domain name of the carrier.  If the carrier is not known 
+    # Carrier is the domain name of the carrier.  If the carrier is not known
     # the carrier will be set to 'mms2r.media'
 
     attr_reader :carrier
@@ -149,14 +149,14 @@ module MMS2R
     MULTIPARTS_TO_SPLIT = [ 'multipart/related', 'multipart/alternative', 'multipart/mixed', 'multipart/appledouble' ]
 
     ##
-    # Factory method that creates MMS2R::Media products based on the domain 
-    # name of the carrier from which the MMS originated.  mail is a TMail 
+    # Factory method that creates MMS2R::Media products based on the domain
+    # name of the carrier from which the MMS originated.  mail is a TMail
     # object.
 
     def self.create(mail)
       d = lambda{ ['mms2r.media', MMS2R::Media] } #sets a default to detect
       from_domain = self.domain(mail)
-      processor = MMS2R::CARRIERS.detect(d) do |domain, klass| 
+      processor = MMS2R::CARRIERS.detect(d) do |domain, klass|
         return klass, domain if from_domain == domain
       end
       [MMS2R::Media, from_domain]
@@ -164,8 +164,8 @@ module MMS2R
 
     ##
     # Determine if return-path or from is going to be used to desiginate the
-    # origin carrier.  If the domain in the From header is listed in 
-    # conf/from.yaml then that is the carrier domain.  Else if there is a 
+    # origin carrier.  If the domain in the From header is listed in
+    # conf/from.yaml then that is the carrier domain.  Else if there is a
     # Return-Path header its address's domain is the carrier doamin, else
     # use From header's address domain.
 
@@ -217,7 +217,7 @@ module MMS2R
       log(&quot;#{self.class} created&quot;, :info)
       @carrier = opts[:domain]
       @dir_count = 0
-      @media_dir = File.join(self.tmp_dir(), 
+      @media_dir = File.join(self.tmp_dir(),
                      self.safe_message_id(@mail.message_id))
       @media = {}
       @was_processed = false
@@ -226,7 +226,7 @@ module MMS2R
       @body = nil
       @default_media = nil
       @default_text = nil
-      
+
       f = File.join(self.conf_dir(), &quot;aliases.yml&quot;)
       @aliases = YAML::load_file(f) rescue {}
 
@@ -240,9 +240,9 @@ module MMS2R
     end
 
     ##
-    # Get the phone number associated with this MMS if it exists.  The value 
-    # returned is simplistic, it is just the user name of the from address 
-    # before the @ symbol.  Validation of the number is left to you.  Most 
+    # Get the phone number associated with this MMS if it exists.  The value
+    # returned is simplistic, it is just the user name of the from address
+    # before the @ symbol.  Validation of the number is left to you.  Most
     # carriers are using the real phone number as the username.
 
     def number
@@ -274,8 +274,8 @@ module MMS2R
       @subject
     end
 
-    # Convenience method that returns a string including all the text of the 
-    # first text/plain file found.  Returns empty string if no body text 
+    # Convenience method that returns a string including all the text of the
+    # first text/plain file found.  Returns empty string if no body text
     # is found.
 
     def body
@@ -285,9 +285,9 @@ module MMS2R
     end
 
     # Returns a File with the most likely candidate for the user-submitted
-    # media.  Given that most MMS messages only have one file attached, this 
-    # method will try to return that file.  Singleton methods are added to 
-    # the File object so it can be used in place of a CGI upload (local_path, 
+    # media.  Given that most MMS messages only have one file attached, this
+    # method will try to return that file.  Singleton methods are added to
+    # the File object so it can be used in place of a CGI upload (local_path,
     # original_filename, size, and content_type) such as in conjunction with
     # AttachementFu.  The largest file found in terms of bytes is returned.
     #
@@ -298,9 +298,9 @@ module MMS2R
     end
 
     # Returns a File with the most likely candidate that is text, or nil
-    # otherwise.  It also adds singleton methods to the File object so it can be 
-    # used in place of a CGI upload (local_path, original_filename, size, and 
-    # content_type) such as in conjunction with AttachmentFu.  The largest file 
+    # otherwise.  It also adds singleton methods to the File object so it can be
+    # used in place of a CGI upload (local_path, original_filename, size, and
+    # content_type) such as in conjunction with AttachmentFu.  The largest file
     # found in terms of bytes is returned.
     #
     # Returns nil if there are not any text Files found
@@ -311,9 +311,9 @@ module MMS2R
 
     ##
     # process is a template method and collects all the media in a MMS.
-    # Override helper methods to this template to clean out advertising and/or 
-    # ignore media that are advertising.  This method should not be overridden 
-    # unless there is an extreme special case in processing the media of a MMS 
+    # Override helper methods to this template to clean out advertising and/or
+    # ignore media that are advertising.  This method should not be overridden
+    # unless there is an extreme special case in processing the media of a MMS
     # (like Sprint)
     #
     # Helper methods for the process template:
@@ -321,7 +321,7 @@ module MMS2R
     # * process_media -- retrieves media to temporary file, returns path to file.
     # * transform_text -- called by process_media, strips out advertising.
     # * temp_file -- creates a temporary filepath based on information from the part.
-    # 
+    #
     # Block support:
     # Call process() with a block to automatically iterate through media.
     # For example, to process and receive only media of video type:
@@ -335,11 +335,11 @@ module MMS2R
     def process() # :yields: media_type, file
       unless @was_processed
         log(&quot;#{self.class} processing&quot;, :info)
-  
+
         parts = mail.multipart? ? mail.parts : [mail]
-  
-        # Double check for multipart/related, if it exists replace it with its 
-        # children parts.  Do this twice as multipart/alternative can have 
+
+        # Double check for multipart/related, if it exists replace it with its
+        # children parts.  Do this twice as multipart/alternative can have
         # children and we want to fold everything down
         for i in 1..2
           flat = []
@@ -349,10 +349,10 @@ module MMS2R
             else
               flat &lt;&lt; p
             end
-          end 
+          end
           parts = flat.dup
-        end 
-  
+        end
+
         # get to work
         parts.each do |p|
           t = p.part_type?
@@ -375,8 +375,8 @@ module MMS2R
     end
 
     ##
-    # Helper for process template method to determine if media contained in a 
-    # part should be ignored.  Producers should override this method to return 
+    # Helper for process template method to determine if media contained in a
+    # part should be ignored.  Producers should override this method to return
     # true for media such as images that are advertising, carrier logos, etc.
     # See the ignore section in the discussion of the built-in configuration.
 
@@ -385,18 +385,18 @@ module MMS2R
       ignore = ignores.detect{|test| filename?(part) == test}
       ignore ||= ignores.detect{|test| filename?(part) =~ eval(test) if test.index('/') == 0 }
       ignore ||= ignores.detect{|test| part.body.strip =~ eval(test) if test.index('/') == 0 }
-      ignore ||= (part.body.strip.size == 0 ? true : nil) 
+      ignore ||= (part.body.strip.size == 0 ? true : nil)
       ignore.nil? ? false : true
     end
 
     ##
-    # Helper for process template method to decode the part based on its type 
-    # and write its content to a temporary file.  Returns path to temporary 
-    # file that holds the content.  Parts with a main type of text will have 
+    # Helper for process template method to decode the part based on its type
+    # and write its content to a temporary file.  Returns path to temporary
+    # file that holds the content.  Parts with a main type of text will have
     # their contents transformed with a call to transform_text
     #
-    # Producers should only override this method if the parts of the MMS need 
-    # special treatment besides what is expected for a normal mime part (like 
+    # Producers should only override this method if the parts of the MMS need
+    # special treatment besides what is expected for a normal mime part (like
     # Sprint).
     #
     # Returns a tuple of content type, file path
@@ -405,7 +405,7 @@ module MMS2R
       # TMail body auto-magically decodes quoted
       # printable for text/html type.
       file = temp_file(part)
-      if part.main_type('text') == 'text' || 
+      if part.main_type('text') == 'text' ||
          part.content_type == 'application/smil'
         type, content = transform_text_part(part)
         mode = 'w'
@@ -427,11 +427,11 @@ module MMS2R
 
     ##
     # Helper for process_media template method to transform text.
-    # See the transform section in the discussion of the built-in 
+    # See the transform section in the discussion of the built-in
     # configuration.
 
     def transform_text(type, text, original_nencoding = 'ISO-8859-1')
-      return type, text unless transforms = config['transform'][type] 
+      return type, text unless transforms = config['transform'][type]
 
       #convert to UTF-8
       begin
@@ -447,7 +447,7 @@ module MMS2R
         r = transform.last
         utf_t = utf_t.gsub(eval(p), r) rescue utf_t
       end
-      
+
       return type, utf_t
     end
 
@@ -461,12 +461,12 @@ module MMS2R
     end
 
     ##
-    # Helper for process template method to name a temporary filepath based on 
-    # information in the part.  This version attempts to honor the name of the 
-    # media as labeled in the part header and creates a unique temporary 
+    # Helper for process template method to name a temporary filepath based on
+    # information in the part.  This version attempts to honor the name of the
+    # media as labeled in the part header and creates a unique temporary
     # directory for writing the file so filename collision does not occur.
-    # Consumers of this method expect the directory structure to the file 
-    # exists, if the method is overridden it is mandatory that this behavior is 
+    # Consumers of this method expect the directory structure to the file
+    # exists, if the method is overridden it is mandatory that this behavior is
     # retained.
 
     def temp_file(part)
@@ -475,7 +475,7 @@ module MMS2R
     end
 
     ##
-    # Purges the unique MMS2R::Media.media_dir directory created 
+    # Purges the unique MMS2R::Media.media_dir directory created
     # for this producer and all of the media that it contains.
 
     def purge()
@@ -492,7 +492,7 @@ module MMS2R
     end
 
     ##
-    # Helper to temp_file to create a unique temporary directory that is a 
+    # Helper to temp_file to create a unique temporary directory that is a
     # child of tmp_dir  This version is based on the message_id of the mail.
 
     def msg_tmp_dir()
@@ -525,7 +525,7 @@ module MMS2R
         base = File.basename(name, ext)
         name = &quot;#{base[0, 255 - ext.size]}#{ext}&quot;
       end
-      
+
       name
     end
 
@@ -534,11 +534,46 @@ module MMS2R
     end
 
     ##
-    # Best guess of the mobile device type.  Simple heuristics thus far for 
-    # :iphone :blackberry :handset :unknown .  Could be expanded for exif 
+    # Best guess of the mobile device type.  Simple heuristics thus far for
+    # :iphone :blackberry :handset :unknown .  Could be expanded for exif
     # probing or shifting mail header schemes
 
     def device_type?
+      begin
+        # rely on native exif first with exifr gem if its loaded
+        require 'exifr'
+        file = attachment(['image'])
+        if file
+          original = file.original_filename
+          @exif = case original
+                  when /\.jpg$/i
+                    EXIFR::JPEG.new(file)
+                  when /\.jepg$/i
+                    EXIFR::JPEG.new(file)
+                  when /\.tif$/i
+                    EXIFR::TIFF.new(file)
+                  when /\.tiff$/i
+                    EXIFR::TIFF.new(file)
+                  end
+          if @exif
+            # TODO do something about the assortment of camera models that have 
+            # been seen:
+            # 1.3 Megapixel, 2.0 Megapixel, BlackBerry, CU920, G'z One TYPE-S,
+            # Hermes, iPhone, LG8700, LSI_S5K4AAFA, Micron MT9M113 1.3MP YUV,
+            # Motorola Phone, Omni_vision-9650, Pre,
+            # Seoul Electronics &amp; Telecom SIM120B 1.3M, SGH-T729, SGH-T819,
+            # SPH-M540, SPH-M800, SYSTEMLSI S5K4BAFB 2.0 MP, VX-9700
+            case @exif.model
+            when/iPhone/i
+              return :iphone
+            when/BlackBerry/i
+              return :blackberry
+            end
+          end
+        end
+      rescue LoadError =&gt; err
+      end
+
       headers = config['device_types']['headers'] rescue {}
       headers.keys.each do |header|
         if mail.header[header.downcase]
@@ -554,13 +589,21 @@ module MMS2R
 
       return :handset if File.exist?(File.join(self.conf_dir,
                                      &quot;#{self.aliases[self.carrier] || self.carrier}.yml&quot;))
-      
+
       :unknown
     end
 
     ##
+    # exif object on default image from exifr gem
+
+    def exif
+      device_type? unless @exif
+      @exif
+    end
+
+    ##
     # The source of the MMS was some sort of mobile or smart phone
-    
+
     def is_mobile?
       self.device_type? != :unknown
     end
@@ -607,7 +650,7 @@ module MMS2R
       if MMS2R::EXT[content_type]
         MMS2R::EXT[content_type]
       elsif content_type
-        content_type.split('/').last 
+        content_type.split('/').last
       end
     end
 
@@ -644,7 +687,7 @@ module MMS2R
 
     ##
     # convenience accessor for self.class.conf_dir
-    
+
     def conf_dir
       self.class.conf_dir
     end
@@ -665,14 +708,14 @@ module MMS2R
 
     ##
     # convenience accessor for self.class.safe_message_id
-    
+
     def safe_message_id(message_id)
       self.class.safe_message_id(message_id)
     end
 
     ##
     # convenience accessor for self.class.initialize_confg
-  
+
     def initialize_config(config)
       self.class.initialize_config(config)
     end
@@ -697,13 +740,13 @@ module MMS2R
 
     ##
     # used by #default_media and #text to return the biggest attachment type
-    # listed in the types array 
+    # listed in the types array
 
     def attachment(types)
 
       # get all the files that are of the major types passed in
       files = []
-      
+
       types.each do |type|
         media.keys.find_all{|k| type.include?(&quot;/&quot;) ? k == type : k.index(type) == 0 }.each do |key|
           files += media[key]
@@ -721,7 +764,7 @@ module MMS2R
         if File.size(f) &gt; size
           size = File.size(f)
           file = File.new(f)
-          mime_type = media.detect{|type,files| files.detect{|fl| fl == f}}[0] 
+          mime_type = media.detect{|type,files| files.detect{|fl| fl == f}}[0]
         end
       end
 </diff>
      <filename>lib/mms2r/media.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,57 +6,22 @@ Gem::Specification.new do |s|
 
   s.required_rubygems_version = Gem::Requirement.new(&quot;&gt;= 0&quot;) if s.respond_to? :required_rubygems_version=
   s.authors = [&quot;Mike Mondragon&quot;]
-  s.date = %q{2009-08-30}
+  s.date = %q{2009-08-31}
   s.description = %q{== DESCRIPTION
-  
-MMS2R is a library that decodes the parts of an MMS message to disk while 
-stripping out advertising injected by the mobile carriers.  MMS messages are 
+
+MMS2R is a library that decodes the parts of an MMS message to disk while
+stripping out advertising injected by the mobile carriers.  MMS messages are
 multipart email and the carriers often inject branding into these messages.  Use
 MMS2R if you want to get at the real user generated content from a MMS without
 having to deal with the cruft from the carriers.
 
-If MMS2R is not aware of a particular carrier no extra processing is done to the 
+If MMS2R is not aware of a particular carrier no extra processing is done to the
 MMS other than decoding and consolidating its media.
 
-Contact the author to add additional carriers to be processed by the library.  
+Contact the author to add additional carriers to be processed by the library.
 Suggestions and patches appreciated and welcomed!
 
-Corpus of carriers currently processed by MMS2R:
-
-* 1nbox/Idea: 1nbox.net
-* 3 Ireland: mms.3ireland.ie
-* Alltel: mms.alltel.com
-* AT&amp;T/Cingular/Legacy: mms.att.net, txt.att.net, mmode.com, mms.mycingular.com, 
-  cingularme.com, mobile.mycingular.com pics.cingularme.com
-* Bell Canada: txt.bell.ca
-* Bell South / Suncom: bellsouth.net
-* Cricket Wireless: mms.mycricket.com
-* Dobson/Cellular One: mms.dobson.net
-* Helio: mms.myhelio.com
-* Hutchison 3G UK Ltd: mms.three.co.uk
-* INDOSAT M2: mobile.indosat.net.id
-* LUXGSM S.A.: mms.luxgsm.lu
-* Maroc Telecom / mms.mobileiam.ma
-* MTM South Africa: mms.mtn.co.za
-* NetCom (Norway): mms.netcom.no
-* Nextel: messaging.nextel.com
-* O2 Germany: mms.o2online.de
-* O2 UK: mediamessaging.o2.co.uk
-* Orange &amp; Regional Oranges: orangemms.net, mmsemail.orange.pl, orange.fr
-* PLSPICTURES.COM mms hosting: waw.plspictures.com
-* PXT New Zealand: pxt.vodafone.net.nz
-* Rogers of Canada: rci.rogers.com
-* SaskTel: sms.sasktel.com
-* Sprint: pm.sprint.com, messaging.sprintpcs.com, sprintpcs.com
-* T-Mobile: tmomail.net, mmsreply.t-mobile.co.uk, tmo.blackberry.net
-* TELUS Corporation (Canada): mms.telusmobility.com, msg.telus.com
-* UAE MMS: mms.ae
-* Unicel: unicel.com, info2go.com 
-  (note: mobile number is tucked away in a text/plain part for unicel.com)
-* Verizon: vzwpix.com, vtext.com
-* Virgin Mobile: vmpix.com
-* Virgin Mobile of Canada: vmobile.ca
-* Vodacom: mms.vodacom4me.co.za}
+Corpus of carriers currently processed by MMS2R:}
   s.email = %q{mikemondragon@gmail.com}
   s.extra_rdoc_files = [&quot;History.txt&quot;, &quot;Manifest.txt&quot;, &quot;README.txt&quot;]
   s.files = [&quot;.gitignore&quot;, &quot;History.txt&quot;, &quot;Manifest.txt&quot;, &quot;README.txt&quot;, &quot;Rakefile&quot;, &quot;conf/1nbox.net.yml&quot;, &quot;conf/aliases.yml&quot;, &quot;conf/bellsouth.net.yml&quot;, &quot;conf/from.yml&quot;, &quot;conf/mediamessaging.o2.co.uk.yml&quot;, &quot;conf/messaging.nextel.com.yml&quot;, &quot;conf/mms.3ireland.ie.yml&quot;, &quot;conf/mms.ae.yml&quot;, &quot;conf/mms.alltel.com.yml&quot;, &quot;conf/mms.att.net.yml&quot;, &quot;conf/mms.dobson.net.yml&quot;, &quot;conf/mms.luxgsm.lu.yml&quot;, &quot;conf/mms.mobileiam.ma.yml&quot;, &quot;conf/mms.mtn.co.za.yml&quot;, &quot;conf/mms.mycricket.com.yml&quot;, &quot;conf/mms.myhelio.com.yml&quot;, &quot;conf/mms.netcom.no.yml&quot;, &quot;conf/mms.o2online.de.yml&quot;, &quot;conf/mms.three.co.uk.yml&quot;, &quot;conf/mms.vodacom4me.co.za.yml&quot;, &quot;conf/mms2r_media.yml&quot;, &quot;conf/mobile.indosat.net.id.yml&quot;, &quot;conf/msg.telus.com.yml&quot;, &quot;conf/orangemms.net.yml&quot;, &quot;conf/pm.sprint.com.yml&quot;, &quot;conf/pxt.vodafone.net.nz.yml&quot;, &quot;conf/rci.rogers.com.yml&quot;, &quot;conf/sms.sasktel.com.yml&quot;, &quot;conf/tmomail.net.yml&quot;, &quot;conf/txt.bell.ca.yml&quot;, &quot;conf/unicel.com.yml&quot;, &quot;conf/vmpix.com.yml&quot;, &quot;conf/vzwpix.com.yml&quot;, &quot;conf/waw.plspictures.com.yml&quot;, &quot;dev_tools/anonymizer.rb&quot;, &quot;dev_tools/debug_sprint_hpricot_parsing.rb&quot;, &quot;dev_tools/github.rb&quot;, &quot;init.rb&quot;, &quot;lib/mms2r.rb&quot;, &quot;lib/mms2r/media.rb&quot;, &quot;lib/mms2r/media/sprint.rb&quot;, &quot;lib/tmail_ext.rb&quot;, &quot;mms2r.gemspec&quot;, &quot;test/fixtures/1nbox-2images-01.mail&quot;, &quot;test/fixtures/1nbox-2images-02.mail&quot;, &quot;test/fixtures/1nbox-2images-03.mail&quot;, &quot;test/fixtures/1nbox-2images-04.mail&quot;, &quot;test/fixtures/3ireland-mms-01.mail&quot;, &quot;test/fixtures/alltel-image-01.mail&quot;, &quot;test/fixtures/alltel-mms-01.mail&quot;, &quot;test/fixtures/alltel-mms-03.mail&quot;, &quot;test/fixtures/apple-double-image-01.mail&quot;, &quot;test/fixtures/att-blackberry-02.mail&quot;, &quot;test/fixtures/att-blackberry.mail&quot;, &quot;test/fixtures/att-image-01.mail&quot;, &quot;test/fixtures/att-image-02.mail&quot;, &quot;test/fixtures/att-iphone-01.mail&quot;, &quot;test/fixtures/att-iphone-02.mail&quot;, &quot;test/fixtures/att-iphone-03.mail&quot;, &quot;test/fixtures/att-text-01.mail&quot;, &quot;test/fixtures/bell-canada-image-01.mail&quot;, &quot;test/fixtures/cingularme-text-01.mail&quot;, &quot;test/fixtures/cingularme-text-02.mail&quot;, &quot;test/fixtures/dobson-image-01.mail&quot;, &quot;test/fixtures/dot.jpg&quot;, &quot;test/fixtures/generic.mail&quot;, &quot;test/fixtures/helio-image-01.mail&quot;, &quot;test/fixtures/helio-message-01.mail&quot;, &quot;test/fixtures/iconv-fr-text-01.mail&quot;, &quot;test/fixtures/indosat-image-01.mail&quot;, &quot;test/fixtures/indosat-image-02.mail&quot;, &quot;test/fixtures/info2go-image-01.mail&quot;, &quot;test/fixtures/iphone-image-01.mail&quot;, &quot;test/fixtures/luxgsm-image-01.mail&quot;, &quot;test/fixtures/maroctelecom-france-mms-01.mail&quot;, &quot;test/fixtures/mediamessaging_o2_co_uk-image-01.mail&quot;, &quot;test/fixtures/mmode-image-01.mail&quot;, &quot;test/fixtures/mms.ae-image-01.mail&quot;, &quot;test/fixtures/mms.mycricket.com-pic-and-text.mail&quot;, &quot;test/fixtures/mms.mycricket.com-pic.mail&quot;, &quot;test/fixtures/mmsreply.t-mobile.co.uk-text-image-01.mail&quot;, &quot;test/fixtures/mobile.mycingular.com-text-01.mail&quot;, &quot;test/fixtures/mtn-southafrica-mms.mail&quot;, &quot;test/fixtures/mycingular-image-01.mail&quot;, &quot;test/fixtures/netcom-image-01.mail&quot;, &quot;test/fixtures/nextel-image-01.mail&quot;, &quot;test/fixtures/nextel-image-02.mail&quot;, &quot;test/fixtures/nextel-image-03.mail&quot;, &quot;test/fixtures/nextel-image-04.mail&quot;, &quot;test/fixtures/o2-de-image-01.mail&quot;, &quot;test/fixtures/orange-uk-image-01.mail&quot;, &quot;test/fixtures/orangefrance-text-and-image.mail&quot;, &quot;test/fixtures/orangepoland-text-01.mail&quot;, &quot;test/fixtures/orangepoland-text-02.mail&quot;, &quot;test/fixtures/pics.cingularme.com-image-01.mail&quot;, &quot;test/fixtures/pxt-image-01.mail&quot;, &quot;test/fixtures/rogers-canada-mms-01.mail&quot;, &quot;test/fixtures/sasktel-image-01.mail&quot;, &quot;test/fixtures/sprint-broken-image-01.mail&quot;, &quot;test/fixtures/sprint-image-01.mail&quot;, &quot;test/fixtures/sprint-pcs-text-01.mail&quot;, &quot;test/fixtures/sprint-purged-image-01.mail&quot;, &quot;test/fixtures/sprint-text-01.mail&quot;, &quot;test/fixtures/sprint-two-images-01.mail&quot;, &quot;test/fixtures/sprint-video-01.mail&quot;, &quot;test/fixtures/sprint.mov&quot;, &quot;test/fixtures/suncom-blackberry.mail&quot;, &quot;test/fixtures/telus-image-01.mail&quot;, &quot;test/fixtures/three-uk-image-01.mail&quot;, &quot;test/fixtures/tmo.blackberry.net-image-01.mail&quot;, &quot;test/fixtures/tmobile-blackberry-02.mail&quot;, &quot;test/fixtures/tmobile-blackberry.mail&quot;, &quot;test/fixtures/tmobile-image-01.mail&quot;, &quot;test/fixtures/tmobile-image-02.mail&quot;, &quot;test/fixtures/unicel-image-01.mail&quot;, &quot;test/fixtures/verizon-blackberry.mail&quot;, &quot;test/fixtures/verizon-image-01.mail&quot;, &quot;test/fixtures/verizon-image-02.mail&quot;, &quot;test/fixtures/verizon-image-03.mail&quot;, &quot;test/fixtures/verizon-text-01.mail&quot;, &quot;test/fixtures/verizon-video-01.mail&quot;, &quot;test/fixtures/virgin-mobile-image-01.mail&quot;, &quot;test/fixtures/virgin.ca-text-01.mail&quot;, &quot;test/fixtures/vodacom4me-co-za-01.mail&quot;, &quot;test/fixtures/vodacom4me-co-za-02.mail&quot;, &quot;test/fixtures/vodacom4me-southafrica-mms-01.mail&quot;, &quot;test/fixtures/vodacom4me-southafrica-mms-04.mail&quot;, &quot;test/fixtures/vtext-text-01.mail&quot;, &quot;test/fixtures/vzwpix.com-image-01.mail&quot;, &quot;test/fixtures/waw.plspictures.com-image-01.mail&quot;, &quot;test/test_1nbox_net.rb&quot;, &quot;test/test_bell_canada.rb&quot;, &quot;test/test_bellsouth_net.rb&quot;, &quot;test/test_github.rb&quot;, &quot;test/test_helper.rb&quot;, &quot;test/test_mediamessaging_o2_co_uk.rb&quot;, &quot;test/test_messaging_nextel_com.rb&quot;, &quot;test/test_messaging_sprintpcs_com.rb&quot;, &quot;test/test_mms2r_media.rb&quot;, &quot;test/test_mms_3ireland_ie.rb&quot;, &quot;test/test_mms_ae.rb&quot;, &quot;test/test_mms_alltel_com.rb&quot;, &quot;test/test_mms_att_net.rb&quot;, &quot;test/test_mms_dobson_net.rb&quot;, &quot;test/test_mms_luxgsm_lu.rb&quot;, &quot;test/test_mms_mobileiam_ma.rb&quot;, &quot;test/test_mms_mtn_co_za.rb&quot;, &quot;test/test_mms_mycricket_com.rb&quot;, &quot;test/test_mms_myhelio_com.rb&quot;, &quot;test/test_mms_netcom_no.rb&quot;, &quot;test/test_mms_o2online_de.rb&quot;, &quot;test/test_mms_three_co_uk.rb&quot;, &quot;test/test_mms_vodacom4me_co_za.rb&quot;, &quot;test/test_mobile_indosat_net_id.rb&quot;, &quot;test/test_msg_telus_com.rb&quot;, &quot;test/test_orangemms_net.rb&quot;, &quot;test/test_pm_sprint_com.rb&quot;, &quot;test/test_pxt_vodafone_net_nz.rb&quot;, &quot;test/test_rci_rogers_com.rb&quot;, &quot;test/test_sms_sasktel_com.rb&quot;, &quot;test/test_tmomail_net.rb&quot;, &quot;test/test_unicel_com.rb&quot;, &quot;test/test_vmpix_com.rb&quot;, &quot;test/test_vzwpix_com.rb&quot;, &quot;test/test_waw_plspictures_com.rb&quot;, &quot;vendor/plugins/mms2r/lib/autotest/discover.rb&quot;, &quot;vendor/plugins/mms2r/lib/autotest/mms2r.rb&quot;]</diff>
      <filename>mms2r.gemspec</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>627e731c59e3cf24a1a4002190eed926e90c77f9</id>
    </parent>
  </parents>
  <author>
    <name>Mike Mondragon</name>
    <email>mikemondragon@gmail.com</email>
  </author>
  <url>http://github.com/monde/mms2r/commit/b1616ac476c196934e77f55c2182533d88e1bbb3</url>
  <id>b1616ac476c196934e77f55c2182533d88e1bbb3</id>
  <committed-date>2009-08-31T00:46:13-07:00</committed-date>
  <authored-date>2009-08-31T00:46:13-07:00</authored-date>
  <message>mild cleanup and enhanced smartphone detection with exifr gem</message>
  <tree>7751f2b856713bc019d9c3b2d8b073f90401eaef</tree>
  <committer>
    <name>Mike Mondragon</name>
    <email>mikemondragon@gmail.com</email>
  </committer>
</commit>
