allow the PC16/17/19/21 to operate locally only (ready for polled routing).
[spider.git] / perl / DXProtout.pm
index 95c1981359262202c5e255752327453540f640a7..99ba17d01891bfa77c66a43f46df4eedf7b4441d 100644 (file)
@@ -19,6 +19,13 @@ use DXDebug;
 
 use strict;
 
+use vars qw($VERSION $BRANCH);
+($VERSION, $BRANCH) = dxver(q$Revision$);
+
+use vars qw($sentencelth);
+
+$sentencelth = 180;
+
 #
 # All the PCxx generation routines
 #
@@ -26,7 +33,7 @@ use strict;
 # create a talk string ($from, $to, $via, $text)
 sub pc10
 {
-       my ($from, $to, $via, $text) = @_;
+       my ($from, $to, $via, $text, $origin) = @_;
        my ($user1, $user2);
        if ($via && $via ne $to) {
                $user1 = $via;
@@ -35,10 +42,11 @@ sub pc10
                $user2 = ' ';
                $user1 = $to;
        }
+       $origin ||= $main::mycall;
        $text = unpad($text);
        $text = ' ' unless $text && length $text > 0;
        $text =~ s/\^/%5E/g;
-       return "PC10^$from^$user1^$text^*^$user2^$main::mycall^~";  
+       return "PC10^$from^$user1^$text^*^$user2^$origin^~";  
 }
 
 # create a dx message (call, freq, dxcall, text) 
@@ -55,14 +63,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;
+       $text ||= ' ';
        $text =~ s/\^/%5E/g;
-       return "PC12^$call^$tonode^$text^$sysop^$main::mycall^$wx^$hops^~";
+       $tonode ||= '*';
+       $sysop ||= ' ';
+       $wx ||= '0';
+       $origin ||= $main::mycall;
+       return "PC12^$call^$tonode^$text^$sysop^$origin^$wx^$hops^~";
 }
 
 #
@@ -78,15 +87,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;
 }
 
@@ -108,7 +120,9 @@ sub pc17
 # Request init string
 sub pc18
 {
-       return "PC18^DXSpider Version: $main::version Build: $main::build^$DXProt::myprot_version^";
+       my $flags = " pc92 pc9[2]";
+       $flags .= " xml" if DXXml::available(); 
+       return "PC18^DXSpider Version: $main::version Build: $main::build$flags^$DXProt::myprot_version^";
 }
 
 #
@@ -117,20 +131,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;
 }
 
@@ -203,7 +221,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^~";
 }
@@ -353,6 +371,52 @@ sub pc85
        return "PC85^$tonode^$fromnode^$call^$msg^~";
 }
 
+# spider route broadcasts
+#
+
+
+sub _gen_pc92
+{
+       my $sort = shift;
+       my $ext = shift;
+       my $s = "PC92^$main::mycall^" . gen_pc9x_t() . "^$sort";
+       for (@_) {
+               $s .= "^" . _encode_pc92_call($_, $ext);
+       }
+       return $s . '^H99^';
+}
+
+sub gen_pc92_with_time
+{
+       my $call = shift;
+       my $sort = shift;
+       my $t = shift;
+       my $ext = 1;
+       my $s = "PC92^$call^$t^$sort";
+       for (@_) {
+               $s .= "^" . _encode_pc92_call($_, $ext);
+       }
+       return $s . '^H99^';
+}
+
+# add a local one
+sub pc92a
+{
+       return _gen_pc92('A', 0, @_);
+}
+
+# delete a local one
+sub pc92d
+{
+       return _gen_pc92('D', 0, @_);
+}
+
+# send a config
+sub pc92c
+{
+       return _gen_pc92('C', 1, @_);
+}
+
 1;
 __END__