Archive::Lha::Header::Level2 - Archive::Lha::Header::Level2 documentation


Archive-Lha documentation Contained in the Archive-Lha distribution.

Index


Code Index:

NAME

Top

Archive::Lha::Header::Level2

DESCRIPTION

Top

You usually don't need to use this directly. See Archive::Lha::Header for examples.

This parses Level 2 headers found in the recent archives. Level 2 header uses extended headers to store longer file/directory names.

METHODS

Top

new

parses a stream and creates an object.

AUTHOR

Top

Kenichi Ishigaki, <ishigaki@cpan.org>

COPYRIGHT AND LICENSE

Top


Archive-Lha documentation Contained in the Archive-Lha distribution.

package Archive::Lha::Header::Level2;

use strict;
use warnings;
use Carp;
use Archive::Lha::Header::Base;
use Archive::Lha::Header::Utils;

sub new {
  my ($class, $stream) = @_;

  my $start = $stream->tell;
  my $size  = _short( split '', $stream->read(2) );

  croak "Header is broken: size is null" unless $size;
  croak "Header is too large: $size" if $size > 4096;

  $stream->seek( $start );
  my @bits = split '', $stream->read( $size );

  my %header;
  $header{header_top}    = $start;
  $header{header_size}   = $size;
  $header{method}        = join '', @bits[3..5];
  $header{encoded_size}  = _int( @bits[7..10] );
  $header{original_size} = _int( @bits[11..14] );
  $header{timestamp}     = _int( @bits[15..18] );
  $header{crc16}         = _short( @bits[21..22] );
  $header{os}            = _os_id( $bits[23] );
  $header{data_top}      = $start + $size;
  $header{next_header}   = $header{data_top} + $header{encoded_size};
  my $extended_size = _short( @bits[24..25] );
  my $from = 26;
  while( $extended_size ) {
    my $to = $from + $extended_size - 1;
    my ($next, %hash) = _extended_header( @bits[$from..$to] );
    %header = (%header, %hash) if %hash;
    $extended_size = $next;
    $from = $to + 1;
  }

  bless \%header, $class;
}

1;

__END__