/usr/share/perl5/IO/Async/Protocol/LineStream.pm is in libio-async-perl 0.61-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | # You may distribute under the terms of either the GNU General Public License
# or the Artistic License (the same terms as Perl itself)
#
# (C) Paul Evans, 2010 -- leonerd@leonerd.org.uk
package IO::Async::Protocol::LineStream;
use strict;
use warnings;
our $VERSION = '0.61';
use base qw( IO::Async::Protocol::Stream );
use Carp;
=head1 NAME
C<IO::Async::Protocol::LineStream> - stream-based protocols using lines of
text
=head1 SYNOPSIS
Most likely this class will be subclassed to implement a particular network
protocol.
package Net::Async::HelloWorld;
use strict;
use warnings;
use base qw( IO::Async::Protocol::LineStream );
sub on_read_line
{
my $self = shift;
my ( $line ) = @_;
if( $line =~ m/^HELLO (.*)/ ) {
my $name = $1;
$self->invoke_event( on_hello => $name );
}
}
sub send_hello
{
my $self = shift;
my ( $name ) = @_;
$self->write_line( "HELLO $name" );
}
This small example elides such details as error handling, which a real
protocol implementation would be likely to contain.
=head1 DESCRIPTION
=cut
=head1 EVENTS
The following events are invoked, either using subclass methods or CODE
references in parameters:
=head2 on_read_line $line
Invoked when a new complete line of input is received.
=cut
=head1 PARAMETERS
The following named parameters may be passed to C<new> or C<configure>:
=over 8
=item on_read_line => CODE
CODE reference for the C<on_read_line> event.
=back
=cut
sub _init
{
my $self = shift;
$self->SUPER::_init;
$self->{eol} = "\x0d\x0a";
$self->{eol_pattern} = qr/\x0d?\x0a/;
}
sub configure
{
my $self = shift;
my %params = @_;
foreach (qw( on_read_line )) {
$self->{$_} = delete $params{$_} if exists $params{$_};
}
$self->SUPER::configure( %params );
}
sub on_read
{
my $self = shift;
my ( $buffref, $eof ) = @_;
# Easiest to run each event individually, in case it returns a CODE ref
$$buffref =~ s/^(.*?)$self->{eol_pattern}// or return 0;
return $self->invoke_event( on_read_line => $1 ) || 1;
}
=head1 METHODS
=cut
=head2 $lineprotocol->write_line( $text )
Writes a line of text to the transport stream. The text will have the
end-of-line marker appended to it; C<$text> should not end with it.
=cut
sub write_line
{
my $self = shift;
my ( $line, @args ) = @_;
$self->write( "$line$self->{eol}", @args );
}
=head1 AUTHOR
Paul Evans <leonerd@leonerd.org.uk>
=cut
0x55AA;
|