/usr/local/CPAN/SVL/SVL/BeaconClient.pm


package SVL::BeaconClient;
use strict;
use warnings;
$| = 1;
use POE qw(Component::Client::TCP Filter::Reference Filter::Stream);

POE::Component::Client::TCP->new(
  RemoteAddress => "www.astray.com",
#  RemoteAddress => "localhost",
  RemotePort    => 5678,
  ServerInput   => \&handle_server_input,
  Filter        => 'POE::Filter::Reference',
  Connected     => \&handle_connected,			      
);

my $global_uuid = shift;

my %svnserve;

sub handle_connected {
    $_[HEAP]->{server}->put({ type => 'register', uuid => $global_uuid } );
}

sub handle_server_input {
  my $data = $_[ARG0];

  my $heap = $_[HEAP];

  if ($data->{type} eq 'listen') {
    print "Remote listening enabled $data->{address}:$data->{port}/$data->{uuid}/\n";
  } elsif ($data->{type} eq 'connect') {
    # we need to connect here
    my $stream_id = $data->{stream};
    POE::Component::Client::TCP->new(
      RemoteAddress => '127.0.0.1',
      RemotePort    => '48513',
      Connected     => sub {
        #print "Connected to svnserve\n";
        $svnserve{$stream_id} = $_[HEAP]->{server};
      },
      ServerInput => sub {
        #print "Sending data back for stream $stream_id\n";
#        warn $_[ARG0] . "\n";
        $heap->{server}
          ->put({ type => 'data', stream => $stream_id, data => $_[ARG0] });
      },
      Filter => 'POE::Filter::Stream'
    );
    print "Connection from $data->{address} stream $data->{stream}\n";
  } elsif ($data->{type} eq 'data') {
    #print "Got data for stream $data->{stream}\n";
    $svnserve{ $data->{stream} }->put($data->{data});
  } elsif ($data->{type} eq 'disconnect') {
    #print "Disconnected client for stream $data->{stream}\n";
  } else {
    die "Unknown type";
  }
}

$poe_kernel->run();

1;