package Net::Paraget::ServerList;
#
# $Id: ServerList.pm,v 1.5 2001/05/10 04:33:48 lrclause Exp $
#

use strict;
use XML::Simple;
use Data::Dumper;

use Class::MethodMaker
  hash          => [ qw( servers serverdata ) ],
  new_hash_init => 'new';


sub read_in_servers
{
    my ($self, $filename) = @_;

    if (-e $filename)
    {
	$self->state( "Reading server statistics from $filename", 1);
	
	my $data = XMLin($filename);
	
	$self->serverdata(%{$data->{'server'}});
    }
    else
    {
	$self->serverdata( "server" => {} );
    }
    
    return;
}

sub write_out_servers
{
    my ($self, $filename) = @_;

    foreach my $server ( $self->servers_values() ) {
	my $data = $server->save_state();
	$self->serverdata( $server->as_string(), $data );
    }

    $self->state( "Writing server statistics to $filename", 1);

    my $text = XMLout( { server => scalar($self->serverdata()) } );
    my $file = IO::File->new( ">$filename" );
    if (not $file) 
    {
	warn( "Could not open $filename for writing server statistics." );
	return;
    }
    print $file $text;
    close($file);
}


sub count_servers
{
    my ( $self ) = @_;
    return scalar $self->servers_keys();
}


sub average_speed
{
    my ( $self ) = @_;
    return $self->get_average( 'speed' );
}


sub average_overhead
{
    my ( $self ) = @_;
    return $self->get_average( 'overhead' );
}


sub get_average
{
    my ( $self, $value ) = @_;

    my $n = $self->count_servers() or return undef;
    my $sum = 0;

    foreach my $s ( $self->servers_values() )
    {
       my $x = $s->$value();
       $sum += $x if defined $x;
    }

    my $average = int ( $sum / $n );
    return $average;
}      
                                  
sub get_a
{
    my ( $self, $value ) = @_;
    my $average_string = "average_$value";
    my $default_string = "default_$value";
    
    my $a = ( $self->$value()
	      || $self->list->$average_string()
	      || $self->list->$default_string()
	    );
    return $a;
}


sub a_speed
{
    my ( $self ) = @_;
    return $self->get_a( 'speed' );
}


sub an_overhead
{
    my ( $self ) = @_;
    return $self->get_a( 'overhead' );
}


sub default_speed
{
    return 10**3;
}


sub default_overhead
{
    return 3;
}

sub state
{
    my ( $self, $string, $priority ) = @_;
    main::state( "server list: " . $string, $priority );
}

1;


syntax highlighted by Code2HTML, v. 0.9.1