spider/gtkconsole/DebugHandler.pm
2001-08-08 15:56:49 +00:00

116 lines
2.6 KiB
Perl

#
# Gtk Handler for Debug Files
#
package DebugHandler;
use strict;
use Gtk;
use DXVars;
use DXLog;
use DXUtil;
use vars qw(@ISA);
@ISA = qw(Gtk::Window);
sub new
{
my $pkg = shift;
my $parent = shift;
my $regexp = shift || '';
my $nolines = shift || 1;
my $self = new Gtk::Window;
bless $self, $pkg;
$self->set_default_size(400, 400);
$self->set_transient_for($parent) if $parent;
$self->signal_connect('destroy', sub {$self->destroy} );
$self->signal_connect('delete_event', sub {$self->destroy; return undef;});
$self->set_title("Debug Output - $regexp");
$self->border_width(0);
$self->show;
my $box1 = new Gtk::VBox(0, 0);
$self->add($box1);
$box1->show;
my $swin = new Gtk::ScrolledWindow(undef, undef);
$swin->set_policy('automatic', 'automatic');
$box1->pack_start($swin, 1, 1, 0);
$swin->show;
my $button = new Gtk::Button('close');
$button->signal_connect('clicked', sub {$self->destroy});
$box1->pack_end($button, 0, 1, 0);
$button->show;
my $clist = new_with_titles Gtk::CList('Time', 'Data');
$swin->add($clist);
$clist->show;
$self->{fp} = DXLog::new('debug', 'dat', 'd');
my @today = Julian::unixtoj(time);
my $fh = $self->{fh} = $self->{fp}->open(@today);
$fh->seek(0, 2);
$self->{regexp} = $regexp if $regexp;
$self->{nolines} = $nolines;
$self->{clist} = $clist;
$self->{id} = Gtk::Gdk->input_add($fh->fileno, ['read'], sub {$self->handleinp(@_); 1;}, $fh);
$self->show_all;
return $self;
}
sub destroy
{
my $self = shift;
$self->{fp}->close;
Gtk::Gdk->input_remove($self->{id});
delete $self->{clist};
}
sub handleinp
{
my ($self, $socket, $fd, $flags) = @_;
if ($flags->{read}) {
my $offset = exists $self->{rbuf} ? length $self->{rbuf} : 0;
my $l = sysread($socket, $self->{rbuf}, 1024, $offset);
if (defined $l) {
if ($l) {
while ($self->{rbuf} =~ s/^([^\015\012]*)\015?\012//) {
my $line = $1;
if ($self->{regexp}) {
push @{$self->{prev}}, $line;
shift @{$self->{prev}} while @{$self->{prev}} > $self->{nolines};
if ($line =~ m{$self->{regexp}}oi) {
$self->printit(@{$self->{prev}});
@{$self->{prev}} = [];
}
} else {
$self->printit($line);
}
}
}
}
}
}
sub printit
{
my $self = shift;
my $clist = $self->{clist};
while (@_) {
my $line = shift;
$line =~ s/([\x00-\x1f\x7f-\xff])/sprintf("\\x%02X", ord($1))/eg;
my @line = split /\^/, $line, 2;
my $t = shift @line;
my ($sec,$min,$hour) = gmtime((defined $t) ? $t : time);
my $buf = sprintf "%02d:%02d:%02d", $hour, $min, $sec;
$clist->append($buf, @line);
}
}
1;