$cb = ($RH{$type} or Carp::croak "unsupported type passed to AnyEvent::Handle::push_read")
->($self, $cb, @_);
}
push @{ $self->{_queue} }, $cb;
$self->_drain_rbuf unless $self->{_in_drain};
}
sub unshift_read {
my $self = shift;
my $cb = pop;
if (@_) {
my $type = shift;
$cb = ($RH{$type} or Carp::croak "unsupported type passed to AnyEvent::Handle::unshift_read")
->($self, $cb, @_);
}
unshift @{ $self->{_queue} }, $cb;
$self->_drain_rbuf unless $self->{_in_drain};
}
=item $handle->push_read (type => @args, $cb)
=item $handle->unshift_read (type => @args, $cb)
Instead of providing a callback that parses the data itself you can chose
between a number of predefined parsing formats, for chunks of data, lines
etc.
Predefined types are (if you have ideas for additional types, feel free to
drop by and tell us):
=over 4
=item chunk => $octets, $cb->($handle, $data)
Invoke the callback only once C<$octets> bytes have been read. Pass the
data read to the callback. The callback will never be called with less
data.
Example: read 2 bytes.
$handle->push_read (chunk => 2, sub {
warn "yay ", unpack "H*", $_[1];
});
=cut
register_read_type chunk => sub {
my ($self, $cb, $len) = @_;
sub {
$len <= length $_[0]{rbuf} or return;
$cb->($_[0], substr $_[0]{rbuf}, 0, $len, "");
1
}
};
# compatibility with older API
sub push_read_chunk {
$_[0]->push_read (chunk => $_[1], $_[2]);
}
sub unshift_read_chunk {
$_[0]->unshift_read (chunk => $_[1], $_[2]);
}
=item line => [$eol, ]$cb->($handle, $line, $eol)
The callback will be called only once a full line (including the end of
line marker, C<$eol>) has been read. This line (excluding the end of line
marker) will be passed to the callback as second argument (C<$line>), and
the end of line marker as the third argument (C<$eol>).
The end of line marker, C<$eol>, can be either a string, in which case it
will be interpreted as a fixed record end marker, or it can be a regex
object (e.g. created by C<qr>), in which case it is interpreted as a
regular expression.
The end of line marker argument C<$eol> is optional, if it is missing (NOT
undef), then C<qr|\015?\012|> is used (which is good for most internet
protocols).
Partial lines at the end of the stream will never be returned, as they are
not marked by the end of line marker.
=cut
register_read_type line => sub {
my ($self, $cb, $eol) = @_;
$eol = qr|(\015?\012)| if @_ < 3;
$eol = quotemeta $eol unless ref $eol;
$eol = qr|^(.*?)($eol)|s;
sub {
$_[0]{rbuf} =~ s/$eol// or return;
=9= |