#!/usr/bin/perl -w
#
# Pasek postpu: Term::ProgressBar - pasek postpu w LWP.
# http://disobey.com/d/code/ lub skontaktuj si z morbus@disobey.com.
# Procedura oryginalna od tachyon'a z http://tachyon.perlmonk.org/
#
# Kod ten jest oprogramowaniem darmowy; mona go rozpowszechnia i modyfikowa
# na takich samych warunkach, jak sam jzyk Perl.
#

use strict; $|++;
my $VERSION = "1.0";

# upewnijmy si, e mamy potrzebne moduy; jeli nie, koniec.
eval("use LWP 5.6.9;"); 
die "[err] Niewaciwa wersja LWP.\n" if $@;
eval("use Term::ProgressBar;"); # ochrona przed zawijaniem sw.
die "[err] Nie zainstalowano Term::ProgressBar.\n" if $@;

# sprawdzenie przekazanych adresw URL.
die "[err] Brak adresw URL do przetwarzania.\n" unless @ARGV;

my $final_data = 0;  # zaadowane dane.
my $total_size;      # czna wielko danych spod adresu URL.
my $progress;        # obiekt paska postpu.
my $next_update = 0; # ograniczenie uycia ProgressBar.

# ptla po kolejnych adresach URL.
foreach my $url (@ARGV) {
   print "Pobieranie danych spod adresu ", substr($url, 0, 40), "...\n";

   # utworzenie nowej przegldarki, adowanie danych spod danego adresu URL.
   # wszystkie dane s adowane do zmiennej $final_data, do ktrej docza je
   # procedura callback. Wczeniej jednak pobierana jest czna wielko
   # danych spod danego adresu URL.
   my $ua = LWP::UserAgent->new(  );
   my $result = $ua->head($url);
   my $remote_headers = $result->headers;
   $total_size = $remote_headers->content_length;

   # inicjalizacja paska postpu.
   $progress = Term::ProgressBar->new({count => $total_size, ETA => 'linear'});
   $progress->minor(0);           # wycza przemieszczajc si gwiazdk.
   $progress->max_update_rate(1); # tylko w przypadku uycia ETA.

   # tutaj faktyczne adowanie danych.
   my $response = $ua->get($url, ':content_cb' => \&callback );

   # Koniec paska postpu.
   $progress->update($total_size);
}

# przy kadej porcji danych.
sub callback {
   my ($data, $response, $protocol) = @_;
   $final_data .= $data;

   $next_update = $progress->update(length($final_data))
      if length($final_data) >= $next_update;
}

