summaryrefslogtreecommitdiffstats
path: root/lib/network/netcenter.pm
blob: 19b4207696e7c60b82919e6d1f4a7fc4be40f079 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#!/usr/bin/perl
# Olivier Blin, 2007 <oblin@mandriva.com>
# Licensed under the GPL

package network::netcenter;

use strict;
use common;
use mygtk2;
use ugtk2 qw(:create :helpers :wrappers);
use network::connection;
use network::connection_manager;
use network::tools;

sub build_cmanager {
    my ($in, $net, $w, $pixbufs, $connection) = @_;

    my $cmanager = network::connection_manager->new($in, $net, $w, $pixbufs);
    $cmanager->set_connection($connection);
    $cmanager->{gui}{show_unique_network} = $cmanager->{connection}->has_unique_network;

    if ($connection->can('get_networks')) {
        $cmanager->create_networks_list;
        #- do not check if it is slow (either scan or device check) or unavailable
        $cmanager->update_networks
            if !$connection->network_scan_is_slow && $cmanager->check_setup;
    }
    $cmanager;
}

sub main {
    my ($in, $net, $dbus) = @_;

    my $wait = $in->wait_message(N("Please wait"), N("Please wait"));

    my $title = N("Network Center");
    my $icon = '/usr/share/mcc/themes/default/drakroam-mdk.png';

    $ugtk2::wm_icon = $icon;
    my $w = ugtk2->new($title);
    #- so that transient_for is defined, for wait messages and popups to be centered
    $::main_window = $w->{real_window};

    my @all_connections = map { $_->get_connections(automatic_only => 1, fast_only => 1) } network::connection::get_types;
    @all_connections = grep { !network::tools::is_zeroconf_interface($_->get_interface) } @all_connections;
    my ($sysfs, $no_sysfs) = partition { exists $_->{device}{sysfs_device} } @all_connections;
    my ($real, $other) = partition { network::tools::is_real_interface($_->get_interface) } @$sysfs;
    my @connections = (
        (uniq_ { $_->{device}{sysfs_device} } @$real),
        (uniq_ { $_->{device}{sysfs_device} } @$other),
        (uniq_ { $_->{device}{interface} } @$no_sysfs),
    );

    my $pixbufs = network::connection_manager::create_pixbufs();
    my @cmanagers = map { build_cmanager($in, $net, $w, $pixbufs, $_) } @connections;

    (undef, my $rootwin_height) = gtkroot()->get_size;
    my $scrolled_height = $rootwin_height > 480 ? 400 : 295;
    gtkadd($w->{window},
       gtknew('VBox', spacing => 5, children => [
           $::isEmbedded ? () : (0, Gtk2::Banner->new($icon, $title)),
           1, gtknew('ScrolledWindow', width => 600, height => $scrolled_height, shadow_type => 'none',
                     child => gtknew('VBox', spacing => 5, children_tight => [
               map_index {
                   my $cmanager = $cmanagers[$::i];
                   my $head = gtknew('HBox', children => [
                               0, $cmanager->{gui}{status_image} = gtknew('Image'),
                               0, gtknew('Label', padding => [ 5, 0 ]),
                               1, gtknew('Label', ellipsize => 'end', alignment => [ 0, 0 ], text_markup => '<b>' . $_->get_description . '</b>'),
                               0, gtknew('Label', padding => [ 2, 0 ]),
                               0, $cmanager->{gui}{labels}{interface} = gtknew('Label', alignment => [ 0, 0 ], text_markup => $_->get_interface ? '<b>' . $_->get_interface . '</b>' : ""),
                   ]);
                   my $content = gtknew('HBox', children => [
                               0, gtknew('Label', padding => [ 5, 0 ]),
                               1, gtknew('VBox', spacing => 5, children_tight => [
                                   ($cmanager->{connection}->can('get_networks') ? (
                                       $cmanager->{gui}{show_unique_network} ? (
                                           $cmanager->{gui}{networks_list},
                                       ): ( 
                                           gtknew('Label', text => N("Please select your network:"), alignment => [ 0, 0 ]),
                                           gtknew('ScrolledWindow', height => 160, child => $cmanager->{gui}{networks_list})
                                       ),
                                   ) : ()),
                                   gtknew('HBox', children => [
                                       1, gtknew('HButtonBox', spacing => 6, layout => 'start', children_loose => [
                                               $cmanager->{gui}{buttons}{monitor} =
                                                 gtknew('Button', text => N("_: This is a verb\nMonitor"),
                                                        image => gtknew('Image', file => 'monitor-16'),
                                                        clicked => sub { $cmanager->monitor_connection }),
                                               $cmanager->{gui}{buttons}{configure} =
                                                 gtknew('Button', text => N("Configure"),
                                                        image => gtknew('Image', file => 'configure-16'),
                                                        clicked => sub { $cmanager->configure_connection }),
                                               ($cmanager->{connection}->can('get_networks') ?
                                                  ($cmanager->{gui}{buttons}{refresh} =
                                                    gtknew('Button', text => N("Refresh"),
                                                           image => gtknew('Image', file => 'refresh', size => 16),
                                                           clicked => sub { $cmanager->update_networks }))
                                                  : ()),
                                           ]),
                                       0, $cmanager->{gui}{buttons}{connect_toggle} =
                                                 gtknew('Button',
                                                        image => gtknew('Image', file => 'activate-16'),
                                                        clicked => sub { $cmanager->toggle_connection }),
                                           ]),
                               ]),
                   ]);

                   my $expander = gtknew('Expander');
                   my $on_expand = sub {
                       my ($expanded) = @_;
                       if ($expanded && $cmanager->{connection}->can('get_networks') &&
                             !$cmanager->{connection}{probed_networks} && $expanded) {
                           gtkflush();
                           $cmanager->update_networks;
                       }
                   };
                   my $toggle_expand = sub {
                       my $was_expanded = $expander->get_expanded;
                       $was_expanded ? $content->hide : $content->show_all;
                       $on_expand->(!$was_expanded);
                   };
                   $expander->signal_connect(activate => $toggle_expand);
                   my $eventbox = gtksignal_connect(Gtk2::EventBox->new, button_press_event => sub {
                       $_[1]->button == 1 or return;
                       $toggle_expand->();
                       my $was_expanded = $expander->get_expanded;
                       $expander->set_expanded(!$was_expanded);
                   });
                   my $box = gtknew('VBox', spacing => 5, children_tight => [
                       gtknew('HBox', children => [
                           0, $expander,
                           1, gtkadd($eventbox, $head),
                       ]),
                       $content,
                   ]);
                   $content->hide;

                   $cmanager->update_on_status_change;

                   ($::i > 0 ? Gtk2::HSeparator->new : ()), $box;
               } @connections,
           ])),
           0, gtknew('HButtonBox', spacing => 6, layout => 'end', children_loose => [
               gtknew('Button', text => N("Quit"), clicked => sub { Gtk2->main_quit }),
           ]),
       ]),
    );

    if ($dbus) {
        $dbus->{connection}->add_filter(sub {
            my ($_con, $msg) = @_;
            if ($msg->get_member eq 'status') {
                my ($_status, $interface) = $msg->get_args_list;
                my $cmanager = find { $_->{connection}->get_interface eq $interface } @cmanagers
                  or return;
                #- FIXME: factorize in update_on_status_change() and check why update_networks() calls update_on_status_change()
                if ($cmanager->{connection}->can('get_networks') && !$cmanager->{connection}->network_scan_is_slow) {
                    $cmanager->update_networks;
                } else {
                    $cmanager->network::connection_manager::update_on_status_change;
                }
            }
        });
        $dbus->{connection}->add_match("type='signal',interface='com.mandriva.network'");
        dbus_object::set_gtk2_watch_helper($dbus);
    }

    undef $wait;
    $w->main;
}

1;