class PEdump::CompositeIO

Public Class Methods

new(*ios) click to toggle source
# File lib/pedump/composite_io.rb, line 3
def initialize(*ios)
  @ios    = ios.flatten
  @starts = ios.map(&:tell) # respect current position of each IO
  @pos = 0
end

Public Instance Methods

eof?() click to toggle source
# File lib/pedump/composite_io.rb, line 52
def eof?
  @ios.all?(&:eof?)
end
read(amount = nil, buf = nil) click to toggle source
# File lib/pedump/composite_io.rb, line 9
def read(amount = nil, buf = nil)
  buf ||= ''; buf1 = ''

  # truncates buffer to zero length if nothing read
  @ios.first.read(amount,buf)

  @ios[1..-1].each do |io|
    break if amount && buf.size >= amount
    io.read(amount ? (amount-buf.size) : nil, buf1)
    buf << buf1
  end

  @pos += buf.size

  buf.size > 0 ? buf : (amount ? nil : buf )
end
rewind() click to toggle source
# File lib/pedump/composite_io.rb, line 44
def rewind
  seek(0)
end
seek(pos) click to toggle source
# File lib/pedump/composite_io.rb, line 30
def seek pos
  @pos = pos
  @ios.each_with_index do |io,idx|
    if pos > 0
      sz = io.size-@starts[idx]
      io.seek( @starts[idx] + (pos < sz ? pos : sz) )
      pos -= sz
    else
      # seek all remaining IOs to 0
      io.seek @starts[idx]
    end
  end
end
size() click to toggle source
# File lib/pedump/composite_io.rb, line 48
def size
  @ios.map(&:size).inject(&:+)
end
tell() click to toggle source
# File lib/pedump/composite_io.rb, line 26
def tell
  @pos
end