X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FThingy.pm;h=308e80c3d67c3dd13e72576c09f7bceead959887;hb=de7f7dbbadcad48ba245f22db044b14954e18782;hp=522e4b136d0c7ea80ff55f8c31c2e3d4f5fb3acc;hpb=6c06ed486e67b3e36e9af4794d2eb84f59f249c4;p=spider.git diff --git a/perl/Thingy.pm b/perl/Thingy.pm index 522e4b13..308e80c3 100644 --- a/perl/Thingy.pm +++ b/perl/Thingy.pm @@ -42,6 +42,8 @@ sub new { my $class = shift; my $thing = {@_}; + + $thing->{origin} ||= $main::mycall; bless $thing, $class; return $thing; @@ -53,25 +55,42 @@ sub send my $thing = shift; my $dxchan = shift; my $class; + my $sub; + if (@_) { $class = shift; } elsif ($dxchan->isa('DXChannel')) { $class = ref $dxchan; } + # BEWARE!!!!! + no strict 'refs'; + # do output filtering if ($thing->can('out_filter')) { return unless $thing->out_filter($dxchan); } - # generate the line which may (or not) be cached + # before send (and line generation) things + # function must return true to make the send happen + $sub = "before_send_$class"; + return unless $thing->can($sub) && $thing->$sub($dxchan); + + # generate the protocol line which may (or not) be cached my $ref; unless ($ref = $thing->{class}) { - no strict 'refs'; - my $sub = "gen_$class"; + $sub = "gen_$class"; $ref = $thing->$sub($dxchan) if $thing->can($sub); } $dxchan->send(ref $ref ? @$ref : $ref) if $ref; + + # after send + if ($thing->can('after_send_all')) { + $thing->after_send_all($dxchan); + } else { + $sub = "after_send_$class"; + $thing->$sub($dxchan) if $thing->can($sub); + } } # broadcast to all except @_ @@ -113,7 +132,7 @@ sub process } while (@queue) { $thing = shift @queue; - my $dxchan = DXChannel->get($thing->{dxchan}); + my $dxchan = DXChannel::get($thing->{dxchan}); if ($dxchan) { if ($thing->can('in_filter')) { next unless $thing->in_filter($dxchan); @@ -171,5 +190,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;