/usr/local/CPAN/dvdrip/Video/DVDRip/Logger.pm
# $Id: Logger.pm 2326 2007-08-05 16:58:33Z joern $
#-----------------------------------------------------------------------
# Copyright (C) 2001-2006 Jörn Reder <joern AT zyn.de>.
# All Rights Reserved. See file COPYRIGHT for details.
#
# This module is part of Video::DVDRip, which is free software; you can
# redistribute it and/or modify it under the same terms as Perl itself.
#-----------------------------------------------------------------------
package Video::DVDRip::Logger;
use Locale::TextDomain qw (video.dvdrip);
use Carp;
use strict;
sub gtk_text_view { shift->{gtk_text_view} }
sub project { shift->{project} }
sub fh { shift->{fh} }
sub set_gtk_text_view { shift->{gtk_text_view} = $_[1] }
sub set_project { shift->{project} = $_[1] }
sub set_fh { shift->{fh} = $_[1] }
sub new {
my $class = shift;
my %par = @_;
my ( $gtk_text_view, $project, $fh )
= @par{ 'gtk_text_view', 'project', 'fh' };
my $self = bless {
gtk_text_view => $gtk_text_view,
fh => $fh,
project => $project,
}, $class;
return bless $self, $class;
}
sub insert_project_logfile {
my $self = shift;
my $project = $self->project or return;
my $gtk_text_view = $self->gtk_text_view or return;
$gtk_text_view->get("buffer")->set_text("") if $self->gtk_text_view;
if ( -r $project->logfile ) {
open( IN, $project->logfile );
my $buffer = $gtk_text_view->get("buffer");
my $iter = $buffer->get_end_iter;
my @lines;
my $cnt;
while (<IN>) {
++$cnt;
push @lines, $_;
shift @lines if @lines > 20;
}
close IN;
$cnt -= 20;
unshift @lines, "[truncated $cnt lines]\n" if $cnt > 0;
for (@lines) {
my ( $date, $line ) = split( /\t/, $_, 2 );
if ( $line eq '' ) {
$line = $date;
$date = "";
}
else {
$line = " " . $line;
}
$buffer->insert_with_tags_by_name( $iter, $date, "date" );
$buffer->insert( $iter, $line );
}
#-- timing problems without the Idle handler...
Glib::Idle->add(
sub {
$iter = $buffer->get_end_iter;
$gtk_text_view->scroll_to_iter( $iter, 0.0, 0, 0.0, 0.0 );
0;
}
);
}
1;
}
sub log {
my $self = shift;
my $date = localtime(time);
my $line = $_[0];
$line =~ s/\s*$/\n/;
my $gtk_text_view = $self->gtk_text_view;
my $fh = $self->fh;
my $project = $self->project;
if ($gtk_text_view) {
my $buffer = $gtk_text_view->get("buffer");
my $iter = $buffer->get_end_iter;
$buffer->insert_with_tags_by_name( $iter, $date, "date" );
$buffer->insert( $iter, " " . $line );
#-- timing problems without the Idle handler...
Glib::Idle->add(
sub {
$iter = $buffer->get_end_iter;
$gtk_text_view->scroll_to_iter( $iter, 0.0, 0, 0.0, 0.0 );
0;
}
);
}
if ($fh) {
print $fh "$date: $line";
}
if ($project) {
open( OUT, ">>" . $project->logfile );
binmode OUT, ":utf8";
print OUT "$date\t$line";
close OUT;
}
1;
}
sub nuke {
my $self = shift;
my $gtk_text_view = $self->gtk_text_view;
my $project = $self->project;
$gtk_text_view->get("buffer")->set_text("") if $gtk_text_view;
unlink $project->logfile if $project;
$self->log( __ "Logfile nuked." );
1;
}
1;