X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXChannel.pm;h=e4b513f6a4d0efb0b84b4e74755865dd2d1f1710;hb=c6a62ff483f8887b4157e111a405fef971ade8d9;hp=a000e17ac4657159c5a212514cf9c31a1320a53f;hpb=3e1e7b56903a67dde9ea8ecebbc507fcf9bbb402;p=spider.git diff --git a/perl/DXChannel.pm b/perl/DXChannel.pm index a000e17a..e4b513f6 100644 --- a/perl/DXChannel.pm +++ b/perl/DXChannel.pm @@ -19,7 +19,7 @@ # firstly and OO about ninthly (if you don't like the design and you can't # improve it with better OO and thus make it smaller and more efficient, then tough). # -# Copyright (c) 1998-2000 - Dirk Koopman G1TLH +# Copyright (c) 1998-2016 - Dirk Koopman G1TLH # # # @@ -171,7 +171,7 @@ sub alloc if (@dxcc > 0) { $self->{dxcc} = $dxcc[1]->dxcc; $self->{itu} = $dxcc[1]->itu; - $self->{cq} = $dxcc[1]->cq; + $self->{cq} = $dxcc[1]->cq; } $self->{inqueue} = []; @@ -213,6 +213,7 @@ sub rec if (defined $msg) { push @{$self->{inqueue}}, $msg; } + $self->process_one; } # obtain a channel object by callsign [$obj = DXChannel::get($call)] @@ -299,68 +300,68 @@ sub del sub is_bbs { my $self = shift; - return $self->{'sort'} eq 'B'; + return $self->{sort} eq 'B'; } sub is_node { my $self = shift; - return $self->{'sort'} =~ /[ACRSXW]/; + return $self->{sort} =~ /^[ACRSX]$/; } # is it an ak1a node ? sub is_ak1a { my $self = shift; - return $self->{'sort'} eq 'A'; + return $self->{sort} eq 'A'; } # is it a user? sub is_user { my $self = shift; - return $self->{'sort'} eq 'U'; + return $self->{sort} =~ /^[UW]$/; } # is it a clx node sub is_clx { my $self = shift; - return $self->{'sort'} eq 'C'; + return $self->{sort} eq 'C'; } -# it is Aranea -sub is_aranea +# it is a Web connected user +sub is_web { my $self = shift; - return $self->{'sort'} eq 'W'; + return $self->{sort} eq 'W'; } # is it a spider node sub is_spider { my $self = shift; - return $self->{'sort'} eq 'S'; + return $self->{sort} eq 'S'; } # is it a DXNet node sub is_dxnet { my $self = shift; - return $self->{'sort'} eq 'X'; + return $self->{sort} eq 'X'; } # is it a ar-cluster node sub is_arcluster { my $self = shift; - return $self->{'sort'} eq 'R'; + return $self->{sort} eq 'R'; } # for perl 5.004's benefit sub sort { my $self = shift; - return @_ ? $self->{'sort'} = shift : $self->{'sort'} ; + return @_ ? $self->{sort} = shift : $self->{sort} ; } # find out whether we are prepared to believe this callsign on this interface @@ -586,7 +587,7 @@ sub decode_input { my $dxchan = shift; my $data = shift; - my ($sort, $call, $line) = $data =~ /^([A-Z])([A-Z0-9\-]{3,9})\|(.*)$/; + my ($sort, $call, $line) = $data =~ /^([A-Z])(#?[A-Z0-9\/\-]{3,25})\|(.*)$/; my $chcall = (ref $dxchan) ? $dxchan->call : "UN.KNOWN"; @@ -696,40 +697,46 @@ sub broadcast_list } } -sub process +sub process_one { - foreach my $dxchan (get_all()) { - next if $dxchan->{disconnecting}; + my $self = shift; + + while (my $data = shift @{$self->{inqueue}}) { + my ($sort, $call, $line) = $self->decode_input($data); + next unless defined $sort; - while (my $data = shift @{$dxchan->{inqueue}}) { - my ($sort, $call, $line) = $dxchan->decode_input($data); - next unless defined $sort; - - # do the really sexy console interface bit! (Who is going to do the TK interface then?) - dbg("<- $sort $call $line") if $sort ne 'D' && isdbg('chan'); - - # handle A records - my $user = $dxchan->user; - if ($sort eq 'A' || $sort eq 'O') { - $dxchan->start($line, $sort); - } elsif ($sort eq 'I') { - die "\$user not defined for $call" if !defined $user; + # do the really sexy console interface bit! (Who is going to do the TK interface then?) + dbg("<- $sort $call $line") if $sort ne 'D' && isdbg('chan'); + + # handle A records + my $user = $self->user; + if ($sort eq 'I') { + die "\$user not defined for $call" unless defined $user; - # normal input - $dxchan->normal($line); - } elsif ($sort eq 'Z') { - $dxchan->disconnect; - } elsif ($sort eq 'D') { - ; # ignored (an echo) - } elsif ($sort eq 'G') { - $dxchan->enhanced($line); - } else { - print STDERR atime, " Unknown command letter ($sort) received from $call\n"; - } + # normal input + $self->normal($line); + } elsif ($sort eq 'G') { + $self->enhanced($line); + } elsif ($sort eq 'A' || $sort eq 'O') { + $self->start($line, $sort); + } elsif ($sort eq 'Z') { + $self->disconnect; + } elsif ($sort eq 'D') { + ; # ignored (an echo) + } else { + dbg atime . " DXChannel::process_one: Unknown command letter ($sort) received from $call\n"; } } } +sub process +{ + foreach my $dxchan (values %channels) { + next if $dxchan->{disconnecting}; + $dxchan->process_one; + } +} + sub handle_xml { my $self = shift;