From b58b97fe23a0725f2de9943ad72634aed3d5073f Mon Sep 17 00:00:00 2001 From: Robert Haines Date: Sun, 27 Oct 2019 10:29:27 +0000 Subject: [PATCH] UniversalTime: correctly set the flags. When a timestamp is set/unset the flags should reflect this. --- lib/zip/extra_field/universal_time.rb | 31 +++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/lib/zip/extra_field/universal_time.rb b/lib/zip/extra_field/universal_time.rb index 453b539..39c292c 100644 --- a/lib/zip/extra_field/universal_time.rb +++ b/lib/zip/extra_field/universal_time.rb @@ -4,24 +4,43 @@ module Zip HEADER_ID = 'UT' register_map + ATIME_MASK = 0b010 + CTIME_MASK = 0b100 + MTIME_MASK = 0b001 + def initialize(binstr = nil) @ctime = nil @mtime = nil @atime = nil - @flag = nil + @flag = 0 binstr && merge(binstr) end - attr_accessor :atime, :ctime, :mtime, :flag + attr_reader :atime, :ctime, :mtime, :flag + + def atime=(time) + @flag = time.nil? ? @flag & ~ATIME_MASK : @flag | ATIME_MASK + @atime = time + end + + def ctime=(time) + @flag = time.nil? ? @flag & ~CTIME_MASK : @flag | CTIME_MASK + @ctime = time + end + + def mtime=(time) + @flag = time.nil? ? @flag & ~MTIME_MASK : @flag | MTIME_MASK + @mtime = time + end def merge(binstr) return if binstr.empty? size, content = initial_parse(binstr) size || return - @flag, mtime, atime, ctime = content.unpack('CVVV') - mtime && @mtime ||= ::Zip::DOSTime.at(mtime) - atime && @atime ||= ::Zip::DOSTime.at(atime) - ctime && @ctime ||= ::Zip::DOSTime.at(ctime) + @flag, mt, at, ct = content.unpack('CVVV') + mt && @mtime ||= ::Zip::DOSTime.at(mt) + at && @atime ||= ::Zip::DOSTime.at(at) + ct && @ctime ||= ::Zip::DOSTime.at(ct) end def ==(other)