changed BKN for SCT
[spider.git] / perl / QXProt.pm
index fd945ce1a2320a13c7b826d47e849a1f44aaee4f..3aabb5ed07e8c9d206d24024483cbc71dfc70a08 100644 (file)
@@ -72,28 +72,45 @@ sub sendinit
 
 sub normal
 {
-       if ($_[1] =~ /^PC\d\d\^/) {
-               DXProt::normal(@_);
-               return;
+       my $r;
+       
+       if  (ref $_[1] && $_->isa('Thingy')) {
+               $_[1]->handle($_[0]);
+       } else {
+               if ($_[1] =~ /^PC\d\d\^/) {
+                       DXProt::normal(@_);
+               } elsif ($_[1] =~ /^QX\w\^/){
+
+                       my ($sort, $tonode, $fromnode, $msgid, $incs);
+                       return unless ($sort, $tonode, $fromnode, $msgid, $incs) = $_[1] =~ /^QX([A-Z])\^(\*|[-A-Z0-9]+)\^([-A-Z0-9]+)\^([0-9A-F]{1,4})\^.*\^([0-9A-F]{2})$/;
+                       
+                       $msgid = hex $msgid;
+                       my $noderef = Route::Node::get($fromnode);
+                       $noderef = Route::Node::new($fromnode) unless $noderef;
+                       
+                       my $il = length $incs; 
+                       my $cs = sprintf("%02X", unpack("%32C*", substr($_[1], 0, length($_[1]) - ($il+1))) & 255);
+                       if ($incs ne $cs) {
+                               dbg("QXPROT: Checksum fail in: $incs ne calc: $cs" ) if isdbg('chanerr');
+                               return;
+                       }
+                       
+                       unless ($noderef->newid($msgid)) {
+                               dbg("QXPROT: Dupe, dropped") if isdbg('chanerr');
+                               return;
+                       }
+                       
+                       no strict 'subs';
+                       my $sub = "Thingy::QX$sort";
+                       my $thing = $sub->new(sort => $sort, tonode => $tonode, fromnode => $fromnode, id=> $msgid, line => $line);
+                       $r = $thing->handle($_[0]); 
+               } else {
+                       dbg("QXProt: unrecognised protocol, dropped") if isdbg('chanerr') 
+               }
        }
-       my ($sort, $tonode, $fromnode, $msgid, $incs);
-       return unless ($sort, $tonode, $fromnode, $msgid, $incs) = $_[1] =~ /^QX([A-Z])\^(\*|[-A-Z0-9]+)\^([-A-Z0-9]+)\^([0-9A-F]{1,4})\^.*\^([0-9A-F]{2})$/;
-
-       $msgid = hex $msgid;
-       my $noderef = Route::Node::get($fromnode);
-       $noderef = Route::Node::new($fromnode) unless $noderef;
-
-       my $il = length $incs; 
-       my $cs = sprintf("%02X", unpack("%32C*", substr($_[1], 0, length($_[1]) - ($il+1))) & 255);
-       if ($incs ne $cs) {
-               dbg("QXPROT: Checksum fail in: $incs ne calc: $cs" ) if isdbg('chanerr');
-               return;
+       unless (ref $r) {
+               dbg($r) if isdbg("chanerr");
        }
-
-       return unless $noderef->newid($msgid);
-
-       $_[0]->handle($sort, $tonode, $fromnode, $msgid, $_[1]);
-       return;
 }
 
 sub handle
@@ -134,15 +151,6 @@ sub disconnect
        $self->DXProt::disconnect(@_);
 }
 
-sub sendallnodes
-{
-}
-
-sub sendallusers
-{
-
-}
-
 my $msgid = 1;
 
 sub frame
@@ -158,15 +166,29 @@ sub frame
        return "$line^$cs";
 }
 
+sub send_frame
+{
+       my $self = shift;
+       my $origin = shift || $main::me;
+       for (@_) {
+               $self->send(frame('X', undef, $origin == $main::me || $origin->is_user ? '' : $origin->call, $_));
+       }
+}
+
 sub handleI
 {
        my $self = shift;
        
-       my @f = split /\^/, $_[2];
-       my $inv = Verify->new($f[7]);
-       unless ($inv->verify($f[8], $main::me->user->passphrase, $main::mycall, $self->call)) {
-               $self->sendnow('D','Sorry...');
-               $self->disconnect;
+       my @f = split /\^/, $_[3];
+       if ($self->user->passphrase && $f[7] && $f[8]) {
+               my $inv = Verify->new($f[7]);
+               unless ($inv->verify($f[8], $main::me->user->passphrase, $main::mycall, $self->call)) {
+                       $self->sendnow('D','Sorry...');
+                       $self->disconnect;
+               }
+               $self->{verified} = 1;
+       } else {
+               $self->{verified} = 0;
        }
        if ($self->{outbound}) {
                $self->send($self->genI);
@@ -184,16 +206,20 @@ sub handleI
 sub genI
 {
        my $self = shift;
-       my $inp = Verify->new;
-       return frame('I', $self->call, 1, "DXSpider", ($main::version + 53) * 100, $main::build, $inp->challenge, $inp->response($self->user->passphrase, $self->call, $main::mycall));
+       my @out = ('I', $self->call, "DXSpider", ($main::version + 53) * 100, $main::build);
+       if (my $pass = $self->user->passphrase) {
+               my $inp = Verify->new;
+               push @out, $inp->challenge, $inp->response($pass, $self->call, $main::mycall);
+       }
+       return frame(@out);
 }
 
-sub handleB
+sub handleR
 {
 
 }
 
-sub genB
+sub genR
 {
 
 }
@@ -208,39 +234,17 @@ sub genP
 
 }
 
-sub gen2
+sub handleX
 {
        my $self = shift;
-       
-       my $node = shift;
-       my $sort = shift;
-       my @out;
-       my $dxchan;
-       
-       while (@_) {
-               my $str = '';
-               for (; @_ && length $str <= 230;) {
-                       my $ref = shift;
-                       my $call = $ref->call;
-                       my $flag = 0;
-                       
-                       $flag += 1 if $ref->here;
-                       $flag += 2 if $ref->conf;
-                       if ($ref->is_node) {
-                               my $ping = int($ref->pingave * 10);
-                               $str .= "^N$flag$call,$ping";
-                               my $v = $ref->build || $ref->version;
-                               $str .= ",$v" if defined $v;
-                       } else {
-                               $str .= "^U$flag$call";
-                       }
-               }
-               push @out, $str if $str;
+       my ($sort, $to, $from, $msgid, $origin, $line) = split /\^/, $_[3], 6;
+
+       my ($pcno) = $line =~ /^PC(\d\d)/;
+       if ($pcno) {
+               $line =~ s/\^[[0-9A-F]+]$//;
+               DXProt::normal($self, $line);
        }
-       my $n = @out;
-       my $h = get_hops(90);
-       @out = map { sprintf "PC90^%s^%X^%s%d%s^%s^", $node->call, $main::systime, $sort, --$n, $_, $h } @out;
-       return @out;
 }
 
+
 1;