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;