#!/usr/bin/perl -w
use strict;

use lib qw(blib/lib blib/arch);

use POE qw(Session);
use POE::Component::IKC::Server;

# Very simple time pulse session
# Foreign sessions connect to it via 'connect' events and
# disconect with 'disconnect'.
# Every 10 seconds, a 'pulse' event is sent to connected sessions.


POE::Session->new
(
    _start=>\&time_start,
#    _stop=>\&time_stop,
    'connect'=>\&time_connect,
    'disconnect'=>\&time_disconnect,    
    'pulse'=>\&time_pulse,
);

create_ikc_server(
    port=>31338, 
    name=>'Pulse');       # eleet++

print "Running server...\n";
$poe_kernel->run();
print "Server exited...\n";

#############################################
sub time_start
{
    my($kernel, $heap)=@_[KERNEL, HEAP];
    $heap->{listeners}={};
    $kernel->alias_set('timeserver');
    $kernel->delay('pulse', 10-(time%10));
}

#############################################
sub time_stop
{
    my($heap)=$_[HEAP];
    $heap->{listeners}={};
}

#############################################
sub time_connect
{
    my($kernel, $heap, $dest)=@_[KERNEL, HEAP, ARG0];
    $dest->{name}||=join '::', @{$dest}{qw(kernel session event)};
    print "Connected $dest->{name}\n";
    $heap->{listeners}->{$dest->{name}}=$dest;
}

#############################################
sub time_disconnect
{
    my($kernel, $heap, $dest)=@_[KERNEL, HEAP, ARG0];
    $dest->{name}||=join '::', @{$dest}{qw(kernel session event)};
    print "Disconnected $dest->{name}\n";
    delete $heap->{listeners}->{$dest->{name}};
}

#############################################
sub time_pulse
{
    my($kernel, $heap)=@_[KERNEL, HEAP];
    my $now=localtime;
    $kernel->delay('pulse', 10-(time%10));

    foreach my $dest (values %{$heap->{listeners}})
    {
        print "$dest->{name} -- $now\n";
        $kernel->call('IKC', 'post', $dest, $now)
                or $kernel->yield('disconnect', $dest);
    }
    return;
}

