X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=lib%2FZOOM%2FIRSpy.pm;h=b2e0f154868bb1377b418c6595d40472506d35b4;hb=a6fb2364986bfbd051d227a45dd73ce4260dde5f;hp=a1072b227bb8ef8070f21b459ce5bc70ab6868b8;hpb=6e20e8c0e0f0f60744d34abd4d457e5e60ccaf3c;p=irspy-moved-to-github.git diff --git a/lib/ZOOM/IRSpy.pm b/lib/ZOOM/IRSpy.pm index a1072b2..b2e0f15 100644 --- a/lib/ZOOM/IRSpy.pm +++ b/lib/ZOOM/IRSpy.pm @@ -1,4 +1,4 @@ -# $Id: IRSpy.pm,v 1.57 2007-01-20 09:53:20 mike Exp $ +# $Id: IRSpy.pm,v 1.63 2007-02-22 15:43:13 mike Exp $ package ZOOM::IRSpy; @@ -246,9 +246,9 @@ sub _render_record { sub _irspy_to_zeerex { - my ($this, $conn) = @_; + my $this = shift(); + my($conn, $save_xml) = @_; my $irspy_doc = $conn->record()->{zeerex}->ownerDocument; - my $save_xml = 0; if ($save_xml) { unlink('/tmp/irspy_orig.xml'); @@ -274,7 +274,7 @@ sub _rewrite_record { my($conn) = @_; $conn->log("irspy", "rewriting XML record"); - my $rec = $this->_irspy_to_zeerex($conn); + my $rec = $this->_irspy_to_zeerex($conn, $ENV{IRSPY_SAVE_XML}); _really_rewrite_record($this->{conn}, $rec); } @@ -404,7 +404,19 @@ sub check { my $i0 = ZOOM::event(\@conn); $this->log("irspy_event", "ZOOM_event(", scalar(@conn), " connections) = $i0"); - last if $i0 == 0 || $i0 == -3; # no events or no connections + if ($i0 < 1) { + my %messages = ( + 0 => "no events remain", + -1 => "ZOOM::event() argument not a reference", + -2 => "ZOOM::event() reference not an array", + -3 => "no connections remain", + -4 => "too many connections for ZOOM::event()", + ); + my $message = $messages{$i0} || "ZOOM::event() returned $i0"; + $this->log("irspy", $message); + last; + } + my $conn = $conn[$i0-1]; my $ev = $conn->last_event(); my $evstr = ZOOM::event_str($ev); @@ -415,7 +427,6 @@ sub check { eval { $conn->_check() }; if ($@ && ($ev == ZOOM::Event::RECV_DATA || - $ev == ZOOM::Event::RECV_APDU || $ev == ZOOM::Event::ZEND)) { # An error in, say, a search response, becomes visible to # ZOOM before the Receive Data event is sent and persists @@ -423,7 +434,7 @@ sub check { # each report the same error. So we just ignore errors on # "unimportant" events. ### But this doesn't work for, # say, a Connection Refused, as the only event that shows - # us this error is the End. + # us this error is the ZEND. $conn->log("irspy_event", "ignoring error ", "on event $ev ($evstr): $@"); next; @@ -506,7 +517,7 @@ sub check { $finished = 0; } my $ev = $conn->peek_event(); - if ($ev != ZOOM::Event::ZEND) { + if ($ev != 0 && $ev != ZOOM::Event::ZEND) { my $evstr = ZOOM::event_str($ev); $this->log("irspy", "$conn has event $ev ($evstr) waiting"); $finished = 0; @@ -517,9 +528,11 @@ sub check { } } - # This really shouldn't be necessary, but it's belt and braces + # This really shouldn't be necessary, and in practice it rarely + # helps, but it's belt and braces. For now, we don't do this + # (hence the zero in the $nruns check). if (!$finished) { - if (++$nruns < 3) { + if (++$nruns < 0) { $this->log("irspy", "back into main loop, ${nruns}th time"); goto ROUND_AND_ROUND_WE_GO; } else { @@ -529,11 +542,12 @@ sub check { # This shouldn't happen emit anything either: @conn = @{ $this->{connections} }; - while (my $i1 = ZOOM::event(\@conn)) { + while ((my $i1 = ZOOM::event(\@conn)) > 0) { my $conn = $conn[$i1-1]; my $ev = $conn->last_event(); my $evstr = ZOOM::event_str($ev); - warn "$conn still has ZOOM-C level task queued: $ev ($evstr)" + $this->log("irspy", + "$conn still has ZOOM-C level task queued: $ev ($evstr)") if $ev != ZOOM::Event::ZEND; }