From 86f4bb8c29dd7de1dd83c31bd874c63a28616992 Mon Sep 17 00:00:00 2001 From: Matijs van Zuijlen Date: Sun, 15 Jan 2017 21:39:42 +0100 Subject: [PATCH 1/8] Remove OrderedHash --- lib/mapi/convert/note-mime.rb | 2 +- lib/mapi/convert/note-tmail.rb | 2 +- lib/mapi/mime.rb | 8 -- lib/orderedhash.rb | 218 --------------------------------- 4 files changed, 2 insertions(+), 228 deletions(-) delete mode 100644 lib/orderedhash.rb diff --git a/lib/mapi/convert/note-mime.rb b/lib/mapi/convert/note-mime.rb index 5955d9b..7a4d010 100644 --- a/lib/mapi/convert/note-mime.rb +++ b/lib/mapi/convert/note-mime.rb @@ -214,7 +214,7 @@ def to_mime next if mime.headers.keys.map(&:downcase).include? key.downcase mime.headers[key] += vals end - # just a stupid hack to make the content-type header last, when using OrderedHash + # just a stupid hack to make the content-type header last mime.headers['Content-Type'] = mime.headers.delete 'Content-Type' mime diff --git a/lib/mapi/convert/note-tmail.rb b/lib/mapi/convert/note-tmail.rb index e3cae2e..dfb6b28 100644 --- a/lib/mapi/convert/note-tmail.rb +++ b/lib/mapi/convert/note-tmail.rb @@ -226,7 +226,7 @@ def to_tmail #next if mime.headers.keys.map(&:downcase).include? key.downcase mail[key] = vals.first end - # just a stupid hack to make the content-type header last, when using OrderedHash + # just a stupid hack to make the content-type header last #mime.headers['Content-Type'] = mime.headers.delete 'Content-Type' mail diff --git a/lib/mapi/mime.rb b/lib/mapi/mime.rb index c738aa3..3271de8 100644 --- a/lib/mapi/mime.rb +++ b/lib/mapi/mime.rb @@ -13,7 +13,6 @@ # = TODO # # * Better streaming support, rather than an all-in-string approach. -# * Add +OrderedHash+ optionally, to not lose ordering in headers. # * A fair bit remains to be done for this class, its fairly immature. But generally I'd like # to see it be more generally useful. # * All sorts of correctness issues, encoding particular. @@ -23,13 +22,6 @@ # module Mapi class Mime - Hash = begin - require 'orderedhash' - OrderedHash - rescue LoadError - Hash - end - attr_reader :headers, :body, :parts, :content_type, :preamble, :epilogue # Create a Mime object using +str+ as an initial serialization, which must contain headers diff --git a/lib/orderedhash.rb b/lib/orderedhash.rb deleted file mode 100644 index 16a4f58..0000000 --- a/lib/orderedhash.rb +++ /dev/null @@ -1,218 +0,0 @@ -# = OrderedHash -# -# == Version -# 1.2006.07.13 (change of the first number means Big Change) -# -# == Description -# Hash which preserves order of added items (like PHP array). -# -# == Usage -# -# (see examples directory under the ruby gems root directory) -# -# require 'rubygems' -# require 'ordered_hash' -# -# hsh = OrderedHash.new -# hsh['z'] = 1 -# hsh['a'] = 2 -# hsh['c'] = 3 -# p hsh.keys # ['z','a','c'] -# -# == Source -# http://simplypowerful.1984.cz/goodlibs/1.2006.07.13 -# -# == Author -# jan molic (/mig/at_sign/1984/dot/cz/) -# -# == Thanks to -# Andrew Johnson for his suggestions and fixes of Hash[], merge, to_a, inspect and shift -# Desmond Dsouza for == fixes -# -# == Licence -# You can redistribute it and/or modify it under the same terms of Ruby's license; -# either the dual license version in 2003, or any later version. -# - -class OrderedHash < Hash - - attr_accessor :order - - class << self - - def [] *args - hsh = OrderedHash.new - if Hash === args[0] - hsh.replace args[0] - elsif (args.size % 2) != 0 - raise ArgumentError, "odd number of elements for Hash" - else - hsh[args.shift] = args.shift while args.size > 0 - end - hsh - end - - end - - def initialize(*a, &b) - super - @order = [] - end - - def store_only a,b - store a,b - end - - alias orig_store store - - def store a,b - @order.push a unless has_key? a - super a,b - end - - alias []= store - - def == hsh2 - return hsh2==self if !hsh2.is_a?(OrderedHash) - return false if @order != hsh2.order - super hsh2 - end - - def clear - @order = [] - super - end - - def delete key - @order.delete key - super - end - - def each_key - @order.each { |k| yield k } - self - end - - def each_value - @order.each { |k| yield self[k] } - self - end - - def each - @order.each { |k| yield k,self[k] } - self - end - - alias each_pair each - - def delete_if - @order.clone.each { |k| - delete k if yield - } - self - end - - def values - ary = [] - @order.each { |k| ary.push self[k] } - ary - end - - def keys - @order - end - - def invert - hsh2 = Hash.new - @order.each { |k| hsh2[self[k]] = k } - hsh2 - end - - def reject &block - self.dup.delete_if( &block ) - end - - def reject! &block - hsh2 = reject( &block ) - self == hsh2 ? nil : hsh2 - end - - def replace hsh2 - @order = hsh2.keys - super hsh2 - end - - def shift - key = @order.first - key ? [key,delete(key)] : super - end - - def unshift k,v - unless self.include? k - @order.unshift k - orig_store(k,v) - true - else - false - end - end - - def push k,v - unless self.include? k - @order.push k - orig_store(k,v) - true - else - false - end - end - - def pop - key = @order.last - key ? [key,delete(key)] : nil - end - - def first - self[@order.first] - end - - def last - self[@order.last] - end - - def to_a - ary = [] - each { |k,v| ary << [k,v] } - ary - end - - def to_s - self.to_a.to_s - end - - def inspect - ary = [] - each {|k,v| ary << k.inspect + "=>" + v.inspect} - '{' + ary.join(", ") + '}' - end - - def update hsh2 - hsh2.each { |k,v| self[k] = v } - self - end - - alias :merge! update - - def merge hsh2 - self.dup update(hsh2) - end - - def select - ary = [] - each { |k,v| ary << [k,v] if yield k,v } - ary - end - -end - -#=end From 6b82f89dde61c6b5c863a27af4efde8c4a05f3d2 Mon Sep 17 00:00:00 2001 From: aquasync Date: Mon, 4 Jun 2018 20:28:20 +1000 Subject: [PATCH 2/8] Change project homepage to github. Add .rdoc extension to README. --- README => README.rdoc | 0 ruby-msg.gemspec | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) rename README => README.rdoc (100%) diff --git a/README b/README.rdoc similarity index 100% rename from README rename to README.rdoc diff --git a/ruby-msg.gemspec b/ruby-msg.gemspec index 438e9d1..b587c9e 100644 --- a/ruby-msg.gemspec +++ b/ruby-msg.gemspec @@ -11,20 +11,20 @@ Gem::Specification.new do |s| s.description = %q{A library for reading and converting Outlook msg and pst files (mapi message stores).} s.authors = ['Charles Lowe'] s.email = %q{aquasync@gmail.com} - s.homepage = %q{http://code.google.com/p/ruby-msg} + s.homepage = %q{https://github.com/aquasync/ruby-msg} s.rubyforge_project = %q{ruby-msg} s.executables = ['mapitool'] - s.files = ['README', 'COPYING', 'Rakefile', 'ChangeLog', 'ruby-msg.gemspec'] + s.files = ['README.rdoc', 'COPYING', 'Rakefile', 'ChangeLog', 'ruby-msg.gemspec'] s.files += Dir.glob('data/*.yaml') s.files += Dir.glob('lib/**/*.rb') s.files += Dir.glob('test/test_*.rb') s.files += Dir.glob('bin/*') s.has_rdoc = true - s.extra_rdoc_files = ['README', 'ChangeLog'] + s.extra_rdoc_files = ['README.rdoc', 'ChangeLog'] s.rdoc_options += [ - '--main', 'README', + '--main', 'README.rdoc', '--title', "#{PKG_NAME} documentation", '--tab-width', '2' ] From 153b89c5a6c5d93c68d2434aed32725dc9ad7d3b Mon Sep 17 00:00:00 2001 From: aquasync Date: Mon, 4 Jun 2018 21:18:53 +1000 Subject: [PATCH 3/8] Update wiki links in README. --- README.rdoc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.rdoc b/README.rdoc index bd16dfc..e4c3fc5 100644 --- a/README.rdoc +++ b/README.rdoc @@ -118,11 +118,10 @@ support conversion to mime objects. For more information, see -* TODO +* TODO[/aquasync/ruby-msg/wiki/TODO] -* MsgDetails[http://code.google.com/p/ruby-msg/wiki/MsgDetails] +* MsgDetails[/aquasync/ruby-msg/wiki/MsgDetails] -* PstDetails[http://code.google.com/p/ruby-msg/wiki/PstDetails] - -* OleDetails[http://code.google.com/p/ruby-ole/wiki/OleDetails] +* PstDetails[/aquasync/ruby-msg/wiki/PstDetails] +* OleDetails[/aquasync/ruby-msg/wiki/OleDetails] From 34fb32e43e29b3d5fa535537faf7123a176146a8 Mon Sep 17 00:00:00 2001 From: aquasync Date: Wed, 25 Jul 2018 21:07:12 +1000 Subject: [PATCH 4/8] Fix broken Attachment#save (github #14). --- lib/mapi/base.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/mapi/base.rb b/lib/mapi/base.rb index f5410bd..72b8b7f 100644 --- a/lib/mapi/base.rb +++ b/lib/mapi/base.rb @@ -30,7 +30,8 @@ def data # a.save open(File.basename(a.filename || 'attachment'), 'wb') def save io raise "can only save binary data blobs, not ole dirs" if @embedded_ole - data.each_read { |chunk| io << chunk } + data.rewind + io << data.read(8192) until data.eof? end def inspect From 72101584caac6e9b71cc04b5f80a14c7ef313627 Mon Sep 17 00:00:00 2001 From: aquasync Date: Thu, 28 Mar 2024 17:12:13 +1100 Subject: [PATCH 5/8] Update ChangeLog and bump version. --- ChangeLog | 7 +++++++ lib/mapi/version.rb | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index b17e930..d7f3984 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +== 1.5.3 / 2024-03-28 + +- Remove OrderedHash (github #12, mvz). +- Change project homepage to github and add .rdoc extension to README. +- Update wiki links in README to point to github not googlecode. +- Fix broken Attachment#save (github #14). + == 1.5.2 / 2014-08-20 - Move mime.rb file to avoid conflicts with mime_types gem (github #7, diff --git a/lib/mapi/version.rb b/lib/mapi/version.rb index e94f97c..0653d07 100644 --- a/lib/mapi/version.rb +++ b/lib/mapi/version.rb @@ -1,3 +1,3 @@ module Mapi - VERSION = '1.5.2' + VERSION = '1.5.3' end From 5f8fceac0f09d06362fb8dc52202d28af01afff4 Mon Sep 17 00:00:00 2001 From: aquasync Date: Thu, 28 Mar 2024 21:39:20 +1100 Subject: [PATCH 6/8] Duplicate homepage in gemspec metadata to fix rubygems. --- ruby-msg.gemspec | 1 + 1 file changed, 1 insertion(+) diff --git a/ruby-msg.gemspec b/ruby-msg.gemspec index b587c9e..4d3f26d 100644 --- a/ruby-msg.gemspec +++ b/ruby-msg.gemspec @@ -12,6 +12,7 @@ Gem::Specification.new do |s| s.authors = ['Charles Lowe'] s.email = %q{aquasync@gmail.com} s.homepage = %q{https://github.com/aquasync/ruby-msg} + s.metadata = {'homepage_uri' => s.homepage} s.rubyforge_project = %q{ruby-msg} s.executables = ['mapitool'] From 769b6b8a0e438e522673af045e076545b95cd232 Mon Sep 17 00:00:00 2001 From: aquasync Date: Thu, 28 Mar 2024 21:40:52 +1100 Subject: [PATCH 7/8] Update ChangeLog and bump version. --- ChangeLog | 4 ++++ lib/mapi/version.rb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index d7f3984..50f0cab 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +== 1.5.3.1 / 2024-03-28 + +- Duplicate homepage in gemspec metadata to fix rubygems (fixes github #18). + == 1.5.3 / 2024-03-28 - Remove OrderedHash (github #12, mvz). diff --git a/lib/mapi/version.rb b/lib/mapi/version.rb index 0653d07..df92fc4 100644 --- a/lib/mapi/version.rb +++ b/lib/mapi/version.rb @@ -1,3 +1,3 @@ module Mapi - VERSION = '1.5.3' + VERSION = '1.5.3.1' end From 4e31827908b4eaebeda95ac82cea7d79db2afe47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20Rosick=C3=BD?= Date: Fri, 15 Aug 2025 18:10:30 +0200 Subject: [PATCH 8/8] exclude null chars --- lib/mapi/msg.rb | 4 ++-- lib/mapi/pst.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/mapi/msg.rb b/lib/mapi/msg.rb index 89199e3..3ed950f 100644 --- a/lib/mapi/msg.rb +++ b/lib/mapi/msg.rb @@ -100,7 +100,7 @@ class PropertyStore # change these to use mapi symbolic const names ENCODINGS = { 0x000d => proc { |obj| obj }, # seems to be used when its going to be a directory instead of a file. eg nested ole. 3701 usually. in which case we shouldn't get here right? - 0x001f => proc { |obj| Ole::Types::FROM_UTF16.iconv obj.read }, # unicode + 0x001f => proc { |obj| Ole::Types::Lpwstr.load obj.read }, # unicode # ascii # FIXME hack did a[0..-2] before, seems right sometimes, but for some others it chopped the text. chomp 0x001e => proc { |obj| obj.read.chomp 0.chr }, @@ -198,7 +198,7 @@ def self.parse_nameid obj prop = if named str_off = str.unpack('V').first len = names_data[str_off, 4].unpack('V').first - Ole::Types::FROM_UTF16.iconv names_data[str_off + 4, len] + Ole::Types::Lpwstr.load names_data[str_off + 4, len] else a, b = str.unpack('v2') Log.debug "b not 0" if b != 0 diff --git a/lib/mapi/pst.rb b/lib/mapi/pst.rb index 9ac64b0..68e1d95 100644 --- a/lib/mapi/pst.rb +++ b/lib/mapi/pst.rb @@ -1122,7 +1122,7 @@ def handle_indirect_values key, type, value if type == PT_STRING8 value = value.read elsif type == PT_UNICODE - value = Ole::Types::FROM_UTF16.iconv value.read + value = Ole::Types::Lpwstr.load value.read end end # special subject handling