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