merged back NEW_ROUTE into trunk
[spider.git] / gtkconsole / DebugHandler.pm
diff --git a/gtkconsole/DebugHandler.pm b/gtkconsole/DebugHandler.pm
new file mode 100644 (file)
index 0000000..f6e51d3
--- /dev/null
@@ -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;