Class Archive::Tar::Minitar::Reader
In: lib/more/facets/minitar.rb
Parent: Object

The class that reads a tar format archive from a data stream. The data stream may be sequential or random access, but certain features only work with random access data streams.

Methods

close   each   each_entry   new   open   rewind  

Public Class methods

Creates and returns a new Reader object.

[Source]

# File lib/more/facets/minitar.rb, line 662
    def initialize(anIO)
      @io     = anIO
      @init_pos = anIO.pos
    end

With no associated block, +Reader::open+ is a synonym for +Reader::new+. If the optional code block is given, it will be passed the new writer as an argument and the Reader object will automatically be closed when the block terminates. In this instance, +Reader::open+ returns the value of the block.

[Source]

# File lib/more/facets/minitar.rb, line 647
    def self.open(anIO)
      reader = Reader.new(anIO)

      return reader unless block_given?

      begin
        res = yield reader
      ensure
        reader.close
      end

      res
    end

Public Instance methods

[Source]

# File lib/more/facets/minitar.rb, line 717
    def close
    end

Iterates through each entry in the data stream.

[Source]

# File lib/more/facets/minitar.rb, line 668
    def each(&block)
      each_entry(&block)
    end

Iterates through each entry in the data stream.

[Source]

# File lib/more/facets/minitar.rb, line 686
    def each_entry
      loop do
        return if @io.eof?

        header = Archive::Tar::PosixHeader.new_from_stream(@io)
        return if header.empty?

        entry = EntryStream.new(header, @io)
        size  = entry.size

        yield entry

        skip = (512 - (size % 512)) % 512

        if @io.respond_to?(:seek)
            # avoid reading...
          @io.seek(size - entry.bytes_read, IO::SEEK_CUR)
        else
          pending = size - entry.bytes_read
          while pending > 0
            bread = @io.read([pending, 4096].min).size
            raise UnexpectedEOF if @io.eof?
            pending -= bread
          end
        end
        @io.read(skip) # discard trailing zeros
          # make sure nobody can use #read, #getc or #rewind anymore
        entry.close
      end
    end

Resets the read pointer to the beginning of data stream. Do not call this during a each or each_entry iteration. This only works with random access data streams that respond to rewind and pos.

[Source]

# File lib/more/facets/minitar.rb, line 675
    def rewind
      if @init_pos == 0
        raise NonSeekableStream unless @io.respond_to?(:rewind)
        @io.rewind
      else
        raise NonSeekableStream unless @io.respond_to?(:pos=)
        @io.pos = @init_pos
      end
    end

[Validate]