fix disappeared messages
[spider.git] / perl / DXProt.pm
index c099a92c4163050ebe63ad157296a9f2dccfa2b5..8687a4943d446c920152a73b9657ae7a0ce5c1fc 100644 (file)
@@ -565,6 +565,8 @@ sub normal
                        
                        # queue up any messages (look for privates only)
                        DXMsg::queue_msg(1) if $self->state eq 'normal';     
+#                      broadcast_route($line, $self, $field[1]);
+#                      return;
                        last SWITCH;
                }
                
@@ -613,6 +615,8 @@ sub normal
                                dbg('chan', "PCPROT: $field[1] not known" );
                                return;
                        }
+#                      broadcast_route($line, $self, $field[2]);
+#                      return;
                        last SWITCH;
                }
                
@@ -731,6 +735,8 @@ sub normal
                                dbg('chan', "PCPROT: I WILL _NOT_ be disconnected!");
                                return;
                        }
+#                      broadcast_route($line, $self, $call);
+#                      return;
                        last SWITCH;
                }
                
@@ -1148,6 +1154,39 @@ sub process
 #
 # some active measures
 #
+sub send_route
+{
+       my $self = shift;
+       my $line = shift;
+       my @dxchan = DXChannel::get_all_nodes();
+       my $dxchan;
+       
+       # send it if it isn't the except list and isn't isolated and still has a hop count
+       # taking into account filtering and so on
+       foreach $dxchan (@dxchan) {
+               my $routeit;
+               my ($filter, $hops);
+
+               if ($dxchan->{routefilter}) {
+                       ($filter, $hops) = $dxchan->{routefilter}->it($self->{call}, @_);
+                        next unless $filter;
+               }
+               next if $dxchan == $self;
+               if ($hops) {
+                       $routeit = $line;
+                       $routeit =~ s/\^H\d+\^\~$/\^H$hops\^\~/;
+               } else {
+                       $routeit = adjust_hops($dxchan, $line);  # adjust its hop count by node name
+                       next unless $routeit;
+               }
+               if ($filter) {
+                       $dxchan->send($routeit) if $routeit;
+               } else {
+                       $dxchan->send($routeit) unless $dxchan->{isolate} || $self->{isolate};
+               }
+       }
+}
+
 sub send_dx_spot
 {
        my $self = shift;
@@ -1660,20 +1699,30 @@ sub disconnect
        my $mref = DXMsg::get_busy($call);
        $mref->stop_msg($call) if $mref;
        
-       # broadcast to all other nodes that all the nodes connected to via me are gone
-       foreach my $node (grep { $_->dxchan == $self } DXNode::get_all) {
+       # create a list of all the nodes that have gone and delete them from the table
+       my @nodes;
+       foreach my $node (grep { $_->dxchancall eq $call } DXNode::get_all) {
                next if $node->call eq $call;
                next if $node->call eq $main::mycall;
-               broadcast_ak1a(pc21($node->call, 'Gone.'), $self) unless $self->{isolate};
+               push @nodes, $node->call;
                $node->del;
        }
 
+       # broadcast to all other nodes that all the nodes connected to via me are gone
+       unless ($self->{isolate}) {
+               push @nodes, $call;
+               for (@nodes) {
+                       broadcast_ak1a(pc21($_, 'Gone.'), $self);
+               }
+       }
+
+       # remove this node from the tables
+       my $node = DXCluster->get_exact($call);
+       $node->del if $node;
+       
        # remove outstanding pings
        delete $pings{$call};
        
-       # now broadcast to all other ak1a nodes that I have gone
-       broadcast_ak1a(pc21($call, 'Gone.'), $self) unless $self->{isolate};
-
        # I was the last node visited
     $self->user->node($main::mycall);
 
@@ -1681,8 +1730,6 @@ sub disconnect
        $self->tell_login('logoutn');
 
        Log('DXProt', $call . " Disconnected");
-       my $ref = DXCluster->get_exact($call);
-       $ref->del() if $ref;
 
        $self->SUPER::disconnect;
 }