File Coverage

blib/lib/Net/Shared/Handler.pm
Criterion Covered Total %
statement 78 109 71.5
branch 21 40 52.5
condition 1 3 33.3
subroutine 13 17 76.4
pod 0 10 0.0
total 113 179 63.1


line stmt bran cond sub pod time code
1 1     1   127 use strict;
  1         1  
  1         43  
2 1     1   5 use warnings;
  1         3  
  1         37  
3 1     1   4 use vars qw($VERSION);
  1         2  
  1         62  
4             $VERSION = "0.17";
5            
6             package Net::Shared::Handler;
7 1     1   4 use IO::Socket;
  1         2  
  1         8  
8 1     1   3020 use Storable qw(freeze thaw);
  1         3  
  1         83  
9 1     1   6 use Carp;
  1         2  
  1         1787  
10            
11             sub new
12             {
13 1     1 0 274 my $proto = shift;
14 1   33     32 my $class = ref($proto) || $proto;
15            
16 1         2 my $self = {};
17 1         4 $self->{vars} = {};
18 1 50       6 $self->{debug} = scalar @_ ? shift : 0;
19 1 50       4 if ($self->{debug})
20             {
21 0         0 print "Constructor for Handler.\n\n";
22             }
23 1         5 bless ($self, $class);
24             }
25            
26             sub cleanup
27             {
28 0     0 0 0 my ($self, $return_value) = @_;
29 0         0 $self->destroy_all;
30 0         0 return $return_value;
31             }
32            
33             sub add
34             {
35 1     1 0 77 my ($self, @vars) = @_;
36 1 50       14 print "Adding Objects:\n" if ($self->{debug});
37 1         11 foreach my $var (@vars)
38             {
39 3         61 $self->{vars}->{$$var->{name}.$$var->{ref}} = $var;
40 3 50       22 print "\t", $$var->{debug}, " added.\n" if ($self->{debug});
41             }
42 1 50       12 print "\n" if ($self->{debug});
43             }
44            
45             sub remove
46             {
47 0     0 0 0 my ($self, @vars) = @_;
48 0         0 foreach my $var (@vars)
49             {
50 0         0 my $temp = $$var->{name}.$$var->{ref};
51 0         0 $$var->destroy_variable;
52 0         0 delete $self->{vars}->{$temp};
53             }
54             }
55            
56             sub store
57             {
58 4     4 0 1218 my ($self, $var, $data) = @_;
59 4         23 $var = $self->{vars}->{$var->{name}.$var->{ref}};
60 4 100       23 my $address = exists($$var->{address}) ? $$var->{address} : '127.0.0.1';
61            
62 4 50       69 my $send = IO::Socket::INET->new
63             (
64             Proto => 'tcp',
65             PeerAddr => $address,
66             PeerPort => $$var->{port}
67             ) or croak( $self->cleanup($!) );
68            
69 4         2189 $send->autoflush(1);
70            
71 4 50       146 if ($$var->{debug})
72             {
73 0         0 print "Connected to ", $$var->{ref}, " for storing:\n";
74 0         0 print "\tPeerhost: ", $send->peerhost, "\n";
75 0         0 print "\tPeerport: ", $send->peerport, "\n";
76 0         0 print "\tLocalhost: ", $send->sockhost, "\n";
77 0         0 print "\tLocalport: ", $send->sockport, "\n\n";
78             }
79            
80 4         22 my $header = $$var->build_header;
81 4         21 my $serialized_data = $$var->prepare_data(\$data);
82            
83 4         167 my $bytes = syswrite($send, $header.$serialized_data, length($serialized_data) + length($header));
84 4         16 $send->close;
85 4         176 return $bytes;
86             }
87            
88             sub retrieve
89             {
90 4     4 0 660 my ($self, $var) = @_;
91 4         17 $var = $self->{vars}->{$var->{name}.$var->{ref}};
92            
93 4 100       194 my $address = exists($$var->{address}) ? $$var->{address} : '127.0.0.1';
94 4 50       31 my $message = IO::Socket::INET->new
95             (
96             Proto => 'tcp',
97             PeerPort => $$var->{port},
98             PeerAddr => $address
99             ) or die ( $self->cleanup($!) );
100            
101 4         1365 $message->sockopt (SO_REUSEADDR, 1);
102 4         71 $message->sockopt (SO_LINGER, 0);
103            
104 4         39 $message->autoflush(1);
105 4         142 my $port = $message->sockport;
106 4 50       1281 if ($$var->{debug})
107             {
108 0         0 print "Connected to ", $$var->{ref}, " for retrieving:\n";
109 0         0 print "\tPeerhost: ", $message->peerhost, "\n";
110 0         0 print "\tPeerport: ", $message->peerport, "\n";
111 0         0 print "\tLocalhost: ", $message->sockhost, "\n";
112 0         0 print "\tLocalport: ", $message->sockport, "\n\n";
113             }
114            
115 4         26 my $header = $$var->build_header;
116 4         128 syswrite($message, $header.$$var->{response}, length($$var->{response})+length($header));
117 4         15 $message->close;
118            
119 4 50       147 $message = IO::Socket::INET->new
120             (
121             Listen => SOMAXCONN,
122             LocalPort => $port,
123             Reuse => 1,
124             LocalAddr => '127.0.0.1',
125             ) or croak ( $self->cleanup($!) );
126 4 50       991 if ($$var->{debug})
127             {
128 0         0 print "Listening for ", $$var->{ref}, ":\n";
129 0         0 print "\tLocalport: ", $message->sockport, "\n\n";
130             }
131 4         30 while (my $connection = $message->accept)
132             {
133 4 50       22372 if ($$var->{debug})
134             {
135 0         0 print "Recieved a connection from ", $$var->{ref}, ":\n";
136 0         0 print "\tPeerhost: ", $connection->peerhost, "\n";
137 0         0 print "\tPeerport: ", $connection->peerport, "\n";
138 0         0 print "\tLocalhost: ", $connection->sockhost, "\n";
139 0         0 print "\tLocalport: ", $connection->sockport, "\n\n";
140             }
141            
142 4         15146 my $sent = <$connection>;
143 4 50       31 $connection->close if $connection->connected;
144 4         317 $message->close;
145 4         99 return $self->inflate_data($sent);
146             }
147 0 0       0 $message->close if $message->connected;
148             }
149            
150             sub set_remote_port
151             {
152 0     0 0 0 my ($self, $var, $port) = shift;
153 0         0 $$var->set_port($port);
154             }
155            
156             sub set_remote_addr
157             {
158 0     0 0 0 my ($self, $var, $addr) = shift;
159 0         0 $$var->set_addr($addr);
160             }
161            
162             sub destroy_all
163             {
164 2     2 0 106 my $self=shift;
165 2 50       11 print "Destroying variables: \n" if $self->{debug};
166 2         3 while ( my($key,$value) = each(%{$self->{vars}}))
  5         38  
167             {
168 3         12 my $temp = $$value->{name}.$$value->{ref};
169 3 50       26 my $temp1 = $$value->{debug} if $self->{debug};
170 3         19 $$value->destroy_variable;
171 3         11 delete $self->{vars}->{$temp};
172 3 50       14 print "\t", $temp1, " destroyed.\n" if $self->{debug};
173             }
174 2 50       215 print "\n" if $self->{debug};
175             }
176            
177             sub inflate_data
178             {
179 4     4 0 9 my ($self,$data) = @_;
180 4         133 $data = join('',map(chr,split(/\*/,$data)));
181 4         39 $data = thaw($data);
182 4         126 return $$data;
183             }
184            
185             sub DESTROY
186             {
187 1     1   3 my $self = shift;
188 1         4 $self->destroy_all;
189             }
190            
191             "JAPH";