diff options
author | Pascal Rigaux <pixel@mandriva.com> | 2007-04-25 12:26:16 +0000 |
---|---|---|
committer | Pascal Rigaux <pixel@mandriva.com> | 2007-04-25 12:26:16 +0000 |
commit | 126777bc019a54afb4ec51299f2cf9d2841698aa (patch) | |
tree | 97f76e571902ead55ba138f1156a4b4f00b9b779 /perl-install/install_steps_gtk.pm | |
parent | f1f67448efc714873378dfeb8279fae68054a90a (diff) | |
download | drakx-126777bc019a54afb4ec51299f2cf9d2841698aa.tar drakx-126777bc019a54afb4ec51299f2cf9d2841698aa.tar.gz drakx-126777bc019a54afb4ec51299f2cf9d2841698aa.tar.bz2 drakx-126777bc019a54afb4ec51299f2cf9d2841698aa.tar.xz drakx-126777bc019a54afb4ec51299f2cf9d2841698aa.zip |
re-sync after the big svn loss
Diffstat (limited to 'perl-install/install_steps_gtk.pm')
-rw-r--r-- | perl-install/install_steps_gtk.pm | 700 |
1 files changed, 0 insertions, 700 deletions
diff --git a/perl-install/install_steps_gtk.pm b/perl-install/install_steps_gtk.pm deleted file mode 100644 index 4c16cbcaf..000000000 --- a/perl-install/install_steps_gtk.pm +++ /dev/null @@ -1,700 +0,0 @@ -package install_steps_gtk; # $Id$ - -use diagnostics; -use strict; -use vars qw(@ISA); - -@ISA = qw(install_steps_interactive interactive::gtk); - -#-###################################################################################### -#- misc imports -#-###################################################################################### -use pkgs; -use install_steps_interactive; -use interactive::gtk; -use xf86misc::main; -use common; -use mygtk2; -use ugtk2 qw(:helpers :wrappers :create); -use devices; -use modules; -use install_gtk; -use install_any; -use mouse; -use help; -use log; - -#-###################################################################################### -#- In/Out Steps Functions -#-###################################################################################### -sub new($$) { - my ($type, $o) = @_; - - $ENV{DISPLAY} ||= $o->{display} || ":0"; - my $wanted_DISPLAY = $::testing && -x '/usr/X11R6/bin/Xnest' ? ':9' : $ENV{DISPLAY}; - - if (!$::local_install && - ($::testing ? $ENV{DISPLAY} ne $wanted_DISPLAY : $ENV{DISPLAY} =~ /^:\d/)) { #- is the display local or distant? - my $f = "/tmp/Xconf"; - if (!$::testing) { - devices::make("/dev/kbd"); - } - my $launchX = sub { - my ($server, $Driver) = @_; - - mkdir '/var/log' if !-d '/var/log'; - - my @options = $wanted_DISPLAY; - if ($server eq 'Xnest') { - push @options, '-ac', '-geometry', $o->{vga} || ($o->{vga16} ? '640x480' : '800x600'); - } elsif ($::globetrotter || !$::move) { - install_gtk::createXconf($f, @{$o->{mouse}}{"XMOUSETYPE", "device"}, $o->{mouse}{wacom}[0], $Driver); - - push @options, if_(!$::globetrotter, '-kb'), '-allowMouseOpenFail', '-xf86config', $f if arch() !~ /^sparc/; - push @options, 'tty7', '-dpms', '-s', '240'; - - #- old weird servers: Xsun - push @options, '-fp', '/usr/X11R6/lib/X11/fonts:unscaled' if $server =~ /Xsun/; - } - - if (!fork()) { - c::setsid(); - exec $server, @options or c::_exit(1); - } - - #- wait for the server to start - foreach (1..5) { - sleep 1; - last if fuzzy_pidofs(qr/\b$server\b/); - log::l("$server still not running, trying again"); - } - my $nb; - foreach (1..60) { - log::l("waiting for the server to start ($_ $nb)"); - log::l("Server died"), return 0 if !fuzzy_pidofs(qr/\b$server\b/); - $nb++ if xf86misc::main::Xtest($wanted_DISPLAY); - if ($nb > 2) { #- one succeeded test is not enough :-( - log::l("AFAIK X server is up"); - return 1; - } - sleep 1; - } - log::l("Timeout!!"); - 0; - }; - my @servers = qw(Driver:fbdev); #-) - if ($::testing) { - @servers = 'Xnest'; - } elsif (arch() eq "alpha") { - require Xconfig::card; - my ($card) = Xconfig::card::probe(); - Xconfig::card::add_to_card__using_Cards($card, $card->{type}) if $card && $card->{type}; - @servers = $card->{server} || "TGA"; - #-@servers = qw(SVGA 3DLabs TGA) - } elsif (arch() =~ /^sparc/) { - local $_ = cat_("/proc/fb"); - if (/Mach64/) { - @servers = qw(Mach64); - } elsif (/Permedia2/) { - @servers = qw(3DLabs); - } else { - @servers = qw(Xsun24); - } - } elsif (arch() =~ /ia64/) { - require Xconfig::card; - my ($card) = Xconfig::card::probe(); - @servers = map { if_($_, "Driver:$_") } $card && $card->{Driver}, 'fbdev'; - } - - if (($::move || $::globetrotter) && !$::testing) { - require move; - require run_program; - move::automatic_xconf($o); - run_program::run('/sbin/service', 'xfs', 'start'); - @servers = $::globetrotter ? qw(Driver:fbdev) : qw(X_move); - } - - foreach (@servers) { - log::l("Trying with server $_"); - my ($prog, $Driver) = /Driver:(.*)/ ? ('Xorg', $1) : /Xsun|Xnest|^X_move$/ ? $_ : "XF86_$_"; - if (/FB/i) { - !$o->{vga16} && $o->{allowFB} or next; - - $o->{allowFB} = &$launchX($prog, $Driver) #- keep in mind FB is used. - and goto OK; - } else { - $o->{vga16} = 1 if /VGA16/; - &$launchX($prog, $Driver) and goto OK; - } - $::move and print("can not launch graphical mode :(\n"), c::_exit(1); - } - return undef; - } - OK: - $ENV{DISPLAY} = $wanted_DISPLAY; - require detect_devices; - if (detect_devices::is_xbox()) { - modules::load('xpad'); - run_program::run('xset', 'm', '1/8', '1'); - } - install_gtk::init_gtk($o); - install_gtk::init_sizes(); - install_gtk::install_theme($o); - install_gtk::create_logo_window($o); - install_gtk::create_steps_window($o); - - $ugtk2::grab = 1; - - $o = (bless {}, ref($type) || $type)->SUPER::new($o); - $o->interactive::gtk::new; - $o; -} - -sub enteringStep { - my ($o, $step) = @_; - - printf "Entering step `%s'\n", $o->{steps}{$step}{text}; - $o->SUPER::enteringStep($step); - install_gtk::update_steps_position($o); -} -sub leavingStep { - my ($o, $step) = @_; - $o->SUPER::leavingStep($step); -} - - -sub charsetChanged { - my ($o) = @_; - Gtk2->set_locale; - install_gtk::load_font($o); - install_gtk::create_steps_window($o); -} - -#-###################################################################################### -#- Steps Functions -#-###################################################################################### -sub selectLanguage { - my ($o) = @_; - $o->SUPER::selectLanguage; - - $o->ask_warn('', -formatAlaTeX(N("Your system is low on resources. You may have some problem installing -Mandriva Linux. If that occurs, you can try a text install instead. For this, -press `F1' when booting on CDROM, then enter `text'."))) if availableRamMB() < 70; # 70MB - -} - -#------------------------------------------------------------------------------ -sub selectMouse { - my ($o, $force) = @_; - my %old = %{$o->{mouse}}; - $o->SUPER::selectMouse($force) or return; - my $mouse = $o->{mouse}; - $mouse->{type} eq 'none' || - $old{type} eq $mouse->{type} && - $old{name} eq $mouse->{name} && - $old{device} eq $mouse->{device} and return; - - while (1) { - my $x_protocol_changed = mouse::change_mouse_live($mouse, \%old); - mouse::test_mouse_install($mouse, $x_protocol_changed) and return; - - %old = %$mouse; - $o->SUPER::selectMouse; - $mouse = $o->{mouse}; - } -} - -sub reallyChooseGroups { - my ($o, $size_to_display, $individual, $_compssUsers) = @_; - - my $w = ugtk2->new(N("Package Group Selection")); - my $w_size = gtknew('Label', text => &$size_to_display); - - my $entry = sub { - my ($e) = @_; - - gtknew('CheckButton', - text => translate($e->{label}), - tip => translate($e->{descr}), - active_ref => \$e->{selected}, - toggled => sub { - gtkset($w_size, text => &$size_to_display); - }); - }; - #- when restarting this step, it might be necessary to reload the compssUsers.pl (bug 11558). kludgy. - if (!ref $o->{gtk_display_compssUsers}) { install_any::load_rate_files($o) } - ugtk2::gtkadd($w->{window}, - gtknew('VBox', children => [ - 1, $o->{gtk_display_compssUsers}->($entry), - 1, '', - 0, gtknew('HBox', children_loose => [ - gtknew('Button', text => N("Help"), clicked => $o->interactive_help_sub_display_id('choosePackages')), - $w_size, - if_($individual, - gtknew('CheckButton', text => N("Individual package selection"), active_ref => $individual), - ), - gtknew('Button', text => N("Next"), clicked => sub { Gtk2->main_quit }), - ]), - ]), - ); - $w->main; - 1; -} - -sub choosePackagesTree { - my ($o, $packages, $o_limit_medium) = @_; - - my $available = install_any::getAvailableSpace($o); - my $availableCorrected = pkgs::invCorrectSize($available / sqr(1024)) * sqr(1024); - - my $common; - $common = { get_status => sub { - my $size = pkgs::selectedSize($packages); - N("Total size: %d / %d MB", pkgs::correctSize($size / sqr(1024)), $available / sqr(1024)); - }, - node_state => sub { - my $p = pkgs::packageByName($packages, $_[0]) or return; - pkgs::packageMedium($packages, $p)->selected or return; - $p->arch eq 'src' and return; - $p->flag_base and return 'base'; - $p->flag_installed && !$p->flag_upgrade and return 'installed'; - $p->flag_selected and return 'selected'; - return 'unselected'; - }, - build_tree => sub { - my ($add_node, $flat) = @_; - if ($flat) { - foreach (sort map { $_->name } - grep { !$o_limit_medium || pkgs::packageMedium($packages, $_) == $o_limit_medium } - grep { $_ && $_->arch ne 'src' } - @{$packages->{depslist}}) { - $add_node->($_, undef); - } - } else { - foreach my $root (@{$o->{compssUsers}}) { - my (@firstchoice, @others); - my %fl = map { ("CAT_$_" => 1) } @{$root->{flags}}; - foreach my $p (@{$packages->{depslist}}) { - !$o_limit_medium || pkgs::packageMedium($packages, $p) == $o_limit_medium or next; - my @flags = $p->rflags; - next if !($p->rate && any { any { !/^!/ && $fl{$_} } split('\|\|') } @flags); - $p->rate >= 3 ? - push(@firstchoice, $p->name) : - push(@others, $p->name); - } - my $root2 = translate($root->{path}) . '|' . translate($root->{label}); - $add_node->($_, $root2) foreach sort @firstchoice; - $add_node->($_, $root2 . '|' . N("Other")) foreach sort @others; - } - } - }, - get_info => sub { - my $p = pkgs::packageByName($packages, $_[0]) or return ''; - pkgs::extractHeaders([$p], $packages->{mediums}); - - my $imp = translate($pkgs::compssListDesc{$p->flag_base ? 5 : $p->rate}); - - my $tag = { 'foreground' => 'royalblue3' }; - $@ ? N("Bad package") : - [ [ N("Name: "), $tag ], [ $p->name . "\n" ], - [ N("Version: "), $tag ], [ $p->version . '-' . $p->release . "\n" ], - [ N("Size: "), $tag ], [ N("%d KB\n", $p->size / 1024) ], - if_($imp, [ N("Importance: "), $tag ], [ "$imp\n" ]), - [ "\n" ], [ formatLines(common::from_utf8($p->description)) ] ]; - }, - toggle_nodes => sub { - my $set_state = shift @_; - my $isSelection = 0; - my %l = map { my $p = pkgs::packageByName($packages, $_); - $isSelection ||= !$p->flag_selected; - $p->id => 1 } @_; - my $state = $packages->{state} ||= {}; - my @l = $isSelection ? $packages->resolve_requested($packages->{rpmdb}, $state, \%l, - callback_choices => \&pkgs::packageCallbackChoices) : - $packages->disable_selected($packages->{rpmdb}, $state, - map { $packages->{depslist}[$_] } keys %l); - my $size = pkgs::selectedSize($packages); - my $error; - - if (!@l) { - #- no package can be selected or unselected. - my @ask_unselect = grep { $state->{rejected}{$_}{backtrack} && - exists $l{$packages->search($_, strict_fullname => 1)->id} } - keys %{$state->{rejected} || {}}; - #- extend to closure (to given more detailed and not absurd reason). - my %ask_unselect; - while (@ask_unselect > keys %ask_unselect) { - @ask_unselect{@ask_unselect} = (); - foreach (keys %ask_unselect) { - foreach (keys %{$state->{rejected}{$_}{backtrack}{closure} || {}}) { - next if exists $ask_unselect{$_}; - push @ask_unselect, $_; - } - } - } - $error = [ N("You can not select/unselect this package"), - formatList(20, map { my $rb = $state->{rejected}{$_}{backtrack}; - my @froms = keys %{$rb->{closure} || {}}; - my @unsatisfied = @{$rb->{unsatisfied} || []}; - my $s = join ", ", ((map { N("due to missing %s", $_) } @froms), - (map { N("due to unsatisfied %s", $_) } @unsatisfied), - $rb->{promote} && !$rb->{keep} ? N("trying to promote %s", join(", ", @{$rb->{promote}})) : @{[]}, - $rb->{keep} ? N("in order to keep %s", join(", ", @{$rb->{keep}})) : @{[]}, - ); - $_ . ($s ? " ($s)" : ''); - } sort @ask_unselect) ]; - } elsif (pkgs::correctSize($size / sqr(1024)) > $available / sqr(1024)) { - $error = N("You can not select this package as there is not enough space left to install it"); - } elsif (@l > @_ && $common->{state}{auto_deps}) { - $o->ask_okcancel('', [ $isSelection ? - N("The following packages are going to be installed") : - N("The following packages are going to be removed"), - formatList(20, sort(map { $_->name } @l)) ], 1) or $error = ''; #- defined - } - if (defined $error) { - $o->ask_warn('', $error) if $error; - #- disable selection (or unselection). - $isSelection ? $packages->disable_selected($packages->{rpmdb}, $state, @l) : - $packages->resolve_requested($packages->{rpmdb}, $state, { map { $_->id => 1 } @l }); - } else { - #- keep the changes, update visible state. - foreach (@l) { - $set_state->($_->name, $_->flag_selected ? 'selected' : 'unselected'); - } - } - }, - grep_allowed_to_toggle => sub { - grep { my $p = pkgs::packageByName($packages, $_); $p && !$p->flag_base } @_; - }, - grep_unselected => sub { - grep { !pkgs::packageByName($packages, $_)->flag_selected } @_; - }, - check_interactive_to_toggle => sub { - my $p = pkgs::packageByName($packages, $_[0]) or return; - if ($p->flag_base) { - $o->ask_warn('', N("This is a mandatory package, it can not be unselected")); - } elsif ($p->flag_installed && !$p->flag_upgrade) { - $o->ask_warn('', N("You can not unselect this package. It is already installed")); - } elsif ($p->flag_selected && $p->flag_installed) { - if ($::expert) { - $o->ask_yesorno('', N("This package must be upgraded.\nAre you sure you want to deselect it?")) or return; - return 1; - } else { - $o->ask_warn('', N("You can not unselect this package. It must be upgraded")); - } - } else { return 1 } - return; - }, - auto_deps => N("Show automatically selected packages"), - interactive_help_id => 'choosePackagesTree', - ok => N("Install"), - cancel => N("Previous"), - icons => [ { icon => 'floppy', - help => N("Load/Save selection"), - wait_message => N("Updating package selection"), - code => sub { $o->loadSavePackagesOnFloppy($packages); 1 }, - }, - if_(0, - { icon => 'feather', - help => N("Minimal install"), - code => sub { - - install_any::unselectMostPackages($o); - pkgs::setSelectedFromCompssList($packages, { SYSTEM => 1 }, 4, $availableCorrected); - 1; - } }), - ], - state => { - auto_deps => 1, - flat => $o_limit_medium, - }, - }; - - $o->ask_browse_tree_info('', N("Choose the packages you want to install"), $common); -} - -#------------------------------------------------------------------------------ -sub beforeInstallPackages { - my ($o) = @_; - $o->SUPER::beforeInstallPackages; - install_any::copy_advertising($o); -} - -#------------------------------------------------------------------------------ -sub installPackages { - my ($o, $packages) = @_; - - my ($current_total_size, $last_size, $nb, $total_size, $start_time, $last_dtime, $_trans_progress_total); - - local $::noborderWhenEmbedded = 1; - my $w = ugtk2->new(N("Installing")); - my $show_advertising if 0; - - my $pkg_log_widget = gtknew('TextView', editable => 0); - my ($advertising_image, $change_time, $i); - my $advertize = sub { - my ($update) = @_; - - @install_any::advertising_images && $show_advertising && $update or return; - - $change_time = time(); - my $f = $install_any::advertising_images[$i++ % @install_any::advertising_images]; - log::l("advertising $f"); - gtkval_modify(\$advertising_image, $f); - - if (my $banner = $w->{window}{banner}) { - my ($title); - my $pl = $f; $pl =~ s/\.png$/.pl/; - eval(cat_($pl)) if -e $pl; - $banner->{text} = $title; - Gtk2::Banner::set_pixmap($banner); - } - }; - - my $cancel = gtknew('Button', text => N("Cancel"), clicked => sub { $pkgs::cancel_install = 1 }); - my $details = gtknew('Button', text_ref => \$show_advertising, - format => sub { $show_advertising ? N("Details") : N("No details") }, - clicked => sub { - gtkval_modify(\$show_advertising, !$show_advertising); - $pkg_log_widget->{to_bottom}->('force'); - }); - - ugtk2::gtkadd($w->{window}, my $box = gtknew('VBox', children_tight => [ - gtknew('Image_using_pixmap', file_ref => \$advertising_image, show_ref => \$show_advertising), - ])); - - $box->pack_end(gtkshow(gtknew('VBox', border_width => 7, spacing => 3, children_loose => [ - gtknew('ScrolledWindow', child => $pkg_log_widget, - hide_ref => \$show_advertising, height => 250, to_bottom => 1), - gtknew('ProgressBar', fraction_ref => \ (my $pkg_progress), hide_ref => \$show_advertising), - gtknew('Table', children => [ [ - N("Time remaining "), - gtknew('Label', text_ref => \ (my $msg_time_remaining = N("Estimating"))), - ] ]), - gtknew('HBox', children => [ - 1, gtknew('VBox', children_centered => [ gtknew('ProgressBar', fraction_ref => \ (my $progress_total), height => 25) ]), - 0, gtknew('HButtonBox', children_loose => [ $cancel, $details ]), - ]), - ])), 0, 1, 0); - - #- for the hide_ref & show_ref to work, we must set $show_advertising after packing - gtkval_modify(\$show_advertising, - defined $show_advertising ? $show_advertising : to_bool(@install_any::advertising_images)); - - $details->hide if !@install_any::advertising_images; - $w->sync; - foreach ($cancel, $details) { - gtkset_mousecursor_normal($_->window); - } - - $advertize->(0); - - local *install_steps::installCallback = sub { - my ($packages, $type, $id, $subtype, $amount, $total) = @_; - if ($type eq 'user' && $subtype eq 'install') { - #- $amount and $total are used to return number of package and total size. - $nb = $amount; - $total_size = $total; $current_total_size = 0; - $start_time = time(); - mygtk2::gtkadd($pkg_log_widget, text => N("%d packages", $nb)); - $w->flush; - } elsif ($type eq 'open') { - gtkval_modify(\$pkg_progress, 0); - my $p = $packages->{depslist}[$id]; - mygtk2::gtkadd($pkg_log_widget, text => sprintf("\n%s: %s", $p->name, (split /\n/, common::from_utf8($p->summary))[0] || '')); - $current_total_size += $last_size; - $last_size = $p->size; - $advertize->(1) if $show_advertising && $total_size > 20_000_000 && time() - $change_time > 20; - $w->flush; - } elsif ($type eq 'inst' && $subtype eq 'progress') { - gtkval_modify(\$pkg_progress, $total ? $amount / $total : 0); - - my $dtime = time() - $start_time; - my $ratio = - $total_size == 0 ? 0 : - pkgs::size2time($current_total_size + $amount, $total_size) / pkgs::size2time($total_size, $total_size); - $ratio >= 1 and $ratio = 1; - my $total_time = $ratio ? $dtime / $ratio : time(); - - gtkval_modify(\$progress_total, $ratio); - if ($dtime != $last_dtime && $current_total_size > 80_000_000) { - gtkval_modify(\$msg_time_remaining, formatTime(10 * round(max($total_time - $dtime, 0) / 10) + 10)); - $last_dtime = $dtime; - } - $w->flush; - } - }; - #- the modification is not local as the box should be living for other package installation. - undef *install_any::changeMedium; - *install_any::changeMedium = sub { - my ($method, $medium) = @_; - - #- if not using a cdrom medium or an iso image, always abort. - return if !install_any::method_allows_medium_change($method); - - my $name = install_medium::by_id($medium, $o->{packages})->{descr}; - local $| = 1; print "\a"; - my $time = time(); - my $r = $name !~ /commercial/i || ($o->{useless_thing_accepted2} ||= $o->ask_from_list_('', formatAlaTeX(install_messages::com_license()), [ N_("Accept"), N_("Refuse") ], "Accept") eq "Accept"); - if ($method =~ /-iso$/) { - $r = install_any::changeIso($name); - } else { - $r &&= $o->ask_okcancel('', N("Change your Cd-Rom! -Please insert the Cd-Rom labelled \"%s\" in your drive and press Ok when done. -If you do not have it, press Cancel to avoid installation from this Cd-Rom.", $name), 1); - } - #- add the elapsed time (otherwise the predicted time will be rubbish) - $start_time += time() - $time; - return $r; - }; - my $install_result; - catch_cdie { $install_result = $o->install_steps::installPackages($packages) } - sub { - log::l("catch_cdie: $@"); - if (my @err = $@ =~ /^error ordering package list: (.*)/ ? - (N("There was an error ordering packages:"), $1) : - $@ =~ /^error installing package list: (.*)/ ? - (N("There was an error installing packages:"), $1) : @{[]}) { - my $time = time(); - if ($o->ask_yesorno('', [ @err, N("Go on anyway?") ], 1)) { - #- add the elapsed time (otherwise the predicted time will be rubbish) - $start_time += time() - $time; - return 1; - } else { - ${$_[0]} = "already displayed"; - } - } - $w->destroy; - 0; - }; - if ($pkgs::cancel_install) { - $pkgs::cancel_install = 0; - die 'already displayed'; - } - $w->destroy; - $install_result; -} - -sub summary_prompt { - my ($o, $l, $check_complete) = @_; - - my $w = ugtk2->new(N("Summary"), icon => 'banner-summary'); - - my $set_entry_labels; - my @table; - my $group; - foreach my $e (@$l) { - if ($group ne $e->{group}) { - $group = $e->{group}; - push @table, [ gtknew('HBox', children_tight => [ $group ]), '' ]; - } - $e->{widget} = gtknew('WrappedLabel', width => $::real_windowwidth * 0.72); - - push @table, [], [ gtknew('HBox', spacing => 30, children_tight => [ '', $e->{widget} ]), - gtknew('Button', text => N("Configure"), clicked => sub { - $w->{rwindow}->hide; - $e->{clicked}(); - $w->{rwindow}->show; - $set_entry_labels->(); - }) ]; - } - - $set_entry_labels = sub { - foreach (@$l) { - my $t = $_->{val}() || '<span foreground="red">' . N("not configured") . '</span>'; - $t =~ s/&/&/g; - gtkset($_->{widget}, text_markup => $_->{label} . ' - ' . $t); - } - }; - $set_entry_labels->(); - - my $help_sub = $o->interactive_help_sub_display_id('summary'); - - ugtk2::gtkadd($w->{window}, - gtknew('VBox', spacing => 5, children => [ - 1, gtknew('ScrolledWindow', child => gtknew('Table', mcc => 1, children => \@table)), - 0, $w->create_okcancel(undef, '', '', if_($help_sub, [ N("Help"), $help_sub, 1 ])) - ])); - - $w->main($check_complete); -} - -sub deselectFoundMedia { - #- group by CD - my ($o, $hdlists, $mediumsize) = @_; - my %cdlist; - my @hdlist2; - my @corresp; - my $i = 0; - my $totalsize = 0; - foreach (@$hdlists) { - my $cd = install_medium->new(descr => $_->[3])->get_cd_number; - if (!$cd || !@{$cdlist{$cd} || []}) { - push @hdlist2, $_; - $corresp[$i] = [ $i ]; - } else { - $corresp[$i] = []; - push @{$corresp[$cdlist{$cd}[0]]}, $i; - } - if ($cd) { - $cdlist{$cd} ||= []; - push @{$cdlist{$cd}}, $i; - } - $totalsize >= 0 and $totalsize += $mediumsize->{$_->[0]}; - ++$i; - } - $totalsize ||= -1; #- don't check size, total medium size unknown - my @selection = (1) x @hdlist2; - my $copy_rpms_on_disk = 0; - my $ask_copy_rpms_on_disk = $o->{method} !~ /iso/i; - #- check available size for copying rpms from infos in hdlists file - if ($ask_copy_rpms_on_disk && $totalsize >= 0) { - my $availvar = install_any::getAvailableSpace_mounted("$::prefix/var"); - $availvar /= 1024 * 1024; #- Mo - log::l("totalsize=$totalsize, avail on $::prefix/var=$availvar"); - $ask_copy_rpms_on_disk = $totalsize < $availvar * 0.6; - } - if ($ask_copy_rpms_on_disk) { - #- don't be afraid, cleanup old RPMs if upgrade - eval { rm_rf("$::prefix/var/ftp/pub/Mandrivalinux", "$::prefix/var/ftp/pub/Mandrivalinux") if $o->{isUpgrade} }; - my $w = ugtk2->new(""); - $i = -1; - $w->sync; - ugtk2::gtkadd( - $w->{window}, - gtkpack( - Gtk2::VBox->new(0, 5), - Gtk2::WrappedLabel->new(N("The following installation media have been found. -If you want to skip some of them, you can unselect them now.")), - (map { - ++$i; - my $b = gtknew('CheckButton', text => $_->[3], active_ref => \$selection[$i]); - $b->set_sensitive(0) unless $i; - $b; - } @hdlist2), - gtknew('HSeparator'), - Gtk2::WrappedLabel->new(N("You have the option to copy the contents of the CDs onto the hard drive before installation. -It will then continue from the hard drive and the packages will remain available once the system is fully installed.")), - gtknew('CheckButton', text => N("Copy whole CDs"), active_ref => \$copy_rpms_on_disk), - gtknew('HSeparator'), - gtknew('HBox', children_tight => [ - gtknew('Button', text => N("Next"), clicked => sub { Gtk2->main_quit }), - ]), - ), - ); - $w->main; - } - $i = -1; - my $l = [ grep { $selection[++$i] } @hdlist2 ]; - my @l2; $i = 0; - foreach my $c (@$l) { - ++$i while $hdlists->[$i][3] ne $c->[3]; - push @l2, $hdlists->[$_] foreach @{$corresp[$i]}; - } - log::l("keeping media " . join ',', map { $_->[1] } @l2); - $o->{mediumsize} = $totalsize; - (\@l2, $copy_rpms_on_disk); -} - -1; |