1use strict; 2use warnings; 3 4package Data::ParseBinary::Stream::StringBufferReader; 5our @ISA = qw{Data::ParseBinary::Stream::StringRefReader Data::ParseBinary::Stream::WrapperBase}; 6 7__PACKAGE__->_registerStreamType("StringBuffer"); 8 9sub new { 10 my ($class, $sub_stream) = @_; 11 my $string = ''; 12 my $self = $class->SUPER::new(\$string); 13 $self->_warping($sub_stream); 14 return $self; 15} 16 17sub ReadBytes { 18 my ($self, $count) = @_; 19 if ($self->{location} + $count > $self->{length}) { 20 my $more_needed = $count - ($self->{length} - $self->{location}); 21 my $new_bytes = $self->{ss}->ReadBytes($more_needed); 22 ${ $self->{data} } .= $new_bytes; 23 $self->{length} += $more_needed; 24 } 25 return $self->SUPER::ReadBytes($count); 26} 27 28sub seek { 29 my ($self, $newpos) = @_; 30 if ($newpos > $self->{length}) { 31 my $more_needed = $newpos - $self->{length}; 32 my $new_bytes = $self->{ss}->ReadBytes($more_needed); 33 ${ $self->{data} } .= $new_bytes; 34 $self->{length} += $more_needed; 35 } 36 $self->SUPER::seek($newpos); 37} 38 39package Data::ParseBinary::Stream::StringBufferWriter; 40our @ISA = qw{Data::ParseBinary::Stream::StringRefWriter Data::ParseBinary::Stream::WrapperBase}; 41 42__PACKAGE__->_registerStreamType("StringBuffer"); 43 44sub new { 45 my ($class, $sub_stream) = @_; 46 my $source = ''; 47 my $self = $class->SUPER::new(\$source); 48 $self->_warping($sub_stream); 49 return $self; 50} 51 52sub Flush { 53 my $self = shift; 54 my $data = $self->SUPER::Flush(); 55 $self->{ss}->WriteBytes($$data); 56 my $empty_string = ''; 57 $self->{data} = \$empty_string; 58 $self->{offset} = 0; 59 return $self->{ss}->Flush(); 60} 61 62 631;