#!/usr/bin/perl #- Copyright (C) 2005 MandrakeSoft SA #- Copyright (C) 2005-2007 Mandriva SA use strict; use warnings; BEGIN { #- set up a safe path and environment $ENV{PATH} = "/bin:/usr/bin:/usr/X11R6/bin"; delete @ENV{qw(ENV BASH_ENV IFS CDPATH)}; } use Gtk2; use gurpmi; #- globals my ($srpms, $rpms) = ([], []); my ($mainw, $mainbox); my @all_rpms = gurpmi::parse_command_line(); #- Now, the graphical stuff. Gtk2->init; #- Create main window $mainw = Gtk2::Window->new('toplevel'); $mainw->set_border_width(3); $mainw->set_title(N("RPM installation")); $mainw->signal_connect(destroy => \&quit); $mainw->set_position('center'); $mainw->set_modal(0); $mainbox = Gtk2::VBox->new(0, 5); $mainw->add($mainbox); sub all_descriptions { my (@rpms) = @_; join '', `rpm -qp --qf '%{name}-%{version}-%{release}: %{summary}\\n' @rpms`; } foreach (@all_rpms) { unless (-e $_) { $mainbox->pack_start(new_label(N("Error: unable to find file %s, will cancel operation", $_)), 1, 1, 0); my $abort_button = Gtk2::Button->new(but(N("_Ok"))); $abort_button->signal_connect(clicked => sub { quit(); exit 1 }); add_button_box($mainbox, $abort_button); $mainw->show_all; Gtk2->main; } /\.src\.rpm$/ ? push(@$srpms, $_) : push(@$rpms, $_); } sub proceed() { #- we need to switch to root if we're not already (via consolehelper) #- yes. hardcoded paths. safe. exec $> ? '/usr/bin/gurpmi2' : '/usr/sbin/gurpmi2', @ARGV; } #- Ask question: save or install ? #- change depending on the number of rpms, and on the presence of srpms if (!$gurpmi::options{auto} && @all_rpms + @gurpmi::names) { my $msg = ( @$srpms > 0 ? N("You have selected a source package: %s You probably didn't want to install it on your computer (installing it would allow you to make modifications to its sourcecode then compile it). What would you like to do?", $srpms->[0]) : @all_rpms == 0 ? N("You are about to install the following software packages on your computer: %s Proceed?", join("\n", map { "- $_" } @gurpmi::names)) : @all_rpms == 1 ? N("You are about to install the following software package on your computer: %s You may prefer to just save it. What is your choice?", all_descriptions($rpms->[0])) : N("You are about to install the following software packages on your computer: %s Proceed?", all_descriptions(@all_rpms)) ); $mainbox->pack_start(new_label($msg), 1, 1, 0); } else { #- we're doing an --auto-select, proceed without asking proceed(); } { #- buttons my $inst_button = Gtk2::Button->new(but(N("_Install"))); my $save_button = @all_rpms == 1 ? Gtk2::Button->new(but(N("_Save"))) : undef; my $ccel_button = Gtk2::Button->new(but(N("_Cancel"))); $inst_button->signal_connect(clicked => sub { #- performs installation. quit(); proceed(); }); $save_button and $save_button->signal_connect(clicked => sub { my $file_dialog = Gtk2::FileSelection->new(N("Choose location to save file")); $file_dialog->set_modal(1); $file_dialog->set_position('center'); my $filename = @$srpms > 0 ? $srpms->[0] : $rpms->[0]; $file_dialog->set_filename($filename); $file_dialog->hide_fileop_buttons; $file_dialog->ok_button->signal_connect(clicked => sub { my $location = $file_dialog->get_filename; quit(); $location and exec '/bin/mv', '-f', $filename, $location; }); $file_dialog->cancel_button->signal_connect(clicked => \&quit); $file_dialog->show; }); $ccel_button->signal_connect(clicked => \&quit); add_button_box($mainbox, grep { defined $_ } $inst_button, $save_button, $ccel_button); } $mainw->show_all; Gtk2->main;