X-Git-Url: http://www.dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FRoute.pm;h=3301099890e23214948639c8aa28c667bc52dbfd;hb=c1540ccd7990ec4bd151604dd63583d19fe4d0f6;hp=415d1744f2f7ebcf263d55c9930797d27cf30303;hpb=fd0a34c34ad4112ee21e0730f7307498ff437e18;p=spider.git diff --git a/perl/Route.pm b/perl/Route.pm index 415d1744..33010998 100644 --- a/perl/Route.pm +++ b/perl/Route.pm @@ -1,4 +1,4 @@ -#!/usr/bin/perl +# # # This module impliments the abstracted routing for all protocols and # is probably what I SHOULD have done the first time. @@ -181,6 +181,7 @@ sub config { my $self = shift; my $nodes_only = shift || 0; + my $width = shift || 79; my $level = shift; my $seen = shift; my @out; @@ -200,7 +201,7 @@ sub config $pcall .= ":" . $self->obscount if isdbg('obscount'); - $line = ' ' x ($level*2) . "$pcall"; + $line = ' ' x ($level*2) . $pcall; $pcall = ' ' x length $pcall; # recursion detector @@ -223,7 +224,7 @@ sub config } else { $c = "$ucall?"; } - if ((length $line) + (length $c) + 1 < 79) { + if ((length $line) + (length $c) + 1 < $width) { $line .= $c . ' '; } else { $line =~ s/\s+$//; @@ -251,7 +252,7 @@ sub config if ($nref) { my $c = $nref->user_call; dbg("recursing from $call -> $c") if isdbg('routec'); - my @rout = $nref->config($nodes_only, $level+1, $seen, @_); + my @rout = $nref->config($nodes_only, $width, $level+1, $seen, @_); if (@rout && @_) { push @out, ' ' x ($level*2) . $self->user_call unless grep /^\s+$call/, @out; } @@ -288,32 +289,49 @@ sub get sub findroutes { my $call = shift; - my $level = shift || 0; - my $seen = shift || {}; my @out; - dbg("findroutes: $call level: $level calls: " . join(',', @_)) if isdbg('routec'); + dbg("ROUTE: findroutes: $call") if isdbg('findroutes'); - # recursion detector - return () if $seen->{$call}; + # return immediately if we are directly connected if (my $dxchan = DXChannel::get($call)) { - $seen->{$call}++; - push @out, $level ? [$level, $dxchan] : $dxchan; - return @out; + return $dxchan; } - $seen->{$call}++; - # deal with more nodes my $nref = Route::get($call); - foreach my $ncall (@{$nref->{parent}}) { - unless ($seen->{$ncall}) { - dbg("recursing from $call -> $ncall") if isdbg('routec'); - my @rout = findroutes($ncall, $level+1, $seen); - push @out, @rout; + return () unless $nref; + + # obtain the dxchannels that have seen this thingy + my @parent = $nref->isa('Route::User') ? @{$nref->{parent}} : $call; + my %cand; + foreach my $p (@parent) { + my $r = Route::Node::get($p); + if ($r) { + my %r = $r->PC92C_dxchan; + while (my ($k, $v) = each %r) { + $cand{$k} = $v if $v > ($cand{$k} || 0); + } + } + } + + # remove any dxchannels that have gone away + while (my ($k, $v) = each %cand) { + if (my $dxc = DXChannel::get($k)) { + push @out, [$v, $dxc]; } } - return $level == 0 ? map {$_->[1]} sort {$a->[0] <=> $b->[0]} @out : @out; + # get a sorted list of dxchannels with the highest hop count first + my @nout = map {$_->[1]} sort {$b->[0] <=> $a->[0]} @out; + if (isdbg('findroutes')) { + if (@out) { + foreach (sort {$b->[0] <=> $a->[0]} @out) { + dbg("ROUTE: findroute $call -> $_->[0] " . $_->[1]->call); + } + } + } + + return @nout; } # find all the possible dxchannels which this object might be on @@ -335,21 +353,14 @@ sub dxchan my @dxchan = $self->alldxchan; return undef unless @dxchan; - # determine the minimum ping channel -# my $minping = 99999999; -# foreach my $dxc (@dxchan) { -# my $p = $dxc->pingave; -# if (defined $p && $p < $minping) { -# $minping = $p; -# $dxchan = $dxc; -# } -# } -# $dxchan = shift @dxchan unless $dxchan; - # dxchannels are now returned in order of "closeness" return $dxchan[0]; } +sub delete_interface +{ + +} #