X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FRoute%2FNode.pm;h=f3072db121cb747b440c838244cc51025606cf3c;hb=8c23f70c2487e906a80ef323763cb7cb123baf28;hp=6f8de6dee1ca0431d37ef25c757877fc67e3a797;hpb=9a31104f31ce5d80a659dea3de9dbf9a5d46ef8e;p=spider.git diff --git a/perl/Route/Node.pm b/perl/Route/Node.pm index 6f8de6de..f3072db1 100644 --- a/perl/Route/Node.pm +++ b/perl/Route/Node.pm @@ -15,8 +15,8 @@ use Route::User; use strict; use vars qw($VERSION $BRANCH); -$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ ); -$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ || (0,0)); +$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /:\s+(\d+)\.(\d+)/ ); +$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /:\s+\d+\.\d+\.(\d+)\.(\d+)/ || (0,0)); $main::build += $VERSION; $main::branch += $BRANCH; @@ -25,11 +25,12 @@ use vars qw(%list %valid @ISA $max $filterdef); %valid = ( dxchan => '0,DXChannel List,parray', - nodes => '0,Nodes,parray', - users => '0,Users,parray', + nodes => '0,Node List,parray', + users => '0,User List,parray', usercount => '0,User Count', version => '0,Version', newroute => '0,New Routing?,yesno', + pingtime => '0,Ping Time', ); $filterdef = $Route::filterdef; @@ -80,6 +81,39 @@ sub unlink_node return $neighbour->is_empty('dxchan') ? ($neighbour) : (); } +sub add_route +{ + my ($self, $neighbour, $dxchan) = @_; + + # add the dxchan link + # add the node link + my @rout; + push @rout, $self->link_node($neighbour, $dxchan); + dbg("Adding $neighbour->{call}") if isdbg('routelow'); + + # then run down the tree removing this dxchan link from + # all the referenced nodes that use this interface + my %visited; + my @in = map { Route::Node::get($_) } $neighbour->nodes; + foreach my $r (@in) { + next unless $r; + next if $visited{$r->call}; + next if $r->{call} eq $main::mycall; + next if $r->{call} eq $self->{call}; + my ($o) = $r->add_dxchan($dxchan); + if ($o) { + dbg("Connecting new node $o->{call}") if isdbg('routelow'); + push @rout, $o; + } + push @in, map{ Route::Node::get($_) } $r->nodes; + $visited{$r->call} = $r; + } + + # @rout should contain any nodes that have now been de-orphaned + # ie have had their first dxchan added. + return @rout; +} + sub remove_route { my ($self, $neighbour, $dxchan) = @_; @@ -97,9 +131,11 @@ sub remove_route foreach my $r (@in) { next unless $r; next if $visited{$r->call}; - my ($o) = $r->del_dxchan($self); + next if $r->{call} eq $main::mycall; + next if $r->{call} eq $self->{call}; + my ($o) = $r->del_dxchan($dxchan); if ($o) { - dbg("Orphanning $_->{call}") if isdbg('routelow'); + dbg("Orphanning $o->{call}") if isdbg('routelow'); push @rout, $o; } push @in, map{ Route::Node::get($_) } $r->nodes; @@ -155,7 +191,8 @@ sub add_dxchan sub del_dxchan { my ($self, $dxchan) = @_; - return $self->_dellist('dxchan', $dxchan); + $self->_dellist('dxchan', $dxchan); + return $self->is_empty('dxchan') ? ($self) : (); } sub usercount @@ -183,7 +220,7 @@ sub unlink_all_users { my $self = shift; my @rout; - foreach my $u (${$self->{users}}) { + foreach my $u (@{$self->{users}}) { my $uref = Route::User::get($u); push @rout, $self->del_user($uref) if $uref; } @@ -198,14 +235,13 @@ sub new confess "already have $call in $pkg" if $list{$call}; my $self = $pkg->SUPER::new($call); - $self->{dxchan} = ref $pkg ? [ $pkg->{call} ] : [ ]; + $self->{dxchan} = [ ]; $self->{version} = shift || 5000; $self->{flags} = shift || Route::here(1); $self->{users} = []; $self->{nodes} = []; $list{$call} = $self; - dbg("creating Route::Node $self->{call}") if isdbg('routelow'); return $self; } @@ -213,7 +249,10 @@ sub new sub delete { my $self = shift; - dbg("deleting Route::Node $self->{call}") if isdbg('routelow'); + dbg("Deleting Route::Node $self->{call}") if isdbg('routelow'); + for ($self->unlink_all_users) { + $_->delete; + } delete $list{$self->{call}}; }