Class: Archive::Tar::Minitar::Reader
- Inherits:
-
Object
- Object
- Archive::Tar::Minitar::Reader
- Defined in:
- lib/folio/minitar.rb
Overview
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.
Defined Under Namespace
Modules: InvalidEntryStream Classes: EntryStream
Class Method Summary collapse
-
.open(anIO) ⇒ Object
With no associated block,
Reader::openis a synonym forReader::new.
Instance Method Summary collapse
- #close ⇒ Object
-
#each(&block) ⇒ Object
Iterates through each entry in the data stream.
-
#each_entry ⇒ Object
Iterates through each entry in the data stream.
-
#initialize(anIO) ⇒ Reader
constructor
Creates and returns a new Reader object.
-
#rewind ⇒ Object
Resets the read pointer to the beginning of data stream.
Constructor Details
#initialize(anIO) ⇒ Reader
Creates and returns a new Reader object.
662 663 664 665 |
# File 'lib/folio/minitar.rb', line 662 def initialize(anIO) @io = anIO @init_pos = anIO.pos end |
Class Method Details
.open(anIO) ⇒ Object
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.
647 648 649 650 651 652 653 654 655 656 657 658 659 |
# File 'lib/folio/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 |
Instance Method Details
#close ⇒ Object
717 718 |
# File 'lib/folio/minitar.rb', line 717 def close end |
#each(&block) ⇒ Object
Iterates through each entry in the data stream.
668 669 670 |
# File 'lib/folio/minitar.rb', line 668 def each(&block) each_entry(&block) end |
#each_entry ⇒ Object
Iterates through each entry in the data stream.
686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 |
# File 'lib/folio/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 |
#rewind ⇒ Object
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.
675 676 677 678 679 680 681 682 683 |
# File 'lib/folio/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 |