remove finishes and derive disconnect instead
[spider.git] / perl / DXProt.pm
index 516779b67458791266a7d00bd25453d30732b1ad..c099a92c4163050ebe63ad157296a9f2dccfa2b5 100644 (file)
@@ -1144,42 +1144,6 @@ sub process
 #
 # finish up a pc context
 #
-sub finish
-{
-       my $self = shift;
-       my $call = $self->call;
-       my $conn = shift;
-       my $ref = DXCluster->get_exact($call);
-       
-       # unbusy and stop and outgoing mail
-       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
-       my @gonenodes = map { $_->dxchan == $self ? $_ : () } DXNode::get_all();
-       my $node;
-       
-       foreach $node (@gonenodes) {
-               next if $node->call eq $call;
-               broadcast_ak1a(pc21($node->call, 'Gone') , $self) unless $self->{isolate}; 
-               $node->del();
-       }
-
-       # 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);
-
-       # send info to all logged in thingies
-       $self->tell_login('logoutn');
-
-       Log('DXProt', $call . " Disconnected");
-       $ref->del() if $ref;
-}
 
 #
 # some active measures
@@ -1514,6 +1478,8 @@ sub broadcast_ak1a
        # send it if it isn't the except list and isn't isolated and still has a hop count
        foreach $dxchan (@dxchan) {
                next if grep $dxchan == $_, @except;
+               next if $dxchan == $me;
+               
                my $routeit = adjust_hops($dxchan, $s);      # adjust its hop count by node name
                $dxchan->send($routeit) unless $dxchan->{isolate} || !$routeit;
        }
@@ -1531,6 +1497,8 @@ sub broadcast_all_ak1a
        # send it if it isn't the except list and isn't isolated and still has a hop count
        foreach $dxchan (@dxchan) {
                next if grep $dxchan == $_, @except;
+               next if $dxchan == $me;
+
                my $routeit = adjust_hops($dxchan, $s);      # adjust its hop count by node name
                $dxchan->send($routeit);
        }
@@ -1565,6 +1533,7 @@ sub broadcast_list
        
        foreach $dxchan (@_) {
                my $filter = 1;
+               next if $dxchan == $me;
                
                if ($sort eq 'dx') {
                    next unless $dxchan->{dx};
@@ -1681,11 +1650,40 @@ sub disconnect
 {
        my $self = shift;
        my $nopc39 = shift;
+       my $call = $self->call;
 
-       if ($self->{conn} && !$nopc39) {
+       unless ($nopc39) {
                $self->send_now("D", DXProt::pc39($main::mycall, $self->msg('disc1', "System Op")));
        }
 
+       # unbusy and stop and outgoing mail
+       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) {
+               next if $node->call eq $call;
+               next if $node->call eq $main::mycall;
+               broadcast_ak1a(pc21($node->call, 'Gone.'), $self) unless $self->{isolate};
+               $node->del;
+       }
+
+       # 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);
+
+       # send info to all logged in thingies
+       $self->tell_login('logoutn');
+
+       Log('DXProt', $call . " Disconnected");
+       my $ref = DXCluster->get_exact($call);
+       $ref->del() if $ref;
+
        $self->SUPER::disconnect;
 }