1 | package AnyEvent::Handle; |
1 | package AnyEvent::Handle; |
2 | |
2 | |
3 | no warnings; |
3 | no warnings; |
4 | use strict; |
4 | use strict qw(subs vars); |
5 | |
5 | |
6 | use AnyEvent (); |
6 | use AnyEvent (); |
7 | use AnyEvent::Util qw(WSAEWOULDBLOCK); |
7 | use AnyEvent::Util qw(WSAEWOULDBLOCK); |
8 | use Scalar::Util (); |
8 | use Scalar::Util (); |
9 | use Carp (); |
9 | use Carp (); |
… | |
… | |
79 | |
79 | |
80 | Set the callback to be called when an end-of-file condition is detected, |
80 | Set the callback to be called when an end-of-file condition is detected, |
81 | i.e. in the case of a socket, when the other side has closed the |
81 | i.e. in the case of a socket, when the other side has closed the |
82 | connection cleanly. |
82 | connection cleanly. |
83 | |
83 | |
84 | While not mandatory, it is highly recommended to set an eof callback, |
84 | While not mandatory, it is I<highly> recommended to set an eof callback, |
85 | otherwise you might end up with a closed socket while you are still |
85 | otherwise you might end up with a closed socket while you are still |
86 | waiting for data. |
86 | waiting for data. |
|
|
87 | |
|
|
88 | If an EOF condition has been detected but no C<on_eof> callback has been |
|
|
89 | set, 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 | |
90 | This is the error callback, which is called when, well, some error |
93 | This is the error callback, which is called when, well, some error |
91 | occured, such as not being able to resolve the hostname, failure to |
94 | occured, 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 |
|
|
911 | sub push_read_chunk { |
|
|
912 | $_[0]->push_read (chunk => $_[1], $_[2]); |
|
|
913 | } |
|
|
914 | |
|
|
915 | sub 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 | |
921 | The callback will be called only once a full line (including the end of |
918 | The callback will be called only once a full line (including the end of |
922 | line marker, C<$eol>) has been read. This line (excluding the end of line |
919 | line marker, C<$eol>) has been read. This line (excluding the end of line |
923 | marker) will be passed to the callback as second argument (C<$line>), and |
920 | marker) 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 |
|
|
965 | sub push_read_line { |
|
|
966 | my $self = shift; |
|
|
967 | $self->push_read (line => @_); |
|
|
968 | } |
|
|
969 | |
|
|
970 | sub 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 | |
977 | Makes a regex match against the regex object C<$accept> and returns |
963 | Makes a regex match against the regex object C<$accept> and returns |
978 | everything up to and including the match. |
964 | everything 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 | |