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

# User Rev Content
1 root 1.1 package Net::Knuddels;
2    
3 root 1.3 use Net::Knuddels::Dictionary;
4    
5 root 1.2 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 root 1.3 my $RE_dec = join "|", keys %$Net::Knuddels::Dictionary;
53 root 1.1
54 root 1.2 sub feed_msg($$) {
55     my ($self, $msg) = @_;
56 root 1.1
57     my $bin = unpack "b*", $msg;
58     my $res = "";
59    
60 root 1.2 while ($bin =~ /\G($RE_dec)/cmog) {
61 root 1.3 my $frag = $Net::Knuddels::Dictionary->{$1};
62 root 1.1 $frag = pack "b*", substr $bin, 0, 16, "" if $frag eq "\\\\\\";
63     $res .= $frag;
64     }
65 root 1.2 $bin =~ /\G(.*[^0].*)$/ and die "Net::Knuddels::Receiver: undecodable message tail '$1'";
66    
67     $self->feed_event (split /\0/, $res);
68 root 1.1 }
69    
70 root 1.2 sub feed_event($@) {
71     my ($self, $type, @arg) = @_;
72 root 1.1
73 root 1.2 for ($type, "ALL") {
74     my $ev = $self->{cb}{$_};
75     $_->($type, @arg) for values %$ev;
76 root 1.1 }
77 root 1.2 }
78 root 1.1
79 root 1.2 sub register {
80     my ($self, $type, $cb) = @_;
81 root 1.1
82 root 1.2 $self->{cb}{$type}{$cb} = $cb;
83 root 1.1 }
84    
85 root 1.2 1;
86