started port of routing stuff
[spider.git] / perl / DXProt.pm
index d8048ffbb6be6e98434d63f513a5512a49b491aa..b9d00a3786fdf910fc68885bd750f6d15b189b57 100644 (file)
@@ -707,6 +707,7 @@ sub handle_16
                return;
        }
 
+
        RouteDB::update($ncall, $origin);
 
        # do we believe this call? 
@@ -728,116 +729,59 @@ sub handle_16
 
        # if there is a parent, proceed, otherwise if there is a latent PC19 in the PC19list, 
        # fix it up in the routing tables and issue it forth before the PC16
-       unless ($parent) {
-               my $nl = $pc19list{$ncall};
-
-               if ($nl && @_ > 3) { # 3 because of the hop count!
-
-                       # this is a new (remembered) node, now attach it to me if it isn't in filtered
-                       # and we haven't disallowed it
-                       my $user = DXUser->get_current($ncall);
-                       if (!$user) {
-                               $user = DXUser->new($ncall);
-                               $user->sort('A');
-                               $user->priv(1); # I have relented and defaulted nodes
-                               $user->lockout(1);
-                               $user->homenode($ncall);
-                               $user->node($ncall);
-                       }
+       if ($parent) {
 
-                       my $wantpc19 = $user->wantroutepc19;
-                       if ($wantpc19 || !defined $wantpc19) {
-                               my $new = Route->new($ncall); # throw away
-                               if ($self->in_filter_route($new)) {
-                                       my @nrout;
-                                       for (@$nl) {
-                                               $parent = Route::Node::get($_->[0]);
-                                               $dxchan = $parent->dxchan if $parent;
-                                               if ($dxchan && $dxchan ne $self) {
-                                                       dbg("PCPROT: PC19 from $origin trying to alter locally connected $ncall, ignored!") if isdbg('chanerr');
-                                                       $parent = undef;
-                                               }
-                                               if ($parent) {
-                                                       my $r = $parent->add($ncall, $_->[1], $_->[2]);
-                                                       push @nrout, $r unless @nrout;
-                                               }
-                                       }
-                                       $user->wantroutepc19(1) unless defined $wantpc19; # for now we work on the basis that pc16 = real route 
-                                       $user->lastin($main::systime) unless DXChannel->get($ncall);
-                                       $user->put;
-                                               
-                                       # route the pc19 - this will cause 'stuttering PC19s' for a while
-                                       $self->route_pc19($origin, $line, @nrout) if @nrout ;
-                                       $parent = Route::Node::get($ncall);
-                                       unless ($parent) {
-                                               dbg("PCPROT: lost $ncall after sending PC19 for it?");
-                                               return;
-                                       }
-                               } else {
-                                       return;
-                               }
-                               delete $pc19list{$ncall};
-                       }
-               } else {
-                       dbg("PCPROT: Node $ncall not in config") if isdbg('chanerr');
-                       return;
-               }
-       } else {
-                               
                $dxchan = $parent->dxchan;
                if ($dxchan && $dxchan ne $self) {
                        dbg("PCPROT: PC16 from $origin trying to alter locally connected $ncall, ignored!") if isdbg('chanerr');
                        return;
                }
 
-               # input filter if required
-               return unless $self->in_filter_route($parent);
-       }
-
-       my $i;
-       my @rout;
-       for ($i = 2; $i < $#_; $i++) {
-               my ($call, $conf, $here) = $_[$i] =~ /^(\S+) (\S) (\d)/o;
-               next unless $call && $conf && defined $here && is_callsign($call);
-               next if $call eq $main::mycall;
-
-               eph_del_regex("^PC17\\^$call\\^$ncall");
+               
+               my $i;
+               my @rout;
+               for ($i = 2; $i < $#_; $i++) {
+                       my ($call, $conf, $here) = $_[$i] =~ /^(\S+) (\S) (\d)/o;
+                       next unless $call && $conf && defined $here && is_callsign($call);
+                       next if $call eq $main::mycall;
+                       
+                       eph_del_regex("^PC17\\^$call\\^$ncall");
                                
-               $conf = $conf eq '*';
-
-               # reject this if we think it is a node already
-               my $r = Route::Node::get($call);
-               my $u = DXUser->get_current($call) unless $r;
-               if ($r || ($u && $u->is_node)) {
-                       dbg("PCPROT: $call is a node") if isdbg('chanerr');
-                       next;
-               }
+                       $conf = 1;
                                
-               $r = Route::User::get($call);
-               my $flags = Route::here($here)|Route::conf($conf);
+                       my $r = Route::User::get($call);
+                       my $flags = Route::here($here)|Route::conf($conf);
                                
-               if ($r) {
-                       my $au = $r->addparent($parent);                                        
-                       if ($r->flags != $flags) {
-                               $r->flags($flags);
-                               $au = $r;
+                       if ($r) {
+                               my $au = $r->addparent($parent);                                        
+                               if ($r->flags != $flags) {
+                                       $r->flags($flags);
+                                       $au = $r;
+                               }
+                               push @rout, $r if $au;
+                       } else {
+                               push @rout, $parent->add_user($call, $flags);
                        }
-                       push @rout, $r if $au;
-               } else {
-                       push @rout, $parent->add_user($call, $flags);
-               }
                
                                
-               # add this station to the user database, if required
-               $call =~ s/-\d+$//o;    # remove ssid for users
-               my $user = DXUser->get_current($call);
-               $user = DXUser->new($call) if !$user;
-               $user->homenode($parent->call) if !$user->homenode;
-               $user->node($parent->call);
-               $user->lastin($main::systime) unless DXChannel->get($call);
-               $user->put;
+                       # add this station to the user database, if required
+                       $call =~ s/-\d+$//o;    # remove ssid for users
+                       my $user = DXUser->get_current($call);
+                       $user = DXUser->new($call) if !$user;
+                       $user->homenode($parent->call) if !$user->homenode;
+                       $user->node($parent->call);
+                       $user->lastin($main::systime) unless DXChannel->get($call);
+                       $user->put;
+               }
+
+               if (@rout) {
+                       my $thing = Thingy::Dx->new(origin=>$main::mycall);
+                       $thing->from_DXProt(DXProt=>$line,originref=>$parent);
+                       $thing->queue($self);
+               } else {
+                       dbg("PCPROT: No usable users") if isdbg('chanerr');
+               }
        }
-       $self->route_pc16($origin, $line, $parent, @rout) if @rout;
 }
                
 # remove a user