X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=gtkconsole%2FDebugHandler.pm;fp=gtkconsole%2FDebugHandler.pm;h=f6e51d37374616fb8a7d6657adc4767ee58a2435;hb=6624dcdf07d628e8d6a16fc6549edf40be25b7b2;hp=0000000000000000000000000000000000000000;hpb=ca8e84c32e70ea8eb1f30e716b7dbdc92f7e5083;p=spider.git diff --git a/gtkconsole/DebugHandler.pm b/gtkconsole/DebugHandler.pm new file mode 100644 index 00000000..f6e51d37 --- /dev/null +++ b/gtkconsole/DebugHandler.pm @@ -0,0 +1,115 @@ +# +# 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;