File Coverage

lib/Archive/Lha/Header/Level2.pm
Criterion Covered Total %
statement 44 44 100.0
branch 4 6 66.6
condition n/a
subroutine 6 6 100.0
pod 1 1 100.0
total 55 57 96.4


line stmt bran cond sub pod time code
1             package Archive::Lha::Header::Level2;
2              
3 17     17   115 use strict;
  17         58  
  17         710  
4 17     17   88 use warnings;
  17         32  
  17         974  
5 17     17   127 use Carp;
  17         42  
  17         1276  
6 17     17   98 use Archive::Lha::Header::Base;
  17         29  
  17         104  
7 17     17   94 use Archive::Lha::Header::Utils;
  17         30  
  17         156  
8              
9             sub new {
10 57     57 1 178 my ($class, $stream) = @_;
11              
12 57         156 my $start = $stream->tell;
13 57         162 my $size = unpack 'v', $stream->read(2);
14              
15 57 50       178 croak "Header is broken: size is null" unless $size;
16 57 50       185 croak "Header is too large: $size" if $size > 4096;
17              
18 57         179 $stream->seek($start);
19 57         151 my $buf = $stream->read($size);
20              
21 57         114 my %header;
22 57         162 $header{header_top} = $start;
23 57         166 $header{header_size} = $size;
24 57         181 $header{method} = substr($buf, 3, 3);
25 57         185 $header{encoded_size} = unpack 'V', substr($buf, 7, 4);
26 57         149 $header{original_size} = unpack 'V', substr($buf, 11, 4);
27 57         170 $header{timestamp} = unpack 'V', substr($buf, 15, 4);
28 57         178 $header{timestamp_is_unix} = 1;
29 57         213 $header{crc16} = unpack 'v', substr($buf, 21, 2);
30 57         385 $header{os} = _os_id( substr($buf, 23, 1) );
31 57         168 $header{data_top} = $start + $size;
32 57         192 $header{next_header} = $header{data_top} + $header{encoded_size};
33              
34 57         94 my $from = 26;
35 57         144 my $extended_size = unpack 'v', substr($buf, 24, 2);
36 57         162 while ($extended_size) {
37 284         713 my ($next, $hash) = _extended_header_buf($buf, $from, $extended_size);
38 284 100       420 %header = (%header, %{ $hash }) if %{ $hash };
  190         1406  
  284         1097  
39 284         665 $from += $extended_size;
40 284         816 $extended_size = $next;
41             }
42              
43 57         349 bless \%header, $class;
44             }
45              
46             1;
47              
48             __END__