X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXCluster.pm;h=8338cccb5a511c3da8e0d1096a5679d6520424fe;hb=2b58ccdf81685a1167a43c38705a0d84b9d8d661;hp=021ff7f270875b3e0ea2cbab2e11609bc8c2e43e;hpb=5ed3964b50ca394ae47d335b70bc8282c037fe77;p=spider.git diff --git a/perl/DXCluster.pm b/perl/DXCluster.pm index 021ff7f2..8338cccb 100644 --- a/perl/DXCluster.pm +++ b/perl/DXCluster.pm @@ -14,10 +14,8 @@ package DXCluster; -use Exporter; -@ISA = qw(Exporter); use DXDebug; -use Carp; +use DXUtil; use strict; use vars qw(%cluster %valid); @@ -25,16 +23,22 @@ use vars qw(%cluster %valid); %cluster = (); # this is where we store the dxcluster database %valid = ( - mynode => '0,Parent Node,showcall', + mynode => '0,Parent Node', call => '0,Callsign', confmode => '0,Conference Mode,yesno', here => '0,Here?,yesno', - dxchan => '5,Channel ref', + dxchancall => '5,Channel Call', pcversion => '5,Node Version', - list => '5,User List,dolist', + list => '5,User List,DXCluster::dolist', users => '0,No of Users', ); +use vars qw($VERSION $BRANCH); +$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ ); +$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ ) || 0; +$main::build += $VERSION; +$main::branch += $BRANCH; + sub alloc { my ($pkg, $dxchan, $call, $confmode, $here) = @_; @@ -43,7 +47,7 @@ sub alloc $self->{call} = $call; $self->{confmode} = $confmode; $self->{here} = $here; - $self->{dxchan} = $dxchan; + $self->{dxchancall} = $dxchan->call; $cluster{$call} = bless $self, $pkg; return $self; @@ -102,6 +106,14 @@ sub field_prompt my ($self, $ele) = @_; return $valid{$ele}; } +# +# return a list of valid elements +# + +sub fields +{ + return keys(%valid); +} # this expects a reference to a list in a node NOT a ref to a node sub dolist @@ -110,7 +122,8 @@ sub dolist my $out; my $ref; - foreach $ref (@{$self}) { + foreach my $call (keys %{$self}) { + $ref = $$self{$call}; my $s = $ref->{call}; $s = "($s)" if !$ref->{here}; $out .= "$s "; @@ -136,10 +149,40 @@ sub cluster return " $DXNode::nodes nodes, $users local / $tot total users Max users $DXNode::maxusers Uptime $uptime"; } -sub DESTROY +sub mynode +{ + my $self = shift; + my $noderef = shift; + + if ($noderef) { + $self->{mynode} = $noderef->call; + } else { + $noderef = DXCluster->get_exact($self->{mynode}); + unless ($noderef) { + my $mynode = $self->{mynode}; + my $call = $self->{call}; + dbg("parent node $mynode has disappeared from $call") if isdbg('err'); + } + } + return $noderef; +} + +sub dxchan { my $self = shift; - dbg('cluster', "destroying $self->{call}\n"); + my $dxchan = shift; + + if ($dxchan) { + $self->{dxchancall} = $dxchan->call; + } else { + $dxchan = DXChannel->get($self->{dxchancall}); + unless ($dxchan) { + my $dxcall = $self->{dxchancall}; + my $call = $self->{call}; + dbg("parent dxchan $dxcall has disappeared from $call") if isdbg('err'); + } + } + return $dxchan; } no strict; @@ -152,6 +195,9 @@ sub AUTOLOAD $name =~ s/.*:://o; confess "Non-existant field '$AUTOLOAD'" if !$valid{$name}; + # this clever line of code creates a subroutine which takes over from autoload + # from OO Perl - Conway + *{$AUTOLOAD} = sub {@_ > 1 ? $_[0]->{$name} = $_[1] : $_[0]->{$name}} ; @_ ? $self->{$name} = shift : $self->{$name} ; } @@ -174,9 +220,9 @@ sub new die "tried to add $call when it already exists" if DXCluster->get_exact($call); my $self = $pkg->alloc($dxchan, $call, $confmode, $here); - $self->{mynode} = $node; + $self->{mynode} = $node->call; $node->add_user($call, $self); - dbg('cluster', "allocating user $call to $node->{call} in cluster\n"); + dbg("allocating user $call to $node->{call} in cluster\n") if isdbg('cluster'); return $self; } @@ -184,10 +230,10 @@ sub del { my $self = shift; my $call = $self->{call}; - my $node = $self->{mynode}; + my $node = $self->mynode; $node->del_user($call); - dbg('cluster', "deleting user $call from $node->{call} in cluster\n"); + dbg("deleting user $call from $node->{call} in cluster\n") if isdbg('cluster'); } sub count @@ -221,10 +267,10 @@ sub new my $self = $pkg->alloc($dxchan, $call, $confmode, $here); $self->{pcversion} = $pcversion; $self->{list} = { } ; - $self->{mynode} = $self; # for sh/station + $self->{mynode} = $self->call; # for sh/station $self->{users} = 0; $nodes++; - dbg('cluster', "allocating node $call to cluster\n"); + dbg("allocating node $call to cluster\n") if isdbg('cluster'); return $self; } @@ -250,7 +296,7 @@ sub del $ref->del(); # this also takes them out of this list } delete $DXCluster::cluster{$call}; # remove me from the cluster table - dbg('cluster', "deleting node $call from cluster\n"); + dbg("deleting node $call from cluster\n") if isdbg('cluster'); $users -= $self->{users}; # it may be PC50 updated only therefore > 0 $users = 0 if $users < 0; $nodes--; @@ -303,5 +349,13 @@ sub dolist { } + +sub DESTROY +{ + my $self = shift; + undef $self->{list} if $self->{list}; +} + + 1; __END__