add all the basic aranea routing + local configuration broadcasts
[spider.git] / perl / Thingy.pm
index c91edc0ce3d0d1d1429d7365338988884f796f94..8b3f3ccef0d6bc6ad75a6f512b8e4101115557c8 100644 (file)
@@ -16,10 +16,8 @@ use strict;
 package Thingy;
 
 use vars qw($VERSION $BRANCH @queue @permin @persec);
-$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
-$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /^\d+\.\d+(?:\.(\d+)\.(\d+))?$/  || (0,0));
-$main::build += $VERSION;
-$main::branch += $BRANCH;
+
+main::mkver($VERSION = q$Revision$);
 
 @queue = ();                                   # the input / processing queue
 
@@ -44,6 +42,8 @@ sub new
 {
        my $class = shift;
        my $thing = {@_};
+
+       $thing->{origin} ||= $main::mycall;
        
        bless $thing, $class;
        return $thing;
@@ -67,15 +67,13 @@ sub send
        }
 
        # generate the line which may (or not) be cached
-       my @out;
-       if (my $ref = $thing->{class}) {
-               push @out, ref $ref ? @$ref : $ref;
-       } else {
+       my $ref;
+       unless ($ref = $thing->{class}) {
                no strict 'refs';
                my $sub = "gen_$class";
-               push @out, $thing->$sub($dxchan) if $thing->can($sub);
+               $ref = $thing->$sub($dxchan) if $thing->can($sub);
        }
-       $dxchan->send(@out) if @out;
+       $dxchan->send(ref $ref ? @$ref : $ref) if $ref;
 }
 
 # broadcast to all except @_
@@ -100,11 +98,21 @@ sub queue
        push @queue, $thing;
 }
 
+#
 # this is the main commutator loop. In due course it will
-# become the *only* commutator loop
+# become the *only* commutator loop, This can be called in one
+# of two ways: either with 2 args or with none.
+#
+# The two arg form is an immediate "queue and handle" and does
+# a full cycle, immediately
+#
 sub process
 {
        my $thing;
+       if (@_ == 2) {
+               $thing = shift;
+               $thing->queue(shift);
+       }
        while (@queue) {
                $thing = shift @queue;
                my $dxchan = DXChannel->get($thing->{dxchan});
@@ -165,5 +173,14 @@ sub ascii
     $dd->Quotekeys($] < 5.005 ? 1 : 0);
        return $dd->Dumpxs;
 }
+
+sub add_auth
+{
+       my $thing = shift;
+       my $s = $thing->{'s'} = sprintf "%X", int(rand() * 100000000);
+       my $auth = Verify->new("DXSp,$main::mycall,$s,$main::version,$main::build");
+       $thing->{auth} = $auth->challenge($main::me->user->passphrase);
+}
+
 1;