Sha256: 794309ec1224e16ae48d1d26531973c96669cbaff0c2644ed35a6686976c5d63

Contents?: true

Size: 1.98 KB

Versions: 23

Compression:

Stored size: 1.98 KB

Contents

##
# $Id: entry.rb 12718 2011-05-25 16:45:20Z egypt $
##

module Rex
module Zip

# 
# An Entry represents a logical file or directory to be stored in an Archive
#
class Entry

	attr_accessor :name, :flags, :info, :xtra, :comment, :attrs
	attr_reader :data

	def initialize(fname, data, compmeth, timestamp=nil, attrs=nil, xtra=nil, comment=nil)
		@name = fname
		@data = data
		@xtra = xtra
		@xtra ||= ''
		@comment = comment
		@comment ||= ''
		@attrs = attrs
		@attrs ||= 0

		# XXX: sanitize timestmap (assume now)
		timestamp ||= Time.now
		@flags = CompFlags.new(0, compmeth, timestamp)

		if (@data)
			compress
		else
			@data = ''
			@info = CompInfo.new(0, 0, 0)
		end
		@compdata ||= ''
	end

	def data=(val)
		@data = val
		compress
	end

	#
	# Compress the #data and store it for later use.  If this entry's compression method
	# produces a larger blob than the original data, the method is changed to CM_STORE.
	#
	def compress
		@crc = Zlib.crc32(@data, 0)
		case @flags.compmeth

		when CM_STORE
			@compdata = @data

		when CM_DEFLATE
			z = Zlib::Deflate.new(Zlib::BEST_COMPRESSION)
			@compdata = z.deflate(@data, Zlib::FINISH)
			z.close
			@compdata = @compdata[2, @compdata.length-6]

		else
			raise 'Unsupported compression method: %u' % @flags.compmeth
		end

		# if compressing doesn't help, just store it
		if (@compdata.length > @data.length)
			@compdata = @data
			@flags.compmeth = CM_STORE
		end

		@info = CompInfo.new(@crc, @compdata.length, @data.length)
	end


	def relative_path
		if (@name[0,1] == '/')
			return @name[1,@name.length]
		end
		@name
	end


	#
	# Return the compressed data in a format suitable for adding to an Archive
	#
	def pack
		ret = ''

		#  - lfh 1
		lfh = LocalFileHdr.new(self)
		ret << lfh.pack

		#  - data 1
		if (@compdata)
			ret << @compdata
		end

		if (@gpbf & GPBF_USE_DATADESC)
			#  - data desc 1
			dd = DataDesc.new(@info)
			ret << dd.pack
		end

		ret
	end

	def inspect
		"#<#{self.class} name:#{name}, data:#{@data.length} bytes>"
	end

end

end
end

Version data entries

23 entries across 23 versions & 1 rubygems

Version Path
librex-0.0.65 lib/rex/zip/entry.rb
librex-0.0.63 lib/rex/zip/entry.rb
librex-0.0.54 lib/rex/zip/entry.rb
librex-0.0.53 lib/rex/zip/entry.rb
librex-0.0.52 lib/rex/zip/entry.rb
librex-0.0.51 lib/rex/zip/entry.rb
librex-0.0.50 lib/rex/zip/entry.rb
librex-0.0.49 lib/rex/zip/entry.rb
librex-0.0.48 lib/rex/zip/entry.rb
librex-0.0.47 lib/rex/zip/entry.rb
librex-0.0.46 lib/rex/zip/entry.rb
librex-0.0.44 lib/rex/zip/entry.rb
librex-0.0.43 lib/rex/zip/entry.rb
librex-0.0.42 lib/rex/zip/entry.rb
librex-0.0.41 lib/rex/zip/entry.rb
librex-0.0.40 lib/rex/zip/entry.rb
librex-0.0.39 lib/rex/zip/entry.rb
librex-0.0.38 lib/rex/zip/entry.rb
librex-0.0.37 lib/rex/zip/entry.rb
librex-0.0.36 lib/rex/zip/entry.rb