ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Handle.pm
(Generate patch)

Comparing AnyEvent/lib/AnyEvent/Handle.pm (file contents):
Revision 1.76 by root, Sun Jul 27 03:28:36 2008 UTC vs.
Revision 1.80 by root, Sun Jul 27 08:43:32 2008 UTC

1package AnyEvent::Handle; 1package AnyEvent::Handle;
2 2
3no warnings; 3no warnings;
4use strict; 4use strict qw(subs vars);
5 5
6use AnyEvent (); 6use AnyEvent ();
7use AnyEvent::Util qw(WSAEWOULDBLOCK); 7use AnyEvent::Util qw(WSAEWOULDBLOCK);
8use Scalar::Util (); 8use Scalar::Util ();
9use Carp (); 9use Carp ();
79 79
80Set the callback to be called when an end-of-file condition is detected, 80Set the callback to be called when an end-of-file condition is detected,
81i.e. in the case of a socket, when the other side has closed the 81i.e. in the case of a socket, when the other side has closed the
82connection cleanly. 82connection cleanly.
83 83
84While not mandatory, it is highly recommended to set an eof callback, 84While not mandatory, it is I<highly> recommended to set an eof callback,
85otherwise you might end up with a closed socket while you are still 85otherwise you might end up with a closed socket while you are still
86waiting for data. 86waiting for data.
87
88If an EOF condition has been detected but no C<on_eof> callback has been
89set, then a fatal error will be raised with C<$!> set to <0>.
87 90
88=item on_error => $cb->($handle, $fatal) 91=item on_error => $cb->($handle, $fatal)
89 92
90This is the error callback, which is called when, well, some error 93This is the error callback, which is called when, well, some error
91occured, such as not being able to resolve the hostname, failure to 94occured, such as not being able to resolve the hostname, failure to
730 ) { 733 ) {
731 return $self->_error (&Errno::ENOSPC, 1); 734 return $self->_error (&Errno::ENOSPC, 1);
732 } 735 }
733 736
734 while () { 737 while () {
735 no strict 'refs';
736
737 my $len = length $self->{rbuf}; 738 my $len = length $self->{rbuf};
738 739
739 if (my $cb = shift @{ $self->{_queue} }) { 740 if (my $cb = shift @{ $self->{_queue} }) {
740 unless ($cb->($self)) { 741 unless ($cb->($self)) {
741 if ($self->{_eof}) { 742 if ($self->{_eof}) {
768 delete $self->{_rw}; 769 delete $self->{_rw};
769 last; 770 last;
770 } 771 }
771 } 772 }
772 773
774 if ($self->{_eof}) {
775 if ($self->{on_eof}) {
773 $self->{on_eof}($self) 776 $self->{on_eof}($self)
774 if $self->{_eof} && $self->{on_eof}; 777 } else {
778 $self->_error (0, 1);
779 }
780 }
775 781
776 # may need to restart read watcher 782 # may need to restart read watcher
777 unless ($self->{_rw}) { 783 unless ($self->{_rw}) {
778 $self->start_read 784 $self->start_read
779 if $self->{on_read} || @{ $self->{_queue} }; 785 if $self->{on_read} || @{ $self->{_queue} };
905 $cb->($_[0], substr $_[0]{rbuf}, 0, $len, ""); 911 $cb->($_[0], substr $_[0]{rbuf}, 0, $len, "");
906 1 912 1
907 } 913 }
908}; 914};
909 915
910# compatibility with older API
911sub push_read_chunk {
912 $_[0]->push_read (chunk => $_[1], $_[2]);
913}
914
915sub unshift_read_chunk {
916 $_[0]->unshift_read (chunk => $_[1], $_[2]);
917}
918
919=item line => [$eol, ]$cb->($handle, $line, $eol) 916=item line => [$eol, ]$cb->($handle, $line, $eol)
920 917
921The callback will be called only once a full line (including the end of 918The callback will be called only once a full line (including the end of
922line marker, C<$eol>) has been read. This line (excluding the end of line 919line marker, C<$eol>) has been read. This line (excluding the end of line
923marker) will be passed to the callback as second argument (C<$line>), and 920marker) will be passed to the callback as second argument (C<$line>), and
958 $cb->($_[0], $1, $2); 955 $cb->($_[0], $1, $2);
959 1 956 1
960 } 957 }
961 } 958 }
962}; 959};
963
964# compatibility with older API
965sub push_read_line {
966 my $self = shift;
967 $self->push_read (line => @_);
968}
969
970sub unshift_read_line {
971 my $self = shift;
972 $self->unshift_read (line => @_);
973}
974 960
975=item regex => $accept[, $reject[, $skip], $cb->($handle, $data) 961=item regex => $accept[, $reject[, $skip], $cb->($handle, $data)
976 962
977Makes a regex match against the regex object C<$accept> and returns 963Makes a regex match against the regex object C<$accept> and returns
978everything up to and including the match. 964everything up to and including the match.
1102 sub { 1088 sub {
1103 # when we can use 5.10 we can use ".", but for 5.8 we use the re-pack method 1089 # when we can use 5.10 we can use ".", but for 5.8 we use the re-pack method
1104 defined (my $len = eval { unpack $format, $_[0]{rbuf} }) 1090 defined (my $len = eval { unpack $format, $_[0]{rbuf} })
1105 or return; 1091 or return;
1106 1092
1093 $format = length pack $format, $len;
1094
1095 # bypass unshift if we already have the remaining chunk
1096 if ($format + $len <= length $_[0]{rbuf}) {
1097 my $data = substr $_[0]{rbuf}, $format, $len;
1098 substr $_[0]{rbuf}, 0, $format + $len, "";
1099 $cb->($_[0], $data);
1100 } else {
1107 # remove prefix 1101 # remove prefix
1108 substr $_[0]{rbuf}, 0, (length pack $format, $len), ""; 1102 substr $_[0]{rbuf}, 0, $format, "";
1109 1103
1110 # read rest 1104 # read remaining chunk
1111 $_[0]->unshift_read (chunk => $len, $cb); 1105 $_[0]->unshift_read (chunk => $len, $cb);
1106 }
1112 1107
1113 1 1108 1
1114 } 1109 }
1115}; 1110};
1116 1111
1176 sub { 1171 sub {
1177 # when we can use 5.10 we can use ".", but for 5.8 we use the re-pack method 1172 # when we can use 5.10 we can use ".", but for 5.8 we use the re-pack method
1178 defined (my $len = eval { unpack "w", $_[0]{rbuf} }) 1173 defined (my $len = eval { unpack "w", $_[0]{rbuf} })
1179 or return; 1174 or return;
1180 1175
1176 my $format = length pack "w", $len;
1177
1178 # bypass unshift if we already have the remaining chunk
1179 if ($format + $len <= length $_[0]{rbuf}) {
1180 my $data = substr $_[0]{rbuf}, $format, $len;
1181 substr $_[0]{rbuf}, 0, $format + $len, "";
1182 $cb->($_[0], Storable::thaw ($data));
1183 } else {
1181 # remove prefix 1184 # remove prefix
1182 substr $_[0]{rbuf}, 0, (length pack "w", $len), ""; 1185 substr $_[0]{rbuf}, 0, $format, "";
1183 1186
1184 # read rest 1187 # read remaining chunk
1185 $_[0]->unshift_read (chunk => $len, sub { 1188 $_[0]->unshift_read (chunk => $len, sub {
1186 if (my $ref = eval { Storable::thaw ($_[1]) }) { 1189 if (my $ref = eval { Storable::thaw ($_[1]) }) {
1187 $cb->($_[0], $ref); 1190 $cb->($_[0], $ref);
1188 } else { 1191 } else {
1189 $self->_error (&Errno::EBADMSG); 1192 $self->_error (&Errno::EBADMSG);
1193 }
1190 } 1194 });
1191 }); 1195 }
1196
1197 1
1192 } 1198 }
1193}; 1199};
1194 1200
1195=back 1201=back
1196 1202

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines