+
+ if ($pcno == 16) { # add a user
+ my $node = DXCluster->get($field[1]);
+ last SWITCH if !$node; # ignore if havn't seen a PC19 for this one yet
+ my $i;
+
+ for ($i = 2; $i < $#field-1; $i++) {
+ my ($call, $confmode, $here) = $field[$i] =~ /^(\w+) (-) (\d)/o;
+ next if length $call < 3;
+ next if !$confmode;
+ $call =~ s/^(\w+)-\d+/$1/; # remove ssid
+ next if DXCluster->get($call); # we already have this (loop?)
+
+ $confmode = $confmode eq '*';
+ DXNodeuser->new($self, $node, $call, $confmode, $here);
+ }
+ last SWITCH;
+ }
+
+ if ($pcno == 17) { # remove a user
+ my $ref = DXCluster->get($field[1]);
+ $ref->del() if $ref;
+ last SWITCH;
+ }
+
+ if ($pcno == 18) { # link request
+
+ # send our nodes
+ my $hops = get_hops(19);
+ $self->send($me->pc19(get_all_ak1a()));
+
+ # get all the local users and send them out
+ $self->send($me->pc16(get_all_users()));
+ $self->send(pc20());
+ last SWITCH;
+ }
+
+ if ($pcno == 19) { # incoming cluster list
+ my $i;
+ for ($i = 1; $i < $#field-1; $i += 4) {
+ my $here = $field[$i];
+ my $call = $field[$i+1];
+ my $confmode = $field[$i+2] eq '*';
+ my $ver = $field[$i+3];
+
+ # now check the call over
+ next if DXCluster->get($call); # we already have this
+
+ # check for sane parameters
+ next if $ver < 5000; # only works with version 5 software
+ next if length $call < 3; # min 3 letter callsigns
+ DXNode->new($self, $call, $confmode, $here, $ver);
+ }
+ last SWITCH;
+ }
+