more debugging
[spider.git] / perl / DXProt.pm
index f8b3e08bbfebf21e27475c5a46cd31b1f9b5f841..4ea652afefefaef6a0c01c0e03e814894a88c5db 100644 (file)
@@ -221,6 +221,8 @@ sub init
        $main::me->{registered} = 1;
        $main::me->{version} = $main::version;
        $main::me->{build} = $main::build;
+       $main::me->{do_pc92} = 1;
+       $main::me->{via_pc92} = 1;
 }
 
 #
@@ -430,6 +432,7 @@ sub process
                import_chat();
 
                if ($main::systime >= $last_pc92_update + $pc92_update_period) {
+                       dbg("ROUTE: sending pc92 update") if isdbg('route');
                        send_pc92_update();
                        time_out_pc92_routes();
                        $last_pc92_update = $main::systime + int rand(180);
@@ -776,11 +779,13 @@ sub gen_pc92_update
        my $node;
        my @lines;
        
-       dbg('DXProt::send_pc92_update') if isdbg('trace');
+       dbg('ROUTE: DXProt::gen_pc92_update start') if isdbg('route');
 
        # send 'my' configuration for all users and pc92 capable nodes
        my @dxchan = grep { $_->call ne $main::mycall && $_ != $self && !$_->{isolate} } DXChannel::get_all();
+       dbg("ROUTE: all dxchan: " . join(',', map{$_->{call}} @dxchan)) if isdbg('route');
        my @localnodes = map { my $r = Route::get($_->{call}); $r ? $r : () } @dxchan;
+       dbg("ROUTE: localnodes: " . join(',', map{$_->{call}} @localnodes)) if isdbg('route');
        push @lines, pc92c($main::routeroot, @localnodes);
 
 
@@ -788,7 +793,9 @@ sub gen_pc92_update
                # send out the configuration of all the directly connected PC92 nodes with current configuration
                # but with the dates that the last config came in with.
                @dxchan = grep { $_->call ne $main::mycall && $_ != $self && !$_->{isolate} && $_->{do_pc92} } DXChannel::get_all_nodes();
+               dbg("ROUTE: pc92 dxchan: " . join(',', map{$_->{call}} @dxchan)) if isdbg('route');
                @localnodes = map { my $r = Route::Node::get($_->{call}); $r ? $r : () } @dxchan;
+               dbg("ROUTE: pc92 localnodes: " . join(',', map{$_->{call}} @localnodes)) if isdbg('route');
                foreach $node (@localnodes) {
                        if ($node && $node->lastid->{92}) {
                                my @rout = map {my $r = Route::get($_); $r ? ($r) : ()} $node->nodes, $node->users;
@@ -800,13 +807,17 @@ sub gen_pc92_update
        # send the configuration of all the directly connected 'external' nodes that don't handle PC92
        # out with the 'external' marker on the first node.
        @dxchan = grep { $_->call ne $main::mycall && $_ != $self && !$_->{isolate} && !$_->{do_pc92} } DXChannel::get_all_nodes();
+       dbg("ROUTE: non pc92 dxchan: " . join(',', map{$_->{call}} @dxchan)) if isdbg('route');
        @localnodes = map { my $r = Route::Node::get($_->{call}); $r ? $r : () } @dxchan;
+       dbg("ROUTE: non pc92 localnodes: " . join(',', map{$_->{call}} @localnodes)) if isdbg('route');
        foreach $node (@localnodes) {
                if ($node) {
                        my @rout = map {my $r = Route::User::get($_); $r ? ($r) : ()} $node->users;
                        push @lines, pc92c($node, @rout);
                } 
        }
+
+       dbg('ROUTE: DXProt::gen_pc92_update end with ' . scalar @lines . ' lines') if isdbg('route');
        return @lines;
 }
 
@@ -831,20 +842,31 @@ sub send_pc92_update
        
        # broadcast the lines to all PC92 nodes
        for (@out) {
-               $main::me->broadcast_route_pc9x('', undef, $_, 0);
+               $main::me->broadcast_route_pc9x($main::mycall, undef, $_, 0);
        }
 } 
 
 sub time_out_pc92_routes
 {
-       my @nodes = grep {$_->do_pc92 || $_->via_pc92} Route::Node::get_all();
+       my @nodes = grep {$_->call ne $main::mycall && ($_->do_pc92 || $_->via_pc92)} Route::Node::get_all();
        my @rdel;
        foreach my $n (@nodes) {
-               if ($n->dec_obs <= 0) {
+               my $o = $n->dec_obs;
+               if ($o <= 0) {
+                       if (my $dxchan = DXChannel::get($n->call)) {
+                               dbg("ROUTE: disconnecting local pc92 $dxchan->{call} on obscount") if isdbg('route');
+                               $dxchan->disconnect;
+                               next;
+                       }
                        my @parents = map {Route::Node::get($_)} $n->parents;
                        for (@parents) {
-                               push @rdel, $n->del($_) if $_;
+                               if ($_) {
+                                       dbg("ROUTE: deleting pc92 $_->{call} from $n->{call} on obscount") if isdbg('route');
+                                       push @rdel, $n->del($_);
+                               }
                        }
+               } else {
+                       dbg("ROUTE: obscount on $n->{call} now $o") if isdbg('route');
                }
        }
        for (@rdel) {
@@ -1219,15 +1241,15 @@ sub broadcast_route_pc9x
        my @dxchan = DXChannel::get_all_nodes();
        my $dxchan;
 
-       if ($origin eq $main::mycall) {
+       if ($origin eq $main::mycall && $generate && !$line) {
                $line = &$generate(@_);
        } 
 
        $line =~ /\^H(\d+)\^\~?$/;
        unless ($1 > 0 && $self->{isolate}) {
                foreach $dxchan (@dxchan) {
-                       next if $dxchan == $self;
-                       next if $dxchan == $main::me;
+                       next if $dxchan == $self || $dxchan == $main::me;
+                       next if $origin eq $dxchan->{call};     # don't route some from this call back again.
                        next unless $dxchan->{do_pc92};
                        next unless $dxchan->isa('DXProt');