try to fix protocol version
[spider.git] / perl / DXProt.pm
index 612e59b6c93e62fbefa1a52a6dc4823ed5e001a1..cc468cd54409a0e6cfb3b103aab3187d235baf2b 100644 (file)
@@ -214,7 +214,6 @@ sub init
        my $user = DXUser->get($main::mycall);
        die "User $main::mycall not setup or disappeared RTFM" unless $user;
        
-       $myprot_version += $main::version*100;
        $main::me = DXProt->new($main::mycall, 0, $user); 
        $main::me->{here} = 1;
        $main::me->{state} = "indifferent";
@@ -223,8 +222,9 @@ sub init
        $main::me->{metric} = 0;
        $main::me->{pingave} = 0;
        $main::me->{registered} = 1;
-       $main::me->{version} = 5252 + $main::version;
+       $main::me->{version} = $myprot_version + int ($main::version * 100);
        $main::me->{build} = $main::build;
+       $main::me->{lastcf} = $main::me->{lasthello} = time;
 }
 
 #
@@ -238,12 +238,7 @@ sub new
        # add this node to the table, the values get filled in later
        my $pkg = shift;
        my $call = shift;
-       $main::routeroot->add($call, '5000', Route::here(1)) if $call ne $main::mycall;
-       if ($self->{call} ne $main::mycall) {
-               my $thing = Thingy::Hello->new(user=>$call);
-               $thing->broadcast($self);
-       }
-       
+       $main::routeroot->add($call, '5000', 1) if $call ne $main::mycall;
        return $self;
 }
 
@@ -313,8 +308,10 @@ sub start
        $self->state('init');
        $self->{pc50_t} = $main::systime;
 
-       my $thing = Thingy::Hello->new(origin=>$main::mycall, user=>$call);
+       # ALWAYS output the hello
+       my $thing = Thingy::Hello->new(user => $call, h => $self->{here});
        $thing->broadcast($self);
+       $self->lasthello($main::systime);
        
        # send info to all logged in thingies
        $self->tell_login('loginn');
@@ -813,7 +810,7 @@ sub handle_16
                }
                
                $r = Route::User::get($call);
-               my $flags = Route::here($here)|Route::conf($conf);
+               my $flags = $here;
                
                if ($r) {
                        my $au = $r->addparent($parent);                                        
@@ -923,8 +920,8 @@ sub handle_18
 
        # record the type and version offered
        if ($_[1] =~ /DXSpider Version: (\d+\.\d+) Build: (\d+\.\d+)/) {
-               $self->version(52.51 + $1);
-               $self->user->version(52.51 + $1);
+               $self->version(0 + $1);
+               $self->user->version(0 + $1);
                $self->build(0 + $2);
                $self->user->build(0 + $2);
                unless ($self->is_spider) {
@@ -972,7 +969,7 @@ sub handle_19
        if ($origin ne $self->call) {
                my $op = Route::Node::get($origin);
                unless ($op) {
-                       $op = $parent->add($origin, 5000, Route::here(1));
+                       $op = $parent->add($origin, 5000, 1);
                        my $user = DXUser->get_current($origin);
                        if (!$user) {
                                $user = DXUser->new($origin);
@@ -1046,7 +1043,7 @@ sub handle_19
                }
 
                my $r = Route::Node::get($call);
-               my $flags = Route::here($here)|Route::conf($conf);
+               my $flags = $here;
 
                # is he under the control of the new protocol?
                if ($r && $r->np) {
@@ -1064,11 +1061,6 @@ sub handle_19
                                        next;
                                }
                        }
-                       if ($r->version ne $ver || $r->flags != $flags) {
-                               $r->version($ver);
-                               $r->flags($flags);
-                               push @rout, $r unless $ar;
-                       }
                } else {
 
                        # if he is directly connected or allowed then add him, otherwise store him up for later
@@ -1113,7 +1105,8 @@ sub handle_20
        $self->{lastping} = 0;
        my $thing = Thingy::Rt->new(user=>$self->{call});
        my $nref = Route::Node::get($self->{call});
-       $thing->broadcast if $thing->copy_pc16_data($nref);
+       $thing->copy_pc16_data($nref);
+       $thing->broadcast($self);
        $self->lastcf($main::systime);
 }
                
@@ -1203,7 +1196,8 @@ sub handle_22
        $self->{lastping} = 0;
        my $thing = Thingy::Rt->new(user=>$self->{call});
        my $nref = Route::Node::get($self->{call});
-       $thing->broadcast if $thing->copy_pc16_data($nref);
+       $thing->copy_pc16_data($nref);
+       $thing->broadcast($self);
        $self->lastcf($main::systime);
 }
                                
@@ -1544,70 +1538,15 @@ sub handle_51
        my $pcno = shift;
        my $line = shift;
        my $origin = shift;
-       my $to = $_[1];
-       my $from = $_[2];
-       my $flag = $_[3];
 
-                       
-       # is it for us?
-       if ($to eq $main::mycall) {
-               if ($flag == 1) {
-                       $self->send(pc51($from, $to, '0'));
-               } else {
-                       # it's a reply, look in the ping list for this one
-                       my $ref = $pings{$from};
-                       if ($ref) {
-                               my $tochan =  DXChannel::get($from);
-                               while (@$ref) {
-                                       my $r = shift @$ref;
-                                       my $dxchan = DXChannel::get($r->{call});
-                                       next unless $dxchan;
-                                       my $t = tv_interval($r->{t}, [ gettimeofday ]);
-                                       if ($dxchan->is_user) {
-                                               my $s = sprintf "%.2f", $t; 
-                                               my $ave = sprintf "%.2f", $tochan ? ($tochan->{pingave} || $t) : $t;
-                                               $dxchan->send($dxchan->msg('pingi', $from, $s, $ave))
-                                       } elsif ($dxchan->is_node) {
-                                               if ($tochan) {
-                                                       my $nopings = $tochan->user->nopings || $obscount;
-                                                       push @{$tochan->{pingtime}}, $t;
-                                                       shift @{$tochan->{pingtime}} if @{$tochan->{pingtime}} > 6;
-                                                       
-                                                       # cope with a missed ping, this means you must set the pingint large enough
-                                                       if ($t > $tochan->{pingint}  && $t < 2 * $tochan->{pingint} ) {
-                                                               $t -= $tochan->{pingint};
-                                                       }
-                                                       
-                                                       # calc smoothed RTT a la TCP
-                                                       if (@{$tochan->{pingtime}} == 1) {
-                                                               $tochan->{pingave} = $t;
-                                                       } else {
-                                                               $tochan->{pingave} = $tochan->{pingave} + (($t - $tochan->{pingave}) / 6);
-                                                       }
-                                                       $tochan->{nopings} = $nopings; # pump up the timer
-                                                       if (my $ivp = Investigate::get($from, $origin)) {
-                                                               $ivp->handle_ping;
-                                                       }
-                                               } elsif (my $rref = Route::Node::get($r->{call})) {
-                                                       if (my $ivp = Investigate::get($from, $origin)) {
-                                                               $ivp->handle_ping;
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               }
-       } else {
-
-               RouteDB::update($from, $origin);
-
-               if (eph_dup($line)) {
-                       dbg("PCPROT: dup PC51 detected") if isdbg('chanerr');
-                       return;
-               }
-               # route down an appropriate thingy
-               $self->route($to, $line);
+       if (eph_dup($line, 60)) {
+               dbg("PCPROT: dup PC51 detected") if isdbg('chanerr');
+               return;
        }
+
+       my $thing = Thingy::Ping->new(origin=>$main::mycall);
+       $thing->from_DXProt($self, $line, @_);
+       $thing->handle($self);
 }
 
 # dunno but route it
@@ -2163,22 +2102,9 @@ sub load_hops
 sub addping
 {
        my ($from, $to, $via) = @_;
-       my $ref = $pings{$to} || [];
-       my $r = {};
-       $r->{call} = $from;
-       $r->{t} = [ gettimeofday ];
-       if ($via && (my $dxchan = DXChannel::get($via))) {
-               $dxchan->send(pc51($to, $main::mycall, 1));
-       } else {
-               route(undef, $to, pc51($to, $main::mycall, 1));
-       }
-       push @$ref, $r;
-       $pings{$to} = $ref;
-       my $u = DXUser->get_current($to);
-       if ($u) {
-               $u->lastping(($via || $from), $main::systime);
-               $u->put;
-       }
+       my $thing = Thingy::Ping->new_ping($from eq $main::mycall ? () : (user=>$from), $via ? (touser=> $to, group => $via) : (group => $to));
+       $thing->remember;
+       $thing->broadcast;
 }
 
 sub process_rcmd
@@ -2332,7 +2258,7 @@ sub disconnect
        }
 
        # remove outstanding pings
-       delete $pings{$call};
+       Thingy::Ping::forget($call);
        
        # I was the last node visited
     $self->user->node($main::mycall);