add ursigram processor
[spider.git] / perl / DXProtout.pm
index 38ace99bf1cb2ac9e379943a31805f58c23582e1..840c4edec4f9b90213b7f970e3e1ff34e96cf663 100644 (file)
@@ -21,10 +21,15 @@ 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;
+$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/  || (0,0));
 $main::build += $VERSION;
 $main::branch += $BRANCH;
 
+use vars qw($sentencelth $use_newroute);
+
+$sentencelth = 180;
+$use_newroute = 1;
 #
 # All the PCxx generation routines
 #
@@ -62,14 +67,15 @@ sub pc11
 # create an announce message
 sub pc12
 {
-       my ($call, $text, $tonode, $sysop, $wx) = @_;
+       my ($call, $text, $tonode, $sysop, $wx, $origin) = @_;
        my $hops = get_hops(12);
-       $sysop = ' ' if !$sysop;
-       $text = ' ' if !$text;
-       $wx = '0' if !$wx;
-       $tonode = '*' if !$tonode;
+       $origin ||= $main::mycall;
+       $sysop ||= ' ';
+       $text ||= ' ';
+       $wx ||= '0';
+       $tonode ||= '*';
        $text =~ s/\^/%5E/g;
-       return "PC12^$call^$tonode^$text^$sysop^$main::mycall^$wx^$hops^~";
+       return "PC12^$call^$tonode^$text^$sysop^$origin^$wx^$hops^~";
 }
 
 #
@@ -85,15 +91,18 @@ sub pc16
        my $ncall = $node->call;
        my @out;
 
-       while (@_) {
-               my $str = "PC16^$ncall";
-               for ( ; @_ && length $str < 200; ) {
-                       my $ref = shift;
-                       $str .= sprintf "^%s %s %d", $ref->call, $ref->conf ? '*' : '-', $ref->here;
+       my $s = "";
+       for (@_) {
+               next unless $_;
+               my $ref = $_;
+               my $str = sprintf "^%s %s %d", $ref->call, $ref->conf ? '*' : '-', $ref->here;
+               if (length($s) + length($str) > $sentencelth) {
+                       push @out, "PC16^$ncall" . $s . sprintf "^%s^", get_hops(16);
+                       $s = "";
                }
-               $str .= sprintf "^%s^", get_hops(16);
-               push @out, $str;
+               $s .= $str;
        }
+       push @out, "PC16^$ncall" . $s . sprintf "^%s^", get_hops(16);
        return @out;
 }
 
@@ -115,7 +124,8 @@ sub pc17
 # Request init string
 sub pc18
 {
-       return "PC18^DXSpider Version: $main::version Build: $main::build^$DXProt::myprot_version^";
+       my $nr = $use_newroute ? ' !NRt' : '';
+       return "PC18^DXSpider Version: $main::version Build: $main::build$nr^$DXProt::myprot_version^";
 }
 
 #
@@ -124,20 +134,24 @@ sub pc18
 sub pc19
 {
        my @out;
-
-       while(@_) {
-               my $str = "PC19";
-               for (; @_ && length $str < 200;) {
-                       my $ref = shift;
-                       my $call = $ref->call;
-                       my $here = $ref->here;
-                       my $conf = $ref->conf;
-                       my $version = $ref->version;
-                       $str .= "^$here^$call^$conf^$version";
+       my @in;
+
+       my $s = "";
+       for (@_) {
+               next unless $_;
+               my $ref = $_;
+               my $call = $ref->call;
+               my $here = $ref->here;
+               my $conf = $ref->conf;
+               my $version = $ref->version;
+               my $str = "^$here^$call^$conf^$version";
+               if (length($s) + length($str) > $sentencelth) {
+                       push @out, "PC19" . $s . sprintf "^%s^", get_hops(19);
+                       $s = "";
                }
-               $str .= sprintf "^%s^", get_hops(19);
-               push @out, $str;
+               $s .= $str;
        }
+       push @out, "PC19" . $s . sprintf "^%s^", get_hops(19);
        return @out;
 }
 
@@ -210,7 +224,7 @@ sub pc28
 sub pc29 
 {
        my ($fromnode, $tonode, $stream, $text) = @_;
-       $text = ' ' unless $text && length $text > 0;
+       $text = ' ' unless defined $text && length $text > 0;
        $text =~ s/\^/%5E/og;                   # remove ^
        return "PC29^$fromnode^$tonode^$stream^$text^~";
 }
@@ -346,6 +360,78 @@ sub pc51
        return "PC51^$to^$from^$val^";
 }
 
+my $hexlasttime = 0;
+my $hexlastlet = 'A';
+my $hexoverflow = '';
+
+sub hexstamp
+{
+       my $t = shift || $main::systime;
+       if ($t ne $hexlasttime) {
+               $hexlasttime = $t;
+               $hexoverflow = '';
+               $hexlastlet = 'A';
+       } else {
+               do {
+                       $hexlastlet = chr(ord($hexlastlet) + 1);
+                       if ($hexlastlet ge '~') {
+                               $hexlastlet = 'A';
+                               $hexoverflow ||= '@';
+                               do {
+                                       $hexoverflow = chr(ord($hexoverflow) + 1);
+                               } while ($hexoverflow eq '^');
+                       }
+               } while ($hexlastlet eq '^');
+       }
+       return sprintf "%08X%s%s", $hexlasttime, $hexoverflow, $hexlastlet;
+}
+
+sub pc58
+{
+       my $sort = shift;
+       my $hexstamp = shift || hexstamp();
+       my $from = shift;
+       my $to = shift;
+       my $text = unpad(shift);
+       $text = ' ' if !$text;
+       $text =~ s/\^/%5E/g;
+       return "PC58^$sort^$hexstamp^$from^$to^$text" . sprintf "^%s^", get_hops(58);
+}
+
+sub pc59
+{
+       my @out;
+       my $sort = shift;
+       my $hexstamp = shift || hexstamp();
+       my $node = shift;
+       
+       my $s = "PC59^$sort^$hexstamp^$node";
+       for (@_) {
+               next unless $_;
+               my $ref = $_;
+               my $call = $ref->call;
+               my $here = $ref->here;
+               $s .= '^' . $ref->enc_pc59;
+       }
+       push @out, sprintf "$s^%s^", get_hops(59);
+       return @out;
+}
+
+sub PC59c
+{
+       return PC59('C', @_);
+}
+
+sub PC59a
+{
+       return PC59('A', @_);
+}
+
+sub PC59d
+{
+       return PC59('D', @_);
+}
+
 # clx remote cmd send
 sub pc84
 {
@@ -363,35 +449,6 @@ sub pc85
 # spider route broadcast
 sub pc90
 {
-       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 $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;