~kroq-gar78/ubuntu/precise/gnome-control-center/fix-885947

« back to all changes in this revision

Viewing changes to panels/network/cc-network-panel.c

  • Committer: Bazaar Package Importer
  • Author(s): Rodrigo Moya
  • Date: 2011-05-17 10:47:27 UTC
  • mfrom: (0.1.11 experimental) (1.1.45 upstream)
  • Revision ID: james.westby@ubuntu.com-20110517104727-lqel6m8vhfw5jby1
Tags: 1:3.0.1.1-1ubuntu1
* Rebase on Debian, remaining Ubuntu changes:
* debian/control:
  - Build-Depend on hardening-wrapper, dpkg-dev and dh-autoreconf
  - Add dependency on ubuntu-system-service
  - Remove dependency on gnome-icon-theme-symbolic
  - Move dependency on apg, gnome-icon-theme-symbolic and accountsservice to
    be a Recommends: until we get them in main
* debian/rules:
  - Use autoreconf
  - Add binary-post-install rule for gnome-control-center-data
  - Run dh-autoreconf
* debian/gnome-control-center.dirs:
* debian/gnome-control-center.links:
  - Add a link to the control center shell for indicators
* debian/patches/00_disable-nm.patch:
  - Temporary patch to disable building with NetworkManager until we get
    the new one in the archive
* debian/patches/01_git_remove_gettext_calls.patch:
  - Remove calls to AM_GNU_GETTEXT, IT_PROG_INTLTOOL should be enough
* debian/patches/01_git_kill_warning.patch:
  - Kill warning
* debian/patches/50_ubuntu_systemwide_prefs.patch:
  - Ubuntu specific proxy preferences
* debian/patches/51_ubuntu_system_keyboard.patch:
  - Implement the global keyboard spec at https://wiki.ubuntu.com/DefaultKeyboardSettings

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
 
2
 *
 
3
 * Copyright (C) 2010-2011 Richard Hughes <richard@hughsie.com>
 
4
 *
 
5
 * This program is free software; you can redistribute it and/or modify
 
6
 * it under the terms of the GNU General Public License as published by
 
7
 * the Free Software Foundation; either version 2 of the License, or
 
8
 * (at your option) any later version.
 
9
 *
 
10
 * This program is distributed in the hope that it will be useful,
 
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
 * GNU General Public License for more details.
 
14
 *
 
15
 * You should have received a copy of the GNU General Public License
 
16
 * along with this program; if not, write to the Free Software
 
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
18
 *
 
19
 */
 
20
 
 
21
#include <config.h>
 
22
#include <glib/gi18n.h>
 
23
#include <arpa/inet.h>
 
24
#include <stdlib.h>
 
25
 
 
26
#include "cc-network-panel.h"
 
27
 
 
28
#if 0
 
29
#include "nm-remote-settings.h"
 
30
#include "nm-client.h"
 
31
#include "nm-device.h"
 
32
#include "nm-device-ethernet.h"
 
33
#include "nm-device-modem.h"
 
34
#include "nm-device-wifi.h"
 
35
#include "nm-utils.h"
 
36
#include "nm-active-connection.h"
 
37
#include "nm-vpn-connection.h"
 
38
#include "nm-setting-ip4-config.h"
 
39
#include "nm-setting-ip6-config.h"
 
40
#include "nm-setting-connection.h"
 
41
#include "nm-setting-vpn.h"
 
42
#include "nm-setting-wireless.h"
 
43
 
 
44
#include "net-object.h"
 
45
#include "net-device.h"
 
46
#include "net-vpn.h"
 
47
 
 
48
#include "panel-common.h"
 
49
#include "panel-cell-renderer-mode.h"
 
50
#include "panel-cell-renderer-signal.h"
 
51
#include "panel-cell-renderer-security.h"
 
52
#endif
 
53
 
 
54
G_DEFINE_DYNAMIC_TYPE (CcNetworkPanel, cc_network_panel, CC_TYPE_PANEL)
 
55
 
 
56
#define NETWORK_PANEL_PRIVATE(o) \
 
57
        (G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_NETWORK_PANEL, CcNetworkPanelPrivate))
 
58
 
 
59
struct _CcNetworkPanelPrivate
 
60
{
 
61
        GCancellable     *cancellable;
 
62
        GSettings        *proxy_settings;
 
63
        GtkBuilder       *builder;
 
64
        gboolean          updating_device;
 
65
};
 
66
 
 
67
enum {
 
68
        PANEL_DEVICES_COLUMN_ICON,
 
69
        PANEL_DEVICES_COLUMN_TITLE,
 
70
        PANEL_DEVICES_COLUMN_SORT,
 
71
        PANEL_DEVICES_COLUMN_OBJECT,
 
72
        PANEL_DEVICES_COLUMN_LAST
 
73
};
 
74
 
 
75
enum {
 
76
        PANEL_WIRELESS_COLUMN_ID,
 
77
        PANEL_WIRELESS_COLUMN_TITLE,
 
78
        PANEL_WIRELESS_COLUMN_SORT,
 
79
        PANEL_WIRELESS_COLUMN_STRENGTH,
 
80
        PANEL_WIRELESS_COLUMN_MODE,
 
81
        PANEL_WIRELESS_COLUMN_SECURITY,
 
82
        PANEL_WIRELESS_COLUMN_LAST
 
83
};
 
84
 
 
85
static void     refresh_ui      (CcNetworkPanel *panel);
 
86
 
 
87
static void
 
88
cc_network_panel_get_property (GObject    *object,
 
89
                               guint       property_id,
 
90
                               GValue     *value,
 
91
                               GParamSpec *pspec)
 
92
{
 
93
        switch (property_id) {
 
94
        default:
 
95
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 
96
        }
 
97
}
 
98
 
 
99
static void
 
100
cc_network_panel_set_property (GObject      *object,
 
101
                               guint         property_id,
 
102
                               const GValue *value,
 
103
                               GParamSpec   *pspec)
 
104
{
 
105
        switch (property_id) {
 
106
        default:
 
107
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 
108
        }
 
109
}
 
110
 
 
111
static void
 
112
cc_network_panel_dispose (GObject *object)
 
113
{
 
114
        CcNetworkPanelPrivate *priv = CC_NETWORK_PANEL (object)->priv;
 
115
 
 
116
        if (priv->proxy_settings) {
 
117
                g_object_unref (priv->proxy_settings);
 
118
                priv->proxy_settings = NULL;
 
119
        }
 
120
        if (priv->cancellable != NULL) {
 
121
                g_cancellable_cancel (priv->cancellable);
 
122
                g_object_unref (priv->cancellable);
 
123
                priv->cancellable = NULL;
 
124
        }
 
125
        if (priv->builder != NULL) {
 
126
                g_object_unref (priv->builder);
 
127
                priv->builder = NULL;
 
128
        }
 
129
#if 0
 
130
        if (priv->client != NULL) {
 
131
                g_object_unref (priv->client);
 
132
                priv->client = NULL;
 
133
        }
 
134
        if (priv->remote_settings != NULL) {
 
135
                g_object_unref (priv->remote_settings);
 
136
                priv->remote_settings = NULL;
 
137
        }
 
138
#endif
 
139
 
 
140
        G_OBJECT_CLASS (cc_network_panel_parent_class)->dispose (object);
 
141
}
 
142
 
 
143
static void
 
144
cc_network_panel_finalize (GObject *object)
 
145
{
 
146
        G_OBJECT_CLASS (cc_network_panel_parent_class)->finalize (object);
 
147
}
 
148
 
 
149
static void
 
150
cc_network_panel_class_init (CcNetworkPanelClass *klass)
 
151
{
 
152
        GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
153
 
 
154
        g_type_class_add_private (klass, sizeof (CcNetworkPanelPrivate));
 
155
 
 
156
        object_class->get_property = cc_network_panel_get_property;
 
157
        object_class->set_property = cc_network_panel_set_property;
 
158
        object_class->dispose = cc_network_panel_dispose;
 
159
        object_class->finalize = cc_network_panel_finalize;
 
160
}
 
161
 
 
162
static void
 
163
cc_network_panel_class_finalize (CcNetworkPanelClass *klass)
 
164
{
 
165
}
 
166
 
 
167
static void
 
168
check_wpad_warning (CcNetworkPanel *panel)
 
169
{
 
170
        GtkWidget *widget;
 
171
        gchar *autoconfig_url = NULL;
 
172
        GString *string = NULL;
 
173
        gboolean ret = FALSE;
 
174
        guint mode;
 
175
 
 
176
        string = g_string_new ("");
 
177
 
 
178
        /* check we're using 'Automatic' */
 
179
        mode = g_settings_get_enum (panel->priv->proxy_settings, "mode");
 
180
        if (mode != 2)
 
181
                goto out;
 
182
 
 
183
        /* see if the PAC is blank */
 
184
        autoconfig_url = g_settings_get_string (panel->priv->proxy_settings,
 
185
                                                "autoconfig-url");
 
186
        ret = autoconfig_url == NULL ||
 
187
              autoconfig_url[0] == '\0';
 
188
        if (!ret)
 
189
                goto out;
 
190
 
 
191
        g_string_append (string, "<small>");
 
192
 
 
193
        /* TRANSLATORS: this is when the use leaves the PAC textbox blank */
 
194
        g_string_append (string, _("Web Proxy Autodiscovery is used when a Configuration URL is not provided."));
 
195
 
 
196
        g_string_append (string, " ");
 
197
 
 
198
        /* TRANSLATORS: WPAD is bad: if you enable it on an untrusted
 
199
         * network, then anyone else on that network can tell your
 
200
         * machine that it should proxy all of your web traffic
 
201
         * through them. */
 
202
        g_string_append (string, _("This is not recommended for untrusted public networks."));
 
203
        g_string_append (string, "</small>");
 
204
out:
 
205
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
206
                                                     "label_proxy_warning"));
 
207
        gtk_label_set_markup (GTK_LABEL (widget), string->str);
 
208
        g_free (autoconfig_url);
 
209
        g_string_free (string, TRUE);
 
210
}
 
211
 
 
212
static void
 
213
panel_settings_changed (GSettings      *settings,
 
214
                        const gchar    *key,
 
215
                        CcNetworkPanel *panel)
 
216
{
 
217
        check_wpad_warning (panel);
 
218
}
 
219
 
 
220
#if 0
 
221
static NetObject *
 
222
get_selected_object (CcNetworkPanel *panel)
 
223
{
 
224
        GtkWidget *widget;
 
225
        GtkTreeSelection *selection;
 
226
        GtkTreeModel *model;
 
227
        GtkTreeIter iter;
 
228
        NetObject *object = NULL;
 
229
 
 
230
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
231
                                                     "treeview_devices"));
 
232
        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
 
233
        if (!gtk_tree_selection_get_selected (selection, &model, &iter)) {
 
234
                return NULL;
 
235
        }
 
236
 
 
237
        gtk_tree_model_get (model, &iter,
 
238
                            PANEL_DEVICES_COLUMN_OBJECT, &object,
 
239
                            -1);
 
240
 
 
241
        return object;
 
242
}
 
243
#endif
 
244
 
 
245
static void
 
246
panel_proxy_mode_combo_setup_widgets (CcNetworkPanel *panel, guint value)
 
247
{
 
248
        GtkWidget *widget;
 
249
 
 
250
        /* hide or show the PAC text box */
 
251
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
252
                                                     "heading_proxy_url"));
 
253
        gtk_widget_set_visible (widget, value == 2);
 
254
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
255
                                                     "entry_proxy_url"));
 
256
        gtk_widget_set_visible (widget, value == 2);
 
257
 
 
258
        /* hide or show the manual entry text boxes */
 
259
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
260
                                                     "heading_proxy_http"));
 
261
        gtk_widget_set_visible (widget, value == 1);
 
262
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
263
                                                     "entry_proxy_http"));
 
264
        gtk_widget_set_visible (widget, value == 1);
 
265
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
266
                                                     "spinbutton_proxy_http"));
 
267
        gtk_widget_set_visible (widget, value == 1);
 
268
 
 
269
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
270
                                                     "heading_proxy_https"));
 
271
        gtk_widget_set_visible (widget, value == 1);
 
272
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
273
                                                     "entry_proxy_https"));
 
274
        gtk_widget_set_visible (widget, value == 1);
 
275
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
276
                                                     "spinbutton_proxy_https"));
 
277
        gtk_widget_set_visible (widget, value == 1);
 
278
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
279
                                                     "heading_proxy_ftp"));
 
280
        gtk_widget_set_visible (widget, value == 1);
 
281
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
282
                                                     "entry_proxy_ftp"));
 
283
        gtk_widget_set_visible (widget, value == 1);
 
284
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
285
                                                     "spinbutton_proxy_ftp"));
 
286
        gtk_widget_set_visible (widget, value == 1);
 
287
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
288
                                                     "heading_proxy_socks"));
 
289
        gtk_widget_set_visible (widget, value == 1);
 
290
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
291
                                                     "entry_proxy_socks"));
 
292
        gtk_widget_set_visible (widget, value == 1);
 
293
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
294
                                                     "spinbutton_proxy_socks"));
 
295
        gtk_widget_set_visible (widget, value == 1);
 
296
 
 
297
        /* perhaps show the wpad warning */
 
298
        check_wpad_warning (panel);
 
299
}
 
300
 
 
301
static void
 
302
panel_proxy_mode_combo_changed_cb (GtkWidget *widget, CcNetworkPanel *panel)
 
303
{
 
304
        gboolean ret;
 
305
        gint value;
 
306
        GtkTreeIter iter;
 
307
        GtkTreeModel *model;
 
308
 
 
309
        /* no selection */
 
310
        ret = gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter);
 
311
        if (!ret)
 
312
                return;
 
313
 
 
314
        /* get entry */
 
315
        model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
 
316
        gtk_tree_model_get (model, &iter,
 
317
                            1, &value,
 
318
                            -1);
 
319
 
 
320
        /* set */
 
321
        g_settings_set_enum (panel->priv->proxy_settings, "mode", value);
 
322
 
 
323
        /* hide or show the correct widgets */
 
324
        panel_proxy_mode_combo_setup_widgets (panel, value);
 
325
}
 
326
 
 
327
static void
 
328
panel_set_value_for_combo (CcNetworkPanel *panel, GtkComboBox *combo_box, gint value)
 
329
{
 
330
        gboolean ret;
 
331
        gint value_tmp;
 
332
        GtkTreeIter iter;
 
333
        GtkTreeModel *model;
 
334
 
 
335
        /* get entry */
 
336
        model = gtk_combo_box_get_model (combo_box);
 
337
        ret = gtk_tree_model_get_iter_first (model, &iter);
 
338
        if (!ret)
 
339
                return;
 
340
 
 
341
        /* try to make the UI match the setting */
 
342
        do {
 
343
                gtk_tree_model_get (model, &iter,
 
344
                                    1, &value_tmp,
 
345
                                    -1);
 
346
                if (value == value_tmp) {
 
347
                        gtk_combo_box_set_active_iter (combo_box, &iter);
 
348
                        break;
 
349
                }
 
350
        } while (gtk_tree_model_iter_next (model, &iter));
 
351
 
 
352
        /* hide or show the correct widgets */
 
353
        panel_proxy_mode_combo_setup_widgets (panel, value);
 
354
}
 
355
 
 
356
static void
 
357
select_first_device (CcNetworkPanel *panel)
 
358
{
 
359
        GtkTreePath *path;
 
360
        GtkWidget *widget;
 
361
        GtkTreeSelection *selection;
 
362
 
 
363
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
364
                                                     "treeview_devices"));
 
365
        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
 
366
 
 
367
        /* select the first device */
 
368
        path = gtk_tree_path_new_from_string ("0");
 
369
        gtk_tree_selection_select_path (selection, path);
 
370
        gtk_tree_path_free (path);
 
371
}
 
372
 
 
373
#if 0
 
374
static void
 
375
panel_device_got_modem_manager_cb (GObject *source_object,
 
376
                                   GAsyncResult *res,
 
377
                                   gpointer user_data)
 
378
{
 
379
        GError *error = NULL;
 
380
        GVariant *result = NULL;
 
381
        GDBusProxy *proxy;
 
382
        NMDevice *device = (NMDevice *) user_data;
 
383
 
 
384
        proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
 
385
        if (proxy == NULL) {
 
386
                g_warning ("Error creating ModemManager proxy: %s",
 
387
                           error->message);
 
388
                g_error_free (error);
 
389
                goto out;
 
390
        }
 
391
 
 
392
        /* get the IMEI */
 
393
        result = g_dbus_proxy_get_cached_property (proxy,
 
394
                                                   "EquipmentIdentifier");
 
395
 
 
396
        /* save */
 
397
        g_object_set_data_full (G_OBJECT (device),
 
398
                                "ControlCenter::EquipmentIdentifier",
 
399
                                g_variant_dup_string (result, NULL),
 
400
                                g_free);
 
401
out:
 
402
        if (result != NULL)
 
403
                g_variant_unref (result);
 
404
        if (proxy != NULL)
 
405
                g_object_unref (proxy);
 
406
        return;
 
407
}
 
408
 
 
409
static void
 
410
panel_get_registration_info_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
 
411
{
 
412
        gchar *operator_code = NULL;
 
413
        GError *error = NULL;
 
414
        guint registration_status;
 
415
        GVariant *result = NULL;
 
416
        gchar *operator_name = NULL;
 
417
        gchar *operator_name_safe = NULL;
 
418
        NMDevice *device = (NMDevice *) user_data;
 
419
 
 
420
        result = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), res, &error);
 
421
        if (result == NULL) {
 
422
                g_warning ("Error getting registration info: %s\n",
 
423
                           error->message);
 
424
                g_error_free (error);
 
425
                return;
 
426
        }
 
427
 
 
428
        /* get values */
 
429
        g_variant_get (result, "((uss))",
 
430
                       &registration_status,
 
431
                       &operator_code,
 
432
                       &operator_name);
 
433
        if (operator_name != NULL && operator_name[0] != '\0')
 
434
                operator_name_safe = g_strescape (operator_name, NULL);
 
435
 
 
436
        /* save */
 
437
        g_object_set_data_full (G_OBJECT (device),
 
438
                                "ControlCenter::OperatorName",
 
439
                                operator_name_safe,
 
440
                                g_free);
 
441
 
 
442
        g_free (operator_name);
 
443
        g_free (operator_name_safe);
 
444
        g_free (operator_code);
 
445
        g_variant_unref (result);
 
446
}
 
447
 
 
448
static void
 
449
panel_device_got_modem_manager_gsm_cb (GObject *source_object,
 
450
                                       GAsyncResult *res,
 
451
                                       gpointer user_data)
 
452
{
 
453
        GError *error = NULL;
 
454
        GDBusProxy *proxy;
 
455
        NMDevice *device = (NMDevice *) user_data;
 
456
 
 
457
        proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
 
458
        if (proxy == NULL) {
 
459
                g_warning ("Error creating ModemManager GSM proxy: %s\n",
 
460
                           error->message);
 
461
                g_error_free (error);
 
462
                goto out;
 
463
        }
 
464
 
 
465
        g_dbus_proxy_call (proxy,
 
466
                           "GetRegistrationInfo",
 
467
                           NULL,
 
468
                           G_DBUS_CALL_FLAGS_NONE,
 
469
                           -1,
 
470
                           NULL,
 
471
                           panel_get_registration_info_cb,
 
472
                           device);
 
473
out:
 
474
        if (proxy != NULL)
 
475
                g_object_unref (proxy);
 
476
        return;
 
477
}
 
478
 
 
479
static void
 
480
device_state_notify_changed_cb (NMDevice *device,
 
481
                                GParamSpec *pspec,
 
482
                                CcNetworkPanel *panel)
 
483
{
 
484
        refresh_ui (panel);
 
485
}
 
486
 
 
487
static void
 
488
object_changed_cb (NetObject *object, CcNetworkPanel *panel)
 
489
{
 
490
        refresh_ui (panel);
 
491
}
 
492
 
 
493
static void
 
494
object_removed_cb (NetObject *object, CcNetworkPanel *panel)
 
495
{
 
496
        gboolean ret;
 
497
        NetObject *object_tmp;
 
498
        GtkTreeIter iter;
 
499
        GtkTreeModel *model;
 
500
        GtkWidget *widget;
 
501
        GtkTreeSelection *selection;
 
502
 
 
503
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
504
                                                     "treeview_devices"));
 
505
        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
 
506
 
 
507
        /* remove device from model */
 
508
        model = GTK_TREE_MODEL (gtk_builder_get_object (panel->priv->builder,
 
509
                                                        "liststore_devices"));
 
510
        ret = gtk_tree_model_get_iter_first (model, &iter);
 
511
        if (!ret)
 
512
                return;
 
513
 
 
514
        /* get the other elements */
 
515
        do {
 
516
                gtk_tree_model_get (model, &iter,
 
517
                                    PANEL_DEVICES_COLUMN_OBJECT, &object_tmp,
 
518
                                    -1);
 
519
                if (g_strcmp0 (net_object_get_id (object),
 
520
                               net_object_get_id (object_tmp)) == 0) {
 
521
                        g_object_unref (object_tmp);
 
522
                        if (!gtk_list_store_remove (GTK_LIST_STORE (model), &iter))
 
523
                                gtk_tree_model_get_iter_first (model, &iter);
 
524
                        gtk_tree_selection_select_iter (selection, &iter);
 
525
 
 
526
                        break;
 
527
                }
 
528
                g_object_unref (object_tmp);
 
529
        } while (gtk_tree_model_iter_next (model, &iter));
 
530
}
 
531
 
 
532
static void
 
533
register_object_interest (CcNetworkPanel *panel, NetObject *object)
 
534
{
 
535
        g_signal_connect (object,
 
536
                          "changed",
 
537
                          G_CALLBACK (object_changed_cb),
 
538
                          panel);
 
539
        g_signal_connect (object,
 
540
                          "removed",
 
541
                          G_CALLBACK (object_removed_cb),
 
542
                          panel);
 
543
}
 
544
 
 
545
static void
 
546
panel_add_device (CcNetworkPanel *panel, NMDevice *device)
 
547
{
 
548
        GtkListStore *liststore_devices;
 
549
        GtkTreeIter iter;
 
550
        gchar *title = NULL;
 
551
        NMDeviceType type;
 
552
        NetDevice *net_device;
 
553
        CcNetworkPanelPrivate *priv = panel->priv;
 
554
 
 
555
        /* do we have an existing object with this id? */
 
556
        if (find_in_model_by_id (panel, nm_device_get_udi (device)) != NULL)
 
557
                goto out;
 
558
 
 
559
        /* we don't support bluetooth devices yet -- no mockup */
 
560
        type = nm_device_get_device_type (device);
 
561
        if (type == NM_DEVICE_TYPE_BT)
 
562
                goto out;
 
563
 
 
564
        g_debug ("device %s type %i",
 
565
                 nm_device_get_udi (device),
 
566
                 nm_device_get_device_type (device));
 
567
        g_signal_connect (G_OBJECT (device), "notify::state",
 
568
                          (GCallback) device_state_notify_changed_cb, panel);
 
569
 
 
570
        /* do we have to get additonal data from ModemManager */
 
571
        if (type == NM_DEVICE_TYPE_MODEM) {
 
572
                g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
 
573
                                          G_DBUS_PROXY_FLAGS_NONE,
 
574
                                          NULL,
 
575
                                          "org.freedesktop.ModemManager",
 
576
                                          nm_device_get_udi (device),
 
577
                                          "org.freedesktop.ModemManager.Modem",
 
578
                                          panel->priv->cancellable,
 
579
                                          panel_device_got_modem_manager_cb,
 
580
                                          device);
 
581
                g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
 
582
                                          G_DBUS_PROXY_FLAGS_NONE,
 
583
                                          NULL,
 
584
                                          "org.freedesktop.ModemManager",
 
585
                                          nm_device_get_udi (device),
 
586
                                          "org.freedesktop.ModemManager.Modem.Gsm.Network",
 
587
                                          panel->priv->cancellable,
 
588
                                          panel_device_got_modem_manager_gsm_cb,
 
589
                                          device);
 
590
        }
 
591
 
 
592
        /* make title a bit bigger */
 
593
        title = g_strdup_printf ("<span size=\"large\">%s</span>",
 
594
                                 panel_device_to_localized_string (device));
 
595
 
 
596
        liststore_devices = GTK_LIST_STORE (gtk_builder_get_object (priv->builder,
 
597
                                            "liststore_devices"));
 
598
        net_device = net_device_new ();
 
599
        net_device_set_nm_device (net_device, device);
 
600
        net_object_set_id (NET_OBJECT (net_device), nm_device_get_udi (device));
 
601
        register_object_interest (panel, NET_OBJECT (net_device));
 
602
        gtk_list_store_append (liststore_devices, &iter);
 
603
        gtk_list_store_set (liststore_devices,
 
604
                            &iter,
 
605
                            PANEL_DEVICES_COLUMN_ICON, panel_device_to_icon_name (device),
 
606
                            PANEL_DEVICES_COLUMN_SORT, panel_device_to_sortable_string (device),
 
607
                            PANEL_DEVICES_COLUMN_TITLE, title,
 
608
                            PANEL_DEVICES_COLUMN_OBJECT, net_device,
 
609
                            -1);
 
610
out:
 
611
        g_free (title);
 
612
}
 
613
 
 
614
static void
 
615
panel_remove_device (CcNetworkPanel *panel, NMDevice *device)
 
616
{
 
617
        gboolean ret;
 
618
        NetObject *object_tmp;
 
619
        GtkTreeIter iter;
 
620
        GtkTreeModel *model;
 
621
 
 
622
        /* remove device from model */
 
623
        model = GTK_TREE_MODEL (gtk_builder_get_object (panel->priv->builder,
 
624
                                                        "liststore_devices"));
 
625
        ret = gtk_tree_model_get_iter_first (model, &iter);
 
626
        if (!ret)
 
627
                return;
 
628
 
 
629
        /* get the other elements */
 
630
        do {
 
631
                gtk_tree_model_get (model, &iter,
 
632
                                    PANEL_DEVICES_COLUMN_OBJECT, &object_tmp,
 
633
                                    -1);
 
634
                if (g_strcmp0 (net_object_get_id (object_tmp),
 
635
                               nm_device_get_udi (device)) == 0) {
 
636
                        gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
 
637
                        g_object_unref (object_tmp);
 
638
                        break;
 
639
                }
 
640
                g_object_unref (object_tmp);
 
641
        } while (gtk_tree_model_iter_next (model, &iter));
 
642
}
 
643
#endif
 
644
 
 
645
static void
 
646
panel_add_devices_columns (CcNetworkPanel *panel, GtkTreeView *treeview)
 
647
{
 
648
        CcNetworkPanelPrivate *priv = panel->priv;
 
649
        GtkCellRenderer *renderer;
 
650
        GtkListStore *liststore_devices;
 
651
        GtkTreeViewColumn *column;
 
652
 
 
653
        /* image */
 
654
        renderer = gtk_cell_renderer_pixbuf_new ();
 
655
        g_object_set (renderer, "stock-size", GTK_ICON_SIZE_DND, NULL);
 
656
        column = gtk_tree_view_column_new_with_attributes ("", renderer,
 
657
                                                           "icon-name", PANEL_DEVICES_COLUMN_ICON,
 
658
                                                           NULL);
 
659
        gtk_tree_view_append_column (treeview, column);
 
660
 
 
661
        /* column for text */
 
662
        renderer = gtk_cell_renderer_text_new ();
 
663
        g_object_set (renderer,
 
664
                      "wrap-mode", PANGO_WRAP_WORD,
 
665
                      NULL);
 
666
        column = gtk_tree_view_column_new_with_attributes ("", renderer,
 
667
                                                           "markup", PANEL_DEVICES_COLUMN_TITLE,
 
668
                                                           NULL);
 
669
        gtk_tree_view_column_set_sort_column_id (column, PANEL_DEVICES_COLUMN_SORT);
 
670
        liststore_devices = GTK_LIST_STORE (gtk_builder_get_object (priv->builder,
 
671
                                            "liststore_devices"));
 
672
        gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (liststore_devices),
 
673
                                              PANEL_DEVICES_COLUMN_SORT,
 
674
                                              GTK_SORT_ASCENDING);
 
675
        gtk_tree_view_append_column (treeview, column);
 
676
        gtk_tree_view_column_set_expand (column, TRUE);
 
677
}
 
678
 
 
679
#if 0
 
680
static void
 
681
panel_set_widget_data (CcNetworkPanel *panel,
 
682
                       const gchar *sub_pane,
 
683
                       const gchar *widget_suffix,
 
684
                       const gchar *value)
 
685
{
 
686
        gchar *heading_id;
 
687
        gchar *label_id = NULL;
 
688
        GtkWidget *heading;
 
689
        GtkWidget *widget;
 
690
        CcNetworkPanelPrivate *priv = panel->priv;
 
691
 
 
692
        /* hide the row if there is no value */
 
693
        heading_id = g_strdup_printf ("heading_%s_%s", sub_pane, widget_suffix);
 
694
        label_id = g_strdup_printf ("label_%s_%s", sub_pane, widget_suffix);
 
695
        heading = GTK_WIDGET (gtk_builder_get_object (priv->builder, heading_id));
 
696
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, label_id));
 
697
        if (heading == NULL || widget == NULL) {
 
698
                g_critical ("no widgets %s, %s found", heading_id, label_id);
 
699
                return;
 
700
        }
 
701
        g_free (heading_id);
 
702
        g_free (label_id);
 
703
 
 
704
        if (value == NULL) {
 
705
                gtk_widget_hide (heading);
 
706
                gtk_widget_hide (widget);
 
707
        } else {
 
708
                /* there exists a value */
 
709
                gtk_widget_show (heading);
 
710
                gtk_widget_show (widget);
 
711
                gtk_label_set_label (GTK_LABEL (widget), value);
 
712
        }
 
713
}
 
714
 
 
715
static void
 
716
panel_set_widget_heading (CcNetworkPanel *panel,
 
717
                          const gchar *sub_pane,
 
718
                          const gchar *widget_suffix,
 
719
                          const gchar *heading)
 
720
{
 
721
        gchar *label_id = NULL;
 
722
        GtkWidget *widget;
 
723
 
 
724
        label_id = g_strdup_printf ("heading_%s_%s", sub_pane, widget_suffix);
 
725
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, label_id));
 
726
        if (widget)
 
727
                gtk_label_set_label (GTK_LABEL (widget), heading);
 
728
        g_free (label_id);
 
729
}
 
730
 
 
731
static guint
 
732
get_access_point_security (NMAccessPoint *ap)
 
733
{
 
734
        NM80211ApFlags flags;
 
735
        NM80211ApSecurityFlags wpa_flags;
 
736
        NM80211ApSecurityFlags rsn_flags;
 
737
        guint type;
 
738
 
 
739
        flags = nm_access_point_get_flags (ap);
 
740
        wpa_flags = nm_access_point_get_wpa_flags (ap);
 
741
        rsn_flags = nm_access_point_get_rsn_flags (ap);
 
742
 
 
743
        if (!(flags & NM_802_11_AP_FLAGS_PRIVACY) &&
 
744
            wpa_flags == NM_802_11_AP_SEC_NONE &&
 
745
            rsn_flags == NM_802_11_AP_SEC_NONE)
 
746
                type = NM_AP_SEC_NONE;
 
747
        else if ((flags & NM_802_11_AP_FLAGS_PRIVACY) &&
 
748
                 wpa_flags == NM_802_11_AP_SEC_NONE &&
 
749
                 rsn_flags == NM_802_11_AP_SEC_NONE)
 
750
                type = NM_AP_SEC_WEP;
 
751
        else if (!(flags & NM_802_11_AP_FLAGS_PRIVACY) &&
 
752
                 wpa_flags != NM_802_11_AP_SEC_NONE &&
 
753
                 rsn_flags != NM_802_11_AP_SEC_NONE)
 
754
                type = NM_AP_SEC_WPA;
 
755
        else
 
756
                type = NM_AP_SEC_WPA2;
 
757
 
 
758
        return type;
 
759
}
 
760
 
 
761
static void
 
762
add_access_point (CcNetworkPanel *panel, NMAccessPoint *ap, NMAccessPoint *active)
 
763
{
 
764
        CcNetworkPanelPrivate *priv = panel->priv;
 
765
        const GByteArray *ssid;
 
766
        const gchar *ssid_text;
 
767
        const gchar *object_path;
 
768
        GtkListStore *liststore_wireless_network;
 
769
        GtkTreeIter treeiter;
 
770
        GtkWidget *widget;
 
771
 
 
772
        ssid = nm_access_point_get_ssid (ap);
 
773
        if (ssid == NULL)
 
774
                return;
 
775
        ssid_text = nm_utils_escape_ssid (ssid->data, ssid->len);
 
776
 
 
777
        liststore_wireless_network = GTK_LIST_STORE (gtk_builder_get_object (priv->builder,
 
778
                                                     "liststore_wireless_network"));
 
779
 
 
780
        object_path = nm_object_get_path (NM_OBJECT (ap));
 
781
        gtk_list_store_append (liststore_wireless_network, &treeiter);
 
782
        gtk_list_store_set (liststore_wireless_network,
 
783
                            &treeiter,
 
784
                            PANEL_WIRELESS_COLUMN_ID, object_path,
 
785
                            PANEL_WIRELESS_COLUMN_TITLE, ssid_text,
 
786
                            PANEL_WIRELESS_COLUMN_SORT, ssid_text,
 
787
                            PANEL_WIRELESS_COLUMN_STRENGTH, nm_access_point_get_strength (ap),
 
788
                            PANEL_WIRELESS_COLUMN_MODE, nm_access_point_get_mode (ap),
 
789
                            PANEL_WIRELESS_COLUMN_SECURITY, get_access_point_security (ap),
 
790
                            -1);
 
791
 
 
792
        /* is this what we're on already? */
 
793
        if (active == NULL)
 
794
                return;
 
795
        if (g_strcmp0 (object_path,
 
796
                       nm_object_get_path (NM_OBJECT (active))) == 0) {
 
797
                widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
 
798
                                                             "combobox_wireless_network_name"));
 
799
                gtk_combo_box_set_active_iter (GTK_COMBO_BOX (widget), &treeiter);
 
800
        }
 
801
}
 
802
 
 
803
static void
 
804
add_access_point_other (CcNetworkPanel *panel)
 
805
{
 
806
        CcNetworkPanelPrivate *priv = panel->priv;
 
807
        GtkListStore *liststore_wireless_network;
 
808
        GtkTreeIter treeiter;
 
809
 
 
810
        liststore_wireless_network = GTK_LIST_STORE (gtk_builder_get_object (priv->builder,
 
811
                                                     "liststore_wireless_network"));
 
812
 
 
813
        gtk_list_store_append (liststore_wireless_network, &treeiter);
 
814
        gtk_list_store_set (liststore_wireless_network,
 
815
                            &treeiter,
 
816
                            PANEL_WIRELESS_COLUMN_ID, "ap-other...",
 
817
                            /* TRANSLATORS: this is when the access point is not listed
 
818
                             * in the dropdown (or hidden) and the user has to select
 
819
                             * another entry manually */
 
820
                            PANEL_WIRELESS_COLUMN_TITLE, C_("Wireless access point", "Other..."),
 
821
                            /* always last */
 
822
                            PANEL_WIRELESS_COLUMN_SORT, "",
 
823
                            PANEL_WIRELESS_COLUMN_STRENGTH, 0,
 
824
                            PANEL_WIRELESS_COLUMN_MODE, NM_802_11_MODE_UNKNOWN,
 
825
                            PANEL_WIRELESS_COLUMN_SECURITY, NM_AP_SEC_UNKNOWN,
 
826
                            -1);
 
827
}
 
828
 
 
829
#if 0
 
830
static gchar *
 
831
ip4_address_as_string (guint32 ip)
 
832
{
 
833
        char buf[INET_ADDRSTRLEN+1];
 
834
        struct in_addr tmp_addr;
 
835
 
 
836
        memset (&buf, '\0', sizeof (buf));
 
837
        tmp_addr.s_addr = ip;
 
838
 
 
839
        if (inet_ntop (AF_INET, &tmp_addr, buf, INET_ADDRSTRLEN)) {
 
840
                return g_strdup (buf);
 
841
        } else {
 
842
                g_warning ("error converting IP4 address 0x%X",
 
843
                           ntohl (tmp_addr.s_addr));
 
844
                return NULL;
 
845
        }
 
846
}
 
847
 
 
848
static void
 
849
panel_show_ip4_config (NMIP4Config *cfg)
 
850
{
 
851
        gchar *tmp;
 
852
        const GArray *array;
 
853
        const GPtrArray *ptr_array;
 
854
        GSList *iter;
 
855
        int i;
 
856
 
 
857
        for (iter = (GSList *) nm_ip4_config_get_addresses (cfg); iter; iter = g_slist_next (iter)) {
 
858
                NMIP4Address *addr = iter->data;
 
859
                guint32 u;
 
860
 
 
861
                tmp = ip4_address_as_string (nm_ip4_address_get_address (addr));
 
862
                g_debug ("IP4 address: %s", tmp);
 
863
                g_free (tmp);
 
864
 
 
865
                u = nm_ip4_address_get_prefix (addr);
 
866
                tmp = ip4_address_as_string (nm_utils_ip4_prefix_to_netmask (u));
 
867
                g_debug ("IP4 prefix: %d (%s)", u, tmp);
 
868
                g_free (tmp);
 
869
 
 
870
                tmp = ip4_address_as_string (nm_ip4_address_get_gateway (addr));
 
871
                g_debug ("IP4 gateway: %s", tmp);
 
872
                g_free (tmp);
 
873
        }
 
874
 
 
875
        array = nm_ip4_config_get_nameservers (cfg);
 
876
        if (array) {
 
877
                g_debug ("IP4 DNS:");
 
878
                for (i = 0; i < array->len; i++) {
 
879
                        tmp = ip4_address_as_string (g_array_index (array, guint32, i));
 
880
                        g_debug ("\t%s", tmp);
 
881
                        g_free (tmp);
 
882
                }
 
883
        }
 
884
 
 
885
        ptr_array = nm_ip4_config_get_domains (cfg);
 
886
        if (ptr_array) {
 
887
                g_debug ("IP4 domains:");
 
888
                for (i = 0; i < ptr_array->len; i++)
 
889
                        g_debug ("\t%s", (const char *) g_ptr_array_index (ptr_array, i));
 
890
        }
 
891
 
 
892
        array = nm_ip4_config_get_wins_servers (cfg);
 
893
        if (array) {
 
894
                g_debug ("IP4 WINS:");
 
895
                for (i = 0; i < array->len; i++) {
 
896
                        tmp = ip4_address_as_string (g_array_index (array, guint32, i));
 
897
                        g_debug ("\t%s", tmp);
 
898
                        g_free (tmp);
 
899
                }
 
900
        }
 
901
}
 
902
#endif
 
903
 
 
904
static GPtrArray *
 
905
panel_get_strongest_unique_aps (const GPtrArray *aps)
 
906
{
 
907
        const GByteArray *ssid;
 
908
        const GByteArray *ssid_tmp;
 
909
        GPtrArray *aps_unique = NULL;
 
910
        gboolean add_ap;
 
911
        guint i;
 
912
        guint j;
 
913
        NMAccessPoint *ap;
 
914
        NMAccessPoint *ap_tmp;
 
915
 
 
916
        /* we will have multiple entries for typical hotspots, just
 
917
         * filter to the one with the strongest signal */
 
918
        aps_unique = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
 
919
        if (aps != NULL)
 
920
                for (i = 0; i < aps->len; i++) {
 
921
                        ap = NM_ACCESS_POINT (g_ptr_array_index (aps, i));
 
922
                        ssid = nm_access_point_get_ssid (ap);
 
923
                        add_ap = TRUE;
 
924
 
 
925
                        /* get already added list */
 
926
                        for (j=0; j<aps_unique->len; j++) {
 
927
                                ap_tmp = NM_ACCESS_POINT (g_ptr_array_index (aps_unique, j));
 
928
                                ssid_tmp = nm_access_point_get_ssid (ap_tmp);
 
929
        
 
930
                                /* is this the same type and data? */
 
931
                                if (nm_utils_same_ssid (ssid, ssid_tmp, TRUE)) {
 
932
 
 
933
                                        g_debug ("found duplicate: %s",
 
934
                                                 nm_utils_escape_ssid (ssid_tmp->data,
 
935
                                                                       ssid_tmp->len));
 
936
 
 
937
                                        /* the new access point is stronger */
 
938
                                        if (nm_access_point_get_strength (ap) >
 
939
                                            nm_access_point_get_strength (ap_tmp)) {
 
940
                                                g_debug ("removing %s",
 
941
                                                         nm_utils_escape_ssid (ssid_tmp->data,
 
942
                                                                               ssid_tmp->len));
 
943
                                                g_ptr_array_remove (aps_unique, ap_tmp);
 
944
                                                add_ap = TRUE;
 
945
                                        } else {
 
946
                                                add_ap = FALSE;
 
947
                                        }
 
948
 
 
949
                                        break;
 
950
                                }
 
951
                        }
 
952
                        if (add_ap) {
 
953
                                g_debug ("adding %s",
 
954
                                         nm_utils_escape_ssid (ssid->data,
 
955
                                                               ssid->len));
 
956
                                g_ptr_array_add (aps_unique, g_object_ref (ap));
 
957
                        }
 
958
                }
 
959
        return aps_unique;
 
960
}
 
961
 
 
962
static gchar *
 
963
get_ap_security_string (NMAccessPoint *ap)
 
964
{
 
965
        NM80211ApSecurityFlags wpa_flags, rsn_flags;
 
966
        NM80211ApFlags flags;
 
967
        GString *str;
 
968
 
 
969
        flags = nm_access_point_get_flags (ap);
 
970
        wpa_flags = nm_access_point_get_wpa_flags (ap);
 
971
        rsn_flags = nm_access_point_get_rsn_flags (ap);
 
972
 
 
973
        str = g_string_new ("");
 
974
        if ((flags & NM_802_11_AP_FLAGS_PRIVACY) &&
 
975
            (wpa_flags == NM_802_11_AP_SEC_NONE) &&
 
976
            (rsn_flags == NM_802_11_AP_SEC_NONE)) {
 
977
                /* TRANSLATORS: this WEP WiFi security */
 
978
                g_string_append_printf (str, "%s, ", _("WEP"));
 
979
        }
 
980
        if (wpa_flags != NM_802_11_AP_SEC_NONE) {
 
981
                /* TRANSLATORS: this WPA WiFi security */
 
982
                g_string_append_printf (str, "%s, ", _("WPA"));
 
983
        }
 
984
        if (rsn_flags != NM_802_11_AP_SEC_NONE) {
 
985
                /* TRANSLATORS: this WPA WiFi security */
 
986
                g_string_append_printf (str, "%s, ", _("WPA2"));
 
987
        }
 
988
        if ((wpa_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X) ||
 
989
            (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) {
 
990
                /* TRANSLATORS: this Enterprise WiFi security */
 
991
                g_string_append_printf (str, "%s, ", _("Enterprise"));
 
992
        }
 
993
        if (str->len > 0)
 
994
                g_string_set_size (str, str->len - 2);
 
995
        else {
 
996
                /* TRANSLATORS: this no (!) WiFi security */
 
997
                g_string_append (str, _("None"));
 
998
        }
 
999
        return g_string_free (str, FALSE);
 
1000
}
 
1001
 
 
1002
static gchar *
 
1003
get_ipv6_config_address_as_string (NMIP6Config *ip6_config)
 
1004
{
 
1005
        const GSList *list;
 
1006
        const struct in6_addr *addr;
 
1007
        gchar *str = NULL;
 
1008
        gchar tmp[1024];
 
1009
        NMIP6Address *address;
 
1010
 
 
1011
        /* get address */
 
1012
        list = nm_ip6_config_get_addresses (ip6_config);
 
1013
        if (list == NULL)
 
1014
                goto out;
 
1015
 
 
1016
        /* we only care about one address */
 
1017
        address = list->data;
 
1018
        addr = nm_ip6_address_get_address (address);
 
1019
        if (addr == NULL)
 
1020
                goto out;
 
1021
        inet_ntop (AF_INET6, addr, tmp, sizeof(tmp));
 
1022
        str = g_strdup (tmp);
 
1023
out:
 
1024
        return str;
 
1025
}
 
1026
 
 
1027
static NMConnection *
 
1028
find_connection_for_device (CcNetworkPanel *panel,
 
1029
                            NMDevice       *device)
 
1030
{
 
1031
        const GPtrArray *connections;
 
1032
        const GPtrArray *devices;
 
1033
        NMActiveConnection *c;
 
1034
        gint i;
 
1035
 
 
1036
        connections = nm_client_get_active_connections (panel->priv->client);
 
1037
 
 
1038
        for (i = 0; i < connections->len; i++) {
 
1039
                c = (NMActiveConnection *)connections->pdata[i];
 
1040
 
 
1041
                devices = nm_active_connection_get_devices (c);
 
1042
                if (devices->pdata[0] == device) {
 
1043
                        return (NMConnection *)nm_remote_settings_get_connection_by_path (panel->priv->remote_settings, nm_active_connection_get_connection (c));
 
1044
                }
 
1045
        }
 
1046
 
 
1047
        return NULL;
 
1048
}
 
1049
 
 
1050
static void
 
1051
device_off_toggled (GtkSwitch      *sw,
 
1052
                    GParamSpec     *pspec,
 
1053
                    CcNetworkPanel *panel)
 
1054
{
 
1055
        NMDevice *device;
 
1056
        gboolean active;
 
1057
        NetObject *object;
 
1058
 
 
1059
        if (panel->priv->updating_device)
 
1060
                return;
 
1061
 
 
1062
        active = gtk_switch_get_active (sw);
 
1063
 
 
1064
        object = get_selected_object (panel);
 
1065
        if (NET_IS_VPN (object)) {
 
1066
 
 
1067
                NMConnection *connection;
 
1068
 
 
1069
                connection = net_vpn_get_connection (NET_VPN (object));
 
1070
                if (active)
 
1071
                        nm_client_activate_connection (panel->priv->client,
 
1072
                                                       connection, NULL, NULL,
 
1073
                                                       NULL, NULL);
 
1074
                else {
 
1075
                        const gchar *path;
 
1076
                        NMActiveConnection *a;
 
1077
                        const GPtrArray *acs;
 
1078
                        gint i;
 
1079
 
 
1080
                        path = nm_connection_get_path (connection);
 
1081
 
 
1082
                        acs = nm_client_get_active_connections (panel->priv->client);
 
1083
                        for (i = 0; i < acs->len; i++) {
 
1084
                                a = (NMActiveConnection*)acs->pdata[i];
 
1085
                                if (strcmp (nm_active_connection_get_connection (a), path) == 0) {
 
1086
                                        nm_client_deactivate_connection (panel->priv->client, a);
 
1087
                                        break;
 
1088
                                }
 
1089
                        }
 
1090
                }
 
1091
        }
 
1092
 
 
1093
        if (NET_IS_DEVICE (object)) {
 
1094
                device = net_device_get_nm_device (NET_DEVICE (object));
 
1095
                switch (nm_device_get_device_type (device)) {
 
1096
                case NM_DEVICE_TYPE_ETHERNET:
 
1097
                        if (active) {
 
1098
                                GSList *list, *filtered;
 
1099
 
 
1100
                                /* look for an existing connection we can use */
 
1101
                                list = nm_remote_settings_list_connections (panel->priv->remote_settings);
 
1102
                                filtered = nm_device_filter_connections (device, list);
 
1103
                                if (filtered) {
 
1104
                                        nm_client_activate_connection (panel->priv->client,
 
1105
                                                                       (NMConnection *)filtered->data,
 
1106
                                                                       device,
 
1107
                                                                       NULL,
 
1108
                                                                       NULL, NULL);
 
1109
                                }
 
1110
                                else {
 
1111
                                        nm_client_add_and_activate_connection (panel->priv->client,
 
1112
                                                                               NULL,
 
1113
                                                                               device,
 
1114
                                                                               NULL,
 
1115
                                                                               NULL, NULL);
 
1116
                                }
 
1117
 
 
1118
                                g_slist_free (list);
 
1119
                                g_slist_free (filtered);
 
1120
                        } else {
 
1121
                                nm_device_disconnect (device, NULL, NULL);
 
1122
                        }
 
1123
                        break;
 
1124
                case NM_DEVICE_TYPE_WIFI:
 
1125
                        nm_client_wireless_set_enabled (panel->priv->client, active);
 
1126
                        break;
 
1127
                case NM_DEVICE_TYPE_WIMAX:
 
1128
                        nm_client_wimax_set_enabled (panel->priv->client, active);
 
1129
                        break;
 
1130
                default: ;
 
1131
                        /* FIXME: handle other device types */
 
1132
                }
 
1133
        }
 
1134
}
 
1135
 
 
1136
static void
 
1137
wireless_enabled_toggled (NMClient       *client,
 
1138
                          GParamSpec     *pspec,
 
1139
                          CcNetworkPanel *panel)
 
1140
{
 
1141
        gboolean enabled;
 
1142
        GtkSwitch *sw;
 
1143
        NMDevice *device;
 
1144
        NetObject *object;
 
1145
 
 
1146
        object = get_selected_object (panel);
 
1147
        if (object == NULL)
 
1148
                return;
 
1149
        device = net_device_get_nm_device (NET_DEVICE (object));
 
1150
 
 
1151
        if (nm_device_get_device_type (device) != NM_DEVICE_TYPE_WIFI)
 
1152
                return;
 
1153
 
 
1154
        enabled = nm_client_wireless_get_enabled (client);
 
1155
        sw = GTK_SWITCH (gtk_builder_get_object (panel->priv->builder,
 
1156
                                                 "device_wireless_off_switch"));
 
1157
 
 
1158
        panel->priv->updating_device = TRUE;
 
1159
        gtk_switch_set_active (sw, enabled);
 
1160
        panel->priv->updating_device = FALSE;
 
1161
}
 
1162
 
 
1163
static void
 
1164
wimax_enabled_toggled (NMClient       *client,
 
1165
                       GParamSpec     *pspec,
 
1166
                       CcNetworkPanel *panel)
 
1167
{
 
1168
        gboolean enabled;
 
1169
        GtkSwitch *sw;
 
1170
        NMDevice *device;
 
1171
        NetObject *object;
 
1172
 
 
1173
        object = get_selected_object (panel);
 
1174
        if (object == NULL)
 
1175
                return;
 
1176
        device = net_device_get_nm_device (NET_DEVICE (object));
 
1177
 
 
1178
        if (nm_device_get_device_type (device) != NM_DEVICE_TYPE_WIMAX)
 
1179
                return;
 
1180
 
 
1181
        enabled = nm_client_wimax_get_enabled (client);
 
1182
        sw = GTK_SWITCH (gtk_builder_get_object (panel->priv->builder,
 
1183
                                                 "device_wimax_off_switch"));
 
1184
 
 
1185
        panel->priv->updating_device = TRUE;
 
1186
        gtk_switch_set_active (sw, enabled);
 
1187
        panel->priv->updating_device = FALSE;
 
1188
}
 
1189
 
 
1190
static void
 
1191
update_off_switch_from_device_state (GtkSwitch *sw, NMDeviceState state, CcNetworkPanel *panel)
 
1192
{
 
1193
        panel->priv->updating_device = TRUE;
 
1194
        switch (state) {
 
1195
                case NM_DEVICE_STATE_UNMANAGED:
 
1196
                case NM_DEVICE_STATE_UNAVAILABLE:
 
1197
                case NM_DEVICE_STATE_DISCONNECTED:
 
1198
                case NM_DEVICE_STATE_DEACTIVATING:
 
1199
                case NM_DEVICE_STATE_FAILED:
 
1200
                        gtk_switch_set_active (sw, FALSE);
 
1201
                        break;
 
1202
                default:
 
1203
                        gtk_switch_set_active (sw, TRUE);
 
1204
                        break;
 
1205
        }
 
1206
        panel->priv->updating_device = FALSE;
 
1207
}
 
1208
 
 
1209
static void
 
1210
refresh_header_ui (CcNetworkPanel *panel, NMDevice *device, const char *page_name)
 
1211
{
 
1212
        GtkWidget *widget;
 
1213
        char *wid_name;
 
1214
        const char *str;
 
1215
        NMDeviceState state;
 
1216
        NMDeviceType type;
 
1217
 
 
1218
        type = nm_device_get_device_type (device);
 
1219
 
 
1220
        /* set header icon */
 
1221
        wid_name = g_strdup_printf ("image_%s_device", page_name);
 
1222
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, wid_name));
 
1223
        g_free (wid_name);
 
1224
        gtk_image_set_from_icon_name (GTK_IMAGE (widget),
 
1225
                                      panel_device_to_icon_name (device),
 
1226
                                      GTK_ICON_SIZE_DIALOG);
 
1227
 
 
1228
        /* set device kind */
 
1229
        wid_name = g_strdup_printf ("label_%s_device", page_name);
 
1230
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, wid_name));
 
1231
        g_free (wid_name);
 
1232
        gtk_label_set_label (GTK_LABEL (widget),
 
1233
                             panel_device_to_localized_string (device));
 
1234
 
 
1235
 
 
1236
        /* set device state */
 
1237
        state = nm_device_get_state (device);
 
1238
        wid_name = g_strdup_printf ("label_%s_status", page_name);
 
1239
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, wid_name));
 
1240
        g_free (wid_name);
 
1241
        str = panel_device_state_to_localized_string (device);
 
1242
        gtk_label_set_label (GTK_LABEL (widget), str);
 
1243
 
 
1244
 
 
1245
        /* set up the device on/off switch */
 
1246
        wid_name = g_strdup_printf ("device_%s_off_switch", page_name);
 
1247
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, wid_name));
 
1248
        g_free (wid_name);
 
1249
 
 
1250
        /* keep this in sync with the signal handler setup in cc_network_panel_init */
 
1251
        switch (type) {
 
1252
        case NM_DEVICE_TYPE_ETHERNET:
 
1253
                gtk_widget_set_visible (widget,
 
1254
                                        state != NM_DEVICE_STATE_UNAVAILABLE
 
1255
                                        && state != NM_DEVICE_STATE_UNMANAGED);
 
1256
                update_off_switch_from_device_state (GTK_SWITCH (widget), state, panel);
 
1257
                break;
 
1258
        case NM_DEVICE_TYPE_WIFI:
 
1259
                gtk_widget_show (widget);
 
1260
                wireless_enabled_toggled (panel->priv->client, NULL, panel);
 
1261
                break;
 
1262
        case NM_DEVICE_TYPE_WIMAX:
 
1263
                gtk_widget_show (widget);
 
1264
                wimax_enabled_toggled (panel->priv->client, NULL, panel);
 
1265
                break;
 
1266
        default:
 
1267
                gtk_widget_hide (widget);
 
1268
                break;
 
1269
        }
 
1270
 
 
1271
        /* set up options button */
 
1272
        wid_name = g_strdup_printf ("button_%s_options", page_name);
 
1273
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, wid_name));
 
1274
        g_free (wid_name);
 
1275
        if (widget != NULL) {
 
1276
                gtk_widget_set_sensitive (widget, state == NM_DEVICE_STATE_ACTIVATED);
 
1277
        }
 
1278
}
 
1279
 
 
1280
static void
 
1281
device_refresh_ethernet_ui (CcNetworkPanel *panel, NetDevice *device)
 
1282
{
 
1283
        guint speed;
 
1284
        NMDeviceState state;
 
1285
        const char *str;
 
1286
        gchar *str_tmp;
 
1287
        NMDevice *nm_device;
 
1288
 
 
1289
        nm_device = net_device_get_nm_device (device);
 
1290
        state = nm_device_get_state (nm_device);
 
1291
 
 
1292
        refresh_header_ui (panel, nm_device, "wired");
 
1293
 
 
1294
        /* speed */
 
1295
        speed = nm_device_ethernet_get_speed (NM_DEVICE_ETHERNET (nm_device));
 
1296
        if (state == NM_DEVICE_STATE_UNAVAILABLE)
 
1297
                str_tmp = NULL;
 
1298
        else if (speed  > 0)
 
1299
                /* Translators: network device speed */
 
1300
                str_tmp = g_strdup_printf (_("%d Mb/s"), speed);
 
1301
        else
 
1302
                str_tmp = g_strdup ("");
 
1303
        panel_set_widget_data (panel,
 
1304
                               "wired",
 
1305
                               "speed",
 
1306
                               str_tmp);
 
1307
        g_free (str_tmp);
 
1308
 
 
1309
        /* device MAC */
 
1310
        str = nm_device_ethernet_get_hw_address (NM_DEVICE_ETHERNET (nm_device));
 
1311
        panel_set_widget_data (panel,
 
1312
                               "wired",
 
1313
                               "mac",
 
1314
                               str);
 
1315
 
 
1316
}
 
1317
 
 
1318
static void
 
1319
device_refresh_wifi_ui (CcNetworkPanel *panel, NetDevice *device)
 
1320
{
 
1321
        GtkWidget *widget;
 
1322
        guint speed;
 
1323
        const GPtrArray *aps;
 
1324
        GPtrArray *aps_unique = NULL;
 
1325
        GtkWidget *heading;
 
1326
        NMDeviceState state;
 
1327
        NMAccessPoint *ap;
 
1328
        NMAccessPoint *active_ap;
 
1329
        const char *str;
 
1330
        gchar *str_tmp;
 
1331
        GtkListStore *liststore_wireless_network;
 
1332
        guint i;
 
1333
        NMDevice *nm_device;
 
1334
 
 
1335
        nm_device = net_device_get_nm_device (device);
 
1336
        state = nm_device_get_state (nm_device);
 
1337
 
 
1338
        refresh_header_ui (panel, nm_device, "wireless");
 
1339
 
 
1340
        /* speed */
 
1341
        speed = nm_device_wifi_get_bitrate (NM_DEVICE_WIFI (nm_device));
 
1342
        if (state == NM_DEVICE_STATE_UNAVAILABLE)
 
1343
                str_tmp = NULL;
 
1344
        else if (speed > 0)
 
1345
                str_tmp = g_strdup_printf (_("%d Mb/s"),
 
1346
                                           speed / 1000);
 
1347
        else
 
1348
                str_tmp = g_strdup ("");
 
1349
        panel_set_widget_data (panel,
 
1350
                               "wireless",
 
1351
                               "speed",
 
1352
                               str_tmp);
 
1353
        g_free (str_tmp);
 
1354
 
 
1355
        /* device MAC */
 
1356
        str = nm_device_wifi_get_hw_address (NM_DEVICE_WIFI (nm_device));
 
1357
        panel_set_widget_data (panel,
 
1358
                               "wireless",
 
1359
                               "mac",
 
1360
                               str);
 
1361
        /* security */
 
1362
        active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (nm_device));
 
1363
        if (state == NM_DEVICE_STATE_UNAVAILABLE)
 
1364
                str_tmp = NULL;
 
1365
        else if (active_ap != NULL)
 
1366
                str_tmp = get_ap_security_string (active_ap);
 
1367
        else
 
1368
                str_tmp = g_strdup ("");
 
1369
        panel_set_widget_data (panel,
 
1370
                               "wireless",
 
1371
                               "security",
 
1372
                               str_tmp);
 
1373
        g_free (str_tmp);
 
1374
 
 
1375
        heading = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
1376
                                                      "heading_wireless_network_name"));
 
1377
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
1378
                                                     "combobox_wireless_network_name"));
 
1379
        /* populate access point dropdown */
 
1380
        if (state == NM_DEVICE_STATE_UNAVAILABLE) {
 
1381
                gtk_widget_hide (heading);
 
1382
                gtk_widget_hide (widget);
 
1383
        } else {
 
1384
                gtk_widget_show (heading);
 
1385
                gtk_widget_show (widget);
 
1386
                liststore_wireless_network = GTK_LIST_STORE (gtk_builder_get_object (panel->priv->builder,
 
1387
                                                                                     "liststore_wireless_network"));
 
1388
                panel->priv->updating_device = TRUE;
 
1389
                gtk_list_store_clear (liststore_wireless_network);
 
1390
                aps = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (nm_device));
 
1391
                aps_unique = panel_get_strongest_unique_aps (aps);
 
1392
 
 
1393
                for (i = 0; i < aps_unique->len; i++) {
 
1394
                        ap = NM_ACCESS_POINT (g_ptr_array_index (aps_unique, i));
 
1395
                        add_access_point (panel, ap, active_ap);
 
1396
                }
 
1397
                add_access_point_other (panel);
 
1398
                if (active_ap == NULL) {
 
1399
                        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
1400
                                                                     "combobox_wireless_network_name"));
 
1401
                        gtk_combo_box_set_active_iter (GTK_COMBO_BOX (widget), NULL);
 
1402
                        gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (widget))), "");
 
1403
                }
 
1404
 
 
1405
                panel->priv->updating_device = FALSE;
 
1406
 
 
1407
                g_ptr_array_unref (aps_unique);
 
1408
        }
 
1409
 
 
1410
}
 
1411
 
 
1412
static void
 
1413
device_refresh_wimax_ui (CcNetworkPanel *panel, NetDevice *device)
 
1414
{
 
1415
        NMDevice *nm_device;
 
1416
 
 
1417
        nm_device = net_device_get_nm_device (device);
 
1418
        refresh_header_ui (panel, nm_device, "wimax");
 
1419
}
 
1420
 
 
1421
static void
 
1422
device_refresh_modem_ui (CcNetworkPanel *panel, NetDevice *device)
 
1423
{
 
1424
        NMDeviceModemCapabilities caps;
 
1425
        NMDevice *nm_device;
 
1426
        const char *str;
 
1427
 
 
1428
        nm_device = net_device_get_nm_device (device);
 
1429
 
 
1430
        refresh_header_ui (panel, nm_device, "mobilebb");
 
1431
 
 
1432
        caps = nm_device_modem_get_current_capabilities (NM_DEVICE_MODEM (nm_device));
 
1433
 
 
1434
        if ((caps & NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS) ||
 
1435
            (caps & NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO)) {
 
1436
                /* IMEI */
 
1437
                str = g_object_get_data (G_OBJECT (device),
 
1438
                                         "ControlCenter::EquipmentIdentifier");
 
1439
                panel_set_widget_data (panel,
 
1440
                                       "mobilebb",
 
1441
                                       "imei",
 
1442
                                       str);
 
1443
 
 
1444
                /* operator name */
 
1445
                str = g_object_get_data (G_OBJECT (device),
 
1446
                                         "ControlCenter::OperatorName");
 
1447
                panel_set_widget_data (panel,
 
1448
                                       "mobilebb",
 
1449
                                       "provider",
 
1450
                                       str);
 
1451
 
 
1452
                /* device speed */
 
1453
                panel_set_widget_data (panel,
 
1454
                                       "mobilebb",
 
1455
                                       "speed",
 
1456
                                       NULL);
 
1457
        }
 
1458
}
 
1459
 
 
1460
static void
 
1461
nm_device_refresh_device_ui (CcNetworkPanel *panel, NetDevice *device)
 
1462
{
 
1463
        CcNetworkPanelPrivate *priv = panel->priv;
 
1464
        const gchar *str;
 
1465
        const gchar *sub_pane = NULL;
 
1466
        gchar *str_tmp;
 
1467
        GHashTable *options = NULL;
 
1468
        GtkWidget *widget;
 
1469
        NMDeviceType type;
 
1470
        NMDHCP4Config *config_dhcp4 = NULL;
 
1471
        NMIP6Config *ip6_config = NULL;
 
1472
        NMDevice *nm_device;
 
1473
        gboolean has_ip4;
 
1474
        gboolean has_ip6;
 
1475
 
 
1476
        /* we have a new device */
 
1477
        nm_device = net_device_get_nm_device (device);
 
1478
        type = nm_device_get_device_type (nm_device);
 
1479
        g_debug ("device %s type %i", nm_device_get_udi (nm_device), type);
 
1480
 
 
1481
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "notebook_types"));
 
1482
 
 
1483
        switch (type) {
 
1484
        case NM_DEVICE_TYPE_ETHERNET:
 
1485
                gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), 0);
 
1486
                sub_pane = "wired";
 
1487
                device_refresh_ethernet_ui (panel, device);
 
1488
                break;
 
1489
        case NM_DEVICE_TYPE_WIFI:
 
1490
                gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), 1);
 
1491
                sub_pane = "wireless";
 
1492
                device_refresh_wifi_ui (panel, device);
 
1493
                break;
 
1494
        case NM_DEVICE_TYPE_WIMAX:
 
1495
                device_refresh_wimax_ui (panel, device);
 
1496
                break;
 
1497
        case NM_DEVICE_TYPE_MODEM:
 
1498
                {
 
1499
                        NMDeviceModemCapabilities caps = nm_device_modem_get_current_capabilities (NM_DEVICE_MODEM (nm_device));
 
1500
                        if ((caps & NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS) ||
 
1501
                            (caps & NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO)) {
 
1502
                                gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), 4);
 
1503
                                sub_pane = "mobilebb";
 
1504
                                device_refresh_modem_ui (panel, device);
 
1505
                        }
 
1506
                }
 
1507
                break;
 
1508
        default:
 
1509
                g_assert_not_reached ();
 
1510
                break;
 
1511
        }
 
1512
 
 
1513
        if (sub_pane == NULL)
 
1514
                goto out;
 
1515
 
 
1516
        /* get IP4 parameters */
 
1517
        config_dhcp4 = nm_device_get_dhcp4_config (nm_device);
 
1518
        if (config_dhcp4 != NULL) {
 
1519
                g_object_get (G_OBJECT (config_dhcp4),
 
1520
                              NM_DHCP4_CONFIG_OPTIONS, &options,
 
1521
                              NULL);
 
1522
 
 
1523
                /* IPv4 address */
 
1524
                str = nm_dhcp4_config_get_one_option (config_dhcp4,
 
1525
                                                      "ip_address");
 
1526
                panel_set_widget_data (panel,
 
1527
                                       sub_pane,
 
1528
                                       "ipv4",
 
1529
                                       str);
 
1530
                has_ip4 = str != NULL;
 
1531
 
 
1532
                /* IPv4 DNS */
 
1533
                panel_set_widget_data (panel,
 
1534
                                       sub_pane,
 
1535
                                       "dns",
 
1536
                                       nm_dhcp4_config_get_one_option (config_dhcp4,
 
1537
                                                                       "domain_name_servers"));
 
1538
 
 
1539
                /* IPv4 route */
 
1540
                panel_set_widget_data (panel,
 
1541
                                       sub_pane,
 
1542
                                       "route",
 
1543
                                       nm_dhcp4_config_get_one_option (config_dhcp4,
 
1544
                                                                       "routers"));
 
1545
 
 
1546
                /* IPv4 netmask */
 
1547
                if (type == NM_DEVICE_TYPE_ETHERNET) {
 
1548
                        panel_set_widget_data (panel,
 
1549
                                               sub_pane,
 
1550
                                               "subnet",
 
1551
                                               nm_dhcp4_config_get_one_option (config_dhcp4,
 
1552
                                                                               "subnet_mask"));
 
1553
                }
 
1554
        } else {
 
1555
                /* IPv4 address */
 
1556
                panel_set_widget_data (panel,
 
1557
                                       sub_pane,
 
1558
                                       "ipv4",
 
1559
                                       NULL);
 
1560
                has_ip4 = FALSE;
 
1561
 
 
1562
                /* IPv4 DNS */
 
1563
                panel_set_widget_data (panel,
 
1564
                                       sub_pane,
 
1565
                                       "dns",
 
1566
                                       NULL);
 
1567
 
 
1568
                /* IPv4 route */
 
1569
                panel_set_widget_data (panel,
 
1570
                                       sub_pane,
 
1571
                                       "route",
 
1572
                                       NULL);
 
1573
 
 
1574
                /* IPv4 netmask */
 
1575
                if (type == NM_DEVICE_TYPE_ETHERNET) {
 
1576
                        panel_set_widget_data (panel,
 
1577
                                               sub_pane,
 
1578
                                               "subnet",
 
1579
                                               NULL);
 
1580
                }
 
1581
        }
 
1582
 
 
1583
        /* get IP6 parameters */
 
1584
        ip6_config = nm_device_get_ip6_config (nm_device);
 
1585
        if (ip6_config != NULL) {
 
1586
 
 
1587
                /* IPv6 address */
 
1588
                str_tmp = get_ipv6_config_address_as_string (ip6_config);
 
1589
                panel_set_widget_data (panel, sub_pane, "ipv6", str_tmp);
 
1590
                has_ip6 = str_tmp != NULL;
 
1591
                g_free (str_tmp);
 
1592
        } else {
 
1593
                panel_set_widget_data (panel, sub_pane, "ipv6", NULL);
 
1594
                has_ip6 = FALSE;
 
1595
        }
 
1596
 
 
1597
        if (has_ip4 && has_ip6) {
 
1598
                panel_set_widget_heading (panel, sub_pane, "ipv4", _("IPv4 Address"));
 
1599
                panel_set_widget_heading (panel, sub_pane, "ipv6", _("IPv6 Address"));
 
1600
        }
 
1601
        else if (has_ip4) {
 
1602
                panel_set_widget_heading (panel, sub_pane, "ipv4", _("IP Address"));
 
1603
        }
 
1604
        else if (has_ip6) {
 
1605
                panel_set_widget_heading (panel, sub_pane, "ipv6", _("IP Address"));
 
1606
        }
 
1607
out: ;
 
1608
}
 
1609
 
 
1610
static void
 
1611
nm_device_refresh_vpn_ui (CcNetworkPanel *panel, NetVpn *vpn)
 
1612
{
 
1613
        GtkWidget *widget;
 
1614
        GtkWidget *sw;
 
1615
        const gchar *sub_pane = "vpn";
 
1616
        const gchar *status;
 
1617
        CcNetworkPanelPrivate *priv = panel->priv;
 
1618
        const GPtrArray *acs;
 
1619
        NMActiveConnection *a;
 
1620
        gint i;
 
1621
        const gchar *path;
 
1622
        const gchar *apath;
 
1623
        NMVPNConnectionState state;
 
1624
 
 
1625
        sw = GTK_WIDGET (gtk_builder_get_object (priv->builder,
 
1626
                                                 "device_vpn_off_switch"));
 
1627
        gtk_widget_set_visible (sw, TRUE);
 
1628
 
 
1629
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
1630
                                                     "button_vpn_options"));
 
1631
        gtk_widget_set_visible (widget, TRUE);
 
1632
        gtk_widget_set_sensitive (widget, TRUE);
 
1633
 
 
1634
        /* use proxy note page */
 
1635
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
 
1636
                                                     "notebook_types"));
 
1637
        gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), 3);
 
1638
 
 
1639
        /* set VPN icon */
 
1640
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
 
1641
                                                     "image_vpn_device"));
 
1642
        gtk_image_set_from_icon_name (GTK_IMAGE (widget),
 
1643
                                      "network-vpn",
 
1644
                                      GTK_ICON_SIZE_DIALOG);
 
1645
 
 
1646
        /* use title */
 
1647
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
 
1648
                                                     "label_vpn_device"));
 
1649
        gtk_label_set_label (GTK_LABEL (widget), net_object_get_title (NET_OBJECT (vpn)));
 
1650
 
 
1651
        /* use status */
 
1652
        state = net_vpn_get_state (vpn);
 
1653
 
 
1654
        acs = nm_client_get_active_connections (priv->client);
 
1655
        if (acs != NULL) {
 
1656
                path = nm_connection_get_path (net_vpn_get_connection (vpn));
 
1657
                for (i = 0; i < acs->len; i++) {
 
1658
                        a = (NMActiveConnection*)acs->pdata[i];
 
1659
 
 
1660
                        apath = nm_active_connection_get_connection (a);
 
1661
                        if (NM_IS_VPN_CONNECTION (a) && strcmp (apath, path) == 0) {
 
1662
                                state = nm_vpn_connection_get_vpn_state (NM_VPN_CONNECTION (a));
 
1663
                                break;
 
1664
                        }
 
1665
                }
 
1666
        }
 
1667
 
 
1668
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
 
1669
                                                     "label_vpn_status"));
 
1670
        status = panel_vpn_state_to_localized_string (state);
 
1671
        gtk_label_set_label (GTK_LABEL (widget), status);
 
1672
        priv->updating_device = TRUE;
 
1673
        gtk_switch_set_active (GTK_SWITCH (sw),
 
1674
                               state != NM_VPN_CONNECTION_STATE_FAILED &&
 
1675
                               state != NM_VPN_CONNECTION_STATE_DISCONNECTED);
 
1676
        priv->updating_device = FALSE;
 
1677
 
 
1678
        /* gateway */
 
1679
        panel_set_widget_data (panel,
 
1680
                               sub_pane,
 
1681
                               "gateway",
 
1682
                                net_vpn_get_gateway (vpn));
 
1683
 
 
1684
        /* groupname */
 
1685
        panel_set_widget_data (panel,
 
1686
                               sub_pane,
 
1687
                               "group_name",
 
1688
                                net_vpn_get_id (vpn));
 
1689
 
 
1690
        /* username */
 
1691
        panel_set_widget_data (panel,
 
1692
                               sub_pane,
 
1693
                               "username",
 
1694
                                net_vpn_get_username (vpn));
 
1695
 
 
1696
        /* password */
 
1697
        panel_set_widget_data (panel,
 
1698
                               sub_pane,
 
1699
                               "group_password",
 
1700
                                net_vpn_get_password (vpn));
 
1701
}
 
1702
#endif
 
1703
 
 
1704
static void
 
1705
refresh_ui (CcNetworkPanel *panel)
 
1706
{
 
1707
        GtkTreeSelection *selection;
 
1708
        GtkTreeIter iter;
 
1709
        GtkTreeModel *model;
 
1710
        GtkWidget *widget;
 
1711
        void *object = NULL;
 
1712
        CcNetworkPanelPrivate *priv = panel->priv;
 
1713
 
 
1714
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
1715
                                                     "treeview_devices"));
 
1716
        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
 
1717
 
 
1718
        /* will only work in single or browse selection mode! */
 
1719
        if (!gtk_tree_selection_get_selected (selection, &model, &iter)) {
 
1720
                g_debug ("no row selected");
 
1721
                goto out;
 
1722
        }
 
1723
 
 
1724
        /* this is the proxy settings device */
 
1725
        if (object == NULL) {
 
1726
 
 
1727
                /* set header to something sane */
 
1728
                widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
 
1729
                                                             "image_proxy_device"));
 
1730
                gtk_image_set_from_icon_name (GTK_IMAGE (widget),
 
1731
                                              "preferences-system-network",
 
1732
                                              GTK_ICON_SIZE_DIALOG);
 
1733
                widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
 
1734
                                                             "label_proxy_device"));
 
1735
                gtk_label_set_label (GTK_LABEL (widget),
 
1736
                                     _("Proxy"));
 
1737
                widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
 
1738
                                                             "label_proxy_status"));
 
1739
                gtk_label_set_label (GTK_LABEL (widget), "");
 
1740
 
 
1741
                widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
 
1742
                                                             "notebook_types"));
 
1743
                gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), 2);
 
1744
 
 
1745
                /* hide the switch until we get some more detail in the mockup */
 
1746
                widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
 
1747
                                                             "device_proxy_off_switch"));
 
1748
                if (widget != NULL)
 
1749
                        gtk_widget_hide (widget);
 
1750
 
 
1751
                /* we shoulnd't be able to delete the proxy device */
 
1752
                widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
 
1753
                                                             "remove_toolbutton"));
 
1754
                gtk_widget_set_sensitive (widget, FALSE);
 
1755
                goto out;
 
1756
        }
 
1757
 
 
1758
#if 0
 
1759
        /* VPN */
 
1760
        if (NET_IS_VPN (object)) {
 
1761
                nm_device_refresh_vpn_ui (panel, NET_VPN (object));
 
1762
 
 
1763
                /* we're able to remove the VPN connection */
 
1764
                widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
 
1765
                                                             "remove_toolbutton"));
 
1766
                gtk_widget_set_sensitive (widget, TRUE);
 
1767
                goto out;
 
1768
        }
 
1769
 
 
1770
        /* device */
 
1771
        if (NET_IS_DEVICE (object)) {
 
1772
 
 
1773
                /* we're not yet able to remove the connection */
 
1774
                widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
 
1775
                                                             "remove_toolbutton"));
 
1776
                gtk_widget_set_sensitive (widget, FALSE);
 
1777
 
 
1778
                /* refresh device */
 
1779
                nm_device_refresh_device_ui (panel, NET_DEVICE (object));
 
1780
        }
 
1781
#endif
 
1782
out:
 
1783
        return;
 
1784
}
 
1785
 
 
1786
static void
 
1787
nm_devices_treeview_clicked_cb (GtkTreeSelection *selection, CcNetworkPanel *panel)
 
1788
{
 
1789
        refresh_ui (panel);
 
1790
}
 
1791
 
 
1792
static void
 
1793
panel_add_proxy_device (CcNetworkPanel *panel)
 
1794
{
 
1795
        gchar *title;
 
1796
        GtkListStore *liststore_devices;
 
1797
        GtkTreeIter iter;
 
1798
 
 
1799
        liststore_devices = GTK_LIST_STORE (gtk_builder_get_object (panel->priv->builder,
 
1800
                                            "liststore_devices"));
 
1801
        title = g_strdup_printf ("<span size=\"large\">%s</span>",
 
1802
                                 _("Network proxy"));
 
1803
 
 
1804
        gtk_list_store_append (liststore_devices, &iter);
 
1805
        gtk_list_store_set (liststore_devices,
 
1806
                            &iter,
 
1807
                            PANEL_DEVICES_COLUMN_ICON, "preferences-system-network",
 
1808
                            PANEL_DEVICES_COLUMN_TITLE, title,
 
1809
                            PANEL_DEVICES_COLUMN_SORT, "9",
 
1810
                            PANEL_DEVICES_COLUMN_OBJECT, NULL,
 
1811
                            -1);
 
1812
        g_free (title);
 
1813
}
 
1814
 
 
1815
#if 0
 
1816
static void
 
1817
cc_network_panel_notify_enable_active_cb (GtkSwitch *sw,
 
1818
                                          GParamSpec *pspec,
 
1819
                                          CcNetworkPanel *panel)
 
1820
{
 
1821
        gboolean enable;
 
1822
 
 
1823
        /* set enabled state */
 
1824
        enable = !gtk_switch_get_active (sw);
 
1825
        nm_client_wireless_set_enabled (panel->priv->client, enable);
 
1826
}
 
1827
 
 
1828
static void
 
1829
connection_state_changed (NMActiveConnection *c, GParamSpec *pspec, CcNetworkPanel *panel)
 
1830
{
 
1831
        refresh_ui (panel);
 
1832
}
 
1833
 
 
1834
static void
 
1835
active_connections_changed (NMClient *client, GParamSpec *pspec, gpointer user_data)
 
1836
{
 
1837
        CcNetworkPanel *panel = user_data;
 
1838
        const GPtrArray *connections;
 
1839
        int i, j;
 
1840
 
 
1841
        g_debug ("Active connections changed:");
 
1842
        connections = nm_client_get_active_connections (client);
 
1843
        for (i = 0; connections && (i < connections->len); i++) {
 
1844
                NMActiveConnection *connection;
 
1845
                const GPtrArray *devices;
 
1846
 
 
1847
                connection = g_ptr_array_index (connections, i);
 
1848
                g_debug ("    %s", nm_object_get_path (NM_OBJECT (connection)));
 
1849
                devices = nm_active_connection_get_devices (connection);
 
1850
                for (j = 0; devices && j < devices->len; j++)
 
1851
                        g_debug ("           %s", nm_device_get_udi (g_ptr_array_index (devices, j)));
 
1852
                if (NM_IS_VPN_CONNECTION (connection))
 
1853
                        g_debug ("           VPN base connection: %s", nm_active_connection_get_specific_object (connection));
 
1854
 
 
1855
                if (g_object_get_data (G_OBJECT (connection), "has-state-changed-handler") == NULL) {
 
1856
                        g_signal_connect_object (connection, "notify::state",
 
1857
                                                 G_CALLBACK (connection_state_changed), panel, 0);
 
1858
                        g_object_set_data (G_OBJECT (connection), "has-state-changed-handler", GINT_TO_POINTER (TRUE));
 
1859
                }
 
1860
        }
 
1861
 
 
1862
        refresh_ui (panel);
 
1863
}
 
1864
 
 
1865
static void
 
1866
device_added_cb (NMClient *client, NMDevice *device, CcNetworkPanel *panel)
 
1867
{
 
1868
        g_debug ("New device added");
 
1869
        panel_add_device (panel, device);
 
1870
}
 
1871
 
 
1872
static void
 
1873
device_removed_cb (NMClient *client, NMDevice *device, CcNetworkPanel *panel)
 
1874
{
 
1875
        g_debug ("Device removed");
 
1876
        panel_remove_device (panel, device);
 
1877
}
 
1878
 
 
1879
static void
 
1880
manager_running (NMClient *client, GParamSpec *pspec, gpointer user_data)
 
1881
{
 
1882
        const GPtrArray *devices;
 
1883
        int i;
 
1884
        NMDevice *device_tmp;
 
1885
        GtkListStore *liststore_devices;
 
1886
        CcNetworkPanel *panel = CC_NETWORK_PANEL (user_data);
 
1887
 
 
1888
        /* clear all devices we added */
 
1889
        if (!nm_client_get_manager_running (client)) {
 
1890
                g_debug ("NM disappeared");
 
1891
                liststore_devices = GTK_LIST_STORE (gtk_builder_get_object (panel->priv->builder,
 
1892
                                                    "liststore_devices"));
 
1893
                gtk_list_store_clear (liststore_devices);
 
1894
                panel_add_proxy_device (panel);
 
1895
                goto out;
 
1896
        }
 
1897
 
 
1898
        g_debug ("coldplugging devices");
 
1899
        devices = nm_client_get_devices (client);
 
1900
        if (devices == NULL) {
 
1901
                g_debug ("No devices to add");
 
1902
                return;
 
1903
        }
 
1904
        for (i = 0; i < devices->len; i++) {
 
1905
                device_tmp = g_ptr_array_index (devices, i);
 
1906
                panel_add_device (panel, device_tmp);
 
1907
        }
 
1908
out:
 
1909
        /* select the first device */
 
1910
        select_first_device (panel);
 
1911
}
 
1912
 
 
1913
static NetObject *
 
1914
find_in_model_by_id (CcNetworkPanel *panel, const gchar *id)
 
1915
{
 
1916
        gboolean ret;
 
1917
        NetObject *object_tmp;
 
1918
        GtkTreeIter iter;
 
1919
        GtkTreeModel *model;
 
1920
        NetObject *object = NULL;
 
1921
 
 
1922
        /* find in model */
 
1923
        model = GTK_TREE_MODEL (gtk_builder_get_object (panel->priv->builder,
 
1924
                                                        "liststore_devices"));
 
1925
        ret = gtk_tree_model_get_iter_first (model, &iter);
 
1926
        if (!ret)
 
1927
                goto out;
 
1928
 
 
1929
        /* get the other elements */
 
1930
        ret = FALSE;
 
1931
        do {
 
1932
                gtk_tree_model_get (model, &iter,
 
1933
                                    PANEL_DEVICES_COLUMN_OBJECT, &object_tmp,
 
1934
                                    -1);
 
1935
                if (object_tmp != NULL) {
 
1936
                        g_debug ("got %s", net_object_get_id (object_tmp));
 
1937
                        if (g_strcmp0 (net_object_get_id (object_tmp), id) == 0)
 
1938
                                object = object_tmp;
 
1939
                        g_object_unref (object_tmp);
 
1940
                }
 
1941
        } while (object == NULL && gtk_tree_model_iter_next (model, &iter));
 
1942
out:
 
1943
        return object;
 
1944
}
 
1945
 
 
1946
static void
 
1947
panel_add_vpn_device (CcNetworkPanel *panel, NMConnection *connection)
 
1948
{
 
1949
        gchar *title;
 
1950
        gchar *title_markup;
 
1951
        GtkListStore *liststore_devices;
 
1952
        GtkTreeIter iter;
 
1953
        NetVpn *net_vpn;
 
1954
        const gchar *id;
 
1955
 
 
1956
        /* does already exist */
 
1957
        id = nm_connection_get_path (connection);
 
1958
        if (find_in_model_by_id (panel, id) != NULL)
 
1959
                return;
 
1960
 
 
1961
        /* add as a virtual object */
 
1962
        net_vpn = net_vpn_new ();
 
1963
        net_vpn_set_connection (net_vpn, connection);
 
1964
        net_object_set_id (NET_OBJECT (net_vpn), id);
 
1965
        register_object_interest (panel, NET_OBJECT (net_vpn));
 
1966
 
 
1967
        liststore_devices = GTK_LIST_STORE (gtk_builder_get_object (panel->priv->builder,
 
1968
                                            "liststore_devices"));
 
1969
        title = g_strdup_printf (_("%s VPN"), nm_connection_get_id (connection));
 
1970
        title_markup = g_strdup_printf ("<span size=\"large\">%s</span>",
 
1971
                                        title);
 
1972
 
 
1973
        net_object_set_title (NET_OBJECT (net_vpn), title);
 
1974
        gtk_list_store_append (liststore_devices, &iter);
 
1975
        gtk_list_store_set (liststore_devices,
 
1976
                            &iter,
 
1977
                            PANEL_DEVICES_COLUMN_ICON, "network-vpn",
 
1978
                            PANEL_DEVICES_COLUMN_TITLE, title_markup,
 
1979
                            PANEL_DEVICES_COLUMN_SORT, "5",
 
1980
                            PANEL_DEVICES_COLUMN_OBJECT, net_vpn,
 
1981
                            -1);
 
1982
        g_free (title);
 
1983
        g_free (title_markup);
 
1984
}
 
1985
 
 
1986
static void
 
1987
add_connection (CcNetworkPanel *panel,
 
1988
                NMConnection *connection)
 
1989
{
 
1990
        NMSettingConnection *s_con;
 
1991
        const gchar *type;
 
1992
 
 
1993
        s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection,
 
1994
                                                                  NM_TYPE_SETTING_CONNECTION));
 
1995
        type = nm_setting_connection_get_connection_type (s_con);
 
1996
        if (g_strcmp0 (type, "vpn") != 0)
 
1997
                return;
 
1998
        g_debug ("add %s/%s remote connection: %s",
 
1999
                 type, g_type_name_from_instance ((GTypeInstance*)connection),
 
2000
                 nm_connection_get_path (connection));
 
2001
        panel_add_vpn_device (panel, connection);
 
2002
}
 
2003
 
 
2004
static void
 
2005
notify_new_connection_cb (NMRemoteSettings *settings,
 
2006
                          NMRemoteConnection *connection,
 
2007
                          CcNetworkPanel *panel)
 
2008
{
 
2009
        add_connection (panel, NM_CONNECTION (connection));
 
2010
}
 
2011
 
 
2012
static void
 
2013
notify_connections_read_cb (NMRemoteSettings *settings,
 
2014
                            CcNetworkPanel *panel)
 
2015
{
 
2016
        GSList *list, *iter;
 
2017
        NMConnection *connection;
 
2018
 
 
2019
        list = nm_remote_settings_list_connections (settings);
 
2020
        g_debug ("%p has %i remote connections",
 
2021
                 panel, g_slist_length (list));
 
2022
        for (iter = list; iter; iter = g_slist_next (iter)) {
 
2023
                connection = NM_CONNECTION (iter->data);
 
2024
                add_connection (panel, connection);
 
2025
        }
 
2026
}
 
2027
 
 
2028
static gboolean
 
2029
display_version_warning_idle (CcNetworkPanel *panel)
 
2030
{
 
2031
        GtkWidget  *dialog;
 
2032
        GtkWidget  *image;
 
2033
        GtkWindow  *window;
 
2034
        const char *message;
 
2035
 
 
2036
        /* TRANSLATORS: the user is running a NM that is not API compatible */
 
2037
        message = _("The system network services are not compatible with this version.");
 
2038
 
 
2039
        window = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (panel)));
 
2040
        dialog = gtk_message_dialog_new (window,
 
2041
                                         GTK_DIALOG_MODAL,
 
2042
                                         GTK_MESSAGE_ERROR,
 
2043
                                         GTK_BUTTONS_CLOSE,
 
2044
                                         "%s",
 
2045
                                         message);
 
2046
        image = gtk_image_new_from_icon_name ("computer-fail", GTK_ICON_SIZE_DIALOG);
 
2047
        gtk_widget_show (image);
 
2048
        gtk_message_dialog_set_image (GTK_MESSAGE_DIALOG (dialog), image);
 
2049
 
 
2050
        gtk_dialog_run (GTK_DIALOG (dialog));
 
2051
        gtk_widget_destroy (dialog);
 
2052
 
 
2053
        return FALSE;
 
2054
}
 
2055
 
 
2056
static gboolean
 
2057
panel_check_network_manager_version (CcNetworkPanel *panel)
 
2058
{
 
2059
        const gchar *version;
 
2060
        gchar **split = NULL;
 
2061
        guint major = 0;
 
2062
        guint micro = 0;
 
2063
        guint minor = 0;
 
2064
        gboolean ret = TRUE;
 
2065
 
 
2066
        /* parse running version */
 
2067
        version = nm_client_get_version (panel->priv->client);
 
2068
        if (version != NULL) {
 
2069
                split = g_strsplit (version, ".", -1);
 
2070
                major = atoi (split[0]);
 
2071
                minor = atoi (split[1]);
 
2072
                micro = atoi (split[2]);
 
2073
        }
 
2074
 
 
2075
        /* is it too new or old */
 
2076
        if (major > 0 || major > 9 || (minor <= 8 && micro < 992)) {
 
2077
                ret = FALSE;
 
2078
 
 
2079
                /* do modal dialog in idle so we don't block startup */
 
2080
                g_idle_add ((GSourceFunc)display_version_warning_idle, panel);
 
2081
        }
 
2082
 
 
2083
        g_strfreev (split);
 
2084
        return ret;
 
2085
}
 
2086
 
 
2087
static void
 
2088
edit_connection (GtkButton *button, CcNetworkPanel *panel)
 
2089
{
 
2090
        NMConnection *c;
 
2091
        const gchar *uuid;
 
2092
        gchar *cmdline;
 
2093
        GError *error;
 
2094
        NetObject *object;
 
2095
        NMDevice *device;
 
2096
 
 
2097
        object = get_selected_object (panel);
 
2098
        if (object == NULL)
 
2099
                return;
 
2100
        else if (NET_IS_VPN (object)) {
 
2101
                c = net_vpn_get_connection (NET_VPN (object));
 
2102
        }
 
2103
        else {
 
2104
                device = net_device_get_nm_device (NET_DEVICE (object));
 
2105
                c = find_connection_for_device (panel, device);
 
2106
        }
 
2107
 
 
2108
        uuid = nm_connection_get_uuid (c);
 
2109
 
 
2110
        cmdline = g_strdup_printf ("nm-connection-editor --edit %s", uuid);
 
2111
        g_debug ("Launching '%s'\n", cmdline);
 
2112
 
 
2113
        error = NULL;
 
2114
        if (!g_spawn_command_line_async (cmdline, &error)) {
 
2115
                g_warning ("Failed to launch nm-connection-editor: %s", error->message);
 
2116
                g_error_free (error);
 
2117
        }
 
2118
 
 
2119
        g_free (cmdline);
 
2120
}
 
2121
 
 
2122
static void
 
2123
add_connection_cb (GtkToolButton *button, CcNetworkPanel *panel)
 
2124
{
 
2125
        GtkWidget *dialog;
 
2126
        gint response;
 
2127
 
 
2128
        dialog = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2129
                                                     "connection_type_dialog"));
 
2130
        gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (panel))));
 
2131
 
 
2132
        response = gtk_dialog_run (GTK_DIALOG (dialog));
 
2133
 
 
2134
        gtk_widget_hide (dialog);
 
2135
 
 
2136
        if (response == GTK_RESPONSE_OK) {
 
2137
                GtkComboBox *combo;
 
2138
                GtkTreeModel *model;
 
2139
                GtkTreeIter iter;
 
2140
                gchar *type;
 
2141
                gchar *cmdline;
 
2142
                GError *error;
 
2143
 
 
2144
                combo = GTK_COMBO_BOX (gtk_builder_get_object (panel->priv->builder,
 
2145
                                                               "connection_type_combo"));
 
2146
                model = gtk_combo_box_get_model (combo);
 
2147
                gtk_combo_box_get_active_iter (combo, &iter);
 
2148
                type = NULL;
 
2149
                gtk_tree_model_get (model, &iter, 1, &type, -1);
 
2150
 
 
2151
                cmdline = g_strdup_printf ("nm-connection-editor --create --type %s", type);
 
2152
                g_debug ("Launching '%s'\n", cmdline);
 
2153
 
 
2154
                error = NULL;
 
2155
                if (!g_spawn_command_line_async (cmdline, &error)) {
 
2156
                        g_warning ("Failed to launch nm-connection-editor: %s", error->message);
 
2157
                        g_error_free (error);
 
2158
                }
 
2159
                g_free (cmdline);
 
2160
                g_free (type);
 
2161
        }
 
2162
}
 
2163
 
 
2164
static void
 
2165
remove_connection (GtkToolButton *button, CcNetworkPanel *panel)
 
2166
{
 
2167
        NetObject *object;
 
2168
        NMConnection *connection;
 
2169
 
 
2170
        /* get current device */
 
2171
        object = get_selected_object (panel);
 
2172
        if (object == NULL)
 
2173
                return;
 
2174
 
 
2175
        /* VPN */
 
2176
        if (NET_IS_VPN (object)) {
 
2177
                connection = net_vpn_get_connection (NET_VPN (object));
 
2178
                nm_remote_connection_delete (NM_REMOTE_CONNECTION (connection), NULL, panel);
 
2179
                return;
 
2180
        }
 
2181
}
 
2182
#endif
 
2183
 
 
2184
static void
 
2185
on_toplevel_map (GtkWidget      *widget,
 
2186
                 CcNetworkPanel *panel)
 
2187
{
 
2188
        /* just select the proxy settings */
 
2189
        select_first_device (panel);
 
2190
}
 
2191
 
 
2192
#if 0
 
2193
static void
 
2194
connection_activate_cb (NMClient *client,
 
2195
                        NMActiveConnection *connection,
 
2196
                        GError *error,
 
2197
                        gpointer user_data)
 
2198
{
 
2199
        CcNetworkPanel *panel = user_data;
 
2200
 
 
2201
        if (connection == NULL) {
 
2202
                /* failed to activate */
 
2203
                refresh_ui (panel);
 
2204
        }
 
2205
}
 
2206
 
 
2207
static void
 
2208
connection_add_activate_cb (NMClient *client,
 
2209
                            NMActiveConnection *connection,
 
2210
                            const char *path,
 
2211
                            GError *error,
 
2212
                            gpointer user_data)
 
2213
{
 
2214
        connection_activate_cb (client, connection, error, user_data);
 
2215
}
 
2216
 
 
2217
static void
 
2218
connect_to_hidden_network_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
 
2219
{
 
2220
        GError *error = NULL;
 
2221
        GVariant *result = NULL;
 
2222
 
 
2223
        result = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), res, &error);
 
2224
        if (result == NULL) {
 
2225
                g_warning ("failed to connect to hidden network: %s",
 
2226
                           error->message);
 
2227
                g_error_free (error);
 
2228
                return;
 
2229
        }
 
2230
}
 
2231
 
 
2232
static void
 
2233
connect_to_hidden_network (CcNetworkPanel *panel)
 
2234
{
 
2235
        GDBusProxy *proxy;
 
2236
        GVariant *res = NULL;
 
2237
        GError *error = NULL;
 
2238
 
 
2239
        /* connect to NM applet */
 
2240
        proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
 
2241
                                               G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
 
2242
                                               G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
 
2243
                                               NULL,
 
2244
                                               "org.gnome.network_manager_applet",
 
2245
                                               "/org/gnome/network_manager_applet",
 
2246
                                               "org.gnome.network_manager_applet",
 
2247
                                               panel->priv->cancellable,
 
2248
                                               &error);
 
2249
        if (proxy == NULL) {
 
2250
                g_warning ("failed to connect to NM applet: %s",
 
2251
                           error->message);
 
2252
                g_error_free (error);
 
2253
                goto out;
 
2254
        }
 
2255
 
 
2256
        /* try to show the hidden network UI */
 
2257
        g_dbus_proxy_call (proxy,
 
2258
                           "ConnectToHiddenNetwork",
 
2259
                           NULL,
 
2260
                           G_DBUS_CALL_FLAGS_NONE,
 
2261
                           5000, /* don't wait forever */
 
2262
                           panel->priv->cancellable,
 
2263
                           connect_to_hidden_network_cb,
 
2264
                           panel);
 
2265
out:
 
2266
        if (proxy != NULL)
 
2267
                g_object_unref (proxy);
 
2268
        if (res != NULL)
 
2269
                g_variant_unref (res);
 
2270
}
 
2271
 
 
2272
static void
 
2273
wireless_ap_changed_cb (GtkComboBox *combo_box, CcNetworkPanel *panel)
 
2274
{
 
2275
        const GByteArray *ssid;
 
2276
        const gchar *ssid_tmp;
 
2277
        gboolean ret;
 
2278
        gchar *object_path = NULL;
 
2279
        gchar *ssid_target = NULL;
 
2280
        GSList *list, *l;
 
2281
        GSList *filtered;
 
2282
        GtkTreeIter iter;
 
2283
        GtkTreeModel *model;
 
2284
        NetObject *object;
 
2285
        NMConnection *connection;
 
2286
        NMConnection *connection_activate = NULL;
 
2287
        NMDevice *device;
 
2288
        NMSettingWireless *setting_wireless;
 
2289
 
 
2290
        if (panel->priv->updating_device)
 
2291
                goto out;
 
2292
 
 
2293
        ret = gtk_combo_box_get_active_iter (combo_box, &iter);
 
2294
        if (!ret)
 
2295
                goto out;
 
2296
 
 
2297
        object = get_selected_object (panel);
 
2298
        if (object == NULL)
 
2299
                goto out;
 
2300
 
 
2301
        device = net_device_get_nm_device (NET_DEVICE (object));
 
2302
        if (device == NULL)
 
2303
                goto out;
 
2304
 
 
2305
        /* get entry */
 
2306
        model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo_box));
 
2307
        gtk_tree_model_get (model, &iter,
 
2308
                            PANEL_WIRELESS_COLUMN_ID, &object_path,
 
2309
                            PANEL_WIRELESS_COLUMN_TITLE, &ssid_target,
 
2310
                            -1);
 
2311
        g_debug ("try to connect to WIFI network %s [%s]",
 
2312
                 ssid_target, object_path);
 
2313
        if (g_strcmp0 (object_path, "ap-other...") == 0) {
 
2314
                connect_to_hidden_network (panel);
 
2315
                goto out;
 
2316
        }
 
2317
 
 
2318
        /* look for an existing connection we can use */
 
2319
        list = nm_remote_settings_list_connections (panel->priv->remote_settings);
 
2320
        g_debug ("%i existing remote connections available",
 
2321
                 g_slist_length (list));
 
2322
        filtered = nm_device_filter_connections (device, list);
 
2323
        g_debug ("%i suitable remote connections to check",
 
2324
                 g_slist_length (filtered));
 
2325
        for (l = filtered; l; l = g_slist_next (l)) {
 
2326
                connection = NM_CONNECTION (l->data);
 
2327
                setting_wireless = nm_connection_get_setting_wireless (connection);
 
2328
                if (!NM_IS_SETTING_WIRELESS (setting_wireless))
 
2329
                        continue;
 
2330
                ssid = nm_setting_wireless_get_ssid (setting_wireless);
 
2331
                if (ssid == NULL)
 
2332
                        continue;
 
2333
                ssid_tmp = nm_utils_escape_ssid (ssid->data, ssid->len);
 
2334
                if (g_strcmp0 (ssid_target, ssid_tmp) == 0) {
 
2335
                        g_debug ("we found an existing connection %s to activate!",
 
2336
                                 nm_connection_get_id (connection));
 
2337
                        connection_activate = connection;
 
2338
                        break;
 
2339
                }
 
2340
        }
 
2341
 
 
2342
        g_slist_free (list);
 
2343
        g_slist_free (filtered);
 
2344
 
 
2345
        /* activate the connection */
 
2346
        if (connection_activate != NULL) {
 
2347
                nm_client_activate_connection (panel->priv->client,
 
2348
                                               connection_activate,
 
2349
                                               device, NULL,
 
2350
                                               connection_activate_cb, panel);
 
2351
                goto out;
 
2352
        }
 
2353
 
 
2354
        /* create one, as it's missing */
 
2355
        g_debug ("no existing connection found for %s, creating",
 
2356
                 ssid_target);
 
2357
        nm_client_add_and_activate_connection (panel->priv->client,
 
2358
                                               NULL,
 
2359
                                               device, object_path,
 
2360
                                               connection_add_activate_cb, panel);
 
2361
out:
 
2362
        g_free (ssid_target);
 
2363
        g_free (object_path);
 
2364
}
 
2365
 
 
2366
static gint
 
2367
wireless_ap_model_sort_cb (GtkTreeModel *model,
 
2368
                           GtkTreeIter *a,
 
2369
                           GtkTreeIter *b,
 
2370
                           gpointer user_data)
 
2371
{
 
2372
        gchar *str_a;
 
2373
        gchar *str_b;
 
2374
        gint retval;
 
2375
 
 
2376
        gtk_tree_model_get (model, a,
 
2377
                            PANEL_WIRELESS_COLUMN_SORT, &str_a,
 
2378
                            -1);
 
2379
        gtk_tree_model_get (model, b,
 
2380
                            PANEL_WIRELESS_COLUMN_SORT, &str_b,
 
2381
                            -1);
 
2382
 
 
2383
        /* special case blank entries to the bottom */
 
2384
        if (g_strcmp0 (str_a, "") == 0) {
 
2385
                retval = 1;
 
2386
                goto out;
 
2387
        }
 
2388
        if (g_strcmp0 (str_b, "") == 0) {
 
2389
                retval = -1;
 
2390
                goto out;
 
2391
        }
 
2392
 
 
2393
        /* case sensitive search like before */
 
2394
        g_debug ("compare %s with %s", str_a, str_b);
 
2395
        retval = g_strcmp0 (str_a, str_b);
 
2396
out:
 
2397
        g_free (str_a);
 
2398
        g_free (str_b);
 
2399
        return retval;
 
2400
}
 
2401
#endif
 
2402
 
 
2403
static void
 
2404
cc_network_panel_init (CcNetworkPanel *panel)
 
2405
{
 
2406
        gboolean ret;
 
2407
        GError *error = NULL;
 
2408
        gint value;
 
2409
        GSettings *settings_tmp;
 
2410
        GtkAdjustment *adjustment;
 
2411
        GtkCellRenderer *renderer;
 
2412
        GtkComboBox *combobox;
 
2413
        GtkStyleContext *context;
 
2414
        GtkTreeSelection *selection;
 
2415
        GtkTreeSortable *sortable;
 
2416
        GtkWidget *widget;
 
2417
        GtkWidget *toplevel;
 
2418
 
 
2419
        panel->priv = NETWORK_PANEL_PRIVATE (panel);
 
2420
 
 
2421
        panel->priv->builder = gtk_builder_new ();
 
2422
        gtk_builder_add_from_file (panel->priv->builder,
 
2423
                                   GNOMECC_UI_DIR "/network.ui",
 
2424
                                   &error);
 
2425
        if (error != NULL) {
 
2426
                g_warning ("Could not load interface file: %s", error->message);
 
2427
                g_error_free (error);
 
2428
                return;
 
2429
        }
 
2430
 
 
2431
        panel->priv->cancellable = g_cancellable_new ();
 
2432
 
 
2433
        panel->priv->proxy_settings = g_settings_new ("org.gnome.system.proxy");
 
2434
        g_signal_connect (panel->priv->proxy_settings,
 
2435
                          "changed",
 
2436
                          G_CALLBACK (panel_settings_changed),
 
2437
                          panel);
 
2438
 
 
2439
        /* actions */
 
2440
        value = g_settings_get_enum (panel->priv->proxy_settings, "mode");
 
2441
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2442
                                                     "combobox_proxy_mode"));
 
2443
        panel_set_value_for_combo (panel, GTK_COMBO_BOX (widget), value);
 
2444
        g_signal_connect (widget, "changed",
 
2445
                          G_CALLBACK (panel_proxy_mode_combo_changed_cb),
 
2446
                          panel);
 
2447
 
 
2448
        /* bind the proxy values */
 
2449
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2450
                                                     "entry_proxy_url"));
 
2451
        g_settings_bind (panel->priv->proxy_settings, "autoconfig-url",
 
2452
                         widget, "text",
 
2453
                         G_SETTINGS_BIND_DEFAULT);
 
2454
 
 
2455
        /* bind the proxy values */
 
2456
        settings_tmp = g_settings_new ("org.gnome.system.proxy.http");
 
2457
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2458
                                                     "entry_proxy_http"));
 
2459
        g_settings_bind (settings_tmp, "host",
 
2460
                         widget, "text",
 
2461
                         G_SETTINGS_BIND_DEFAULT);
 
2462
        adjustment = GTK_ADJUSTMENT (gtk_builder_get_object (panel->priv->builder,
 
2463
                                                             "adjustment_proxy_port_http"));
 
2464
        g_settings_bind (settings_tmp, "port",
 
2465
                         adjustment, "value",
 
2466
                         G_SETTINGS_BIND_DEFAULT);
 
2467
        g_object_unref (settings_tmp);
 
2468
 
 
2469
        /* bind the proxy values */
 
2470
        settings_tmp = g_settings_new ("org.gnome.system.proxy.https");
 
2471
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2472
                                                     "entry_proxy_https"));
 
2473
        g_settings_bind (settings_tmp, "host",
 
2474
                         widget, "text",
 
2475
                         G_SETTINGS_BIND_DEFAULT);
 
2476
        adjustment = GTK_ADJUSTMENT (gtk_builder_get_object (panel->priv->builder,
 
2477
                                                             "adjustment_proxy_port_https"));
 
2478
        g_settings_bind (settings_tmp, "port",
 
2479
                         adjustment, "value",
 
2480
                         G_SETTINGS_BIND_DEFAULT);
 
2481
        g_object_unref (settings_tmp);
 
2482
 
 
2483
        /* bind the proxy values */
 
2484
        settings_tmp = g_settings_new ("org.gnome.system.proxy.ftp");
 
2485
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2486
                                                     "entry_proxy_ftp"));
 
2487
        g_settings_bind (settings_tmp, "host",
 
2488
                         widget, "text",
 
2489
                         G_SETTINGS_BIND_DEFAULT);
 
2490
        adjustment = GTK_ADJUSTMENT (gtk_builder_get_object (panel->priv->builder,
 
2491
                                                             "adjustment_proxy_port_ftp"));
 
2492
        g_settings_bind (settings_tmp, "port",
 
2493
                         adjustment, "value",
 
2494
                         G_SETTINGS_BIND_DEFAULT);
 
2495
        g_object_unref (settings_tmp);
 
2496
 
 
2497
        /* bind the proxy values */
 
2498
        settings_tmp = g_settings_new ("org.gnome.system.proxy.socks");
 
2499
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2500
                                                     "entry_proxy_socks"));
 
2501
        g_settings_bind (settings_tmp, "host",
 
2502
                         widget, "text",
 
2503
                         G_SETTINGS_BIND_DEFAULT);
 
2504
        adjustment = GTK_ADJUSTMENT (gtk_builder_get_object (panel->priv->builder,
 
2505
                                                             "adjustment_proxy_port_socks"));
 
2506
        g_settings_bind (settings_tmp, "port",
 
2507
                         adjustment, "value",
 
2508
                         G_SETTINGS_BIND_DEFAULT);
 
2509
        g_object_unref (settings_tmp);
 
2510
 
 
2511
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2512
                                                     "treeview_devices"));
 
2513
        panel_add_devices_columns (panel, GTK_TREE_VIEW (widget));
 
2514
        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
 
2515
        gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
 
2516
        g_signal_connect (selection, "changed",
 
2517
                          G_CALLBACK (nm_devices_treeview_clicked_cb), panel);
 
2518
 
 
2519
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2520
                                                     "devices_scrolledwindow"));
 
2521
        context = gtk_widget_get_style_context (widget);
 
2522
        gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
 
2523
 
 
2524
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2525
                                                     "devices_toolbar"));
 
2526
        context = gtk_widget_get_style_context (widget);
 
2527
        gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
 
2528
 
 
2529
        /* add the virtual proxy device */
 
2530
        panel_add_proxy_device (panel);
 
2531
 
 
2532
#if 0
 
2533
        /* setup wireless combobox model */
 
2534
        combobox = GTK_COMBO_BOX (gtk_builder_get_object (panel->priv->builder,
 
2535
                                                          "combobox_wireless_network_name"));
 
2536
        g_signal_connect (combobox, "changed",
 
2537
                          G_CALLBACK (wireless_ap_changed_cb),
 
2538
                          panel);
 
2539
 
 
2540
        renderer = panel_cell_renderer_mode_new ();
 
2541
        gtk_cell_renderer_set_padding (renderer, 4, 0);
 
2542
        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
 
2543
                                    renderer,
 
2544
                                    FALSE);
 
2545
        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
 
2546
                                        "mode", PANEL_WIRELESS_COLUMN_MODE,
 
2547
                                        NULL);
 
2548
 
 
2549
        renderer = panel_cell_renderer_security_new ();
 
2550
        gtk_cell_renderer_set_padding (renderer, 4, 0);
 
2551
        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
 
2552
                                    renderer,
 
2553
                                    FALSE);
 
2554
        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
 
2555
                                        "security", PANEL_WIRELESS_COLUMN_SECURITY,
 
2556
                                        NULL);
 
2557
 
 
2558
        /* sort networks in drop down */
 
2559
        sortable = GTK_TREE_SORTABLE (gtk_builder_get_object (panel->priv->builder,
 
2560
                                                              "liststore_wireless_network"));
 
2561
        gtk_tree_sortable_set_sort_column_id (sortable,
 
2562
                                              PANEL_WIRELESS_COLUMN_SORT,
 
2563
                                              GTK_SORT_ASCENDING);
 
2564
        gtk_tree_sortable_set_sort_func (sortable,
 
2565
                                         PANEL_WIRELESS_COLUMN_SORT,
 
2566
                                         wireless_ap_model_sort_cb,
 
2567
                                         sortable,
 
2568
                                         NULL);
 
2569
 
 
2570
        renderer = panel_cell_renderer_signal_new ();
 
2571
        gtk_cell_renderer_set_padding (renderer, 4, 0);
 
2572
        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
 
2573
                                    renderer,
 
2574
                                    FALSE);
 
2575
        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
 
2576
                                        "signal", PANEL_WIRELESS_COLUMN_STRENGTH,
 
2577
                                        NULL);
 
2578
 
 
2579
        /* use NetworkManager client */
 
2580
        panel->priv->client = nm_client_new ();
 
2581
        g_signal_connect (panel->priv->client, "notify::" NM_CLIENT_MANAGER_RUNNING,
 
2582
                          G_CALLBACK (manager_running), panel);
 
2583
        g_signal_connect (panel->priv->client, "notify::" NM_CLIENT_ACTIVE_CONNECTIONS,
 
2584
                          G_CALLBACK (active_connections_changed), panel);
 
2585
        g_signal_connect (panel->priv->client, "device-added",
 
2586
                          G_CALLBACK (device_added_cb), panel);
 
2587
        g_signal_connect (panel->priv->client, "device-removed",
 
2588
                          G_CALLBACK (device_removed_cb), panel);
 
2589
 
 
2590
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2591
                                                     "device_wired_off_switch"));
 
2592
        g_signal_connect (widget, "notify::active",
 
2593
                          G_CALLBACK (device_off_toggled), panel);
 
2594
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2595
                                                     "device_wireless_off_switch"));
 
2596
        g_signal_connect (widget, "notify::active",
 
2597
                          G_CALLBACK (device_off_toggled), panel);
 
2598
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2599
                                                     "device_mobilebb_off_switch"));
 
2600
        g_signal_connect (widget, "notify::active",
 
2601
                          G_CALLBACK (device_off_toggled), panel);
 
2602
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2603
                                                     "device_vpn_off_switch"));
 
2604
        g_signal_connect (widget, "notify::active",
 
2605
                          G_CALLBACK (device_off_toggled), panel);
 
2606
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2607
                                                     "device_proxy_off_switch"));
 
2608
        g_signal_connect (widget, "notify::active",
 
2609
                          G_CALLBACK (device_off_toggled), panel);
 
2610
 
 
2611
        g_signal_connect (panel->priv->client, "notify::wireless-enabled",
 
2612
                          G_CALLBACK (wireless_enabled_toggled), panel);
 
2613
        g_signal_connect (panel->priv->client, "notify::wimax-enabled",
 
2614
                          G_CALLBACK (wimax_enabled_toggled), panel);
 
2615
 
 
2616
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2617
                                                     "button_wired_options"));
 
2618
        g_signal_connect (widget, "clicked",
 
2619
                          G_CALLBACK (edit_connection), panel);
 
2620
 
 
2621
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2622
                                                     "button_wireless_options"));
 
2623
        g_signal_connect (widget, "clicked",
 
2624
                          G_CALLBACK (edit_connection), panel);
 
2625
 
 
2626
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2627
                                                     "button_vpn_options"));
 
2628
        g_signal_connect (widget, "clicked",
 
2629
                          G_CALLBACK (edit_connection), panel);
 
2630
 
 
2631
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2632
                                                     "add_toolbutton"));
 
2633
        g_signal_connect (widget, "clicked",
 
2634
                          G_CALLBACK (add_connection_cb), panel);
 
2635
 
 
2636
        /* disable for now, until we actually show removable connections */
 
2637
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2638
                                                     "remove_toolbutton"));
 
2639
        g_signal_connect (widget, "clicked",
 
2640
                          G_CALLBACK (remove_connection), panel);
 
2641
 
 
2642
        /* nothing to unlock yet */
 
2643
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2644
                                                     "button_unlock"));
 
2645
        gtk_widget_set_sensitive (widget, FALSE);
 
2646
 
 
2647
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2648
                                                     "switch_flight_mode"));
 
2649
        ret = nm_client_wireless_get_enabled (panel->priv->client);
 
2650
        gtk_switch_set_active (GTK_SWITCH (widget), !ret);
 
2651
        g_signal_connect (GTK_SWITCH (widget), "notify::active",
 
2652
                          G_CALLBACK (cc_network_panel_notify_enable_active_cb),
 
2653
                          panel);
 
2654
 
 
2655
        /* add remote settings such as VPN settings as virtual devices */
 
2656
        bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
 
2657
        if (bus == NULL) {
 
2658
                g_warning ("Error connecting to system D-Bus: %s",
 
2659
                           error->message);
 
2660
                g_error_free (error);
 
2661
        }
 
2662
        panel->priv->remote_settings = nm_remote_settings_new (bus);
 
2663
        g_signal_connect (panel->priv->remote_settings, NM_REMOTE_SETTINGS_CONNECTIONS_READ,
 
2664
                          G_CALLBACK (notify_connections_read_cb), panel);
 
2665
        g_signal_connect (panel->priv->remote_settings, NM_REMOTE_SETTINGS_NEW_CONNECTION,
 
2666
                          G_CALLBACK (notify_new_connection_cb), panel);
 
2667
#endif
 
2668
 
 
2669
        toplevel = gtk_widget_get_toplevel (GTK_WIDGET (panel));
 
2670
        g_signal_connect_after (toplevel, "map", G_CALLBACK (on_toplevel_map), panel);
 
2671
 
 
2672
        /* hide implementation details */
 
2673
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2674
                                                     "notebook_types"));
 
2675
        gtk_notebook_set_show_tabs (GTK_NOTEBOOK (widget), FALSE);
 
2676
 
 
2677
        /* hide stuff that doesn't work yet */
 
2678
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2679
                                                     "button_unlock"));
 
2680
        gtk_widget_hide (widget);
 
2681
 
 
2682
        widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder,
 
2683
                                                     "vbox1"));
 
2684
        gtk_widget_reparent (widget, (GtkWidget *) panel);
 
2685
}
 
2686
 
 
2687
void
 
2688
cc_network_panel_register (GIOModule *module)
 
2689
{
 
2690
        cc_network_panel_register_type (G_TYPE_MODULE (module));
 
2691
        g_io_extension_point_implement (CC_SHELL_PANEL_EXTENSION_POINT,
 
2692
                                        CC_TYPE_NETWORK_PANEL,
 
2693
                                        "network", 0);
 
2694
}