Class: PEdump::CompositeIO

Inherits:
Object show all
Defined in:
lib/pedump/composite_io.rb

Instance Method Summary collapse

Constructor Details

#initialize(*ios) ⇒ CompositeIO

Returns a new instance of CompositeIO.



3
4
5
6
7
# 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

Instance Method Details

#eof?Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/pedump/composite_io.rb', line 52

def eof?
  @ios.all?(&:eof?)
end

#read(amount = nil, buf = nil) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 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

#rewindObject



44
45
46
# File 'lib/pedump/composite_io.rb', line 44

def rewind
  seek(0)
end

#seek(pos) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
# 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

#sizeObject



48
49
50
# File 'lib/pedump/composite_io.rb', line 48

def size
  @ios.map(&:size).inject(&:+)
end

#tellObject



26
27
28
# File 'lib/pedump/composite_io.rb', line 26

def tell
  @pos
end