File Coverage

blib/lib/POE/Component/Server/Daytime.pm
Criterion Covered Total %
statement 55 56 98.2
branch 7 14 50.0
condition 3 9 33.3
subroutine 14 15 93.3
pod 1 1 100.0
total 80 95 84.2


line stmt bran cond sub pod time code
1             # $Id: Daytime.pm,v 1.1.1.1 2005/01/27 15:03:34 chris Exp $
2             #
3             # POE::Component::Server::Daytime, by Chris 'BinGOs' Williams
4             #
5             # This module may be used, modified, and distributed under the same
6             # terms as Perl itself. Please see the license that came with your Perl
7             # distribution for details.
8             #
9              
10             package POE::Component::Server::Daytime;
11              
12 3     3   85426 use strict;
  3         7  
  3         171  
13 3     3   18 use warnings;
  3         7  
  3         93  
14 3     3   18 use Carp;
  3         10  
  3         316  
15 3     3   3243 use POE;
  3         210781  
  3         21  
16 3     3   334309 use Socket;
  3         9  
  3         2260  
17 3     3   20 use POSIX;
  3         6  
  3         28  
18 3     3   8180 use base qw(POE::Component::Server::Echo);
  3         8  
  3         3374  
19 3     3   73168 use vars qw($VERSION);
  3         8  
  3         113  
20              
21 3     3   13 use constant DATAGRAM_MAXLEN => 1024;
  3         9  
  3         120  
22 3     3   34 use constant DEFAULT_PORT => 13;
  3         4  
  3         7399  
23              
24             $VERSION = '1.14';
25              
26             sub spawn {
27 2     2 1 31 my $package = shift;
28 2 50       10 croak "$package requires an even number of parameters" if @_ & 1;
29              
30 2         12 my %parms = @_;
31              
32 2 50 33     25 $parms{'Alias'} = 'Qotd-Server' unless defined $parms{'Alias'} and $parms{'Alias'};
33 2 50 33     13 $parms{'tcp'} = 1 unless defined $parms{'tcp'} and $parms{'tcp'} == 0;
34 2 50 33     13 $parms{'udp'} = 1 unless defined $parms{'udp'} and $parms{'udp'} == 0;
35              
36 2         8 my $self = bless { }, $package;
37              
38 2         29 $self->{CONFIG} = \%parms;
39              
40 2 50       42 POE::Session->create(
41             object_states => [
42             $self => { _start => '_server_start',
43             _stop => '_server_stop',
44             shutdown => '_server_close' },
45             $self => [ qw(_accept_new_client _accept_failed _client_input _client_error _client_flushed _get_datagram) ],
46             ],
47             ( ref $parms{'options'} eq 'HASH' ? ( options => $parms{'options'} ) : () ),
48             );
49              
50 2         4795 return $self;
51             }
52              
53             sub _accept_new_client {
54 1     1   1828 my ($kernel,$self,$socket,$peeraddr,$peerport,$wheel_id) = @_[KERNEL,OBJECT,ARG0 .. ARG3];
55 1         11 $peeraddr = inet_ntoa($peeraddr);
56              
57 1         12 my $wheel = POE::Wheel::ReadWrite->new (
58             Handle => $socket,
59             Filter => POE::Filter::Line->new(),
60             InputEvent => '_client_input',
61             ErrorEvent => '_client_error',
62             FlushedEvent => '_client_flushed',
63             );
64              
65 1         423 $self->{Clients}->{ $wheel->ID() } = { Wheel => $wheel, peeraddr => $peeraddr, peerport => $peerport };
66 1         201 $wheel->put( strftime("%A, %B %d, %Y %X-%Z", localtime) );
67             }
68              
69             sub _client_input {
70 0     0   0 undef;
71             }
72              
73             sub _client_flushed {
74 1     1   1665 my ($kernel,$self,$wheel_id) = @_[KERNEL,OBJECT,ARG0];
75 1         7 delete $self->{Clients}->{ $wheel_id }->{Wheel};
76 1         204 delete $self->{Clients}->{ $wheel_id };
77 1         4 undef;
78             }
79              
80             sub _get_datagram {
81 1     1   12141 my ( $kernel, $self, $socket ) = @_[ KERNEL, OBJECT, ARG0 ];
82              
83 1         19 my $remote_address = recv( $socket, my $message = "", DATAGRAM_MAXLEN, 0 );
84 1 50       6 return unless defined $remote_address;
85              
86 1         784 my $output = strftime("%A, %B %d, %Y %X-%Z", localtime);
87 1 50       28 send( $socket, $output, 0, $remote_address ) == length( $output )
88             or warn "Trouble sending response: $!";
89              
90 1         6 undef;
91             }
92              
93             1;
94             __END__