File Coverage

blib/lib/AOL/SFLAP.pm
Criterion Covered Total %
statement 9 118 7.6
branch 0 24 0.0
condition 0 3 0.0
subroutine 3 18 16.6
pod 0 13 0.0
total 12 176 6.8


line stmt bran cond sub pod time code
1             package AOL::SFLAP;
2              
3 1     1   13 use IO;
  1         1  
  1         6  
4 1     1   20397 use IO::Select;
  1         2111  
  1         74  
5 1     1   9 use Socket;
  1         2  
  1         2368  
6              
7             $VERSION = "0.33";
8              
9             $SFLAP_SIGNON = 1;
10             $SFLAP_DATA = 2;
11             $SFLAP_ERROR = 3;
12             $SFLAP_SIGNOFF = 4;
13             $SFLAP_KEEPALIVE = 5;
14              
15             sub register_callback {
16 0     0 0   my ($self, $chan, $func, @args) = @_;
17              
18             #print "register_callback() func $func for chan $chan adding to $self->{callback}{$chan}\n";
19             #print " self $self selfcb = $self->{callback}\n";
20              
21 0           push (@{$self->{callback}{$chan}}, $func);
  0            
22 0           @{$self->{callback}{$func}} = @args;
  0            
23              
24 0           return;
25             }
26              
27             sub clear_callbacks {
28 0     0 0   my ($self) = @_;
29 0           my $k;
30              
31 0           print "...............C SFLAP clear_callbacks\n";
32 0           for $k (keys %{$self->{callback}}) {
  0            
33 0           print ".............C Clear key ($k)\n";
34 0           delete $self->{callback}{$k};
35             }
36              
37 0           print "...............S SFLAP scan callbacks\n";
38 0           for $k (keys %{$self->{callback}}) {
  0            
39 0           print ".............S Scan key ($k)\n";
40             }
41              
42             }
43              
44             sub callback {
45 0     0 0   my ($self, $chan, @args) = @_;
46 0           my $func;
47              
48 0           for $func (@{$self->{callback}{$chan}}) {
  0            
49             #print ("callback() calling a func $func for $chan fd $self->{fd}..\n");
50 0           eval { &{$func} ($self, @args, @{$self->{callback}{$func}}) };
  0            
  0            
  0            
51             }
52              
53 0           return;
54             }
55              
56             sub new {
57 0     0 0   my ($tochost, $authorizer, $port, $nickname) = @_;
58 0           my $self;
59             my $ipaddr;
60              
61 0 0         if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') }
  0            
62 0 0         die "invalid port" unless $port;
63              
64 0           $ipaddr = inet_aton($tochost);
65 0 0         die "unknown host" unless $ipaddr;
66              
67 0           $self = {
68             tochost => $tochost,
69             authorizer => $authorizer,
70             ipaddr => $ipaddr,
71             port => $port,
72             nickname => $nickname,
73             sequence => 1
74             };
75 0           bless($self);
76              
77 0           return $self;
78             }
79              
80             sub destroy {
81 0     0 0   my ($self) = @_;
82              
83 0           print "sflap destroy\n";
84 0           CORE::close($self->{fd});
85              
86 0           $self = undef;
87              
88 0           return;
89             }
90              
91             sub close {
92 0     0 0   my ($self) = @_;
93 0           my $k;
94              
95 0           print "sflap close\n";
96              
97 0           $self->clear_callbacks();
98              
99             #CORE::close($self->{fd});
100              
101 0           return;
102             }
103              
104             sub set_debug {
105 0     0 0   my ($self, $level) = @_;
106              
107 0           $self->{debug_level} = $level;
108 0           print "slfap debug level $level\n";
109             }
110              
111             sub debug {
112 0     0 0   my ($self, @args) = @_;
113              
114 0 0 0       if (exists $self->{debug_level} && $self->{debug_level} > 0) {
115 0           print @args;
116             }
117             }
118              
119             sub __connect {
120 0     0     my ($self) = @_;
121 0           my $socksaddr = inet_aton("206.223.45.1");
122              
123 0           my $proto = getprotobyname('tcp');
124 0           my $sin = sockaddr_in(1080, $socksaddr);
125 0           my $fd = IO::Handle->new();
126            
127 0 0         socket($fd, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
128 0 0         connect($fd, $sin) || die "connect: $!";
129              
130 0           $buffer = pack("ccncccca*c", 4, 1, 443, 198, 81, 3, 52, "jamersepoo", 0);
131 0           syswrite($fd, $buffer, 19);
132              
133 0           return ($fd);
134             }
135              
136             sub _connect {
137 0     0     my ($self) = @_;
138              
139 0           my $proto = getprotobyname('tcp');
140 0           my $sin = sockaddr_in($self->{port}, $self->{ipaddr});
141 0           my $fd = IO::Handle->new();
142              
143 0 0         socket($fd, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
144 0 0         connect($fd, $sin) || die "connect: $!";
145              
146 0           return ($fd);
147             }
148              
149             sub connect {
150 0     0 0   my ($self) = @_;
151 0           my $fd;
152              
153 0 0         if ($self->{proxy}) {
154 0           $fd = &{$self->{proxy}};
  0            
155             } else {
156 0           $fd = $self->_connect;
157             }
158              
159 0           $self->{fd} = $fd;
160              
161 0           $foo = $self->write("FLAPON\r\n\r\n", 10);
162              
163 0           $self->recv();
164              
165 0           return $fd;
166             }
167              
168             sub recv {
169 0     0 0   my ($self) = @_;
170 0           my ($buffer, $from, $xfrom) = '';
171 0           my ($fd) = $self->{fd};
172              
173 0           $foo = CORE::sysread($fd, $buffer, 6);
174 0 0         if ($foo <= 0) {
175             #print "recv failed! calling signoff....\n";
176 0           $self->callback($SFLAP_SIGNOFF);
177 0           return;
178             }
179              
180 0           my ($id, $chan, $seq, $len, $data) = unpack("aCnn", $buffer);
181 0           $self->debug("sflap recv ($self->{fd}) $foo chan = $chan seq = $seq len = $len\n");
182              
183 0           $foo = CORE::sysread($fd, $data, $len);
184 0           $self->debug(" data = $data\n");
185              
186 0           $self->callback($chan, $data);
187              
188 0           return $buffer;
189             }
190              
191             sub send {
192 0     0 0   my ($self, $chan, $data, $length) = @_;
193 0           my $buffer;
194             my $format;
195              
196 0 0         if (!$length) {
197 0           $length = length($data);
198             }
199              
200 0 0         if ($chan == $SFLAP_DATA) {
201 0           $format = "cCnna*C";
202 0           $length ++;
203             } else {
204 0           $format = "cCnna*";
205             }
206              
207 0           $self->{sequence} ++;
208 0           $buffer = pack($format, 42, $chan, $self->{sequence},
209             $length, $data, 0);
210              
211 0           ($id, $ch, $seq, $len, $data, $nuller) = unpack($format, $buffer);
212              
213 0           $foo = CORE::syswrite($self->{fd}, $buffer, $length + 6);
214 0           $self->debug("sflap send ($self->{fd}) $foo chan = $ch seq = $seq len = $len data = $data\n");
215             }
216              
217             sub write {
218 0     0 0   my ($self, $buffer, $len, $noflap) = @_;
219 0           my $fd = $self->{fd};
220              
221 0           return CORE::syswrite($fd, $buffer, $len);
222             }
223              
224             sub flush {
225 0     0 0   my $self = shift;
226             }
227              
228             1;