chop out all the external linking and add prototype pc92 sentence.
[spider.git] / perl / DXProtout.pm
index 6917b88b8501b384d34fa958464911e4f54aa975..856a60bb7ad081f0a48de49798f5b39f8c5890d6 100644 (file)
@@ -28,7 +28,7 @@ $main::branch += $BRANCH;
 use vars qw($sentencelth);
 
 $sentencelth = 180;
+
 #
 # All the PCxx generation routines
 #
@@ -66,14 +66,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^~";
 }
 
 #
@@ -94,13 +95,13 @@ sub pc16
                next unless $_;
                my $ref = $_;
                my $str = sprintf "^%s %s %d", $ref->call, $ref->conf ? '*' : '-', $ref->here;
-               if (length($s) + length($str) >= $sentencelth) {
+               if (length($s) + length($str) > $sentencelth) {
                        push @out, "PC16^$ncall" . $s . sprintf "^%s^", get_hops(16);
                        $s = "";
                }
                $s .= $str;
        }
-       push @out, "PC16^$ncall" . $s . sprintf "^%s^", get_hops(16) if length $s;
+       push @out, "PC16^$ncall" . $s . sprintf "^%s^", get_hops(16);
        return @out;
 }
 
@@ -122,7 +123,9 @@ sub pc17
 # Request init string
 sub pc18
 {
-       return "PC18^DXSpider Version: $main::version Build: $main::build^$DXProt::myprot_version^";
+       my $flags = " pc";
+       $flags .= " xml" if DXXml::available(); 
+       return "PC18^DXSpider Version: $main::version Build: $main::build$flags^$DXProt::myprot_version^";
 }
 
 #
@@ -142,13 +145,13 @@ sub pc19
                my $conf = $ref->conf;
                my $version = $ref->version;
                my $str = "^$here^$call^$conf^$version";
-               if (length($s) + length($str) >= $sentencelth) {
+               if (length($s) + length($str) > $sentencelth) {
                        push @out, "PC19" . $s . sprintf "^%s^", get_hops(19);
                        $s = "";
                }
                $s .= $str;
        }
-       push @out, "PC19" . $s . sprintf "^%s^", get_hops(19) if length $s;
+       push @out, "PC19" . $s . sprintf "^%s^", get_hops(19);
        return @out;
 }
 
@@ -371,9 +374,64 @@ sub pc85
        return "PC85^$tonode^$fromnode^$call^$msg^~";
 }
 
-# spider route broadcast
-sub pc90
+# spider route broadcasts
+#
+
+my $_last_time;
+my $_last_occurs;
+
+sub _gen_time
+{
+       if (!$_last_time || $_last_time != $main::systime) {
+               $_last_time = $main::systime;
+               $_last_occurs = 0;
+               return $_last_time;
+       } else {
+               $_last_occurs++;
+               return "$_last_time:$_last_occurs";
+       }
+}
+
+sub _gen_pc92
+{
+       my $sort = shift;
+       my $s = "PC92^$sort^" . _gen_time;
+       for (@_) {
+               my $flag = 0;
+               my $call = $_->call; 
+               my $extra = '';
+               if ($_->isa('Route::Node')) {
+                       $flag = 4;
+                       if ($call ne $main::mycall && DXChannel::get($call)) {
+                               $flag += 2;
+                       }
+                       if ($sort eq 'C') {
+                               $extra .= ':' . ($_->version || '') if $_->build;
+                               $extra .= ':' . $_->build if $_->build;
+                       }
+               }
+               $flag += $_->here ? 1 : 0;
+               $s .= "^$flag$call$extra";
+       }
+       return $s . '^H99';
+}
+
+# add a local one
+sub pc92a
+{
+       return _gen_pc92('A', @_);
+}
+
+# delete a local one
+sub pc92d
+{
+       return _gen_pc92('D', @_);
+}
+
+# send a config
+sub pc92c
 {
+       return _gen_pc92('C', @_);
 }
 
 1;