# Simple length-prepended block filter.
# Copyright 2004 by Rocco Caputo.  Free software.
# Same terms as Perl itself.  Have fun!

package LPBFilter;

use warnings;
use strict;
use bytes;

sub new {
  my $class = shift;
  my $self = bless {
    wanted => undef,
    buffer => "",
  }, $class;
  return $self;
}

sub put {
  my ($self, $blocks) = @_;
  substr($_, 0, 0) = pack("N", length($_))
    foreach @$blocks;
  return $blocks;
}

sub get_one_start {
  my ($self, $chunks) = @_;
  $self->{buffer} .= join("", @$chunks);
}

sub get_one {
  my $self = shift;

  unless (defined $self->{wanted}) {
    return [] if length $self->{buffer} < 4;
    $self->{wanted} = unpack(
      "N", substr($self->{buffer}, 0, 4, "")
    );
  }

  return []
    if length($self->{buffer}) < $self->{wanted};
  my $wanted = delete $self->{wanted};
  return [
    substr($self->{buffer}, 0, $wanted, "")
  ];
}

sub get_pending {
  my $self = shift;
  return $self->{buffer};
}

1;
