1d186597fSespie# ex:ts=8 sw=4:
2*ecb1e57bSespie# $OpenBSD: ProgressMeter.pm,v 1.46 2015/05/18 10:25:10 espie Exp $
3d186597fSespie#
433efc49fSespie# Copyright (c) 2010 Marc Espie <espie@openbsd.org>
5d186597fSespie#
6d186597fSespie# Permission to use, copy, modify, and distribute this software for any
7d186597fSespie# purpose with or without fee is hereby granted, provided that the above
8d186597fSespie# copyright notice and this permission notice appear in all copies.
9d186597fSespie#
10d186597fSespie# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11d186597fSespie# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12d186597fSespie# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13d186597fSespie# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14d186597fSespie# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15d186597fSespie# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1633efc49fSespie# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17d186597fSespie
18d186597fSespieuse strict;
19d186597fSespieuse warnings;
20d186597fSespie
21466e8b70Sespiepackage OpenBSD::PackingElement;
22466e8b70Sespiesub compute_size
23466e8b70Sespie{
24466e8b70Sespie	my ($self, $totsize) = @_;
25466e8b70Sespie
26466e8b70Sespie	$$totsize += $self->{size} if defined $self->{size};
27466e8b70Sespie}
28466e8b70Sespie
29d186597fSespiepackage OpenBSD::ProgressMeter;
30af363cbdSespiesub new
31af363cbdSespie{
3233efc49fSespie	bless {}, "OpenBSD::ProgressMeter::Stub";
33af363cbdSespie}
34af363cbdSespie
35466e8b70Sespiesub compute_size
36466e8b70Sespie{
37466e8b70Sespie	my ($self, $plist) = @_;
38466e8b70Sespie	my $totsize = 0;
39466e8b70Sespie	$plist->compute_size(\$totsize);
40466e8b70Sespie	$totsize = 1 if $totsize == 0;
41466e8b70Sespie	return $totsize;
42466e8b70Sespie}
43466e8b70Sespie
4433efc49fSespiesub setup
456e574fa7Sespie{
4663313c1cSespie	my ($self, $opt_x, $opt_m, $state) = @_;
47*ecb1e57bSespie	$self->{state} = $state;
48a409537dSespie	if ($opt_m || (!$opt_x && -t STDOUT)) {
4933efc49fSespie		require OpenBSD::ProgressMeter::Term;
5033efc49fSespie		bless $self, "OpenBSD::ProgressMeter::Term";
5133efc49fSespie		$self->init;
526e574fa7Sespie	}
536e574fa7Sespie}
546e574fa7Sespie
55f43f2e8dSespiesub disable {}
56f43f2e8dSespie
570386587aSespiesub new_sizer
580386587aSespie{
59*ecb1e57bSespie	my ($progress, $plist) = @_;
60*ecb1e57bSespie	return $progress->sizer_class->new($progress, $plist);
610386587aSespie}
620386587aSespie
63466e8b70Sespiesub sizer_class
640386587aSespie{
65466e8b70Sespie	"PureSizer"
660386587aSespie}
670386587aSespie
68f4f6c15cSespiesub for_list
69f4f6c15cSespie{
70f4f6c15cSespie	my ($self, $msg, $l, $code) = @_;
71f4f6c15cSespie	if (defined $msg) {
72f4f6c15cSespie		$self->set_header($msg);
73f4f6c15cSespie	}
74f4f6c15cSespie	my $total = scalar @$l;
75f4f6c15cSespie	my $i = 0;
76f4f6c15cSespie	for my $e (@$l) {
77f4f6c15cSespie		$self->show(++$i, $total);
78f4f6c15cSespie		&$code($e);
79f4f6c15cSespie	}
80f4f6c15cSespie	$self->next;
81f4f6c15cSespie}
82f4f6c15cSespie
8333efc49fSespie# stub class when no actual progressmeter that still prints out.
8433efc49fSespiepackage OpenBSD::ProgressMeter::Stub;
8533efc49fSespieour @ISA = qw(OpenBSD::ProgressMeter);
863cf81a87Sespie
8733efc49fSespiesub clear {}
8833efc49fSespie
89f43f2e8dSespie
9033efc49fSespiesub show {}
9133efc49fSespie
92ae1e9fdfSespiesub working {}
9333efc49fSespiesub message {}
9433efc49fSespie
9533efc49fSespiesub next {}
9633efc49fSespie
9733efc49fSespiesub set_header {}
98d186597fSespie
99f9ed702cSespiesub ntogo
100f9ed702cSespie{
10133efc49fSespie	return "";
10233efc49fSespie}
10333efc49fSespie
10433efc49fSespiesub visit_with_size
10533efc49fSespie{
106b3728a1dSespie	my ($progress, $plist, $method, @r) = @_;
10733efc49fSespie	$plist->$method(@r);
10833efc49fSespie}
10933efc49fSespie
11033efc49fSespiesub visit_with_count
11133efc49fSespie{
11233efc49fSespie	&OpenBSD::ProgressMeter::Stub::visit_with_size;
113f9ed702cSespie}
114f9ed702cSespie
115466e8b70Sespiepackage PureSizer;
116466e8b70Sespie
117466e8b70Sespiesub new
118466e8b70Sespie{
119*ecb1e57bSespie	my ($class, $progress, $plist) = @_;
120466e8b70Sespie	$plist->{totsize} //= $progress->compute_size($plist);
121466e8b70Sespie	bless {
122466e8b70Sespie	    progress => $progress,
123466e8b70Sespie	    totsize => $plist->{totsize},
124466e8b70Sespie	    donesize => 0,
125466e8b70Sespie	    }, $class;
126466e8b70Sespie}
127466e8b70Sespie
128466e8b70Sespiesub advance
129466e8b70Sespie{
130466e8b70Sespie	my ($self, $e) = @_;
131466e8b70Sespie	if (defined $e->{size}) {
132466e8b70Sespie		$self->{donesize} += $e->{size};
133466e8b70Sespie	}
134466e8b70Sespie}
135466e8b70Sespie
136ac2937aeSespiesub saved
137ac2937aeSespie{
138ac2937aeSespie	my $self = shift;
139*ecb1e57bSespie	$self->{progress}{state}{stats}{totsize} += $self->{totsize};
140*ecb1e57bSespie	$self->{progress}{state}{stats}{donesize} += $self->{donesize};
141ac2937aeSespie}
142ac2937aeSespie
143d186597fSespie1;
144