change build number calculation to be more accurate
[spider.git] / perl / DXCluster.pm
index 021ff7f270875b3e0ea2cbab2e11609bc8c2e43e..8338cccb5a511c3da8e0d1096a5679d6520424fe 100644 (file)
 
 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__