X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FBit%2FMorseSignals%2FReceiver.pm;h=a829f36645b7166f1c46329a9f1561ef154e5ebe;hb=8ce9fd9d5f4e6197d1a33a3fd11953cc1dc3b31f;hp=42f6b4fcca68fefed9422077afbcaffb98c8899c;hpb=f90efd6aef2e807ed35c07341456ce727d6668bc;p=perl%2Fmodules%2FBit-MorseSignals.git diff --git a/lib/Bit/MorseSignals/Receiver.pm b/lib/Bit/MorseSignals/Receiver.pm index 42f6b4f..a829f36 100644 --- a/lib/Bit/MorseSignals/Receiver.pm +++ b/lib/Bit/MorseSignals/Receiver.pm @@ -15,15 +15,15 @@ Bit::MorseSignals::Receiver - Base class for Bit::MorseSignals receivers. =head1 VERSION -Version 0.01 +Version 0.05 =cut -our $VERSION = '0.01'; +our $VERSION = '0.05'; =head1 SYNOPSIS - use Bit::MorseSignals; + use Bit::MorseSignals::Receiver; my $pants = new Bit::MorseSignals::Receiver done => sub { print "received $_[1]!\n" }; while (...) { @@ -46,9 +46,9 @@ sub _check_self { =head1 METHODS -=head2 C<< new [ done => $cb ] >> +=head2 C<< new < done => $cb > >> -L object constructor. With the C<'done'> option, you can specify a callback that will be triggered every time a message is completed, and in which C<$_[0]> will be the receiver object and C<$_[1]> the message received. +L object constructor. With the C<'done'> option, you can specify a callback that will be triggered every time a message is completed, and in which C<$_[0]> will be the receiver object and C<$_[1]> the message received. =cut @@ -98,7 +98,15 @@ sub push { substr $self->{buf}, -$base, $base, ''; my @demanglers = (sub { $_[0] }, \&decode_utf8, \&thaw ); # BM_DATA_{PLAIN, UTF8, STORABLE} - $self->{msg} = $demanglers[$self->{type}]->($self->{buf}); + $self->{msg} = defined $demanglers[$self->{type}] + ? do { + my $msg = eval { + local $SIG{__DIE__} = sub { warn @_ }; + $demanglers[$self->{type}]->($self->{buf}) + }; + $@ ? undef : $msg; + } + : $self->{buf}; $self->reset; $self->{done}->($self, $self->{msg}) if $self->{done}; return; @@ -111,6 +119,7 @@ sub push { if ($self->{len} >= 3) { my $type = 2 * vec($self->{buf}, 0, 1) + vec($self->{buf}, 1, 1); + $type = BM_DATA_PLAIN if vec($self->{buf}, 2, 1); @{$self}{qw/state type buf len/} = (3, $type, '', 0); } @@ -184,7 +193,7 @@ L, L. =head1 AUTHOR -Vincent Pit, C<< >> +Vincent Pit, C<< >>, L. You can contact me by mail or on #perl @ FreeNode (vincent or Prof_Vince).