Author: dylan
Date: 2004-10-25 16:49:58 -0400 (Mon, 25 Oct 2004)
New Revision: 403

Added:
   branches/haver-server-cleanup/lib/Haver/Server/Avatar.pm
Removed:
   branches/haver-server-cleanup/lib/Haver/Server/Connection.pm
Modified:
   branches/haver-server-cleanup/lib/Haver/Server/Listener.pm
   branches/haver-server-cleanup/lib/Haver/Server/Registry.pm
Log:
The redesign continues. Adding loadable modules
of server commands.


Copied: branches/haver-server-cleanup/lib/Haver/Server/Avatar.pm (from rev 402, 
branches/haver-server-cleanup/lib/Haver/Server/Connection.pm)
===================================================================
--- branches/haver-server-cleanup/lib/Haver/Server/Connection.pm        
2004-10-22 23:11:22 UTC (rev 402)
+++ branches/haver-server-cleanup/lib/Haver/Server/Avatar.pm    2004-10-25 
20:49:58 UTC (rev 403)
@@ -0,0 +1,225 @@
+# Haver::Server::Avatar,
+# this creates a session, which represents the user...
+# 
+# Copyright (C) 2003 Dylan William Hardison.
+#
+# This module is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This module is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this module; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+# TODO, write POD. Soon.
+package Haver::Server::Avatar;
+use strict;
+use Carp qw(croak confess carp cluck);
+
+use POE qw(
+       Wheel::ReadWrite
+       Driver::SysRW
+       Preprocessor
+       Filter::Haver
+);
+
+use Haver::Server::Commands;
+use Haver::Server::Registry qw( $Registry );
+
+our $RELOAD = 1;
+
+sub create {
+       my ($class) = shift;
+       # ASSERT: (@_ == 1 and ref($_[0]) eq 'HASH') or ((@_ % 2) == 0);
+       my $opts = @_ == 1 ? $_[0] : { @_ };
+
+
+       POE::Session->create(
+               package_states => [ 
+                       $class => {
+                               # POE states
+                               _start    => '_start',
+                               _stop     => '_stop',
+                               _default  => '_default',
+                               
+                               
+                               # Wheel states
+                               input  => 'on_input',
+                               error  => 'on_error',
+                               flush  => 'on_flush',
+                               
+                               # Utility states
+                               cleanup     => 'on_cleanup',
+                               'shutdown'  => 'on_shutdown',
+                               'fail'      => 'on_fail',
+                               'oops'       => 'on_oops',
+                       },
+               ],
+               heap => {},
+               args => [ $opts ],
+       );
+}
+
+sub _start {
+       my ($heap, $session, $kernel, $opt) = @_[ HEAP,  SESSION,  KERNEL,  
ARG0];
+       my ($address, $socket, $port) = ($opt->{address}, delete $opt->{sock}, 
$opt->{port});
+       
+       $kernel->post('Logger', 'note', "Connection from ${address}:$port");
+
+
+       ## breaks ssl.
+       #binmode $socket, ":utf8";
+       my $client = new POE::Wheel::ReadWrite(
+               Handle       => $socket,
+               Driver       => new POE::Driver::SysRW,
+               Filter       => new POE::Filter::Haver,
+               InputEvent   => 'input',
+               FlushedEvent => 'flush',
+               ErrorEvent   => 'error',
+       );
+
+       %$heap = (
+               %$opt,
+               client      => $client,
+               shutdown    => 0,
+               plonk       => 0,
+               plugin      => new Haver::Server::Plugin::Loader,
+       );
+
+       $heap->{plugin}->load('Haver::Server::Commands::Connection');
+       $kernel->call($session, 'init');
+}
+
+
+sub _stop {
+       my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
+
+       my ($address, $port) = @$heap{qw(address port)};
+       $kernel->call('Logger', 'note', "Lost connection from 
${address}:$port");
+}
+
+
+sub on_ready {
+       my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
+
+       $heap->{plugin}->unload('Haver::Server::Commands::Connection');
+       $heap->{plugin}->load('Haver::Server::Commands::Channel');
+}
+
+sub _default {
+       my ($kernel, $heap, $event, $args) = @_[KERNEL, HEAP, ARG0, ARG1];
+       
+       my $cmd = $event;
+       if ($event =~ s/^cmd_//) {
+               $kernel->call($_[SESSION], 'unknown_cmd', $event, $_[ARG1][0], 
$cmd);
+       }
+       $kernel->post('Logger', 'error', "Unknown event: $event");
+
+       return 0;
+}
+
+sub on_input {
+       my ($kernel, $heap, $args) = @_[KERNEL, HEAP, ARG0];
+       
+       my @copy = @$args;
+       foreach (@copy) {
+               next unless defined;
+               #my @foo = split(//, $_);
+               #foreach my $c (@foo) {
+                       #$c = ord($c);
+                       #$c = "[$c]";
+               #}
+               #$_ = join('', @foo);
+               s/\e/<ESC>/g;
+               s/\r/<CR>/g;
+               s/\n/<LF>/g;
+               s/\t/<TAB>/g;
+               p
+       }
+       my $raw = join("\t", map { defined $_ ? $_ : '' } @copy);
+       $kernel->post('Logger', 'raw', $raw);
+       
+       return if $heap->{plonk};
+       return if $heap->{shutdown};
+
+       my $want = 0;
+       my $cmd = shift @$args;
+       my $event = 'cmd_' . $cmd;
+       
+       $kernel->yield($event, $args, $cmd);
+
+}
+
+sub on_flush {
+       my ($kernel, $heap) = @_[KERNEL, HEAP];
+
+       if ($heap->{shutdown}) {
+               delete $heap->{client};
+       }
+}
+
+
+sub on_error {
+       my ($kernel, $heap, $operation, $errnum, $errstr) = @_[KERNEL, HEAP, 
ARG0..ARG3];
+
+       $kernel->post('Logger', 'error', 
+               "Socket generated $operation error ${errnum}: $errstr");
+
+
+       $kernel->yield('shutdown', 'DISCON');
+}
+
+
+sub on_shutdown {
+       my ($kernel, $heap, $session, @args) = @_[KERNEL, HEAP, SESSION, ARG0 
.. $#_];
+       return if $heap->{shutdown};
+
+       $kernel->call('Logger', 'note', 'Shutting down client session.');
+       eval { $heap->{client}->put(['BYE', @args]) };
+       $heap->{shutdown} = 1;
+       $kernel->alarm_remove_all();
+       
+       $kernel->yield('cleanup', @args);
+}
+
+sub on_cleanup {
+       my ($kernel, $heap, @args) = @_[KERNEL, HEAP, ARG0 .. $#_];
+
+}
+
+sub on_oops {
+       my ($kernel, $heap, $err, $data) = @_[KERNEL, HEAP, ARG0 .. $#_];
+
+       if (not defined $data) {
+               $data = [];
+       }
+       
+       if (not ref $data) {
+               $data = [$data];
+       }
+       
+       eval { $heap->{client}->put(['OOPS', $err, @$data]) };
+       $kernel->yield('shutdown', 'OOPS');
+}
+sub on_fail {
+       my ($kernel, $heap, $cmd, $err, $data) = @_[KERNEL, HEAP, ARG0 .. $#_];
+
+       if (not defined $data) {
+               $data = [];
+       }
+       
+       if (not ref $data) {
+               $data = [$data];
+       }
+       
+       $kernel->post('Logger', 'fail', "failing $heap->{uid} with $cmd - 
$err");
+       eval { $heap->{client}->put(['FAIL', $cmd, $err, @$data]) };
+}
+
+1;

Deleted: branches/haver-server-cleanup/lib/Haver/Server/Connection.pm
===================================================================
--- branches/haver-server-cleanup/lib/Haver/Server/Connection.pm        
2004-10-22 23:11:22 UTC (rev 402)
+++ branches/haver-server-cleanup/lib/Haver/Server/Connection.pm        
2004-10-25 20:49:58 UTC (rev 403)
@@ -1,283 +0,0 @@
-# Haver::Server::POE::Connection,
-# this creates a session, which represents the user...
-# 
-# Copyright (C) 2003 Dylan William Hardison.
-#
-# This module is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This module is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this module; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-# TODO, write POD. Soon.
-package Haver::Server::POE::Connection;
-use strict;
-use Carp qw(croak confess carp cluck);
-
-use POE qw(
-       Wheel::ReadWrite
-       Driver::SysRW
-       Preprocessor
-       Filter::Haver
-);
-
-use Haver::Server::Commands;
-use Haver::Server::Registry qw( $Registry );
-use Haver::Formats qw( :duration );
-
-use Scalar::Util ();
-use Digest::SHA1 qw( sha1_base64 );
-our $RELOAD = 1;
-
-sub create {
-       my ($class) = shift;
-       # ASSERT: (@_ == 1 and ref($_[0]) eq 'HASH') or ((@_ % 2) == 0);
-       my $opts = @_ == 1 ? $_[0] : { @_ };
-
-
-       POE::Session->create(
-               package_states => [ 
-                       $class => {
-                               # POE states
-                               _start    => '_start',
-                               _stop     => '_stop',
-                               _default  => '_default',
-                               
-                               
-                               # Wheel states
-                               socket_input  => 'socket_input',
-                               socket_error  => 'socket_error',
-                               socket_flush  => 'socket_flush',
-                               
-                               # Utility states
-                               want        => 'on_want',
-                               cleanup     => 'on_cleanup',
-                               'shutdown'  => 'on_shutdown',
-                               'fail'      => 'on_fail',
-                               'oops'       => 'on_oops',
-                               'accept'    => 'on_accept',
-                               auth        => 'on_auth',
-                               unknown_cmd => 'on_unknown_cmd',
-                       },
-               ],
-               heap => {},
-               args => [ $opts ],
-       );
-}
-
-sub _start {
-       my ($heap, $session, $kernel, $opt) = @_[ HEAP,  SESSION,  KERNEL,  
ARG0];
-       my ($address, $socket, $port) = ($opt->{address}, delete $opt->{sock}, 
$opt->{port});
-       
-       $kernel->post('Logger', 'note', "Connection from ${address}:$port");
-
-
-       ## breaks ssl.
-       #binmode $socket, ":utf8";
-       my $client = new POE::Wheel::ReadWrite(
-               Handle       => $socket,
-               Driver       => new POE::Driver::SysRW,
-               Filter       => new POE::Filter::Haver,
-               InputEvent   => 'socket_input',
-               FlushedEvent => 'socket_flush',
-               ErrorEvent   => 'socket_error',
-       );
-
-
-       my $timer = $kernel->alarm_set(
-               'shutdown', 
-               time + 60 * 60,
-               'TIMEOUT',
-       );
-
-       %$heap = (
-               %$opt,
-               timer       => $timer,
-               client      => $client,
-               shutdown    => 0,
-               plonk       => 0,
-               user        => undef,
-               uid         => undef,
-               prefix      => 'wcmd',
-       );
-}
-sub _stop {
-       my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
-
-       my ($address, $port) = @$heap{qw(address port)};
-       $kernel->call('Logger', 'note', "Lost connection from 
${address}:$port");
-}
-
-sub _default {
-       my ($kernel, $heap, $event, $args) = @_[KERNEL, HEAP, ARG0, ARG1];
-
-
-       if ($event =~ s/^cmd_//) {
-               $kernel->call($_[SESSION], 'unknown_cmd', $event, $_[ARG1][0]);
-       } elsif ($event =~ s/^wcmd_//) {
-               
-       }
-       $kernel->post('Logger', 'error', "Unknown event: $event");
-
-       return 0;
-}
-
-sub socket_input {
-       my ($kernel, $heap, $args) = @_[KERNEL, HEAP, ARG0];
-       
-       my @copy = @$args;
-       foreach (@copy) {
-               next unless defined;
-               #my @foo = split(//, $_);
-               #foreach my $c (@foo) {
-                       #$c = ord($c);
-                       #$c = "[$c]";
-               #}
-               #$_ = join('', @foo);
-               s/\e/<ESC>/g;
-               s/\r/<CR>/g;
-               s/\n/<LF>/g;
-               s/\t/<TAB>/g;
-               p
-       }
-       my $raw = join("\t", map { defined $_ ? $_ : '' } @copy);
-       $kernel->post('Logger', 'raw', $raw);
-       
-       return if $heap->{plonk};
-       return if $heap->{shutdown};
-
-       my $want = 0;
-       my $cmd = shift @$args;
-       my $event = $heap->{prefix} . '_' . $cmd;
-       
-       $kernel->yield($event, $args, $cmd);
-
-}
-
-sub socket_flush {
-       my ($kernel, $heap) = @_[KERNEL, HEAP];
-
-       if ($heap->{shutdown}) {
-               delete $heap->{client};
-       }
-}
-
-
-sub socket_error {
-       my ($kernel, $heap, $operation, $errnum, $errstr) = @_[KERNEL, HEAP, 
ARG0..ARG3];
-
-       $kernel->post('Logger', 'error', 
-               "Socket generated $operation error ${errnum}: $errstr");
-
-
-       $kernel->yield('shutdown', 'DISCON');
-}
-
-sub on_unknown_cmd {
-       my ($kernel, $heap, $event, $args) = @_[KERNEL, HEAP, ARG0, ARG1];
-
-       
-       $heap->{client}->put(['FAIL', $event, 'unknown.command']);
-}
-
-sub on_shutdown {
-       my ($kernel, $heap, $session, @args) = @_[KERNEL, HEAP, SESSION, ARG0 
.. $#_];
-       return if $heap->{shutdown};
-
-       $kernel->call('Logger', 'note', 'Shutting down client session.');
-       eval { $heap->{client}->put(['BYE', @args]) };
-       $heap->{shutdown} = 1;
-       $kernel->alarm_remove_all();
-       
-       $kernel->yield('cleanup', @args);
-}
-
-sub on_cleanup {
-       my ($kernel, $heap, @args) = @_[KERNEL, HEAP, ARG0 .. $#_];
-
-}
-
-sub on_oops {
-       my ($kernel, $heap, $err, $data) = @_[KERNEL, HEAP, ARG0 .. $#_];
-
-       if (not defined $data) {
-               $data = [];
-       }
-       
-       if (not ref $data) {
-               $data = [$data];
-       }
-       
-       eval { $heap->{client}->put(['OOPS', $err, @$data]) };
-       $kernel->yield('shutdown', 'OOPS');
-}
-sub on_fail {
-       my ($kernel, $heap, $cmd, $err, $data) = @_[KERNEL, HEAP, ARG0 .. $#_];
-
-       if (not defined $data) {
-               $data = [];
-       }
-       
-       if (not ref $data) {
-               $data = [$data];
-       }
-       
-       $kernel->post('Logger', 'fail', "failing $heap->{uid} with $cmd - 
$err");
-       eval { $heap->{client}->put(['FAIL', $cmd, $err, @$data]) };
-}
-
-sub since {
-       my ($then, $now) = @_;
-       
-       $now ||= time;
-       format_duration($now - $then);
-}
-
-sub on_accept {
-       my ($kernel, $heap, $uid, $user) = @_[KERNEL, HEAP, ARG0, ARG1];
-
-       $kernel->alarm_remove(delete $heap->{timer});
-
-       
-       $Registry->add($user);
-       $heap->{user} = $user;
-       $heap->{uid}  = $uid;
-       
-       my $addr = join('.', (split(/\./, $heap->{address}))[0,1,2]) . '.*';
-       my $login_time = time;
-       
-       $user->set(
-               IP        => $addr,
-               Login     => sub {
-                       since($login_time);
-               },
-               _last => time,
-               Idle      => sub {
-                       my ($u) = @_;
-                       since($u->get('_last'));
-               },
-               '.IP'     => $heap->{address},
-       );
-       
-       $heap->{prefix} = 'cmd';
-       $heap->{login}  = 1;
-       $heap->{client}->put(['ACCEPT', $uid]);
-}
-
-sub on_auth {
-       my ($kernel, $heap, $uid, $user) = @_[KERNEL, HEAP, ARG0, ARG1];
-
-       $heap->{uid}  = $uid;
-       $heap->{user} = $user;
-        
-}
-
-1;

Modified: branches/haver-server-cleanup/lib/Haver/Server/Listener.pm
===================================================================
--- branches/haver-server-cleanup/lib/Haver/Server/Listener.pm  2004-10-22 
23:11:22 UTC (rev 402)
+++ branches/haver-server-cleanup/lib/Haver/Server/Listener.pm  2004-10-25 
20:49:58 UTC (rev 403)
@@ -20,7 +20,7 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
 # TODO, write POD. Soon.
-package Haver::Server::POE::Listener;
+package Haver::Server::Listener;
 use strict;
 use warnings;
 use Carp;
@@ -29,7 +29,6 @@
 );
 
 use Haver::Preprocessor;
-use Haver::Server::Connection;
 
 sub create {
        my $class = shift;
@@ -122,12 +121,12 @@
                croak "SSL not available";
        }
 
-       Haver::Server::Connection->create(
+       create Haver::Server::Avatar {
                sock    => $socket,
                address => Socket::inet_ntoa($address),
                port    => $port,
                iface   => $info,
-       );
+       };
 }
 
 sub socket_fail {

Modified: branches/haver-server-cleanup/lib/Haver/Server/Registry.pm
===================================================================
--- branches/haver-server-cleanup/lib/Haver/Server/Registry.pm  2004-10-22 
23:11:22 UTC (rev 402)
+++ branches/haver-server-cleanup/lib/Haver/Server/Registry.pm  2004-10-25 
20:49:58 UTC (rev 403)
@@ -26,19 +26,20 @@
 use POE;
 use Carp;
 
-our $VERSION = 0.04;
-our $RELOAD = 1;
+our $VERSION   = 0.04;
+our $RELOAD    = 1;
+our @EXPORT_OK = qw( $Registry );
 our $Registry;
-our @EXPORT_OK = qw( $Registry );
 
 sub instance {
        my $class = shift;
 
        # don't warn about redefining a function.
-       do {
+       {
                no warnings;
-               *instance = \&self;
-       };
+               *old_instance = \&instance;
+               *instance     = \&self;
+       }
        
        return $Registry = $class->SUPER::new(@_);
 }


Reply via email to