-
- if ($node) {
- # input filter it
- return unless $self->in_filter_route($node);
-
- # routing objects
- push @rout, $node->del($parent);
- }
- } else {
- dbg("PCPROT: I WILL _NOT_ be disconnected!") if isdbg('chanerr');
- return;
- }
-
- if (eph_dup($line)) {
- dbg("PCPROT: dup PC21 detected") if isdbg('chanerr');
- return;
- }
-
- $self->route_pc21(@rout) if @rout;
- return;
- }
-
- if ($pcno == 22) {
- $self->state('normal');
- return;
- }
-
- if ($pcno == 23 || $pcno == 27) { # WWV info
-
- # route 'foreign' pc27s
- if ($pcno == 27) {
- if ($field[8] ne $main::mycall) {
- $self->route($field[8], $line);
- return;
- }
- }
-
- # do some de-duping
- my $d = cltounix($field[1], sprintf("%02d18Z", $field[2]));
- my $sfi = unpad($field[3]);
- my $k = unpad($field[4]);
- my $i = unpad($field[5]);
- my ($r) = $field[6] =~ /R=(\d+)/;
- $r = 0 unless $r;
- if (($pcno == 23 && $d < $main::systime - $pc23_max_age) || $d > $main::systime + 1500 || $field[2] < 0 || $field[2] > 23) {
- dbg("PCPROT: WWV Date ($field[1] $field[2]) out of range") if isdbg('chanerr');
- return;
- }
- if (Geomag::dup($d,$sfi,$k,$i,$field[6])) {
- dbg("PCPROT: Dup WWV Spot ignored\n") if isdbg('chanerr');
- return;
- }
- $field[7] =~ s/-\d+$//o; # remove spotter's ssid
-
- my $wwv = Geomag::update($d, $field[2], $sfi, $k, $i, @field[6..8], $r);
-
- my $rep;
- eval {
- $rep = Local::wwv($self, $field[1], $field[2], $sfi, $k, $i, @field[6..8], $r);
- };
-# dbg("Local::wwv2 error $@") if isdbg('local') if $@;
- return if $rep;
-
- # DON'T be silly and send on PC27s!
- return if $pcno == 27;
-
- # broadcast to the eager world
- send_wwv_spot($self, $line, $d, $field[2], $sfi, $k, $i, @field[6..8]);
- return;
- }
-
- if ($pcno == 24) { # set here status
- my $call = uc $field[1];
- my ($nref, $uref);
- $nref = Route::Node::get($call);
- $uref = Route::User::get($call);
- return unless $nref || $uref; # if we don't know where they are, it's pointless sending it on
-
- unless (eph_dup($line)) {
- $nref->here($field[2]) if $nref;
- $uref->here($field[2]) if $uref;
- my $ref = $nref || $uref;
- return unless $self->in_filter_route($ref);
- $self->route_pc24($ref, $field[3]);
- }
- return;
- }
-
- if ($pcno == 25) { # merge request
- if ($field[1] ne $main::mycall) {
- $self->route($field[1], $line);
- return;
- }
- if ($field[2] eq $main::mycall) {
- dbg("PCPROT: Trying to merge to myself, ignored") if isdbg('chanerr');
- return;
- }
-
- Log('DXProt', "Merge request for $field[3] spots and $field[4] WWV from $field[1]");
-
- # spots
- if ($field[3] > 0) {
- my @in = reverse Spot::search(1, undef, undef, 0, $field[3]);
- my $in;
- foreach $in (@in) {
- $self->send(pc26(@{$in}[0..4], $field[2]));
- }
- }
-
- # wwv
- if ($field[4] > 0) {
- my @in = reverse Geomag::search(0, $field[4], time, 1);
- my $in;
- foreach $in (@in) {
- $self->send(pc27(@{$in}[0..5], $field[2]));
- }
- }
- return;
- }
-
- if (($pcno >= 28 && $pcno <= 33) || $pcno == 40 || $pcno == 42 || $pcno == 49) { # mail/file handling
- if ($pcno == 49 || $field[1] eq $main::mycall) {
- DXMsg::process($self, $line);
- } else {
- $self->route($field[1], $line) unless $self->is_clx;