#
# Copyright (c) 1998-2006 Dirk Koopman G1TLH
#
-# $Id$
+#
#
package DXProt;
push @rout, @ans if $h && @ans;
}
- # send info to all logged in thingies
- $self->tell_login('loginu', "$ncall: $call") if DXUser->get_current($ncall)->is_local_node;
- $self->tell_buddies('loginb', $call, $ncall);
-
# 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;
+ my $user = DXUser->get_current($ncall);
+ $user = DXUser->new($call) unless $user;
$user->homenode($parent->call) if !$user->homenode;
$user->node($parent->call);
$user->lastin($main::systime) unless DXChannel::get($call);
$user->put;
+
+ # send info to all logged in thingies
+ $self->tell_login('loginu', "$ncall: $call") if $user->is_local_node;
+ $self->tell_buddies('loginb', $call, $ncall);
}
if (@rout) {
$self->route_pc16($origin, $line, $parent, @rout) if @rout;
$parent->del_user($uref);
# send info to all logged in thingies
- $self->tell_login('logoutu', "$ncall: $ucall") if DXUser->get_current($ncall)->is_local_node;
+ my $user = DXUser->get_current($ncall);
+ $self->tell_login('logoutu', "$ncall: $ucall") if $user && $user->is_local_node;
$self->tell_buddies('logoutb', $ucall, $ncall);
if (eph_dup($line)) {
# $self->{handle_xml}++ if DXXml::available() && $_[1] =~ /\bxml/;
if ($_[1] =~ /\bpc9x/) {
if ($self->{isolate}) {
- dbg("pc9x recognised, but is isolated, using old protocol");
+ dbg("pc9x recognised, but $self->{call} is isolated, using old protocol");
+ } elsif (!$self->user->wantpc9x) {
+ dbg("pc9x explicitly switched off on $self->{call}, using old protocol");
} else {
$self->{do_pc9x} = 1;
dbg("Do px9x set on $self->{call}");
}
if ($pcall eq $self->{call} && $self->{state} eq 'init') {
- $self->state('init92');
- $self->{do_pc9x} = 1;
- dbg("Do pc9x set on $pcall");
+ if ($self->{isolate}) {
+ dbg("PC9x received, but $pcall is isolated, ignored");
+ return;
+ } elsif (!$self->user->wantpc9x) {
+ dbg("PC9x explicitly switched off on $pcall, ignored");
+ return;
+ } else {
+ $self->state('init92');
+ $self->{do_pc9x} = 1;
+ dbg("Do pc9x set on $pcall");
+ }
}
unless ($self->{do_pc9x}) {
dbg("PCPROT: PC9x come in from non-PC9x node, ignored") if isdbg('chanerr');
# 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);
# 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');
}
#
dbg("PCPROT: invalid callsign string '$_[1]', ignored") if isdbg('chanerr');
return;
}
+
+ unless ($self->{do_pc9x}) {
+ dbg("PCPROT: PC9x come in from non-PC9x node, ignored") if isdbg('chanerr');
+ return;
+ }
+
my $t = $_[2];
my $parent = check_pc9x_t($pcall, $t, 93, 1) || return;
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)) {