1 package Bit::MorseSignals::Receiver;
7 use Encode qw<decode_utf8>;
10 use Bit::MorseSignals qw<:consts>;
14 Bit::MorseSignals::Receiver - Base class for Bit::MorseSignals receivers.
22 our $VERSION = '0.08';
26 use Bit::MorseSignals::Receiver;
28 my $pants = Bit::MorseSignals::Receiver->new(
29 done => sub { print "received $_[1]!\n" },
32 my $bit = comes_from_somewhere_lets_say_signals();
38 Base class for L<Bit::MorseSignals> receivers.
39 Please refer to this module for more general information about the protocol.
41 Given a sequence of bits coming from the L<Bit::MorseSignals> protocol, the receiver object detects when a packet has been completed and then reconstructs the original message depending of the datatype specified in the header.
46 croak 'First argument isn\'t a valid ' . __PACKAGE__ . ' object'
47 unless ref $_[0] and $_[0]->isa(__PACKAGE__);
54 my $bmr = Bit::MorseSignals::Receiver->new(done => $cb);
56 L<Bit::MorseSignals::Receiver> object constructor.
57 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.
63 return unless $class = ref $class || $class;
64 croak 'Optional arguments must be passed as key => value pairs' if @_ % 2;
79 Tells the receiver that you have received the bit C<$bit>.
80 Returns true while the message isn't completed, and C<undef> as soon as it is.
85 my ($self, $bit) = @_;
89 return unless defined $bit;
93 if ($self->{state} == 3) { # data
95 vec($self->{buf}, $self->{len}, 1) = $bit;
97 if ($self->{len} >= $self->{sig_len}) {
99 for (1 .. $self->{sig_len}) {
100 if (vec($self->{buf}, $self->{len} - $_, 1) != vec($self->{sig}, $_-1, 1)) {
106 my $base = int $self->{sig_len} / 8 + $self->{sig_len} % 8 != 0;
107 substr $self->{buf}, -$base, $base, '';
108 my @demanglers = (sub { $_[0] }, \&decode_utf8, \&thaw );
109 # BM_DATA_{PLAIN, UTF8, STORABLE}
110 $self->{msg} = defined $demanglers[$self->{type}]
112 local $SIG{__DIE__} = sub { warn @_ };
113 $demanglers[$self->{type}]->($self->{buf})
117 $self->{done}->($self, $self->{msg}) if $self->{done};
122 } elsif ($self->{state} == 2) { # header
124 vec($self->{buf}, $self->{len}++, 1) = $bit;
125 if ($self->{len} >= 3) {
126 my $type = 2 * vec($self->{buf}, 1, 1)
127 + vec($self->{buf}, 0, 1);
128 $type = BM_DATA_PLAIN if vec($self->{buf}, 2, 1);
129 @{$self}{qw<state type buf len>} = (3, $type, '', 0);
132 } elsif ($self->{state} == 1) { # end of signature
134 if ($self->{sig_bit} != $bit) {
137 vec($self->{sig}, $self->{sig_len}++, 1) = $bit;
141 @{$self}{qw<state sig sig_bit sig_len buf len>}
142 = (1, '', $bit, 1, '', 0 );
143 vec($self->{sig}, 0, 1) = $bit;
152 Resets the current receiver state, obliterating any current message being received.
160 @{$self}{qw<sig sig_bit sig_len type buf len>} = ();
166 True when the receiver is in the middle of assembling a message.
173 return $self->{state} > 0;
178 The last message completed, or C<undef> when no message has been assembled yet.
190 An object module shouldn't export any function, and so does this one.
194 L<Carp> (standard since perl 5), L<Encode> (since perl 5.7.3), L<Storable> (idem).
198 L<Bit::MorseSignals>, L<Bit::MorseSignals::Emitter>.
202 Vincent Pit, C<< <perl at profvince.com> >>, L<http://www.profvince.com>.
204 You can contact me by mail or on C<irc.perl.org> (vincent).
208 Please report any bugs or feature requests to C<bug-bit-morsesignals-receiver at rt.cpan.org>, or through the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Bit-MorseSignals>.
209 I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
213 You can find documentation for this module with the perldoc command.
215 perldoc Bit::MorseSignals::Receiver
217 Tests code coverage report is available at L<http://www.profvince.com/perl/cover/Bit-MorseSignals>.
219 =head1 COPYRIGHT & LICENSE
221 Copyright 2008 Vincent Pit, all rights reserved.
223 This program is free software; you can redistribute it and/or modify it
224 under the same terms as Perl itself.
228 1; # End of Bit::MorseSignals::Receiver