summaryrefslogtreecommitdiffstats
path: root/lib/network/netcenter.pm
blob: acfc8fe01c80562442af3e41939db85a66d53e5c (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
#!/usr/bin/perl
# Olivier Blin, 2007 <oblin@mandriva.com>
# Licensed under the GPL

package network::netcenter;

use strict;
use common;
use run_program;
use detect_devices;
use interactive;
use mygtk2;
use ugtk2 qw(:create :helpers :wrappers);
use Gtk2::SimpleList;
use network::monitor;
use network::signal_strength;
use network::network;
use network::tools;
use network::connection;
use network::connection::wireless;
use network::connection::cellular_card;
use network::drakroam;

sub build_networks_list {
    my ($connection) = @_;

    my $droam = {};
    network::drakroam::build_pixbufs($droam);

    #- from drakroam
    my $networks_list = Gtk2::SimpleList->new(
        "AP" => "hidden",
        '' => "pixbuf",
        '' => "pixbuf",
        N("Signal strength") => "pixbuf",
        N("SSID") => "text",
    );
    $networks_list->get_selection->set_mode('single');
    $networks_list->set_headers_visible(0);

    my $net = {};
    network::network::read_net_conf($net);

    #- from drakroam::update_networks()
    $connection->{networks} = $connection->get_networks;
    $connection->{network} ||= find { $connection->{networks}{$_}{current} } keys %{$connection->{networks}};
    my $routes = network::tools::get_routes();
    my $interface = $connection->get_interface;
    my $connected = exists $routes->{$interface}{network};


    $_->{configured} = $connection->network_is_configured($_) foreach values %{$connection->{networks}};
    my @networks = sort {
        $b->{configured} <=> $a->{configured} || $b->{signal_strength} <=> $a->{signal_strength} || $a->{name} cmp $b->{name};
    } values %{$connection->{networks}};
    my @valuable_networks = splice @networks, 0, 3;
    foreach (@valuable_networks) {
        my $ap = $_->{ap};
        push @{$networks_list->{data}}, [
            $ap || $_->{name},
            $_->{current} ? $connected ? $droam->{gui}{pixbufs}{state}{connected} : $droam->{gui}{pixbufs}{state}{refresh} : undef,
            $droam->{gui}{pixbufs}{encryption}{$_->{flags} =~ /WPA/i ? 'strong' : $_->{flags} =~ /WEP/i ? 'weak' : 'open'},
            network::signal_strength::get_strength_icon($_),
            !$_->{essid} && exists $net->{wireless}{$ap} && $net->{wireless}{$ap}{WIRELESS_ESSID} || $_->{name},
        ];
    }

    $networks_list;
}

sub gtkset_image {
    my ($w, $file, $o_size) = @_;
    my $image = $o_size
    ?  Gtk2::Image->new_from_pixbuf(gtkcreate_pixbuf($file)->scale_simple($o_size, $o_size, 'hyper'))
    :  gtknew('Image', file => $file);
    $w->set_image($image);
    $w;
}

sub main() {
    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 @connections = map { $_->get_connections(automatic_only => 1) } network::connection::get_types;
    @connections = reverse(uniq_ { $_->{device} } reverse(@connections));

    gtkadd($w->{window},
       gtknew('VBox', spacing => 5, children => [
           $::isEmbedded ? () : (0, Gtk2::Banner->new($icon, $title)),
           1, gtknew('ScrolledWindow', width => 500, height => 300, child => gtknew('VBox', spacing => 5, children_tight => [
               map {
                   gtknew('HBox', children_tight => [
                       gtknew('Image', file => $_->get_type_icon),
                       gtknew('VBox', children_tight => [
                           gtknew('Title2', label => $_->get_description),
                           gtknew('HBox', children_tight => [
                               gtknew('Label', padding => [ 20, 0 ]),
                               gtknew('VBox', children_tight => [
                                   ($_->can('get_networks') && !$_->network_scan_is_slow ? (build_networks_list($_)) : ()),
                                   gtknew('HBox', children_tight => [
                                       gtknew('VBox', children_tight => [
                                           gtknew('HButtonBox', children_tight => [
                                               gtkset_image(gtknew('Button'), 'connected'),
                                               gtkset_image(gtknew('Button'), 'monitor-24'),
                                               gtkset_image(gtknew('Button'), 'configure-24'),
                                               ($_->can('get_networks') ? (0, gtkset_image(gtknew('Button'), 'refresh')) : ()),
                                           ]),
                                       ]),
                                   ]),
                               ]),
                           ]),
                       ]),
                   ]);
               } @connections,
           ])),
       ]),
    );

    $w->main;
}

1;