#!/usr/bin/perl -w
#
# Pasek postpu: Wget - Pasek postpu podobny do Wget w LWP.
# http://disobey.com/d/code/ lub skontaktuj si z morbus@disobey.com.
# Oryginalna procedura od tachyon'a z http://tachyon.perlmonk.org/
#
# Ten kod jest oprogramowaniem darmowym. Mona go dalej rozpowszechnia
# i modyfikowa na takich zasadach, jakie dotycz samego Perla.

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

# upewnijmy si, e mamy wszystkie potrzebne moduy; jeli nie, koniec.
eval("use LWP 5.6.9;");  die "[err] wymagane LWP w wersji 5.6.9 lub wyszej.\n" if $@;

# teraz sprawdzamy przekazane adresy URL.
die "[err] Brak adresw URL do przetwarzania.\n" unless @ARGV;

my $final_data;  # pobrane dane.
my $total_size;  # wielko zasobu spod adresu URL.

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

   # tworzenie nowej przegldarki i pobranie danych z URL.
   # wszystkie dane s adowane do zmiennej $final_data, do ktrej
   # docza je procedura callback. Wczeniej jednak okrelana jest
   # 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;

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

# przy kadej porcji danych.
sub callback {
   my ($data, $response, $protocol) = @_;
   $final_data .= $data;
   print progress_bar( length($final_data), $total_size, 25, '=' );
}

# wget-style. procedura od tachyon'a
# z http://tachyon.perlmonk.org/
sub progress_bar {
    my ( $got, $total, $width, $char ) = @_;
    $width ||= 25; $char ||= '=';
    my $num_width = length $total;
    sprintf "|%-${width}s| Otrzymano %${num_width}s bajtw z %s (%.2f%%)\r", 
        $char x (($width-1)*$got/$total). '>', 
        $got, $total, 100*$got/+$total;
}

