#!/usr/bin/perl -W

use Gtk2 '-init';
use Gtk2::Helper;
use FileHandle;
use utf8;
use POSIX qw(locale_h);
use locale;
setlocale(LC_NUMERIC, "C");
use Glib qw /TRUE FALSE/;
use POSIX qw /ceil/;
my $i;
my $progress;

my $window = Gtk2::Window -> new();
$window -> set_default_size(200,40);
$window -> set_title ("Prelink");
$window -> signal_connect(destroy => sub { Gtk2->main_quit; });

my $vbox = Gtk2::VBox -> new();
$window -> add($vbox);

my $label = Gtk2::Label -> new("Initializing prelink");
$vbox -> pack_start($label, FALSE, FALSE, 0);

my $progressbar = Gtk2::ProgressBar -> new();
$progressbar -> set_text ("Initializing prelink...");

$window->show_all;
&Get_prelink;


Gtk2->main;

sub Get_prelink
{
	my ($fh, $tag);
	open($fh, q^nice -n19 sudo /usr/sbin/prelink -namv|^);
	$tag = Gtk2::Helper -> add_watch( $fh->fileno, 'in', sub { Get_prelink_callback ($fh, $tag); });
	return TRUE;
}

sub Get_prelink_callback
{
	my ($fh, $tag) = @_;
	my $line = <$fh>;
	if (eof($fh))
	{
		Gtk2::Helper -> remove_watch ($tag);
		close($fh);
		if($i > 0)
		{
			$i = $i - 2;
			$vbox -> pack_start($progressbar, FALSE, TRUE, 0);
			$window -> show_all;
			&Prelink
		}
		else { $label -> set_text ("Nothing to prelink.") }
	}
	if($line =~ /^Would prelink/)
	{
		$i++;
		$label -> set_text ("Will prelink $i libs and binaries.");
	}
	return TRUE;
}

sub Prelink
{
	$label -> set_text ("Initializing prelinking.");
	my ($fh, $tag);
	open($fh, q^LANG=C nice -n19 sudo /usr/sbin/prelink -amv|^);
	$tag = Gtk2::Helper -> add_watch($fh -> fileno, 'in', sub { Prelink_callback ($fh, $tag); });
	return TRUE;
}

sub Prelink_callback
{
        my ($fh, $tag) = @_;
	my $line = <$fh>;
	if (eof($fh))
	{
		$label -> set_text ("Done prelinking.");
		Gtk2::Helper -> remove_watch ($tag);
		close($fh);
		print "Done\n";
		Gtk2 -> main_quit;
	}
	if($line =~ /^Prelinking/)
	{
		$progress++;

		if($progress eq $i)
		{
			$progressbar -> set_fraction ('1');
			$progressbar -> set_text ("100%");
			$label -> set_text ("Done prelinking.");
			$window -> set_title ("Prelinking done");
		}
		else
		{
			my $fraction = sprintf("%.4f", $progress/$i);
			my $percent = sprintf("%.2f", $fraction * 100);
			$progressbar -> set_fraction ($fraction);
			$progressbar -> set_text ("$percent%");
			$label -> set_text ("Prelinked $progress of $i.");
			$window -> set_title ("Prelink: $percent%");
		}
	}
	return TRUE;
}
