really REALLY fix period C records
[spider.git] / perl / DXProt.pm
index f6edc3d58fd4875f07d2bb562feea80a183612ec..18d7bdb5ae4bea70c4adfcea392b8e58a6f9aae4 100644 (file)
@@ -449,13 +449,6 @@ sub process
                        }
                }
 
-               # send out a PC92 config record if required
-               if ($main::systime >= $dxchan->{next_pc92_update}) {
-                       if ($dxchan->{call} eq $main::mycall || !$dxchan->{do_pc9x}) {
-                               $dxchan->send_pc92_update($dxchan->{call});
-                       }
-                       $dxchan->update_pc92_next($pc92_update_period);
-               }
        }
 
        Investigate::process();
@@ -474,6 +467,19 @@ sub process
                }
 
                $last10 = $t;
+
+               # send out config broadcasts
+               foreach $dxchan (@dxchan) {
+                       next unless $dxchan->is_node;
+
+                       # send out a PC92 config record if required for me and
+                       # all my non pc9x dependent nodes.
+                       if ($main::systime >= $dxchan->{next_pc92_update}) {
+                               if ($dxchan->{call} eq $main::mycall || !$dxchan->{do_pc9x}) {
+                                       $dxchan->broadcast_pc92_update($dxchan->{call});
+                               }
+                       }
+               }
        }
 
        if ($main::systime - 3600 > $last_hour) {
@@ -834,16 +840,6 @@ sub gen_my_pc92_config
        }
 }
 
-sub gen_pc92_update
-{
-       my $self = shift;
-
-       # send 'my' configuration for all channels
-       my $l = gen_my_pc92_config($main::routeroot);
-       return $l;
-}
-
-
 sub send_last_pc92_config
 {
        my $self = shift;
@@ -866,15 +862,17 @@ sub send_pc92_config
        $self->send($node->last_PC92C);
 }
 
-sub send_pc92_update
+sub broadcast_pc92_update
 {
        my $self = shift;
        my $call = shift;
 
-       dbg('DXProt::send_pc92_update') if isdbg('trace');
+       dbg('DXProt::broadcast_pc92_update') if isdbg('trace');
 
-       my $l = gen_my_pc92_config(Route::Node::get($call));
+       my $nref = Route::Node::get($call);
+       my $l = $nref->last_PC92C(gen_my_pc92_config($nref));
        $main::me->broadcast_route_pc9x($main::mycall, undef, $l, 0);
+       $self->update_pc92_next($pc92_update_period);
 }
 
 sub time_out_pc92_routes
@@ -885,19 +883,19 @@ sub time_out_pc92_routes
                my $o = $n->dec_obs;
                if ($o <= 0) {
                        if (my $dxchan = DXChannel::get($n->call)) {
-                               dbg("disconnecting local pc92 $dxchan->{call} on obscount");
+                               dbg("disconnecting local pc92 $dxchan->{call} on obscount") if isdbg('obscount');
                                $dxchan->disconnect;
                                next;
                        }
                        my @parents = map {Route::Node::get($_)} $n->parents;
                        for (@parents) {
                                if ($_) {
-                                       dbg("deleting pc92 $_->{call} from $n->{call} on obscount");
+                                       dbg("deleting pc92 $_->{call} from $n->{call} on obscount")  if isdbg('obscount');
                                        push @rdel, $n->del($_);
                                }
                        }
                } else {
-                       dbg("ROUTE: obscount on $n->{call} now $o") if isdbg('route');
+                       dbg("ROUTE: obscount on $n->{call} now $o") if isdbg('obscount');
                }
        }
        for (@rdel) {
@@ -1223,6 +1221,7 @@ sub send_route
        }
 }
 
+# broadcast everywhere
 sub broadcast_route
 {
        my $self = shift;
@@ -1238,8 +1237,33 @@ sub broadcast_route
        }
        unless ($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->isa('DXProt');
+
+                       $dxchan->send_route($origin, $generate, @_);
+               }
+       }
+}
+
+# broadcast to non-pc9x nodes
+sub broadcast_route_nopc9x
+{
+       my $self = shift;
+       my $origin = shift;
+       my $generate = shift;
+       my $line = shift;
+       my @dxchan = DXChannel::get_all_nodes();
+       my $dxchan;
+
+       if ($line) {
+               $line =~ /\^H(\d+)\^?\~?$/;
+               return unless $1 > 0;
+       }
+       unless ($self->{isolate}) {
+               foreach $dxchan (@dxchan) {
+                       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->isa('DXProt');
                        next if $dxchan->{do_pc9x};
                        next if ($generate == \&pc16 || $generate==\&pc17) && !$dxchan->user->wantsendpc16;
@@ -1265,6 +1289,7 @@ sub send_route_pc92
        $self->send($line);
 }
 
+# broadcast only to pc9x nodes
 sub broadcast_route_pc9x
 {
        my $self = shift;
@@ -1284,8 +1309,8 @@ sub broadcast_route_pc9x
                foreach $dxchan (@dxchan) {
                        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_pc9x};
                        next unless $dxchan->isa('DXProt');
+                       next unless $dxchan->{do_pc9x};
 
                        $dxchan->send($line);
                }
@@ -1298,7 +1323,7 @@ sub route_pc16
        return unless $self->user->wantpc16;
        my $origin = shift;
        my $line = shift;
-       broadcast_route($self, $origin, \&pc16, $line, 1, @_);
+       broadcast_route_nopc9x($self, $origin, \&pc16, $line, 1, @_);
 }
 
 sub route_pc17
@@ -1307,7 +1332,7 @@ sub route_pc17
        return unless $self->user->wantpc16;
        my $origin = shift;
        my $line = shift;
-       broadcast_route($self, $origin, \&pc17, $line, 1, @_);
+       broadcast_route_nopc9x($self, $origin, \&pc17, $line, 1, @_);
 }
 
 sub route_pc19
@@ -1315,7 +1340,7 @@ sub route_pc19
        my $self = shift;
        my $origin = shift;
        my $line = shift;
-       broadcast_route($self, $origin, \&pc19, $line, scalar @_, @_);
+       broadcast_route_nopc9x($self, $origin, \&pc19, $line, scalar @_, @_);
 }
 
 sub route_pc21
@@ -1323,7 +1348,7 @@ sub route_pc21
        my $self = shift;
        my $origin = shift;
        my $line = shift;
-       broadcast_route($self, $origin, \&pc21, $line, scalar @_, @_);
+       broadcast_route_nopc9x($self, $origin, \&pc21, $line, scalar @_, @_);
 }
 
 sub route_pc24