ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Net-Knuddels/Net/Knuddels.pm
Revision: 1.3
Committed: Wed Jan 12 02:13:01 2005 UTC (19 years, 4 months ago) by root
Branch: MAIN
Changes since 1.2: +4 -2442 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 package Net::Knuddels;
2
3 use Net::Knuddels::Dictionary;
4
5 use strict;
6 use utf8;
7
8 package Net::Knuddels::Receiver;
9
10 sub new {
11 my $class = shift;
12
13 bless { @_ }, $class;
14 }
15
16 sub feed_data($$) {
17 my ($self, $data) = @_;
18
19 # split data stream into packets
20
21 $data = "$self->{rbuf}$data";
22
23 while () {
24 1 <= length $data or last;
25 my $len = ord substr $data, 0, 1;
26
27 my $skip;
28 if ($len & 0x80) {
29 my $tail = (($len >> 5) & 3) - 1;
30 $len = ($len & 0x1f) + 1;
31
32 $tail < length $data or last;
33 $len += (ord substr $data, $_ + 1, 1) << ($_ * 8 + 5)
34 for 0 .. $tail;
35
36 $skip = 2 + $tail;
37 } else {
38 $skip = 1;
39 $len++;
40 }
41
42 $len + $skip <= length $data or last;
43 substr $data, 0, $skip, "";
44 my $msg = substr $data, 0, $len, "";
45
46 $self->feed_msg ($msg);
47 }
48
49 $self->{rbuf} = $data;
50 }
51
52 my $RE_dec = join "|", keys %$Net::Knuddels::Dictionary;
53
54 sub feed_msg($$) {
55 my ($self, $msg) = @_;
56
57 my $bin = unpack "b*", $msg;
58 my $res = "";
59
60 while ($bin =~ /\G($RE_dec)/cmog) {
61 my $frag = $Net::Knuddels::Dictionary->{$1};
62 $frag = pack "b*", substr $bin, 0, 16, "" if $frag eq "\\\\\\";
63 $res .= $frag;
64 }
65 $bin =~ /\G(.*[^0].*)$/ and die "Net::Knuddels::Receiver: undecodable message tail '$1'";
66
67 $self->feed_event (split /\0/, $res);
68 }
69
70 sub feed_event($@) {
71 my ($self, $type, @arg) = @_;
72
73 for ($type, "ALL") {
74 my $ev = $self->{cb}{$_};
75 $_->($type, @arg) for values %$ev;
76 }
77 }
78
79 sub register {
80 my ($self, $type, $cb) = @_;
81
82 $self->{cb}{$type}{$cb} = $cb;
83 }
84
85 1;
86