aboutsummaryrefslogtreecommitdiffstats
path: root/lib/AdminPanel/Rpmdragora/edit_urpm_sources.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/AdminPanel/Rpmdragora/edit_urpm_sources.pm')
-rw-r--r--lib/AdminPanel/Rpmdragora/edit_urpm_sources.pm2243
1 files changed, 0 insertions, 2243 deletions
diff --git a/lib/AdminPanel/Rpmdragora/edit_urpm_sources.pm b/lib/AdminPanel/Rpmdragora/edit_urpm_sources.pm
deleted file mode 100644
index c756964..0000000
--- a/lib/AdminPanel/Rpmdragora/edit_urpm_sources.pm
+++ /dev/null
@@ -1,2243 +0,0 @@
-# vim: set et ts=4 sw=4:
-package ManaTools::Rpmdragora::edit_urpm_sources;
-#*****************************************************************************
-#
-# Copyright (c) 2002 Guillaume Cottenceau
-# Copyright (c) 2002-2007 Thierry Vignaud <tvignaud@mandriva.com>
-# Copyright (c) 2002-2007 Mandriva Linux
-# Copyright (c) 2014 - 2015 Angelo Naselli <anaselli@linux.it>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2, as
-# published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-#*****************************************************************************
-#
-# $Id: edit_urpm_sources.pm 266598 2010-03-03 12:00:58Z tv $
-
-
-use strict;
-use File::ShareDir ':ALL';
-use File::HomeDir qw(home);
-
-use MDK::Common::Func qw(if_ each_index);
-use MDK::Common::Math qw(max);
-use MDK::Common::File qw(cat_ output);
-use MDK::Common::DataStructure qw(member put_in_hash uniq);
-use MDK::Common::Various qw(to_bool);
-
-use ManaTools::Shared;
-use ManaTools::Shared::Locales;
-use ManaTools::rpmdragora;
-use ManaTools::Rpmdragora::init;
-use ManaTools::Rpmdragora::open_db;
-use ManaTools::Rpmdragora::formatting;
-use ManaTools::Shared::GUI;
-use URPM::Signature;
-use urpm::media;
-use urpm::download;
-use urpm::lock;
-
-use Exporter;
-our @ISA = qw(Exporter);
-our @EXPORT_OK = qw(run);
-
-
-my $urpm;
-my ($mainw, $list_tv, $something_changed);
-
-my %col = (
- mainw => {
- is_enabled => 0,
- is_update => 1,
- type => 2,
- name => 3,
- activatable => 4
- },
-);
-
-my $loc = ManaTools::rpmdragora::locale();
-
-sub get_medium_type {
- my ($medium) = @_;
- my %medium_type = (
- cdrom => $loc->N("CD-ROM"),
- ftp => $loc->N("FTP"),
- file => $loc->N("Local"),
- http => $loc->N("HTTP"),
- https => $loc->N("HTTPS"),
- nfs => $loc->N("NFS"),
- removable => $loc->N("Removable"),
- rsync => $loc->N("rsync"),
- ssh => $loc->N("NFS"),
- );
- return $loc->N("Mirror list") if $medium->{mirrorlist};
- return $medium_type{$1} if $medium->{url} =~ m!^([^:]*)://!;
- return $loc->N("Local");
-}
-
-sub selrow {
- my ($o_list_tv) = @_;
- defined $o_list_tv or $o_list_tv = $list_tv;
- my ($model, $iter) = $o_list_tv->get_selection->get_selected;
- $model && $iter or return -1;
- my $path = $model->get_path($iter);
- my $row = $path->to_string;
- return $row;
-}
-
-sub selected_rows {
- my ($o_list_tv) = @_;
- defined $o_list_tv or $o_list_tv = $list_tv;
- my (@rows) = $o_list_tv->get_selection->get_selected_rows;
- return -1 if @rows == 0;
- map { $_->to_string } @rows;
-}
-
-sub remove_row {
- my ($model, $path_str) = @_;
- my $iter = $model->get_iter_from_string($path_str);
- $iter or return;
- $model->remove($iter);
-}
-
-sub remove_from_list {
- my ($list, $list_ref, $model) = @_;
- my $row = selrow($list);
- if ($row != -1) {
- splice @$list_ref, $row, 1;
- remove_row($model, $row);
- }
-
-}
-
-sub _want_base_distro() {
- $::expert && distro_type(0) eq 'updates' ? interactive_msg(
- $loc->N("Choose media type"),
- $loc->N("In order to keep your system secure and stable, you must at a minimum set up
-sources for official security and stability updates. You can also choose to set
-up a fuller set of sources which includes the complete official Mageia
-repositories, giving you access to more software than can fit on the Mageia
-discs. Please choose whether to configure update sources only, or the full set
-of sources."
- ),
- transient => $::main_window,
- yesno => 1, text => { yes => $loc->N("Full set of sources"), no => $loc->N("Update sources only") },
- ) : 1;
-}
-
-sub easy_add_callback_with_mirror() {
- # when called on early init by rpmdragora
- $urpm ||= fast_open_urpmi_db();
-
- #- cooker and community don't have update sources
- my $want_base_distro = _want_base_distro();
- defined $want_base_distro or return 0;
- my $distro = $ManaTools::rpmdragora::mageia_release;
- my ($mirror) = choose_mirror($urpm, message =>
- $loc->N("This will attempt to install all official sources corresponding to your
-distribution (%s).\n
-I need to contact the Mageia website to get the mirror list.
-Please check that your network is currently running.\n
-Is it ok to continue?", $distro),
- transient => $::main_window,
- ) or return 0;
- ref $mirror or return 0;
- my $wait = wait_msg($loc->N("Please wait, adding media..."));
- add_distrib_update_media($urpm, $mirror, if_(!$want_base_distro, only_updates => 1));
- $offered_to_add_sources->[0] = 1;
- remove_wait_msg($wait);
- return 1;
-}
-
-sub easy_add_callback() {
- # when called on early init by rpmdragora
- $urpm ||= fast_open_urpmi_db();
-
- #- cooker and community don't have update sources
- my $want_base_distro = _want_base_distro();
- defined $want_base_distro or return 0;
- warn_for_network_need(undef, transient => $::main_window) or return 0;
- my $wait = wait_msg($loc->N("Please wait, adding media..."));
- add_distrib_update_media($urpm, undef, if_(!$want_base_distro, only_updates => 1));
- $offered_to_add_sources->[0] = 1;
- remove_wait_msg($wait);
- return 1;
-}
-
-## Internal routine that builds input fields needed to manage
-## the selected media type to be added
-## return HASH reference with the added widgets
-sub _build_add_dialog {
- my $options = shift;
-
- die "replace point is needed" if !defined ($options->{replace_pnt});
- die "dialog is needed" if !defined ($options->{dialog});
- die "selected item is needed" if !defined ($options->{selected});
- die "media info is needed" if !defined ($options->{info});
-
- my %widgets;
- my $factory = yui::YUI::widgetFactory;
-
- $options->{dialog}->startMultipleChanges();
- $options->{replace_pnt}->deleteChildren();
-
- # replace widgets
- my $vbox = $factory->createVBox( $options->{replace_pnt} );
- my $hbox = $factory->createHBox($vbox);
- $factory->createHSpacing($hbox, 1.0);
- my $label = $factory->createLabel($hbox,
- $options->{info}->{$options->{selected}}->{url}
- );
-
- $factory->createHSpacing($hbox, 3.0);
- $widgets{url} = $factory->createInputField($hbox, "", 0);
- $widgets{url}->setWeight($yui::YD_HORIZ, 2);
- if (defined($options->{info}->{$options->{selected}}->{dirsel})) {
- $widgets{dirsel} = $factory->createPushButton($hbox, $loc->N("Browse..."));
- }
- elsif (defined($options->{info}->{$options->{selected}}->{loginpass})) {
- $hbox = $factory->createHBox($vbox);
- $factory->createHSpacing($hbox, 1.0);
- $label = $factory->createLabel($hbox, $loc->N("Login:") );
- $factory->createHSpacing($hbox, 1.0);
- $widgets{login} = $factory->createInputField($hbox, "", 0);
- $label->setWeight($yui::YD_HORIZ, 1);
- $widgets{login}->setWeight($yui::YD_HORIZ, 3);
- $hbox = $factory->createHBox($vbox);
- $factory->createHSpacing($hbox, 1.0);
- $label = $factory->createLabel($hbox, $loc->N("Password:") );
- $factory->createHSpacing($hbox, 1.0);
- $widgets{pass} = $factory->createInputField($hbox, "", 1);
- $label->setWeight($yui::YD_HORIZ, 1);
- $widgets{pass}->setWeight($yui::YD_HORIZ, 3);
-
- }
- # recalc layout
- $options->{replace_pnt}->showChild();
- $options->{dialog}->recalcLayout();
- $options->{dialog}->doneMultipleChanges();
-
- return \%widgets;
-}
-
-sub add_callback() {
-
- my $retVal = 0;
-
- my $appTitle = yui::YUI::app()->applicationTitle();
- ## set new title to get it in dialog
- yui::YUI::app()->setApplicationTitle($loc->N("Add a medium"));
-
- my $factory = yui::YUI::widgetFactory;
-
- my $dialog = $factory->createPopupDialog();
- my $minSize = $factory->createMinSize( $dialog, 60, 5 );
- my $vbox = $factory->createVBox( $minSize );
-
- $factory->createVSpacing($vbox, 0.5);
-
- my $hbox = $factory->createHBox( $factory->createLeft($vbox) );
- $factory->createHeading($hbox, $loc->N("Adding a medium:"));
- $factory->createVSpacing($vbox, 0.5);
-
- $hbox = $factory->createHBox($vbox);
- $factory->createHSpacing($hbox, 1.0);
- my $label = $factory->createLabel($hbox, $loc->N("Type of medium:") );
- my $media_type = $factory->createComboBox($hbox, "", 0);
- $media_type->setWeight($yui::YD_HORIZ, 2);
-
- my %radios_infos = (
- local => { name => $loc->N("Local files"), url => $loc->N("Medium path:"), dirsel => 1 },
- ftp => { name => $loc->N("FTP server"), url => $loc->N("URL:"), loginpass => 1 },
- rsync => { name => $loc->N("RSYNC server"), url => $loc->N("URL:") },
- http => { name => $loc->N("HTTP server"), url => $loc->N("URL:") },
- removable => { name => $loc->N("Removable device (CD-ROM, DVD, ...)"),
- url => $loc->N("Path or mount point:"), dirsel => 1 },
- );
- my @radios_names_ordered = qw(local ftp rsync http removable);
-
- my $itemColl = new yui::YItemCollection;
- foreach my $elem (@radios_names_ordered) {
- my $it = new yui::YItem($radios_infos{$elem}->{'name'}, 0);
- if ($elem eq $radios_names_ordered[0]) {
- $it->setSelected(1);
- }
- $itemColl->push($it);
- $it->DISOWN();
- }
- $media_type->addItems($itemColl);
- $media_type->setNotify(1);
-
- $hbox = $factory->createHBox($vbox);
- $factory->createHSpacing($hbox, 1.0);
- $label = $factory->createLabel($hbox, $loc->N("Medium name:") );
- $factory->createHSpacing($hbox, 1.0);
- my $media_name = $factory->createInputField($hbox, "", 0);
- $media_name->setWeight($yui::YD_HORIZ, 2);
-
- # per function layout (replace point)
- my $align = $factory->createLeft($vbox);
- my $replace_pnt = $factory->createReplacePoint($align);
-
- my $add_widgets = _build_add_dialog({replace_pnt => $replace_pnt, dialog => $dialog,
- info => \%radios_infos, selected => $radios_names_ordered[0]}
- );
- # check-boxes
- $hbox = $factory->createHBox($factory->createLeft($vbox));
- $factory->createHSpacing($hbox, 1.3);
- my $dist_media = $factory->createCheckBox($hbox, $loc->N("Create media for a whole distribution"), 0);
- $hbox = $factory->createHBox($factory->createLeft($vbox));
- $factory->createHSpacing($hbox, 1.3);
- my $update_media = $factory->createCheckBox($hbox, $loc->N("Tag this medium as an update medium"), 0);
- $dist_media->setNotify(1);
-
- # Last line buttons
- $factory->createVSpacing($vbox, 0.5);
- $hbox = $factory->createHBox($vbox);
- my $cancelButton = $factory->createPushButton($hbox, $loc->N("&Cancel"));
- $factory->createHSpacing($hbox, 3.0);
- my $okButton = $factory->createPushButton($hbox, $loc->N("&Ok"));
-
- $cancelButton->setDefaultButton(1);
-
- # dialog event loop
- while(1) {
- my $event = $dialog->waitForEvent();
- my $eventType = $event->eventType();
-
- #event type checking
- if ($eventType == $yui::YEvent::CancelEvent) {
- last;
- }
- elsif ($eventType == $yui::YEvent::WidgetEvent) {
- ### widget
- my $widget = $event->widget();
- if ($widget == $cancelButton) {
- last;
- }
- elsif ($widget == $media_type) {
- my $item = $media_type->selectedItem();
- my $sel = $item ? $item->index() : 0 ;
- $add_widgets = _build_add_dialog({replace_pnt => $replace_pnt, dialog => $dialog,
- info => \%radios_infos, selected => $radios_names_ordered[$sel]}
- );
- }
- elsif ($widget == $dist_media) {
- $update_media->setEnabled(!$dist_media->value());
- }
- elsif ($widget == $okButton) {
- my $item = $media_type->selectedItem();
- my $sel = $item ? $item->index() : 0 ;
- my $info = $radios_infos{$radios_names_ordered[$sel]};
- my $name = $media_name->value();
- my $url = $add_widgets->{url}->value();
- $name eq '' || $url eq '' and interactive_msg('rpmdragora', $loc->N("You need to fill up at least the two first entries.")), next;
- if (member($name, map { $_->{name} } @{$urpm->{media}})) {
- interactive_msg('rpmdragora',
- $loc->N("There is already a medium called <%s>,\ndo you really want to replace it?", $name),
- yesno => 1) or next;
- }
-
- my %i = (
- name => $name,
- url => $url,
- distrib => $dist_media->value() ? 1 : 0,
- update => $update_media->value() ? 1 : undef,
- );
- my %make_url = (
- local => "file:/$i{url}",
- http => $i{url},
- rsync => $i{url},
- removable => "removable:/$i{url}",
- );
- $i{url} =~ s|^ftp://||;
- $make_url{ftp} = sprintf "ftp://%s%s",
- defined($add_widgets->{login})
- ?
- $add_widgets->{login}->value() . ':' . ( $add_widgets->{pass}->value() ?
- $add_widgets->{pass}->value() :
- '')
- :
- '',
- $i{url};
-
- if ($i{distrib}) {
- add_medium_and_check(
- $urpm,
- { nolock => 1, distrib => 1 },
- $i{name}, $make_url{$radios_names_ordered[$sel]}, probe_with => 'synthesis', update => $i{update},
- );
- } else {
- if (member($i{name}, map { $_->{name} } @{$urpm->{media}})) {
- urpm::media::select_media($urpm, $i{name});
- urpm::media::remove_selected_media($urpm);
- }
- add_medium_and_check(
- $urpm,
- { nolock => 1 },
- $i{name}, $make_url{$radios_names_ordered[$sel]}, $i{hdlist}, update => $i{update},
- );
- }
-
- $retVal = 1;
- last;
- }
- else {
- my $item = $media_type->selectedItem();
- my $sel = $item ? $item->index() : 0 ;
- if (defined($radios_infos{$radios_names_ordered[$sel]}->{dirsel}) &&
- defined($add_widgets->{dirsel}) ) {
- if ($widget == $add_widgets->{dirsel}) {
- my $dir = yui::YUI::app()->askForExistingDirectory(home(),
- $radios_infos{$radios_names_ordered[$sel]}->{url}
- );
- $add_widgets->{url}->setValue($dir) if ($dir);
- }
- }
- }
- }
- }
-### End ###
-
- $dialog->destroy();
-
- #restore old application title
- yui::YUI::app()->setApplicationTitle($appTitle) if $appTitle;
-
- return $retVal;
-
-}
-
-sub options_callback() {
-
- my $appTitle = yui::YUI::app()->applicationTitle();
- ## set new title to get it in dialog
- yui::YUI::app()->setApplicationTitle($loc->N("Global options for package installation"));
-
- my $factory = yui::YUI::widgetFactory;
-
- my $dialog = $factory->createPopupDialog();
- my $minSize = $factory->createMinSize( $dialog, 50, 5 );
- my $vbox = $factory->createVBox( $minSize );
-
- my $hbox = $factory->createHBox($vbox);
- $factory->createHSpacing($hbox, 1.0);
- my $label = $factory->createLabel($hbox, $loc->N("Verify RPMs to be installed:") );
- $factory->createHSpacing($hbox, 3.5);
- my $verify_rpm = $factory->createComboBox($hbox, "", 0);
- $verify_rpm->setWeight($yui::YD_HORIZ, 2);
- my @verif = ($loc->N("never"), $loc->N("always"));
- my $verify_rpm_value = $urpm->{global_config}{'verify-rpm'} || 0;
-
- my $itemColl = new yui::YItemCollection;
- my $cnt = 0;
- foreach my $elem (@verif) {
- my $it = new yui::YItem($elem, 0);
- if ($cnt == $verify_rpm_value) {
- $it->setSelected(1);
- }
- $itemColl->push($it);
- $it->DISOWN();
- $cnt++;
- }
- $verify_rpm->addItems($itemColl);
-
- $hbox = $factory->createHBox($vbox);
- $factory->createHSpacing($hbox, 1.0);
- $label = $factory->createLabel($hbox, $loc->N("Download program to use:") );
- $factory->createHSpacing($hbox, 4.0);
- my $downloader_entry = $factory->createComboBox($hbox, "", 0);
- $downloader_entry->setWeight($yui::YD_HORIZ, 2);
-
- my @comboList = urpm::download::available_ftp_http_downloaders() ;
- my $downloader = $urpm->{global_config}{downloader} || $comboList[0];
-
- if (scalar(@comboList) > 0) {
- $itemColl = new yui::YItemCollection;
- foreach my $elem (@comboList) {
- my $it = new yui::YItem($elem, 0);
- if ($elem eq $downloader) {
- $it->setSelected(1);
- }
- $itemColl->push($it);
- $it->DISOWN();
- }
- $downloader_entry->addItems($itemColl);
- }
-
- $hbox = $factory->createHBox($vbox);
- $factory->createHSpacing($hbox, 1.0);
- $label = $factory->createLabel($hbox, $loc->N("XML meta-data download policy:") );
- my $xml_info_policy = $factory->createComboBox($hbox, "", 0);
- $xml_info_policy->setWeight($yui::YD_HORIZ, 2);
-
- my @xml_info_policies = ('', 'never', 'on-demand', 'update-only', 'always');
- my @xml_info_policiesL = ('', $loc->N("Never"), $loc->N("On-demand"), $loc->N("Update-only"), $loc->N("Always"));
- my $xml_info_policy_value = $urpm->{global_config}{'xml-info'};
-
- $itemColl = new yui::YItemCollection;
- $cnt = 0;
- foreach my $elem (@xml_info_policiesL) {
- my $it = new yui::YItem($elem, 0);
- if ($xml_info_policy_value && $xml_info_policy_value eq $xml_info_policies[$cnt]) {
- $it->setSelected(1);
- }
- $itemColl->push($it);
- $it->DISOWN();
- $cnt++;
- }
- $xml_info_policy->addItems($itemColl);
-
- ### TODO tips ###
- #tip =>
- #join("\n",
- #$loc->N("For remote media, specify when XML meta-data (file lists, changelogs & information) are downloaded."),
- #'',
- #$loc->N("Never"),
- #$loc->N("For remote media, XML meta-data are never downloaded."),
- #'',
- #$loc->N("On-demand"),
- #$loc->N("(This is the default)"),
- #$loc->N("The specific XML info file is downloaded when clicking on package."),
- #'',
- #$loc->N("Update-only"),
- #$loc->N("Updating media implies updating XML info files already required at least once."),
- #'',
- #$loc->N("Always"),
- #$loc->N("All XML info files are downloaded when adding or updating media."),
-
- $factory->createVSpacing($vbox, 0.5);
-
-
- ### last line buttons
- $factory->createVSpacing($vbox, 0.5);
- $hbox = $factory->createHBox($vbox);
- my $cancelButton = $factory->createPushButton($hbox, $loc->N("&Cancel"));
- $factory->createHSpacing($hbox, 3.0);
- my $okButton = $factory->createPushButton($hbox, $loc->N("&Ok"));
-
- $cancelButton->setDefaultButton(1);
-
- # dialog event loop
- while(1) {
- my $event = $dialog->waitForEvent();
- my $eventType = $event->eventType();
-
- #event type checking
- if ($eventType == $yui::YEvent::CancelEvent) {
- last;
- }
- elsif ($eventType == $yui::YEvent::WidgetEvent) {
- ### widget
- my $widget = $event->widget();
- if ($widget == $cancelButton) {
- last;
- }
- elsif ($widget == $okButton) {
- my $changed = 0;
- my $item = $verify_rpm->selectedItem();
- if ($item->index() != $verify_rpm_value) {
- $changed = 1;
- $urpm->{global_config}{'verify-rpm'} = $item->index();
- }
- $item = $downloader_entry->selectedItem();
- if ($item->label() ne $downloader) {
- $changed = 1;
- $urpm->{global_config}{downloader} = $item->label();
- }
- $item = $xml_info_policy->selectedItem();
- if ($xml_info_policies[$item->index()] ne $xml_info_policy_value) {
- $changed = 1;
- $urpm->{global_config}{'xml-info'} = $xml_info_policies[$item->index()];
- }
- if ($changed) {
- urpm::media::write_config($urpm);
- $urpm = fast_open_urpmi_db();
- }
-
- last;
- }
- }
- }
-
- ### End ###
-
- $dialog->destroy();
-
- #restore old application title
- yui::YUI::app()->setApplicationTitle($appTitle) if $appTitle;
-
-}
-
-#=============================================================
-
-=head2 remove_callback
-
-=head3 INPUT
-
-$selection: YItemCollection (selected items)
-
-
-=head3 DESCRIPTION
-
-Remove the selected medias
-
-=cut
-
-#=============================================================
-
-sub remove_callback {
- my $selection = shift;
-
- my @rows;
- for (my $it = 0; $it < $selection->size(); $it++) {
- my $item = $selection->get($it);
- push @rows, $item->index();
- }
- @rows == 0 and return 0;
- interactive_msg(
- $loc->N("Source Removal"),
- @rows == 1 ?
- $loc->N("Are you sure you want to remove source \"%s\"?", $urpm->{media}[$rows[0]]{name}) :
- $loc->N("Are you sure you want to remove the following sources?") . "\n\n" .
- format_list(map { $urpm->{media}[$_]{name} } @rows),
- yesno => 1, scroll => 1,
- ) or return 0;
-
- my $wait = wait_msg($loc->N("Please wait, removing medium..."));
- foreach my $row (reverse(@rows)) {
- $something_changed = 1;
- urpm::media::remove_media($urpm, [ $urpm->{media}[$row] ]);
- }
- urpm::media::write_urpmi_cfg($urpm);
- remove_wait_msg($wait);
-
- return 1;
-}
-
-
-#=============================================================
-
-=head2 upwards_callback
-
-=head3 INPUT
-
-$table: Mirror table (YTable)
-
-=head3 DESCRIPTION
-
-Move selected item to high priority level
-
-=cut
-
-#=============================================================
-sub upwards_callback {
- my $table = shift;
-
- ## get the first
- my $item = $table->selectedItem();
- !$item and return 0;
- return 0 if ($item->index() == 0);
- my $row = $item->index();
- my @media = ( $urpm->{media}[$row-1], $urpm->{media}[$row]);
- $urpm->{media}[$row] = $media[0];
- $urpm->{media}[$row-1] = $media[1];
-
- urpm::media::write_config($urpm);
- $urpm = fast_open_urpmi_db();
- return $row - 1;
-}
-
-#=============================================================
-
-=head2 downwards_callback
-
-=head3 INPUT
-
-$table: Mirror table (YTable)
-
-=head3 DESCRIPTION
-
-Move selected item to low priority level
-
-=cut
-
-#=============================================================
-sub downwards_callback {
- my $table = shift;
-
- ## get the first
- my $item = $table->selectedItem();
- !$item and return 0;
- my $row = $item->index();
- return $row if ($row >= $table->itemsCount()-1);
-
- my @media = ( $urpm->{media}[$row], $urpm->{media}[$row+1]);
- $urpm->{media}[$row+1] = $media[0];
- $urpm->{media}[$row] = $media[1];
-
- urpm::media::write_config($urpm);
- $urpm = fast_open_urpmi_db();
- return $row + 1;
-}
-
-#- returns 1 if something changed to force readMedia()
-sub edit_callback {
- my $table = shift;
-
- my $changed = 0;
- ## get the first
- my $item = $table->selectedItem();
- !$item and return 0;
- my $row = $item->index();
-
- my $medium = $urpm->{media}[$row];
- my $config = urpm::cfg::load_config_raw($urpm->{config}, 1);
- my ($verbatim_medium) = grep { $medium->{name} eq $_->{name} } @$config;
-
- my $appTitle = yui::YUI::app()->applicationTitle();
- ## set new title to get it in dialog
- yui::YUI::app()->setApplicationTitle($loc->N("Edit a medium"));
-
- my $factory = yui::YUI::widgetFactory;
-
- my $dialog = $factory->createPopupDialog();
- my $minSize = $factory->createMinSize( $dialog, 80, 5 );
- my $vbox = $factory->createVBox( $minSize );
-
- my $hbox = $factory->createHBox( $factory->createLeft($vbox) );
- $factory->createHeading($hbox, $loc->N("Editing medium \"%s\":", $medium->{name}));
- $factory->createVSpacing($vbox, 1.0);
-
- $hbox = $factory->createHBox($vbox);
- $factory->createHSpacing($hbox, 1.0);
- my $label = $factory->createLabel($hbox, $loc->N("URL:"));
- my $url_entry = $factory->createInputField($hbox, "", 0);
- $url_entry->setWeight($yui::YD_HORIZ, 2);
- $url_entry->setValue($verbatim_medium->{url} || $verbatim_medium->{mirrorlist});
-
- $hbox = $factory->createHBox($vbox);
- $factory->createHSpacing($hbox, 1.0);
- $label = $factory->createLabel($hbox, $loc->N("Downloader:") );
- my $downloader_entry = $factory->createComboBox($hbox, "", 0);
- $downloader_entry->setWeight($yui::YD_HORIZ, 2);
-
- my @comboList = urpm::download::available_ftp_http_downloaders() ;
- my $downloader = $verbatim_medium->{downloader} || $urpm->{global_config}{downloader} || $comboList[0];
-
- if (scalar(@comboList) > 0) {
- my $itemColl = new yui::YItemCollection;
- foreach my $elem (@comboList) {
- my $it = new yui::YItem($elem, 0);
- if ($elem eq $downloader) {
- $it->setSelected(1);
- }
- $itemColl->push($it);
- $it->DISOWN();
- }
- $downloader_entry->addItems($itemColl);
- }
- $factory->createVSpacing($vbox, 0.5);
-
- my $url = $url_entry->value();
-
- $hbox = $factory->createHBox($factory->createLeft($vbox));
- $factory->createHSpacing($hbox, 1.0);
-
- my $tableItem = yui::toYTableItem($item);
- # enabled cell 0, updates cell 1
- my $cellEnabled = $tableItem->cell(0)->label() ? 1 : 0;
- my $enabled = $factory->createCheckBox($hbox, $loc->N("Enabled"), $cellEnabled);
- my $cellUpdates = $tableItem->cell(1)->label() ? 1 : 0;
- my $update = $factory->createCheckBox($hbox, $loc->N("Updates"), $cellUpdates);
- $update->setDisabled() if (!$::expert);
-
- $factory->createVSpacing($vbox, 0.5);
- $hbox = $factory->createHBox($vbox);
- my $cancelButton = $factory->createPushButton($hbox, $loc->N("&Cancel"));
- $factory->createHSpacing($hbox, 3.0);
- my $saveButton = $factory->createPushButton($hbox, $loc->N("&OK"));
- $factory->createHSpacing($hbox, 3.0);
- my $proxyButton = $factory->createPushButton($hbox, $loc->N("&Proxy..."));
-
- $cancelButton->setDefaultButton(1);
-
- # dialog event loop
- while(1) {
- my $event = $dialog->waitForEvent();
- my $eventType = $event->eventType();
-
- #event type checking
- if ($eventType == $yui::YEvent::CancelEvent) {
- last;
- }
- elsif ($eventType == $yui::YEvent::WidgetEvent) {
- ### widget
- my $widget = $event->widget();
- if ($widget == $cancelButton) {
- last;
- }
- elsif ($widget == $saveButton) {
- if ($cellEnabled != $enabled->value()) {
- $urpm->{media}[$row]{ignore} = !$urpm->{media}[$row]{ignore} || undef;
- $changed = 1;
- }
- if ($cellUpdates != $update->value()) {
- $urpm->{media}[$row]{update} = !$urpm->{media}[$row]{update} || undef;
- $changed = 1;
- }
- if ( $changed ) {
- urpm::media::write_config($urpm);
- }
-
- my ($m_name, $m_update) = map { $medium->{$_} } qw(name update);
- # TODO check if really changed first
- $url = $url_entry->value();
- $downloader = $downloader_entry->value();
- $url =~ m|^removable://| and (
- interactive_msg(
- $loc->N("You need to insert the medium to continue"),
- $loc->N("In order to save the changes, you need to insert the medium in the drive."),
- yesno => 1, text => { yes => $loc->N("Ok"), no => $loc->N("Cancel") }
- ) or return 0
- );
- my $saved_proxy = urpm::download::get_proxy($m_name);
- undef $saved_proxy if !defined $saved_proxy->{http_proxy} && !defined $saved_proxy->{ftp_proxy};
- urpm::media::select_media($urpm, $m_name);
- if (my ($media) = grep { $_->{name} eq $m_name } @{$urpm->{media}}) {
- MDK::Common::DataStructure::put_in_hash($media, {
- ($verbatim_medium->{mirrorlist} ? 'mirrorlist' : 'url') => $url,
- name => $m_name,
- if_($m_update && $m_update ne $media->{update} || $m_update, update => $m_update),
- if_($saved_proxy && $saved_proxy ne $media->{proxy} || $saved_proxy, proxy => $saved_proxy),
- if_($downloader ne $media->{downloader} || $downloader, downloader => $downloader),
- modified => 1,
- });
- urpm::media::write_config($urpm);
- update_sources_noninteractive($urpm, [ $m_name ]);
- } else {
- urpm::media::remove_selected_media($urpm);
- add_medium_and_check($urpm, { nolock => 1, proxy => $saved_proxy }, $m_name, $url, undef, update => $m_update, if_($downloader, downloader => $downloader));
- }
- last;
- }
- elsif ($widget == $proxyButton) {
- proxy_callback($medium);
- }
- }
- }
-### End ###
-
- $dialog->destroy();
-
- #restore old application title
- yui::YUI::app()->setApplicationTitle($appTitle) if $appTitle;
-
- return $changed;
-}
-
-sub update_callback() {
- update_sources_interactive($urpm, transient => $::main_window, nolock => 1);
-}
-
-#=============================================================
-
-=head2 proxy_callback
-
-=head3 INPUT
-
-$medium: the medium which proxy is going to be modified
-
-=head3 DESCRIPTION
-
-Set or change the proxy settings for the given media.
-Note that Ok button saves the changes.
-
-=cut
-
-#=============================================================
-sub proxy_callback {
- my ($medium) = @_;
- my $medium_name = $medium ? $medium->{name} : '';
-
- my ($proxy, $proxy_user) = readproxy($medium_name);
- my ($user, $pass) = $proxy_user =~ /^([^:]*):(.*)$/;
-
- my $appTitle = yui::YUI::app()->applicationTitle();
- ## set new title to get it in dialog
- yui::YUI::app()->setApplicationTitle($loc->N("Configure proxies"));
-
- my $factory = yui::YUI::widgetFactory;
-
- my $dialog = $factory->createPopupDialog();
- my $minSize = $factory->createMinSize( $dialog, 80, 5 );
- my $vbox = $factory->createVBox( $minSize );
-
- my $hbox = $factory->createHBox( $factory->createLeft($vbox) );
- $factory->createHeading($hbox,
- $medium_name
- ? $loc->N("Proxy settings for media \"%s\"", $medium_name)
- : $loc->N("Global proxy settings"));
- $factory->createVSpacing($vbox, 0.5);
-
- $hbox = $factory->createHBox($vbox);
- $factory->createHSpacing($hbox, 1.0);
- my $label = $factory->createLabel($hbox, $loc->N("If you need a proxy, enter the hostname and an optional port (syntax: <proxyhost[:port]>):"));
- $factory->createVSpacing($vbox, 0.5);
-
- my ($proxybutton, $proxyentry, $proxyuserbutton, $proxyuserentry, $proxypasswordentry);
-
- $hbox = $factory->createHBox($factory->createLeft($vbox));
- $proxybutton = $factory->createCheckBoxFrame($hbox, $loc->N("Enable proxy"), 1);
- my $frm_vbox = $factory->createVBox( $proxybutton );
- my $align = $factory->createRight($frm_vbox);
- $hbox = $factory->createHBox($align);
- $label = $factory->createLabel($hbox, $loc->N("Proxy hostname:") );
- $proxyentry = $factory->createInputField($hbox, "", 0);
- $label->setWeight($yui::YD_HORIZ, 1);
- $proxyentry->setWeight($yui::YD_HORIZ, 2);
- $proxyuserbutton = $factory->createCheckBoxFrame($factory->createLeft($frm_vbox),
- $loc->N("You may specify a username/password for the proxy authentication:"), 1);
- $proxyentry->setValue($proxy) if $proxy;
-
- $frm_vbox = $factory->createVBox( $proxyuserbutton );
-
- ## proxy user name
- $align = $factory->createRight($frm_vbox);
- $hbox = $factory->createHBox($align);
- $label = $factory->createLabel($hbox, $loc->N("User:") );
- $proxyuserentry = $factory->createInputField($hbox, "", 0);
- $label->setWeight($yui::YD_HORIZ, 1);
- $proxyuserentry->setWeight($yui::YD_HORIZ, 2);
- $proxyuserentry->setValue($user) if $user;
-
- ## proxy user password
- $align = $factory->createRight($frm_vbox);
- $hbox = $factory->createHBox($align);
- $label = $factory->createLabel($hbox, $loc->N("Password:") );
- $proxypasswordentry = $factory->createInputField($hbox, "", 1);
- $label->setWeight($yui::YD_HORIZ, 1);
- $proxypasswordentry->setWeight($yui::YD_HORIZ, 2);
- $proxypasswordentry->setValue($pass) if $pass;
-
- $proxyuserbutton->setValue ($proxy_user ? 1 : 0);
- $proxybutton->setValue ($proxy ? 1 : 0);
-
- # dialog low level buttons
- $factory->createVSpacing($vbox, 0.5);
- $hbox = $factory->createHBox($vbox);
- my $okButton = $factory->createPushButton($hbox, $loc->N("&Ok"));
- $factory->createHSpacing($hbox, 3.0);
- my $cancelButton = $factory->createPushButton($hbox, $loc->N("&Cancel"));
-
- $cancelButton->setDefaultButton(1);
-
- # dialog event loop
- while(1) {
- my $event = $dialog->waitForEvent();
- my $eventType = $event->eventType();
-
- #event type checking
- if ($eventType == $yui::YEvent::CancelEvent) {
- last;
- }
- elsif ($eventType == $yui::YEvent::WidgetEvent) {
- ### widget
- my $widget = $event->widget();
- if ($widget == $cancelButton) {
- last;
- }
- elsif ($widget == $okButton) {
- $proxy = $proxybutton->value() ? $proxyentry->value() : '';
- $proxy_user = $proxyuserbutton->value()
- ? ($proxyuserentry->value() . ':' . $proxypasswordentry->value()) : '';
-
- writeproxy($proxy, $proxy_user, $medium_name);
- last;
- }
- }
- }
-
-### End ###
- $dialog->destroy();
-
- #restore old application title
- yui::YUI::app()->setApplicationTitle($appTitle) if $appTitle;
-
-}
-
-sub parallel_read_sysconf() {
- my @conf;
- foreach (MDK::Common::File::cat_('/etc/urpmi/parallel.cfg')) {
- my ($name, $protocol, $command) = /([^:]+):([^:]+):(.*)/ or print STDERR "Warning, unrecognized line in /etc/urpmi/parallel.cfg:\n$_";
- my $medias = $protocol =~ s/\(([^\)]+)\)$// ? [ split /,/, $1 ] : [];
- push @conf, { name => $name, protocol => $protocol, medias => $medias, command => $command };
- }
- \@conf;
-}
-
-sub parallel_write_sysconf {
- my ($conf) = @_;
- output '/etc/urpmi/parallel.cfg',
- map { my $m = @{$_->{medias}} ? '(' . join(',', @{$_->{medias}}) . ')' : '';
- "$_->{name}:$_->{protocol}$m:$_->{command}\n" } @$conf;
-}
-
-sub remove_parallel {
- my ($num, $conf) = @_;
- if ($num != -1) {
- splice @$conf, $num, 1;
- parallel_write_sysconf($conf);
- }
-}
-
-sub add_callback_ {
- my ($title, $label, $mainw, $widget, $get_value, $check) = @_;
- my $w = ugtk2->new($title, grab => 1, transient => $mainw->{real_window});
- local $::main_window = $w->{real_window};
- gtkadd(
- $w->{window},
- gtkpack__(
- gtknew('VBox', spacing => 5),
- gtknew('Label', text => $label),
- $widget,
- gtknew('HSeparator'),
- gtkpack(
- gtknew('HButtonBox'),
- gtknew('Button', text => $loc->N("Ok"), clicked => sub { $w->{retval} = 1; $get_value->(); Gtk2->main_quit }),
- gtknew('Button', text => $loc->N("Cancel"), clicked => sub { $w->{retval} = 0; Gtk2->main_quit })
- )
- )
- );
- $check->() if $w->main;
-}
-
-sub edit_parallel {
- my ($num, $conf) = @_;
- my $edited = $num == -1 ? {} : $conf->[$num];
- my $w = ugtk2->new($num == -1 ? $loc->N("Add a parallel group") : $loc->N("Edit a parallel group"), grab => 1, center => 1, transient => $::main_window);
- local $::main_window = $w->{real_window};
- my $name_entry;
-
- my ($medias_ls, $hosts_ls) = (Gtk2::ListStore->new("Glib::String"), Gtk2::ListStore->new("Glib::String"));
-
- my ($medias, $hosts) = map {
- my $list = Gtk2::TreeView->new_with_model($_);
- $list->append_column(Gtk2::TreeViewColumn->new_with_attributes(undef, Gtk2::CellRendererText->new, 'text' => 0));
- $list->set_headers_visible(0);
- $list->get_selection->set_mode('browse');
- $list;
- } $medias_ls, $hosts_ls;
-
- $medias_ls->append_set([ 0 => $_ ]) foreach @{$edited->{medias}};
-
- my $add_media = sub {
- my $medias_list_ls = Gtk2::ListStore->new("Glib::String");
- my $medias_list = Gtk2::TreeView->new_with_model($medias_list_ls);
- $medias_list->append_column(Gtk2::TreeViewColumn->new_with_attributes(undef, Gtk2::CellRendererText->new, 'text' => 0));
- $medias_list->set_headers_visible(0);
- $medias_list->get_selection->set_mode('browse');
- $medias_list_ls->append_set([ 0 => $_->{name} ]) foreach @{$urpm->{media}};
- my $sel;
- add_callback_($loc->N("Add a medium limit"), $loc->N("Choose a medium to add to the media limit:"),
- $w, $medias_list, sub { $sel = selrow($medias_list) },
- sub {
- return if $sel == -1;
- my $media = ${$urpm->{media}}[$sel]{name};
- $medias_ls->append_set([ 0 => $media ]);
- push @{$edited->{medias}}, $media;
- }
- );
- };
-
- my $hosts_list;
- if ($edited->{protocol} eq 'ssh') { $hosts_list = [ split /:/, $edited->{command} ] }
- elsif ($edited->{protocol} eq 'ka-run') { push @$hosts_list, $1 while $edited->{command} =~ /-m (\S+)/g }
- $hosts_ls->append_set([ 0 => $_ ]) foreach @$hosts_list;
- my $add_host = sub {
- my ($entry, $value);
- add_callback_($loc->N("Add a host"), $loc->N("Type in the hostname or IP address of the host to add:"),
- $mainw, $entry = gtkentry(), sub { $value = $entry->get_text },
- sub { $hosts_ls->append_set([ 0 => $value ]); push @$hosts_list, $value }
- );
- };
-
- my @protocols_names = qw(ka-run ssh);
- my @protocols;
- gtkadd(
- $w->{window},
- gtkpack_(
- gtknew('VBox', spacing => 5),
- if_(
- $num != -1,
- 0, gtknew('Label', text => $loc->N("Editing parallel group \"%s\":", $edited->{name}))
- ),
- 1, create_packtable(
- {},
- [ $loc->N("Group name:"), $name_entry = gtkentry($edited->{name}) ],
- [ $loc->N("Protocol:"), gtknew('HBox', children_tight => [
- @protocols = gtkradio($edited->{protocol}, @protocols_names) ]) ],
- [ $loc->N("Media limit:"),
- gtknew('HBox', spacing => 5, children => [
- 1, gtknew('Frame', shadow_type => 'in', child =>
- gtknew('ScrolledWindow', h_policy => 'never', child => $medias)),
- 0, gtknew('VBox', children_tight => [
- gtksignal_connect(Gtk2::Button->new(but($loc->N("Add"))), clicked => sub { $add_media->() }),
- gtksignal_connect(Gtk2::Button->new(but($loc->N("Remove"))), clicked => sub {
- remove_from_list($medias, $edited->{medias}, $medias_ls);
- }) ]) ]) ],
- [ $loc->N("Hosts:"),
- gtknew('HBox', spacing => 5, children => [
- 1, gtknew('Frame', shadow_type => 'in', child =>
- gtknew('ScrolledWindow', h_policy => 'never', child => $hosts)),
- 0, gtknew('VBox', children_tight => [
- gtksignal_connect(Gtk2::Button->new(but($loc->N("Add"))), clicked => sub { $add_host->() }),
- gtksignal_connect(Gtk2::Button->new(but($loc->N("Remove"))), clicked => sub {
- remove_from_list($hosts, $hosts_list, $hosts_ls);
- }) ]) ]) ]
- ),
- 0, gtknew('HSeparator'),
- 0, gtkpack(
- gtknew('HButtonBox'),
- gtksignal_connect(
- gtknew('Button', text => $loc->N("Ok")), clicked => sub {
- $w->{retval} = 1;
- $edited->{name} = $name_entry->get_text;
- mapn { $_[0]->get_active and $edited->{protocol} = $_[1] } \@protocols, \@protocols_names;
- Gtk2->main_quit;
- }
- ),
- gtknew('Button', text => $loc->N("Cancel"), clicked => sub { $w->{retval} = 0; Gtk2->main_quit }))
- )
- );
- $w->{rwindow}->set_size_request(600, -1);
- if ($w->main) {
- $num == -1 and push @$conf, $edited;
- if ($edited->{protocol} eq 'ssh') { $edited->{command} = join(':', @$hosts_list) }
- if ($edited->{protocol} eq 'ka-run') { $edited->{command} = "-c ssh " . join(' ', map { "-m $_" } @$hosts_list) }
- parallel_write_sysconf($conf);
- return 1;
- }
- return 0;
-}
-
-sub parallel_callback() {
- my $w = ugtk2->new($loc->N("Configure parallel urpmi (distributed execution of urpmi)"), grab => 1, center => 1, transient => $mainw->{real_window});
- local $::main_window = $w->{real_window};
- my $list_ls = Gtk2::ListStore->new("Glib::String", "Glib::String", "Glib::String", "Glib::String");
- my $list = Gtk2::TreeView->new_with_model($list_ls);
- each_index { $list->append_column(Gtk2::TreeViewColumn->new_with_attributes($_, Gtk2::CellRendererText->new, 'text' => $::i)) } $loc->N("Group"), $loc->N("Protocol"), $loc->N("Media limit");
- $list->append_column(my $commandcol = Gtk2::TreeViewColumn->new_with_attributes($loc->N("Command"), Gtk2::CellRendererText->new, 'text' => 3));
- $commandcol->set_max_width(200);
-
- my $conf;
- my $reread = sub {
- $list_ls->clear;
- $conf = parallel_read_sysconf();
- foreach (@$conf) {
- $list_ls->append_set([ 0 => $_->{name},
- 1 => $_->{protocol},
- 2 => @{$_->{medias}} ? join(', ', @{$_->{medias}}) : $loc->N("(none)"),
- 3 => $_->{command} ]);
- }
- };
- $reread->();
-
- gtkadd(
- $w->{window},
- gtkpack_(
- gtknew('VBox', spacing => 5),
- 1, gtkpack_(
- gtknew('HBox', spacing => 10),
- 1, $list,
- 0, gtkpack__(
- gtknew('VBox', spacing => 5),
- gtksignal_connect(
- Gtk2::Button->new(but($loc->N("Remove"))),
- clicked => sub { remove_parallel(selrow($list), $conf); $reread->() },
- ),
- gtksignal_connect(
- Gtk2::Button->new(but($loc->N("Edit..."))),
- clicked => sub {
- my $row = selrow($list);
- $row != -1 and edit_parallel($row, $conf);
- $reread->();
- },
- ),
- gtksignal_connect(
- Gtk2::Button->new(but($loc->N("Add..."))),
- clicked => sub { edit_parallel(-1, $conf) and $reread->() },
- )
- )
- ),
- 0, gtknew('HSeparator'),
- 0, gtkpack(
- gtknew('HButtonBox'),
- gtknew('Button', text => $loc->N("Ok"), clicked => sub { Gtk2->main_quit })
- )
- )
- );
- $w->main;
-}
-
-sub keys_callback() {
- my $changed = 0;
- my $appTitle = yui::YUI::app()->applicationTitle();
-
- ## set new title to get it in dialog
- yui::YUI::app()->setApplicationTitle($loc->N("Manage keys for digital signatures of packages"));
-
- my $factory = yui::YUI::widgetFactory;
-
- my $dialog = $factory->createPopupDialog();
- my $minSize = $factory->createMinSize( $dialog, 80, 20 );
- my $vbox = $factory->createVBox( $minSize );
-
- my $hbox_headbar = $factory->createHBox($vbox);
- my $head_align_left = $factory->createLeft($hbox_headbar);
- my $head_align_right = $factory->createRight($hbox_headbar);
- my $headbar = $factory->createHBox($head_align_left);
- my $headRight = $factory->createHBox($head_align_right);
-
-
- my $hbox_content = $factory->createHBox($vbox);
- my $leftContent = $factory->createLeft($hbox_content);
- $leftContent->setWeight($yui::YD_HORIZ,3);
-
- my $frame = $factory->createFrame ($leftContent, "");
-
- my $frmVbox = $factory->createVBox( $frame );
- my $hbox = $factory->createHBox( $frmVbox );
-
- ## media list
- my $yTableHeader = new yui::YTableHeader();
- $yTableHeader->addColumn($loc->N("Medium"), $yui::YAlignBegin);
- my $multiselection = 0;
- my $mediaTbl = $factory->createTable($hbox, $yTableHeader, $multiselection);
- $mediaTbl->setKeepSorting(1);
- $mediaTbl->setImmediateMode(1);
-
- my $itemColl = new yui::YItemCollection;
- foreach (@{$urpm->{media}}) {
- my $name = $_->{name};
-
- my $item = new yui::YTableItem ($name);
- # NOTE row is $item->index()
- $item->setLabel( $name );
- $itemColl->push($item);
- $item->DISOWN();
- }
- $mediaTbl->addItems($itemColl);
-
- ## key list
- $leftContent = $factory->createLeft($hbox_content);
- $leftContent->setWeight($yui::YD_HORIZ,3);
- $frame = $factory->createFrame ($leftContent, "");
- $frmVbox = $factory->createVBox( $frame );
- $hbox = $factory->createHBox( $frmVbox );
- $yTableHeader = new yui::YTableHeader();
- $yTableHeader->addColumn($loc->N("Keys"), $yui::YAlignBegin);
- $multiselection = 0;
- my $keyTbl = $factory->createTable($hbox, $yTableHeader, $multiselection);
- $keyTbl->setKeepSorting(1);
-
- my ($current_medium, $current_medium_nb, @keys);
-
- ### internal subroutines
- my $read_conf = sub {
- $urpm->parse_pubkeys(root => $urpm->{root});
- @keys = map { [ split /[,\s]+/, ($_->{'key-ids'} || '') ] } @{$urpm->{media}};
- };
-
- my $write = sub {
- $something_changed = 1;
- urpm::media::write_config($urpm);
- $urpm = fast_open_urpmi_db();
- $read_conf->();
- };
-
- $read_conf->();
-
- my $key_name = sub {
- exists $urpm->{keys}{$_[0]} ? $urpm->{keys}{$_[0]}{name}
- : $loc->N("no name found, key doesn't exist in rpm keyring!");
- };
-
- my $sel_changed = sub {
- my $item = $mediaTbl->selectedItem();
- if ($item) {
- $current_medium = $item->label();
- $current_medium_nb = $item->index();
-
- yui::YUI::app()->busyCursor();
- yui::YUI::ui()->blockEvents();
- $dialog->startMultipleChanges();
-
- $keyTbl->deleteAllItems();
- my $itemColl = new yui::YItemCollection;
- foreach ( @{$keys[$current_medium_nb]} ) {
- my $it = new yui::YTableItem (sprintf("%s (%s)", $_, $key_name->($_)));
- # NOTE row is $item->index()
- $it->setLabel( $_ );
- $itemColl->push($it);
- $it->DISOWN();
- }
- $keyTbl->addItems($itemColl);
-
- $dialog->recalcLayout();
- $dialog->doneMultipleChanges();
- yui::YUI::ui()->unblockEvents();
- yui::YUI::app()->normalCursor();
- }
- };
-
- my $add_key = sub {
- my $sh_gui = ManaTools::Shared::GUI->new();
- my $item = $mediaTbl->selectedItem();
- if ($item) {
- $current_medium = $item->label();
- $current_medium_nb = $item->index();
- my @list;
- my %key;
- foreach (keys %{$urpm->{keys}}) {
- my $k = sprintf("%s (%s)", $_, $key_name->($_));
- $key{$k} = $_;
- push @list, $k;
- }
-
- my $choice = $sh_gui->ask_fromList({
- title => $loc->N("Add a key"),
- header => $loc->N("Choose a key to add to the medium %s", $current_medium),
- list => \@list,
- });
- if ($choice) {
- my $k = $key{$choice};
- $urpm->{media}[$current_medium_nb]{'key-ids'} = join(',', sort(uniq(@{$keys[$current_medium_nb]}, $k)));
- $write->();
- return 1;
- }
- }
- return 0;
- };
-
- my $remove_key = sub {
- my $sh_gui = ManaTools::Shared::GUI->new();
- my $keyItem = $keyTbl->selectedItem();
- my $mediaItem = $mediaTbl->selectedItem();
- if ($keyItem && $mediaItem) {
- $current_medium = $mediaItem->label();
- $current_medium_nb = $mediaItem->index();
- my $current_key = $keyItem->label();
- my $current_keyVal = yui::toYTableItem($keyItem)->cell(0)->label();
- my $choice = $sh_gui->ask_YesOrNo({
- title => $loc->N("Remove a key"),
- text => $loc->N("Are you sure you want to remove the key <br>%s<br> from medium %s?<br>(name of the key: %s)",
- $current_keyVal, $current_medium, $current_key
- ),
- richtext => 1,
- });
- if ($choice) {
- $urpm->{media}[$current_medium_nb]{'key-ids'} = join(',',
- difference2(\@{$keys[$current_medium_nb]}, [ $current_key ])
- );
- $write->();
- return 1;
- }
- }
-
- return 0;
-
- };
-
-
- #### end subroutines
- $sel_changed->();
-
- my $rightContent = $factory->createRight($hbox_content);
- $rightContent->setWeight($yui::YD_HORIZ,1);
- my $topContent = $factory->createTop($rightContent);
- my $vbox_commands = $factory->createVBox($topContent);
- $factory->createVSpacing($vbox_commands, 1.0);
- my $addButton = $factory->createPushButton($factory->createHBox($vbox_commands), $loc->N("Add"));
- my $remButton = $factory->createPushButton($factory->createHBox($vbox_commands), $loc->N("Remove"));
-
- # dialog buttons
- $factory->createVSpacing($vbox, 1.0);
- $hbox = $factory->createHBox( $vbox );
-
- ### Close button
- my $closeButton = $factory->createPushButton($hbox, $loc->N("&Quit") );
-
- ### dialog event loop
- while(1) {
- my $event = $dialog->waitForEvent();
- my $eventType = $event->eventType();
- my $changed = 0;
- my $selection_changed = 0;
-
- #event type checking
- if ($eventType == $yui::YEvent::CancelEvent) {
- last;
- }
- elsif ($eventType == $yui::YEvent::WidgetEvent) {
- # widget selected
- my $widget = $event->widget();
- my $wEvent = yui::toYWidgetEvent($event);
-
- if ($widget == $closeButton) {
- last;
- }
- elsif ($widget == $addButton) {
- $changed = $add_key->();
- $sel_changed->() if $changed;
- }
- elsif ($widget == $remButton) {
- $changed = $remove_key->();
- $sel_changed->() if $changed;
- }
- elsif ($widget == $mediaTbl) {
- $sel_changed->();
- }
- }
- }
-
- $dialog->destroy();
-
- #restore old application title
- yui::YUI::app()->setApplicationTitle($appTitle) if $appTitle;
-
- return $changed;
-}
-
-#=============================================================
-
-=head2 readMedia
-
-=head3 INPUT
-
-$name: optional parameter, the media called name has to be
- updated
-
-=head3 OUTPUT
-
-$itemColl: yui::YItemCollection containing media data to
- be added to the YTable
-
-=head3 DESCRIPTION
-
-This method reads the configured media and add their info
-to the collection
-
-=cut
-
-#=============================================================
-sub readMedia {
- my ($name) = @_;
- if (defined $name) {
- urpm::media::select_media($urpm, $name);
- update_sources_check(
- $urpm,
- { nolock => 1 },
- $loc->N_("Unable to update medium, errors reported:\n\n%s"),
- $name,
- );
- }
- # reread configuration after updating media else ignore bit will be restored
- # by urpm::media::check_existing_medium():
- $urpm = fast_open_urpmi_db();
-
- my $itemColl = new yui::YItemCollection;
- foreach (grep { ! $_->{external} } @{$urpm->{media}}) {
- my $name = $_->{name};
-
- my $item = new yui::YTableItem (($_->{ignore} ? "" : "X"),
- ($_->{update} ? "X" : ""),
- get_medium_type($_),
- $name);
- ## NOTE anaselli: next lines add check icon to cells, but they are 8x8, a dimension should
- ## be evaluated by font size, so disabled atm
-# my $cell = $item->cell(0); # Checked
-# my $checkedIcon = File::ShareDir::dist_file(ManaTools::Shared::distName(), 'images/Check_8x8.png');
-#
-# $cell->setIconName($checkedIcon) if (!$_->{ignore});
-# $cell = $item->cell(1); # Updates
-# $cell->setIconName($checkedIcon) if ($_->{update});
- ## end icons on cells
-
- # TODO manage to_bool($::expert)
- # row # is $item->index()
- $item->setLabel( $name );
- $itemColl->push($item);
- $item->DISOWN();
- }
-
- return $itemColl;
-}
-
-#=============================================================
-
-=head2 selectRow
-
-=head3 INPUT
-
-$itemCollection: YItem collection in which to find the item that
- has to be selected
-$row: line to be selected
-
-=head3 DESCRIPTION
-
-Select item at row position
-=cut
-
-#=============================================================
-
-sub selectRow {
- my ($itemCollection, $row) = @_;
-
- return if !$itemCollection;
-
- for (my $it = 0; $it < $itemCollection->size(); $it++) {
- my $item = $itemCollection->get($it);
- if ($it == $row) {
- $item->setSelected(1);
- return;
- }
- }
-}
-
-#=============================================================
-
-=head2 _showMediaStatus
-
-=head3 INPUT
-
-$info: HASH reference containing
- item => selected item
- updates => updates checkbox widget
- enabled => enabled checkbox widget
-
-=head3 DESCRIPTION
-
-This internal function enables/disables checkboxes according to the
-passed item value.
-
-=cut
-
-#=============================================================
-sub _showMediaStatus {
- my $info = shift;
-
- die "Updates checkbox is mandatory" if !defined($info->{updates}) || !$info->{updates};
- die "Enabled checkbox is mandatory" if !defined($info->{enabled}) || !$info->{enabled};
-
- if (defined($info->{item})) {
- my $tableItem = yui::toYTableItem($info->{item});
- # enabled cell 0, updates cell 1
- my $cellEnabled = $tableItem && $tableItem->cell(0)->label() ? 1 : 0;
- my $cellUpdates = $tableItem && $tableItem->cell(1)->label() ? 1 : 0;
- $info->{enabled}->setValue($cellEnabled);
- $info->{updates}->setValue($cellUpdates);
- }
- else {
- $info->{enabled}->setDisabled();
- $info->{updates}->setDisabled();
- }
-}
-
-sub mainwindow() {
-
- my $something_changed = 0;
- my $appTitle = yui::YUI::app()->applicationTitle();
-
- ## set new title to get it in dialog
- yui::YUI::app()->setApplicationTitle($loc->N("Configure media"));
- ## set icon if not already set by external launcher TODO
- yui::YUI::app()->setApplicationIcon("/usr/share/mcc/themes/default/rpmdrake-mdk.png");
-
- my $mageiaPlugin = "mga";
- my $factory = yui::YUI::widgetFactory;
-
- my $dialog = $factory->createMainDialog;
- my $vbox = $factory->createVBox( $dialog );
-
- my $hbox_headbar = $factory->createHBox($vbox);
- my $head_align_left = $factory->createLeft($hbox_headbar);
- my $head_align_right = $factory->createRight($hbox_headbar);
- my $headbar = $factory->createHBox($head_align_left);
- my $headRight = $factory->createHBox($head_align_right);
-
- my %fileMenu = (
- widget => $factory->createMenuButton($headbar,$loc->N("File")),
- update => new yui::YMenuItem($loc->N("Update")),
- add_media => new yui::YMenuItem($loc->N("Add a specific media mirror")),
- custom => new yui::YMenuItem($loc->N("Add a custom medium")),
- quit => new yui::YMenuItem($loc->N("&Quit")),
- );
-
- my @ordered_menu_lines = qw(update add_media custom quit);
- foreach (@ordered_menu_lines) {
- $fileMenu{ widget }->addItem($fileMenu{ $_ });
- }
- $fileMenu{ widget }->rebuildMenuTree();
-
- my %optionsMenu = (
- widget => $factory->createMenuButton($headbar, $loc->N("&Options")),
- global => new yui::YMenuItem($loc->N("Global options")),
- man_keys => new yui::YMenuItem($loc->N("Manage keys")),
- parallel => new yui::YMenuItem($loc->N("Parallel")),
- proxy => new yui::YMenuItem($loc->N("Proxy")),
- );
- @ordered_menu_lines = qw(global man_keys parallel proxy);
- foreach (@ordered_menu_lines) {
- $optionsMenu{ widget }->addItem($optionsMenu{ $_ });
- }
- $optionsMenu{ widget }->rebuildMenuTree();
-
- my %helpMenu = (
- widget => $factory->createMenuButton($headRight, $loc->N("&Help")),
- help => new yui::YMenuItem($loc->N("Manual")),
- report_bug => new yui::YMenuItem($loc->N("Report Bug")),
- about => new yui::YMenuItem($loc->N("&About")),
- );
- @ordered_menu_lines = qw(help report_bug about);
- foreach (@ordered_menu_lines) {
- $helpMenu{ widget }->addItem($helpMenu{ $_ });
- }
- $helpMenu{ widget }->rebuildMenuTree();
-
-# my %contextMenu = (
-# enable => $loc->N("Enable/Disable"),
-# update => $loc->N("Check as updates"),
-# );
-# @ordered_menu_lines = qw(enable update);
-# my $itemColl = new yui::YItemCollection;
-# foreach (@ordered_menu_lines) {
-# # last if (!$::expert && $_ eq "update");
-# my $item = new yui::YMenuItem($contextMenu{$_});
-# $item->DISOWN();
-# $itemColl->push($item);
-# }
-# yui::YUI::app()->openContextMenu($itemColl) or die "Cannot create contextMenu";
-
- my $hbox_content = $factory->createHBox($vbox);
- my $leftContent = $factory->createLeft($hbox_content);
- $leftContent->setWeight($yui::YD_HORIZ,3);
-
- my $frame = $factory->createFrame ($leftContent, "");
-
- my $frmVbox = $factory->createVBox( $frame );
- my $hbox = $factory->createHBox( $frmVbox );
-
- my $yTableHeader = new yui::YTableHeader();
- $yTableHeader->addColumn($loc->N("Enabled"), $yui::YAlignCenter);
- $yTableHeader->addColumn($loc->N("Updates"), $yui::YAlignCenter);
- $yTableHeader->addColumn($loc->N("Type"), $yui::YAlignBegin);
- $yTableHeader->addColumn($loc->N("Medium"), $yui::YAlignBegin);
-
- ## mirror list
- my $multiselection = 1;
- my $mirrorTbl = $factory->createTable($hbox, $yTableHeader, $multiselection);
- $mirrorTbl->setKeepSorting(1);
- $mirrorTbl->setImmediateMode(1);
-
- my $itemCollection = readMedia();
- selectRow($itemCollection, 0); #default selection
- $mirrorTbl->addItems($itemCollection);
-
- my $rightContent = $factory->createRight($hbox_content);
- $rightContent->setWeight($yui::YD_HORIZ,1);
- my $topContent = $factory->createTop($rightContent);
- my $vbox_commands = $factory->createVBox($topContent);
- $factory->createVSpacing($vbox_commands, 1.0);
- my $remButton = $factory->createPushButton($factory->createHBox($vbox_commands), $loc->N("Remove"));
- my $edtButton = $factory->createPushButton($factory->createHBox($vbox_commands), $loc->N("Edit"));
- my $addButton = $factory->createPushButton($factory->createHBox($vbox_commands), $loc->N("Add"));
-
- $hbox = $factory->createHBox( $vbox_commands );
- my $item = $mirrorTbl->selectedItem();
- $factory->createHSpacing($hbox, 1.0);
- my $enabled = $factory->createCheckBox($factory->createLeft($hbox), $loc->N("Enabled"));
- my $update = $factory->createCheckBox($factory->createLeft($hbox), $loc->N("Updates"));
- _showMediaStatus({item => $item, enabled => $enabled, updates => $update});
- $update->setNotify(1);
- $enabled->setNotify(1);
- $update->setDisabled() if (!$::expert);
-
- $hbox = $factory->createHBox( $vbox_commands );
- ## TODO icon and label for ncurses
- my $upIcon = File::ShareDir::dist_file(ManaTools::Shared::distName(), 'images/Up_16x16.png');
- my $downIcon = File::ShareDir::dist_file(ManaTools::Shared::distName(), 'images/Down_16x16.png');
- my $upButton = $factory->createPushButton($factory->createHBox($hbox), $loc->N("Up"));
- my $downButton = $factory->createPushButton($factory->createHBox($hbox), $loc->N("Down"));
- $upButton->setIcon($upIcon);
- $downButton->setIcon($downIcon);
-
- $addButton->setWeight($yui::YD_HORIZ,1);
- $edtButton->setWeight($yui::YD_HORIZ,1);
- $remButton->setWeight($yui::YD_HORIZ,1);
- $upButton->setWeight($yui::YD_HORIZ,1);
- $downButton->setWeight($yui::YD_HORIZ,1);
-
-
- # dialog buttons
- $factory->createVSpacing($vbox, 1.0);
- ## Window push buttons
- $hbox = $factory->createHBox( $vbox );
- my $align = $factory->createLeft($hbox);
- $hbox = $factory->createHBox($align);
-
- my $helpButton = $factory->createPushButton($hbox, $loc->N("Help") );
- $align = $factory->createRight($hbox);
- $hbox = $factory->createHBox($align);
-
- ### Close button
- my $closeButton = $factory->createPushButton($hbox, $loc->N("&Quit") );
-
- ### dialog event loop
- while(1) {
- my $event = $dialog->waitForEvent();
- my $eventType = $event->eventType();
- my $changed = 0;
- my $selection_changed = 0;
-
- #event type checking
- if ($eventType == $yui::YEvent::CancelEvent) {
- last;
- }
- elsif ($eventType == $yui::YEvent::MenuEvent) {
- ### MENU ###
- my $item = $event->item();
- my $menuLabel = $item->label();
- if ($menuLabel eq $fileMenu{ quit }->label()) {
- last;
- }
- elsif ($menuLabel eq $helpMenu{ about }->label()) {
- my $translators = $loc->N("_: Translator(s) name(s) & email(s)\n");
- $translators =~ s/\</\&lt\;/g;
- $translators =~ s/\>/\&gt\;/g;
- my $sh_gui = ManaTools::Shared::GUI->new();
- $sh_gui->AboutDialog({ name => "Rpmdragora",
- version => $VERSION,
- credits => $loc->N("Copyright (C) %s Mageia community", '2013-2014'),
- license => $loc->N("GPLv2"),
- description => $loc->N("Rpmdragora is the Mageia package management tool."),
- authors => $loc->N("<h3>Developers</h3>
- <ul><li>%s</li>
- <li>%s</li>
- </ul>
- <h3>Translators</h3>
- <ul><li>%s</li></ul>",
- "Angelo Naselli &lt;anaselli\@linux.it&gt;",
- "Matteo Pasotti &lt;matteo.pasotti\@gmail.com&gt;",
- $translators
- ),
- }
- );
- }
- elsif ($menuLabel eq $fileMenu{ update }->label()) {
- update_callback();
- }
- elsif ($menuLabel eq $fileMenu{ add_media }->label()) {
- $changed = easy_add_callback_with_mirror();
- }
- elsif ($menuLabel eq $fileMenu{ custom }->label()) {
- $changed = add_callback();
- }
- elsif ($menuLabel eq $optionsMenu{ proxy }->label()) {
- proxy_callback();
- }
- elsif ($menuLabel eq $optionsMenu{ global }->label()) {
- options_callback();
- }
- elsif ($menuLabel eq $optionsMenu{ man_keys }->label()) {
- $changed = keys_callback();
- }
- elsif ($menuLabel eq $optionsMenu{ parallel }->label()) {
-# parallel_callback();
- }
- }
- elsif ($eventType == $yui::YEvent::WidgetEvent) {
- # widget selected
- my $widget = $event->widget();
- my $wEvent = yui::toYWidgetEvent($event);
-
- if ($widget == $closeButton) {
- last;
- }
- elsif ($widget == $helpButton) {
- }
- elsif ($widget == $upButton) {
- yui::YUI::app()->busyCursor();
- yui::YUI::ui()->blockEvents();
- $dialog->startMultipleChanges();
-
- my $row = upwards_callback($mirrorTbl);
-
- $mirrorTbl->deleteAllItems();
- my $itemCollection = readMedia();
- selectRow($itemCollection, $row);
- $mirrorTbl->addItems($itemCollection);
-
- $dialog->recalcLayout();
- $dialog->doneMultipleChanges();
- yui::YUI::ui()->unblockEvents();
- yui::YUI::app()->normalCursor();
- }
- elsif ($widget == $downButton) {
- yui::YUI::app()->busyCursor();
- yui::YUI::ui()->blockEvents();
- $dialog->startMultipleChanges();
-
- my $row = downwards_callback($mirrorTbl);
-
- $mirrorTbl->deleteAllItems();
- my $itemCollection = readMedia();
- selectRow($itemCollection, $row);
- $mirrorTbl->addItems($itemCollection);
-
- $dialog->recalcLayout();
- $dialog->doneMultipleChanges();
- yui::YUI::ui()->unblockEvents();
- yui::YUI::app()->normalCursor();
- }
- elsif ($widget == $edtButton) {
- my $item = $mirrorTbl->selectedItem();
- if ($item && edit_callback($mirrorTbl) ) {
- my $row = $item->index();
- yui::YUI::app()->busyCursor();
- yui::YUI::ui()->blockEvents();
-
- $dialog->startMultipleChanges();
-
- my $ignored = $urpm->{media}[$row]{ignore};
- my $itemCollection = readMedia();
- if (!$ignored && $urpm->{media}[$row]{ignore}) {
- # reread media failed to un-ignore an ignored medium
- # probably because urpm::media::check_existing_medium() complains
- # about missing synthesis when the medium never was enabled before;
- # thus it restored the ignore bit
- $urpm->{media}[$row]{ignore} = !$urpm->{media}[$row]{ignore} || undef;
- urpm::media::write_config($urpm);
- #- Enabling this media failed, force update
- interactive_msg('rpmdragora',
- $loc->N("This medium needs to be updated to be usable. Update it now?"),
- yesno => 1,
- ) and $itemCollection = readMedia($urpm->{media}[$row]{name});
- }
- $mirrorTbl->deleteAllItems();
- selectRow($itemCollection, $row);
- $mirrorTbl->addItems($itemCollection);
-
- $dialog->recalcLayout();
- $dialog->doneMultipleChanges();
- yui::YUI::ui()->unblockEvents();
- yui::YUI::app()->normalCursor();
- $selection_changed = 1; # to align $enabled and $update status
- }
- }
- elsif ($widget == $remButton) {
- my $sel = $mirrorTbl->selectedItems();
- $changed = remove_callback($sel);
- }
- elsif ($widget == $addButton) {
- $changed = easy_add_callback();
- }
- elsif ($widget == $update) {
- my $item = $mirrorTbl->selectedItem();
- if ($item) {
- yui::YUI::app()->busyCursor();
- my $row = $item->index();
- $urpm->{media}[$row]{update} = !$urpm->{media}[$row]{update} || undef;
- urpm::media::write_config($urpm);
- yui::YUI::ui()->blockEvents();
- $dialog->startMultipleChanges();
- $mirrorTbl->deleteAllItems();
- my $itemCollection = readMedia();
- selectRow($itemCollection, $row);
- $mirrorTbl->addItems($itemCollection);
- $dialog->recalcLayout();
- $dialog->doneMultipleChanges();
- yui::YUI::ui()->unblockEvents();
- yui::YUI::app()->normalCursor();
- }
- }
- elsif ($widget == $enabled) {
- ## TODO same as $edtButton after edit_callback
- my $item = $mirrorTbl->selectedItem();
- if ($item) {
- my $row = $item->index();
- yui::YUI::app()->busyCursor();
- yui::YUI::ui()->blockEvents();
-
- $dialog->startMultipleChanges();
-
- $urpm->{media}[$row]{ignore} = !$urpm->{media}[$row]{ignore} || undef;
- urpm::media::write_config($urpm);
- my $ignored = $urpm->{media}[$row]{ignore};
- my $itemCollection = readMedia();
- if (!$ignored && $urpm->{media}[$row]{ignore}) {
- # reread media failed to un-ignore an ignored medium
- # probably because urpm::media::check_existing_medium() complains
- # about missing synthesis when the medium never was enabled before;
- # thus it restored the ignore bit
- $urpm->{media}[$row]{ignore} = !$urpm->{media}[$row]{ignore} || undef;
- urpm::media::write_config($urpm);
- #- Enabling this media failed, force update
- interactive_msg('rpmdragora',
- $loc->N("This medium needs to be updated to be usable. Update it now?"),
- yesno => 1,
- ) and $itemCollection = readMedia($urpm->{media}[$row]{name});
- }
- $mirrorTbl->deleteAllItems();
- selectRow($itemCollection, $row);
- $mirrorTbl->addItems($itemCollection);
-
- $dialog->recalcLayout();
- $dialog->doneMultipleChanges();
- yui::YUI::ui()->unblockEvents();
- yui::YUI::app()->normalCursor();
- }
- }
- elsif ($widget == $mirrorTbl) {
- $selection_changed = 1;
- }
- }
- if ($changed) {
- yui::YUI::app()->busyCursor();
- yui::YUI::ui()->blockEvents();
-
- $dialog->startMultipleChanges();
-
- $mirrorTbl->deleteAllItems();
- my $itemCollection = readMedia();
- selectRow($itemCollection, 0); #default selection
- $mirrorTbl->addItems($itemCollection);
-
- $dialog->recalcLayout();
- $dialog->doneMultipleChanges();
- yui::YUI::app()->normalCursor();
- $selection_changed = 1;
- }
- if ($selection_changed) {
- yui::YUI::ui()->blockEvents();
- my $item = $mirrorTbl->selectedItem();
- _showMediaStatus({item => $item, enabled => $enabled, updates => $update});
-
- my $sel = $mirrorTbl->selectedItems();
- if ($sel->size() == 0 || $sel->size() > 1 ) {
- $remButton->setEnabled(($sel->size() == 0) ? 0 : 1);
- $edtButton->setEnabled(0);
- $upButton->setEnabled(0);
- $downButton->setEnabled(0);
- $enabled->setEnabled(0);
- $update->setEnabled(0);
- }
- else {
- $remButton->setEnabled(1);
- $edtButton->setEnabled(1);
- $upButton->setEnabled(1);
- $downButton->setEnabled(1);
- $enabled->setEnabled(1);
- $update->setEnabled(1) if $::expert;
- }
-
- yui::YUI::ui()->unblockEvents();
- }
- }
- $dialog->destroy();
-
- #restore old application title
- yui::YUI::app()->setApplicationTitle($appTitle) if $appTitle;
-
- return $something_changed;
-}
-
-
-sub OLD_mainwindow() {
- undef $something_changed;
- $mainw = ugtk2->new($loc->N("Configure media"), center => 1, transient => $::main_window, modal => 1);
- local $::main_window = $mainw->{real_window};
-
- my $reread_media;
-
- my ($menu, $_factory) = create_factory_menu(
- $mainw->{real_window},
- [ $loc->N("/_File"), undef, undef, undef, '<Branch>' ],
- [ $loc->N("/_File") . $loc->N("/_Update"), $loc->N("<control>U"), sub { update_callback() and $reread_media->() }, undef, '<Item>', ],
- [ $loc->N("/_File") . $loc->N("/Add a specific _media mirror"), $loc->N("<control>M"), sub { easy_add_callback_with_mirror() and $reread_media->() }, undef, '<Item>' ],
- [ $loc->N("/_File") . $loc->N("/_Add a custom medium"), $loc->N("<control>A"), sub { add_callback() and $reread_media->() }, undef, '<Item>' ],
- [ $loc->N("/_File") . $loc->N("/Close"), $loc->N("<control>W"), sub { Gtk2->main_quit }, undef, '<Item>', ],
- [ $loc->N("/_Options"), undef, undef, undef, '<Branch>' ],
- [ $loc->N("/_Options") . $loc->N("/_Global options"), $loc->N("<control>G"), \&options_callback, undef, '<Item>' ],
- [ $loc->N("/_Options") . $loc->N("/Manage _keys"), $loc->N("<control>K"), \&keys_callback, undef, '<Item>' ],
- [ $loc->N("/_Options") . $loc->N("/_Parallel"), $loc->N("<control>P"), \&parallel_callback, undef, '<Item>' ],
- [ $loc->N("/_Options") . $loc->N("/P_roxy"), $loc->N("<control>R"), \&proxy_callback, undef, '<Item>' ],
- if_($0 =~ /edit-urpm-sources/,
- [ $loc->N("/_Help"), undef, undef, undef, '<Branch>' ],
- [ $loc->N("/_Help") . $loc->N("/_Report Bug"), undef, sub { run_drakbug('edit-urpm-sources.pl') }, undef, '<Item>' ],
- [ $loc->N("/_Help") . $loc->N("/_Help"), undef, sub { rpmdragora::open_help('sources') }, undef, '<Item>' ],
- [ $loc->N("/_Help") . $loc->N("/_About..."), undef, sub {
- my $license = MDK::Common::String::formatAlaTeX(translate($::license));
- $license =~ s/\n/\n\n/sg; # nicer formatting
- my $w = gtknew('AboutDialog', name => $loc->N("Rpmdragora"),
- version => $rpmdragora::distro_version,
- copyright => $loc->N("Copyright (C) %s by Mandriva", '2002-2008'),
- license => $license, wrap_license => 1,
- comments => $loc->N("Rpmdragora is the Mageia package management tool."),
- website => 'http://www.mageia.org/',
- website_label => $loc->N("Mageia"),
- authors => 'Thierry Vignaud <vignaud@mandriva.com>',
- artists => 'Hélène Durosini <ln@mandriva.com>',
- translator_credits =>
- #-PO: put here name(s) and email(s) of translator(s) (eg: "John Smith <jsmith@nowhere.com>")
- $loc->N("_: Translator(s) name(s) & email(s)\n"),
- transient_for => $::main_window, modal => 1, position_policy => 'center-on-parent',
- );
- $w->show_all;
- $w->run;
- }, undef, '<Item>'
- ]
- ),
- );
-
- my $list = Gtk2::ListStore->new("Glib::Boolean", "Glib::Boolean", "Glib::String", "Glib::String", "Glib::Boolean");
- $list_tv = Gtk2::TreeView->new_with_model($list);
- $list_tv->get_selection->set_mode('multiple');
- my ($dw_button, $edit_button, $remove_button, $up_button);
- $list_tv->get_selection->signal_connect(changed => sub {
- my ($selection) = @_;
- my @rows = $selection->get_selected_rows;
- my $model = $list;
- # we can delete several medium at a time:
- $remove_button and $remove_button->set_sensitive($#rows != -1);
- # we can only edit/move one item at a time:
- $_ and $_->set_sensitive(@rows == 1) foreach $up_button, $dw_button, $edit_button;
-
- # we can only up/down one item if not at begin/end:
- return if @rows != 1;
-
- my $curr_path = $rows[0];
- my $first_path = $model->get_path($model->get_iter_first);
- $up_button->set_sensitive($first_path && $first_path->compare($curr_path));
-
- $curr_path->next;
- my $next_item = $model->get_iter($curr_path);
- $dw_button->set_sensitive($next_item); # && !$model->get($next_item, 0)
- });
-
- $list_tv->set_rules_hint(1);
- $list_tv->set_reorderable(1);
-
- my $reorder_ok = 1;
- $list->signal_connect(
- row_deleted => sub {
- $reorder_ok or return;
- my ($model) = @_;
- my @media;
- $model->foreach(
- sub {
- my (undef, undef, $iter) = @_;
- my $name = $model->get($iter, $col{mainw}{name});
- push @media, urpm::media::name2medium($urpm, $name);
- 0;
- }, undef);
- @{$urpm->{media}} = @media;
- },
- );
-
- $list_tv->append_column(Gtk2::TreeViewColumn->new_with_attributes($loc->N("Enabled"),
- my $tr = Gtk2::CellRendererToggle->new,
- 'active' => $col{mainw}{is_enabled}));
- $list_tv->append_column(Gtk2::TreeViewColumn->new_with_attributes($loc->N("Updates"),
- my $cu = Gtk2::CellRendererToggle->new,
- 'active' => $col{mainw}{is_update},
- activatable => $col{mainw}{activatable}));
- $list_tv->append_column(Gtk2::TreeViewColumn->new_with_attributes($loc->N("Type"),
- Gtk2::CellRendererText->new,
- 'text' => $col{mainw}{type}));
- $list_tv->append_column(Gtk2::TreeViewColumn->new_with_attributes($loc->N("Medium"),
- Gtk2::CellRendererText->new,
- 'text' => $col{mainw}{name}));
- my $id;
- $id = $tr->signal_connect(
- toggled => sub {
- my (undef, $path) = @_;
- $tr->signal_handler_block($id);
- my $_guard = before_leaving { $tr->signal_handler_unblock($id) };
- my $iter = $list->get_iter_from_string($path);
- $urpm->{media}[$path]{ignore} = !$urpm->{media}[$path]{ignore} || undef;
- $list->set($iter, $col{mainw}{is_enabled}, !$urpm->{media}[$path]{ignore});
- urpm::media::write_config($urpm);
- my $ignored = $urpm->{media}[$path]{ignore};
- $reread_media->();
- if (!$ignored && $urpm->{media}[$path]{ignore}) {
- # reread media failed to un-ignore an ignored medium
- # probably because urpm::media::check_existing_medium() complains
- # about missing synthesis when the medium never was enabled before;
- # thus it restored the ignore bit
- $urpm->{media}[$path]{ignore} = !$urpm->{media}[$path]{ignore} || undef;
- urpm::media::write_config($urpm);
- #- Enabling this media failed, force update
- interactive_msg('rpmdragora',
- $loc->N("This medium needs to be updated to be usable. Update it now?"),
- yesno => 1,
- ) and $reread_media->($urpm->{media}[$path]{name});
- }
- },
- );
-
- $cu->signal_connect(
- toggled => sub {
- my (undef, $path) = @_;
- my $iter = $list->get_iter_from_string($path);
- $urpm->{media}[$path]{update} = !$urpm->{media}[$path]{update} || undef;
- $list->set($iter, $col{mainw}{is_update}, ! !$urpm->{media}[$path]{update});
- $something_changed = 1;
- },
- );
-
- $reread_media = sub {
- my ($name) = @_;
- $reorder_ok = 0;
- $something_changed = 1;
- if (defined $name) {
- urpm::media::select_media($urpm, $name);
- update_sources_check(
- $urpm,
- { nolock => 1 },
- $loc->N_("Unable to update medium, errors reported:\n\n%s"),
- $name,
- );
- }
- # reread configuration after updating media else ignore bit will be restored
- # by urpm::media::check_existing_medium():
- $urpm = fast_open_urpmi_db();
- $list->clear;
- foreach (grep { ! $_->{external} } @{$urpm->{media}}) {
- my $name = $_->{name};
- $list->append_set($col{mainw}{is_enabled} => !$_->{ignore},
- $col{mainw}{is_update} => ! !$_->{update},
- $col{mainw}{type} => get_medium_type($_),
- $col{mainw}{name} => $name,
- $col{mainw}{activatable} => to_bool($::expert),
- );
- }
- $reorder_ok = 1;
- };
- $reread_media->();
- $something_changed = 0;
-
- gtkadd(
- $mainw->{window},
- gtkpack_(
- gtknew('VBox', spacing => 5),
- 0, $menu,
- ($0 =~ /rpm-edit-media|edit-urpm-sources/ ? (0, Gtk2::Banner->new($ugtk2::wm_icon, $loc->N("Configure media"))) : ()),
- 1, gtkpack_(
- gtknew('HBox', spacing => 10),
- 1, gtknew('ScrolledWindow', child => $list_tv),
- 0, gtkpack__(
- gtknew('VBox', spacing => 5),
- gtksignal_connect(
- $remove_button = Gtk2::Button->new(but($loc->N("Remove"))),
- clicked => sub { remove_callback() and $reread_media->() },
- ),
- gtksignal_connect(
- $edit_button = Gtk2::Button->new(but($loc->N("Edit"))),
- clicked => sub {
- my $name = edit_callback(); defined $name and $reread_media->($name);
- }
- ),
- gtksignal_connect(
- Gtk2::Button->new(but($loc->N("Add"))),
- clicked => sub { easy_add_callback() and $reread_media->() },
- ),
- gtkpack(
- gtknew('HBox'),
- gtksignal_connect(
- $up_button = gtknew('Button',
- image => gtknew('Image', stock => 'gtk-go-up')),
- clicked => \&upwards_callback),
-
- gtksignal_connect(
- $dw_button = gtknew('Button',
- image => gtknew('Image', stock => 'gtk-go-down')),
- clicked => \&downwards_callback),
- ),
- )
- ),
- 0, gtknew('HSeparator'),
- 0, gtknew('HButtonBox', layout => 'edge', children_loose => [
- gtksignal_connect(Gtk2::Button->new(but($loc->N("Help"))), clicked => sub { rpmdragora::open_help('sources') }),
- gtksignal_connect(Gtk2::Button->new(but($loc->N("Ok"))), clicked => sub { Gtk2->main_quit })
- ])
- )
- );
- $_->set_sensitive(0) foreach $dw_button, $edit_button, $remove_button, $up_button;
-
- $mainw->{rwindow}->set_size_request(600, 400);
- $mainw->main;
- return $something_changed;
-}
-
-
-sub run() {
- # ignore rpmdragora's option regarding ignoring debug media:
- local $ignore_debug_media = [ 0 ];
-# local $ugtk2::wm_icon = get_icon('rpmdragora-mdk', 'title-media');
- my $lock;
- {
- $urpm = fast_open_urpmi_db();
- my $err_msg = "urpmdb locked\n";
- local $urpm->{fatal} = sub {
- interactive_msg('rpmdragora',
- $loc->N("The Package Database is locked. Please close other applications
-working with the Package Database. Do you have another media
-manager on another desktop, or are you currently installing
-packages as well?"));
- die $err_msg;
- };
- # lock urpmi DB
- eval { $lock = urpm::lock::urpmi_db($urpm, 'exclusive', wait => $urpm->{options}{wait_lock}) };
- if (my $err = $@) {
- return if $err eq $err_msg;
- die $err;
- }
- }
-
- my $res = mainwindow();
- urpm::media::write_config($urpm);
-
- writeconf();
-
- undef $lock;
- $res;
-}
-
-sub readproxy (;$) {
- my $proxy = get_proxy($_[0]);
- ($proxy->{http_proxy} || $proxy->{ftp_proxy} || '',
- defined $proxy->{user} ? "$proxy->{user}:$proxy->{pwd}" : '');
-}
-
-sub writeproxy {
- my ($proxy, $proxy_user, $o_media_name) = @_;
- my ($user, $pwd) = split /:/, $proxy_user;
- set_proxy_config(user => $user, $o_media_name);
- set_proxy_config(pwd => $pwd, $o_media_name);
- set_proxy_config(http_proxy => $proxy, $o_media_name);
- set_proxy_config(ftp_proxy => $proxy, $o_media_name);
- dump_proxy_config();
-}
-
-1;