connect up the discontinuous trees and route better
[spider.git] / perl / DXProtHandle.pm
index e1b31bafbdf50ee15b27b46e7ee83f92ffc446ed..b83da41784b10ebb4f4d76bd13c25b34d30dfc3b 100644 (file)
@@ -4,7 +4,7 @@
 #
 # Copyright (c) 1998-2006 Dirk Koopman G1TLH
 #
-# $Id$
+#
 #
 
 package DXProt;
@@ -107,40 +107,6 @@ sub handle_10
 
        # convert this to a PC93 and process it as such
        $self->normal(pc93($to, $from, $via, $_[3], $_[6]));
-       return;
-
-       # this is all redundant but kept for now for reference
-
-       # it is here and logged on
-       $dxchan = DXChannel::get($main::myalias) if $to eq $main::mycall;
-       $dxchan = DXChannel::get($to) unless $dxchan;
-       if ($dxchan && $dxchan->is_user) {
-               $_[3] =~ s/\%5E/^/g;
-               $dxchan->talk($from, $to, $via, $_[3]);
-               return;
-       }
-
-       # is it elsewhere, visible on the cluster via the to address?
-       # note: this discards the via unless the to address is on
-       # the via address
-       my ($ref, $vref);
-       if ($ref = Route::get($to)) {
-               $vref = Route::Node::get($via) if $via;
-               $vref = undef unless $vref && grep $to eq $_, $vref->users;
-               $ref->dxchan->talk($from, $to, $vref ? $via : undef, $_[3], $_[6]);
-               return;
-       }
-
-       # can we see an interface to send it down?
-
-       # not visible here, send a message of condolence
-       $vref = undef;
-       $ref = Route::get($from);
-       $vref = $ref = Route::Node::get($_[6]) unless $ref;
-       if ($ref) {
-               $dxchan = $ref->dxchan;
-               $dxchan->talk($main::mycall, $from, $vref ? $vref->call : undef, $dxchan->msg('talknh', $to) );
-       }
 }
 
 # DX Spot handling
@@ -598,16 +564,15 @@ sub handle_18
        my $parent = Route::Node::get($self->{call});
 
        # record the type and version offered
-       if ($_[1] =~ /DXSpider Version: (\d+\.\d+)/) {
-               $self->{version} = 53 + $1;
-               $self->user->version(53 + $1);
-               $parent->version(0 + $1);
-               dbg("DXSpider version $1");
+       if (my ($version) = $_[1] =~ /DXSpider Version: (\d+\.\d+)/) {
+               $self->{version} = 53 + $version;
+               $self->user->version(53 + $version);
+               $parent->version(0 + $version);
                my ($build) = $_[1] =~ /Build: (\d+(?:\.\d+)?)/;
                $self->{build} = 0 + $build;
                $self->user->build(0 + $build);
                $parent->build(0 + $build);
-               dbg("DXSpider build $build");
+               dbg("DXSpider version $version build $build");
                unless ($self->is_spider) {
                        dbg("Change U " . $self->user->sort . " C $self->{sort} -> S");
                        $self->user->sort('S');
@@ -1588,8 +1553,13 @@ sub handle_92
                                                # reparent to external node (note that we must have received a 'C' or 'A' record
                                                # from the true parent node for this external before we get one for the this node
                                                unless ($parent = Route::Node::get($call)) {
-                                                       dbg("PCPROT: no previous C or A for this external node received, ignored") if isdbg('chanerr');
-                                                       return;
+                                                       if ($is_extnode && $oparent) {
+                                                               @radd =  _add_thingy($oparent, $ent[0]);
+                                                               $parent = $radd[0];
+                                                       } else {
+                                                               dbg("PCPROT: no previous C or A for this external node received, ignored") if isdbg('chanerr');
+                                                               return;
+                                                       }
                                                }
                                                $parent = check_pc9x_t($call, $t, 92) || return;
                                                $parent->via_pc92(1);
@@ -1629,10 +1599,12 @@ sub handle_92
 
                        # we only reset obscounts on config records
                        $oparent->reset_obs;
-                       dbg("ROUTE: reset obscount on $pcall now " . $oparent->obscount) if isdbg('route');
+                       $oparent->PC92C_dxchan($self->{call}) unless $self->{call} eq $oparent->call;
+                       dbg("ROUTE: reset obscount on $pcall now " . $oparent->obscount) if isdbg('obscount');
                        if ($oparent != $parent) {
                                $parent->reset_obs;
-                               dbg("ROUTE: reset obscount on $parent->{call} now " . $parent->obscount) if isdbg('route');
+                               $parent->PC92C_dxchan($self->{call}) unless $self->{call} eq $parent->call;
+                               dbg("ROUTE: reset obscount on $parent->{call} now " . $parent->obscount) if isdbg('obscount');
                        }
 
                        #
@@ -1724,6 +1696,11 @@ sub handle_93
                }
        }
 
+       # this is catch loops caused by bad software ...
+       if (eph_dup("PC93|$from|$text|$onode")) {
+               return;
+       }
+
        # if this is a 'bad spotter' user then ignore it
        my $nossid = $from;
        $nossid =~ s/-\d+$//;
@@ -1745,14 +1722,16 @@ sub handle_93
                # convert to PC10 talks where appropriate
                my $ref = Route::get($to);
                if ($ref) {
-                       my @dxchan = $ref->alldxchan;
-                       for $dxchan (@dxchan) {
+                       # just go for the "best" one for now (rather than broadcast)
+                       $dxchan = $ref->dxchan;
+#                      my @dxchan = $ref->alldxchan;
+#                      for $dxchan (@dxchan) {
                                if ($dxchan->{do_pc9x}) {
                                        $dxchan->send($line);
                                } else {
                                        $dxchan->talk($from, $to, $via, $text, $onode);
                                }
-                       }
+#                      }
                        return;
                }
 
@@ -1787,9 +1766,7 @@ sub handle_default
        my $line = shift;
        my $origin = shift;
 
-       if (eph_dup($line)) {
-               dbg("PCPROT: Ephemeral dup, dropped") if isdbg('chanerr');
-       } else {
+       unless (eph_dup($line)) {
                if ($pcno >= 90) {
                        my $pcall = $_[1];
                        unless (is_callsign($pcall)) {