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
# do output filtering
if ($thing->can('out_filter')) {
- return unless $thing->out_filter;
+ return unless $thing->out_filter($dxchan);
}
# 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 @_
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});
if ($thing->can('in_filter')) {
next unless $thing->in_filter($dxchan);
}
+
+ # remember any useful routes
+ RouteDB::update($thing->{origin}, $dxchan->{call}, $thing->{hopsaway});
+ RouteDB::update($thing->{user}, $dxchan->{call}, $thing->{hopsaway}) if exists $thing->{user};
+
$thing->handle($dxchan);
}
}