Asynchat
view release on metacpan or search on metacpan
lib/Asynchat.pm view on Meta::CPAN
package Asynchat;
{
$Asynchat::VERSION = '0.01';
}
#==============================================================================
#
# FILE: Asynchat.pm
#
# DESCRIPTION: porting in Perl of asynchat.py (python 2.7)
#
# FILES: ---
# BUGS: ---
# NOTES: ---
# AUTHOR: (Sebastiano Piccoli), <sebastiano.piccoli@gmail.com>
# COMPANY:
# VERSION: 0.01
# CREATED: 08/09/12 19:47:28 CEST
# REVISION: ---
#==============================================================================
use strict;
use warnings;
use Scalar::Util::Numeric qw(isnum isint);
use Asyncore;
use base qw( Asyncore::Dispatcher );
use Socket;
use Carp;
our $ac_in_buffer_size = 4096;
our $ac_out_buffer_size = 4096;
sub init {
my($self, $sock, $map) = @_;
$self->{_ac_in_buffer} = '';
$self->{_incoming} = [];
$self->{_producer_fifo} = []; # a list of data;
$self->SUPER::init($sock, $map);
return $self;
}
sub collect_incoming_data {
# overrided
}
sub _collect_incoming_data {
my($self, $data) = @_;
push(@{ $self->{_incoming} }, $data);
}
sub _get_data {
my $self = shift;
my $data = join("", @{ $self->{_incoming} });
#delete $self->{_incoming};
return $data;
}
sub found_terminator {
# overrided
}
sub set_terminator {
my($self, $terminator) = @_;
# Set the input delimiter.
# Can be a fixed string of any length, an integer, or undef
$self->{_terminator} = $terminator;
}
sub get_terminator {
my $self = shift;
return $self->{_terminator};
}
sub handle_read {
my $self = shift;
my $data = $self->receive($ac_in_buffer_size);
# catch error todo
$self->{_ac_in_buffer} = $self->{_ac_in_buffer} . $data;
# Continue to search for terminator in ac_in_buffer,
# while calling collect_incoming_data. The while loop
# is necessary because we might read several data terminator
# combos with a single recv(4096).
while ($self->{_ac_in_buffer}) {
my $lb = length($self->{_ac_in_buffer});
my $terminator = $self->get_terminator();
if (not $terminator) {
# no terminator, collect it all
$self->collect_incoming_data($self->{_ac_in_buffer});
$self->{_ac_in_buffer} = '';
( run in 1.348 second using v1.01-cache-2.11-cpan-5a3173703d6 )