put dx.pl into an explicit handle sub
[spider.git] / perl / Route.pm
index 794b8d3d71e15084a36d6854a81bf4129e33a49e..c43fd34d7dc1cad6e93a0baec8504bedf0023de6 100644 (file)
@@ -22,7 +22,7 @@ use DXUtil;
 use strict;
 
 
-use vars qw(%list %valid $filterdef);
+use vars qw(%list %valid $filterdef $maxlevel);
 
 %valid = (
                  call => "0,Callsign",
@@ -53,6 +53,7 @@ $filterdef = bless ([
                          ['by_state', 'ns', 9],
                         ], 'Filter::Cmd');
 
+$maxlevel = 25;                 # maximum recursion level in Route::config
 
 sub new
 {
@@ -205,7 +206,7 @@ sub config
                $pcall = ' ' x length $pcall;
 
                # recursion detector
-               if ((DXChannel::get($call) && $level > 1) || $seen->{$call}) {
+               if ((DXChannel::get($call) && $level > 1) || $seen->{$call} || $level > $maxlevel) {
                        $line .= ' ...';
                        push @out, $line;
                        return @out;
@@ -239,7 +240,7 @@ sub config
                push @out, $line if length $line;
        } else {
                # recursion detector
-               if ((DXChannel::get($call) && $level > 1) || $seen->{$call}) {
+               if ((DXChannel::get($call) && $level > 1) || $seen->{$call} || $level > $maxlevel) {
                        return @out;
                }
                $seen->{$call}++;
@@ -289,24 +290,34 @@ sub get
 sub findroutes
 {
        my $call = shift;
+       my %cand;
        my @out;
 
        dbg("ROUTE: findroutes $call") if isdbg('findroutes');
 
-       # return immediately if we are directly connected
-       my $dxchan = DXChannel::get($call);
-       return $dxchan if $dxchan;
-
        my $nref = Route::get($call);
        return () unless $nref;
 
+       # we are directly connected, force "best possible" priority, but
+       # carry on in case user is connected on other nodes.
+       my $dxchan = DXChannel::get($call);
+       if ($dxchan) {
+               dbg("ROUTE: findroutes $call -> directly connected") if isdbg('findroutes');
+               $cand{$call} = 99;
+       }
+
        # obtain the dxchannels that have seen this thingy
        my @parent = $nref->isa('Route::User') ? @{$nref->{parent}} : $call;
-       my %cand;
        foreach my $p (@parent) {
-               # return immediately if we are directly connected or a user's parent node is
+               next if $p eq $main::mycall; # this is dealt with above
+
+               # deal with directly connected nodes, again "best priority"
                $dxchan = DXChannel::get($p);
-               return $dxchan if $dxchan;
+               if ($dxchan) {
+                       dbg("ROUTE: findroutes $call -> connected direct via parent $p") if isdbg('findroutes');
+                       $cand{$p} = 99;
+                       next;
+               }
 
                my $r = Route::Node::get($p);
                if ($r) {
@@ -325,10 +336,10 @@ sub findroutes
        }
 
        # get a sorted list of dxchannels with the highest hop count first
-       my @nout = map {$_->[1]} sort {$b->[0] <=> $a->[0]} @out;
+       my @nout = sort {$b->[0] <=> $a->[0]} @out;
        if (isdbg('findroutes')) {
-               if (@out) {
-                       foreach (sort {$b->[0] <=> $a->[0]} @out) {
+               if (@nout) {
+                       for (@nout) {
                                dbg("ROUTE: findroutes $call -> $_->[0] " . $_->[1]->call);
                        }
                }
@@ -342,7 +353,7 @@ sub alldxchan
 {
        my $self = shift;
        my @dxchan = findroutes($self->{call});
-       return @dxchan;
+       return map {$_->[1]} @dxchan;
 }
 
 sub dxchan
@@ -365,7 +376,6 @@ sub delete_interface
 
 }
 
-
 #
 # track destruction
 #