spider/perl/Route.pm

1 line
7.3 KiB
Perl
Raw Normal View History

#!/usr/bin/perl## This module impliments the abstracted routing for all protocols and# is probably what I SHOULD have done the first time.## Heyho.## This is just a container class which I expect to subclass## Copyright (c) 2001 Dirk Koopman G1TLH## $Id$#package Route;use DXDebug;use DXChannel;use Prefix;use DXUtil;use strict;use vars qw(%list %valid $filterdef);%valid = ( call => "0,Callsign", flags => "0,Flags,phex", dxcc => '0,Country Code', itu => '0,ITU Zone', cq => '0,CQ Zone', state => '0,State', city => '0,City', );$filterdef = bless ([ # tag, sort, field, priv, special parser ['channel', 'c', 0], ['channel_dxcc', 'nc', 1], ['channel_itu', 'ni', 2], ['channel_zone', 'nz', 3], ['call', 'c', 4], ['by', 'c', 4], ['call_dxcc', 'nc', 5], ['by_dxcc', 'nc', 5], ['call_itu', 'ni', 6], ['by_itu', 'ni', 6], ['call_zone', 'nz', 7], ['by_zone', 'nz', 7], ['channel_state', 'ns', 8], ['call_state', 'ns', 9], ['by_state', 'ns', 9], ], 'Filter::Cmd');sub new{ my ($pkg, $call) = @_; $pkg = ref $pkg if ref $pkg; my $self = bless {call => $call}, $pkg; dbg("create $pkg with $call") if isdbg('routelow'); # add in all the dxcc, itu, zone info ($self->{dxcc}, $self->{itu}, $self->{cq}, $self->{state}, $self->{city}) = Prefix::cty_data($call); $self->{flags} = here(1); return $self;}## get a callsign from a passed reference or a string#sub _getcall{ my $self = shift; my $thingy = shift; $thingy = $self unless $thingy; $thingy = $thingy->call if ref $thingy; $thingy = uc $thingy if $thingy; return $thingy;}## add and delete a callsign to/from a list#sub _addlist{ my $self = shift; my $field = shift; my @out; foreach my $c (@_) { confess "Need a ref here" unless ref($c); my $call = $c->{call}; unless (grep $_ eq $call, @{$self->{$field}}) { push @{$self->{$field}}, $call; dbg(ref($self) . " adding $call to " . $self->{call} . "->\{$field\}") if isdbg('routelow'); push @out, $c; } } return @out;}sub _dellist{ my $self = shift; my $field = shift; my @out; foreach my $c (@_) { confess "Need a ref here" unless ref($c); my $call = $c->{call}; if (grep $_ eq $call, @{$self->{$field}}) { $self->{$field} = [ grep {$_ ne $call} @{$self->{$field}} ]; dbg(ref($self) . " deleting $call from " . $self->{call} . "->\{$field\}") if isdbg('routelow'); push @out, $c; } } return @out;}sub is_empty{ my $self = shift; return @{$self->{$_[0]}} == 0;}## flag field constructors/enquirers## These can be called in various ways:-## Route::here or $ref->here returns 1 or 0 depending on value of the here flag# Route::here(1) returns 2 (the bit value of the here flag)# $ref->here(1) or $ref->here(0) sets the here flag#sub here{ my $self = shift; my $r = shift; return $self ? 2 : 0 unless ref $self; return ($self->{flags} & 2) ? 1 : 0 unless defined $r; $self->{flags} = (($self->{flags} & ~2) | ($r ? 2 : 0)); return $r ? 1 : 0;}sub conf{ my $self = shift; my $r = shift; return $self ? 1 : 0 unless ref $self; return ($self->{flags} & 1) ? 1 : 0 unless defined $r; $self->{flags} = (($self->{flags} & ~1) | ($r ? 1 : 0)); return $r ? 1 : 0;}sub parents{ my $self = shift; return @{$self->{parent}};}## display routines#sub user_call{ my $self = shift; my $call = sprintf "%s", $self->{call}; return $self->here ? "$call" : "($call)";}sub config{ my $self = shift; my $nodes_only = shift; my $level = shift; my $seen = shift; my @out; my $line; my $call = $self->user_call; my $printit = 1; # allow ranges if (@_) { $printit = grep $call =~ m|$_|, @_; } if ($printit) { my $pcall = $call; $pcall .= ":" . $self->obscount if $self->via_pc92; $line = ' ' x ($level*2) . "$pcall"; $call = ' ' x length $pcall; # recursion detector if ((DXChannel::get($self->{call}) && $level > 1) || grep $self->{call} eq $_, @$seen) { $line .= ' ...'; push @out, $line; return @out; } push @$seen, $self->{call}; # print users unless ($nodes_only) { if (@{$self->{users}}) { $line .= '->'; foreach my $ucall (sort @{$self->{users}}) { my $uref = Route::User::get($ucall