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 )