1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2 *
3 * Copyright (C) 2012 Red Hat, Inc
4 *
5 * Licensed under the GNU General Public License Version 2
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 */
21
22 #include "config.h"
23
24 #include <glib/gi18n.h>
25
26 #include <NetworkManager.h>
27
28 #include "ce-page.h"
29 #include "ce-page-details.h"
30
31 #include "../panel-common.h"
32
33 struct _CEPageDetails
34 {
35 GtkGrid parent;
36
37 GtkCheckButton *all_user_check;
38 GtkCheckButton *auto_connect_check;
39 GtkLabel *dns4_heading_label;
40 GtkLabel *dns4_label;
41 GtkLabel *dns6_heading_label;
42 GtkLabel *dns6_label;
43 GtkButton *forget_button;
44 GtkLabel *freq_heading_label;
45 GtkLabel *freq_label;
46 GtkLabel *ipv4_heading_label;
47 GtkLabel *ipv4_label;
48 GtkLabel *ipv6_heading_label;
49 GtkLabel *ipv6_label;
50 GtkLabel *last_used_heading_label;
51 GtkLabel *last_used_label;
52 GtkLabel *mac_heading_label;
53 GtkLabel *mac_label;
54 GtkCheckButton *restrict_data_check;
55 GtkLabel *route_heading_label;
56 GtkLabel *route_label;
57 GtkLabel *security_heading_label;
58 GtkLabel *security_label;
59 GtkLabel *speed_heading_label;
60 GtkLabel *speed_label;
61 GtkLabel *strength_heading_label;
62 GtkLabel *strength_label;
63
64 NMConnection *connection;
65 NMDevice *device;
66 NMAccessPoint *ap;
67 NetConnectionEditor *editor;
68 };
69
70 static void ce_page_iface_init (CEPageInterface *);
71
G_DEFINE_TYPE_WITH_CODE(CEPageDetails,ce_page_details,GTK_TYPE_GRID,G_IMPLEMENT_INTERFACE (ce_page_get_type (),ce_page_iface_init))72 G_DEFINE_TYPE_WITH_CODE (CEPageDetails, ce_page_details, GTK_TYPE_GRID,
73 G_IMPLEMENT_INTERFACE (ce_page_get_type (), ce_page_iface_init))
74
75 static void
76 forget_cb (CEPageDetails *self)
77 {
78 net_connection_editor_forget (self->editor);
79 }
80
81 static gchar *
get_ap_security_string(NMAccessPoint * ap)82 get_ap_security_string (NMAccessPoint *ap)
83 {
84 NM80211ApSecurityFlags wpa_flags, rsn_flags;
85 NM80211ApFlags flags;
86 GString *str;
87
88 flags = nm_access_point_get_flags (ap);
89 wpa_flags = nm_access_point_get_wpa_flags (ap);
90 rsn_flags = nm_access_point_get_rsn_flags (ap);
91
92 str = g_string_new ("");
93 if ((flags & NM_802_11_AP_FLAGS_PRIVACY) &&
94 (wpa_flags == NM_802_11_AP_SEC_NONE) &&
95 (rsn_flags == NM_802_11_AP_SEC_NONE)) {
96 /* TRANSLATORS: this WEP WiFi security */
97 g_string_append_printf (str, "%s, ", _("WEP"));
98 }
99 if (wpa_flags != NM_802_11_AP_SEC_NONE) {
100 /* TRANSLATORS: this WPA WiFi security */
101 g_string_append_printf (str, "%s, ", _("WPA"));
102 }
103 if (rsn_flags != NM_802_11_AP_SEC_NONE) {
104 #if NM_CHECK_VERSION(1,20,6)
105 if (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_SAE) {
106 /* TRANSLATORS: this WPA3 WiFi security */
107 g_string_append_printf (str, "%s, ", _("WPA3"));
108 }
109 #if NM_CHECK_VERSION(1,24,0)
110 else if (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_OWE) {
111 /* TRANSLATORS: this Enhanced Open WiFi security */
112 g_string_append_printf (str, "%s, ", _("Enhanced Open"));
113 }
114 #endif
115 else
116 #endif
117 {
118 /* TRANSLATORS: this WPA WiFi security */
119 g_string_append_printf (str, "%s, ", _("WPA2"));
120 }
121 }
122 if ((wpa_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X) ||
123 (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) {
124 /* TRANSLATORS: this Enterprise WiFi security */
125 g_string_append_printf (str, "%s, ", _("Enterprise"));
126 }
127 if (str->len > 0)
128 g_string_set_size (str, str->len - 2);
129 else {
130 g_string_append (str, C_("Wifi security", "None"));
131 }
132 return g_string_free (str, FALSE);
133 }
134
135 static void
update_last_used(CEPageDetails * self,NMConnection * connection)136 update_last_used (CEPageDetails *self, NMConnection *connection)
137 {
138 g_autofree gchar *last_used = NULL;
139 g_autoptr(GDateTime) now = NULL;
140 g_autoptr(GDateTime) then = NULL;
141 gint days;
142 GTimeSpan diff;
143 guint64 timestamp;
144 NMSettingConnection *s_con;
145
146 s_con = nm_connection_get_setting_connection (connection);
147 if (s_con == NULL)
148 goto out;
149 timestamp = nm_setting_connection_get_timestamp (s_con);
150 if (timestamp == 0) {
151 last_used = g_strdup (_("Never"));
152 goto out;
153 }
154
155 /* calculate the amount of time that has elapsed */
156 now = g_date_time_new_now_utc ();
157 then = g_date_time_new_from_unix_utc (timestamp);
158
159 diff = g_date_time_difference (now, then);
160 days = diff / G_TIME_SPAN_DAY;
161 if (days == 0)
162 last_used = g_strdup (_("Today"));
163 else if (days == 1)
164 last_used = g_strdup (_("Yesterday"));
165 else
166 last_used = g_strdup_printf (ngettext ("%i day ago", "%i days ago", days), days);
167 out:
168 gtk_label_set_label (self->last_used_label, last_used);
169 gtk_widget_set_visible (GTK_WIDGET (self->last_used_heading_label), last_used != NULL);
170 gtk_widget_set_visible (GTK_WIDGET (self->last_used_label), last_used != NULL);
171 }
172
173 static void
all_user_changed(CEPageDetails * self)174 all_user_changed (CEPageDetails *self)
175 {
176 gboolean all_users;
177 NMSettingConnection *sc;
178
179 sc = nm_connection_get_setting_connection (self->connection);
180 all_users = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->all_user_check));
181
182 g_object_set (sc, "permissions", NULL, NULL);
183 if (!all_users)
184 nm_setting_connection_add_permission (sc, "user", g_get_user_name (), NULL);
185 }
186
187 static void
restrict_data_changed(CEPageDetails * self)188 restrict_data_changed (CEPageDetails *self)
189 {
190 NMSettingConnection *s_con;
191 NMMetered metered;
192
193 s_con = nm_connection_get_setting_connection (self->connection);
194
195 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->restrict_data_check)))
196 metered = NM_METERED_YES;
197 else
198 metered = NM_METERED_NO;
199
200 g_object_set (s_con, "metered", metered, NULL);
201 }
202
203 static void
update_restrict_data(CEPageDetails * self)204 update_restrict_data (CEPageDetails *self)
205 {
206 NMSettingConnection *s_con;
207 NMMetered metered;
208 const gchar *type;
209
210 s_con = nm_connection_get_setting_connection (self->connection);
211
212 if (s_con == NULL)
213 return;
214
215 /* Disable for VPN; NetworkManager does not implement that yet (see
216 * bug https://bugzilla.gnome.org/show_bug.cgi?id=792618) */
217 type = nm_setting_connection_get_connection_type (s_con);
218 if (g_str_equal (type, NM_SETTING_VPN_SETTING_NAME))
219 return;
220
221 metered = nm_setting_connection_get_metered (s_con);
222
223 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->restrict_data_check),
224 metered == NM_METERED_YES || metered == NM_METERED_GUESS_YES);
225 gtk_widget_show (GTK_WIDGET (self->restrict_data_check));
226
227 g_signal_connect_object (self->restrict_data_check, "notify::active", G_CALLBACK (restrict_data_changed), self, G_CONNECT_SWAPPED);
228 g_signal_connect_object (self->restrict_data_check, "notify::active", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
229 }
230
231 static void
connect_details_page(CEPageDetails * self)232 connect_details_page (CEPageDetails *self)
233 {
234 NMSettingConnection *sc;
235 guint speed;
236 NMDeviceWifiCapabilities wifi_caps;
237 guint frequency;
238 guint strength;
239 NMDeviceState state;
240 NMAccessPoint *active_ap;
241 g_autofree gchar *speed_label = NULL;
242 const gchar *type;
243 const gchar *hw_address = NULL;
244 g_autofree gchar *security_string = NULL;
245 g_autofree gchar *freq_string = NULL;
246 const gchar *strength_label;
247 gboolean device_is_active;
248 NMIPConfig *ipv4_config = NULL, *ipv6_config = NULL;
249 gboolean have_ipv4_address = FALSE, have_ipv6_address = FALSE;
250 gboolean have_dns4 = FALSE, have_dns6 = FALSE;
251 const gchar *route4_text = NULL, *route6_text = NULL;
252
253 sc = nm_connection_get_setting_connection (self->connection);
254 type = nm_setting_connection_get_connection_type (sc);
255
256 if (NM_IS_DEVICE_WIFI (self->device)) {
257 active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (self->device));
258 frequency = nm_access_point_get_frequency (active_ap);
259 } else {
260 active_ap = NULL;
261 frequency = 0;
262 }
263
264 state = self->device ? nm_device_get_state (self->device) : NM_DEVICE_STATE_DISCONNECTED;
265
266 device_is_active = FALSE;
267 speed = 0;
268 wifi_caps = 0;
269 if (active_ap && self->ap == active_ap && state != NM_DEVICE_STATE_UNAVAILABLE) {
270 device_is_active = TRUE;
271 if (NM_IS_DEVICE_WIFI (self->device)) {
272 speed = nm_device_wifi_get_bitrate (NM_DEVICE_WIFI (self->device)) / 1000;
273 wifi_caps = nm_device_wifi_get_capabilities (NM_DEVICE_WIFI (self->device));
274 }
275 } else if (self->device) {
276 NMActiveConnection *ac;
277 const gchar *p1, *p2;
278
279 ac = nm_device_get_active_connection (self->device);
280 p1 = ac ? nm_active_connection_get_uuid (ac) : NULL;
281 p2 = nm_connection_get_uuid (self->connection);
282 if (g_strcmp0 (p1, p2) == 0) {
283 device_is_active = TRUE;
284 if (NM_IS_DEVICE_WIFI (self->device)) {
285 speed = nm_device_wifi_get_bitrate (NM_DEVICE_WIFI (self->device)) / 1000;
286 wifi_caps = nm_device_wifi_get_capabilities (NM_DEVICE_WIFI (self->device));
287 } else if (NM_IS_DEVICE_ETHERNET (self->device))
288 speed = nm_device_ethernet_get_speed (NM_DEVICE_ETHERNET (self->device));
289 }
290 }
291
292 if (speed > 0 && frequency > 0)
293 speed_label = g_strdup_printf (_("%d Mb/s (%1.1f GHz)"), speed, (float) (frequency) / 1000.0);
294 else if (speed > 0)
295 speed_label = g_strdup_printf (_("%d Mb/s"), speed);
296 gtk_label_set_label (self->speed_label, speed_label);
297 gtk_widget_set_visible (GTK_WIDGET (self->speed_heading_label), speed_label != NULL);
298 gtk_widget_set_visible (GTK_WIDGET (self->speed_label), speed_label != NULL);
299
300 hw_address = nm_device_get_hw_address (self->device);
301 gtk_label_set_label (self->mac_label, hw_address);
302 gtk_widget_set_visible (GTK_WIDGET (self->mac_heading_label), hw_address != NULL);
303 gtk_widget_set_visible (GTK_WIDGET (self->mac_label), hw_address != NULL);
304
305 if (wifi_caps & NM_WIFI_DEVICE_CAP_FREQ_VALID) {
306 if (wifi_caps & NM_WIFI_DEVICE_CAP_FREQ_2GHZ &&
307 wifi_caps & NM_WIFI_DEVICE_CAP_FREQ_5GHZ)
308 freq_string = g_strdup (_("2.4 GHz / 5 GHz"));
309 else if (wifi_caps & NM_WIFI_DEVICE_CAP_FREQ_2GHZ)
310 freq_string = g_strdup (_("2.4 GHz"));
311 else if (wifi_caps & NM_WIFI_DEVICE_CAP_FREQ_5GHZ)
312 freq_string = g_strdup (_("5 GHz"));
313 }
314
315 gtk_label_set_label (self->freq_label, freq_string);
316 gtk_widget_set_visible (GTK_WIDGET (self->freq_heading_label), freq_string != NULL);
317 gtk_widget_set_visible (GTK_WIDGET (self->freq_label), freq_string != NULL);
318
319 if (device_is_active && active_ap)
320 security_string = get_ap_security_string (active_ap);
321 gtk_label_set_label (self->security_label, security_string);
322 gtk_widget_set_visible (GTK_WIDGET (self->security_heading_label), security_string != NULL);
323 gtk_widget_set_visible (GTK_WIDGET (self->security_label), security_string != NULL);
324
325 strength = 0;
326 if (self->ap != NULL)
327 strength = nm_access_point_get_strength (self->ap);
328
329 if (strength <= 0)
330 strength_label = NULL;
331 else if (strength < 20)
332 strength_label = C_("Signal strength", "None");
333 else if (strength < 40)
334 strength_label = C_("Signal strength", "Weak");
335 else if (strength < 50)
336 strength_label = C_("Signal strength", "Ok");
337 else if (strength < 80)
338 strength_label = C_("Signal strength", "Good");
339 else
340 strength_label = C_("Signal strength", "Excellent");
341 gtk_label_set_label (self->strength_label, strength_label);
342 gtk_widget_set_visible (GTK_WIDGET (self->strength_heading_label), strength_label != NULL);
343 gtk_widget_set_visible (GTK_WIDGET (self->strength_label), strength_label != NULL);
344
345 if (device_is_active && self->device != NULL) {
346 ipv4_config = nm_device_get_ip4_config (self->device);
347 ipv6_config = nm_device_get_ip6_config (self->device);
348 }
349
350 if (ipv4_config != NULL) {
351 GPtrArray *addresses;
352 const gchar *ipv4_text = NULL;
353 g_autofree gchar *ip4_dns = NULL;
354
355 addresses = nm_ip_config_get_addresses (ipv4_config);
356 if (addresses->len > 0)
357 ipv4_text = nm_ip_address_get_address (g_ptr_array_index (addresses, 0));
358 gtk_label_set_label (self->ipv4_label, ipv4_text);
359 gtk_widget_set_visible (GTK_WIDGET (self->ipv4_heading_label), ipv4_text != NULL);
360 gtk_widget_set_visible (GTK_WIDGET (self->ipv4_label), ipv4_text != NULL);
361 have_ipv4_address = ipv4_text != NULL;
362
363 ip4_dns = g_strjoinv (" ", (char **) nm_ip_config_get_nameservers (ipv4_config));
364 if (!*ip4_dns)
365 ip4_dns = NULL;
366 gtk_label_set_label (self->dns4_label, ip4_dns);
367 gtk_widget_set_visible (GTK_WIDGET (self->dns4_heading_label), ip4_dns != NULL);
368 gtk_widget_set_visible (GTK_WIDGET (self->dns4_label), ip4_dns != NULL);
369 have_dns4 = ip4_dns != NULL;
370
371 route4_text = nm_ip_config_get_gateway (ipv4_config);
372 } else {
373 gtk_widget_hide (GTK_WIDGET (self->ipv4_heading_label));
374 gtk_widget_hide (GTK_WIDGET (self->ipv4_label));
375 gtk_widget_hide (GTK_WIDGET (self->dns4_heading_label));
376 gtk_widget_hide (GTK_WIDGET (self->dns4_label));
377 }
378
379 if (ipv6_config != NULL) {
380 g_autofree gchar *ipv6_text = NULL;
381 g_autofree gchar *ip6_dns = NULL;
382
383 ipv6_text = net_device_get_ip6_addresses (ipv6_config);
384 gtk_label_set_label (self->ipv6_label, ipv6_text);
385 gtk_widget_set_visible (GTK_WIDGET (self->ipv6_heading_label), ipv6_text != NULL);
386 gtk_widget_set_valign (GTK_WIDGET (self->ipv6_heading_label), GTK_ALIGN_START);
387 gtk_widget_set_visible (GTK_WIDGET (self->ipv6_label), ipv6_text != NULL);
388 have_ipv6_address = ipv6_text != NULL;
389
390 ip6_dns = g_strjoinv (" ", (char **) nm_ip_config_get_nameservers (ipv6_config));
391 if (!*ip6_dns)
392 ip6_dns = NULL;
393 gtk_label_set_label (self->dns6_label, ip6_dns);
394 gtk_widget_set_visible (GTK_WIDGET (self->dns6_heading_label), ip6_dns != NULL);
395 gtk_widget_set_visible (GTK_WIDGET (self->dns6_label), ip6_dns != NULL);
396 have_dns6 = ip6_dns != NULL;
397
398 route6_text = nm_ip_config_get_gateway (ipv6_config);
399 } else {
400 gtk_widget_hide (GTK_WIDGET (self->ipv6_heading_label));
401 gtk_widget_hide (GTK_WIDGET (self->ipv6_label));
402 gtk_widget_hide (GTK_WIDGET (self->dns6_heading_label));
403 gtk_widget_hide (GTK_WIDGET (self->dns6_label));
404 }
405
406 if (have_ipv4_address && have_ipv6_address) {
407 gtk_label_set_label (self->ipv4_heading_label, _("IPv4 Address"));
408 gtk_label_set_label (self->ipv6_heading_label, _("IPv6 Address"));
409 } else {
410 gtk_label_set_label (self->ipv4_heading_label, _("IP Address"));
411 gtk_label_set_label (self->ipv6_heading_label, _("IP Address"));
412 }
413
414 if (have_dns4 && have_dns6) {
415 gtk_label_set_label (self->dns4_heading_label, _("DNS4"));
416 gtk_label_set_label (self->dns6_heading_label, _("DNS6"));
417 } else {
418 gtk_label_set_label (self->dns4_heading_label, _("DNS"));
419 gtk_label_set_label (self->dns6_heading_label, _("DNS"));
420 }
421
422 if (route4_text != NULL || route6_text != NULL) {
423 g_autofree const gchar *routes_text = NULL;
424
425 if (route4_text == NULL) {
426 routes_text = g_strdup (route6_text);
427 } else if (route6_text == NULL) {
428 routes_text = g_strdup (route4_text);
429 } else {
430 routes_text = g_strjoin ("\n", route4_text, route6_text, NULL);
431 }
432 gtk_label_set_label (self->route_label, routes_text);
433 gtk_widget_set_visible (GTK_WIDGET (self->route_heading_label), routes_text != NULL);
434 gtk_widget_set_valign (GTK_WIDGET (self->route_heading_label), GTK_ALIGN_START);
435 gtk_widget_set_visible (GTK_WIDGET (self->route_label), routes_text != NULL);
436 } else {
437 gtk_widget_hide (GTK_WIDGET (self->route_heading_label));
438 gtk_widget_hide (GTK_WIDGET (self->route_label));
439 }
440
441 if (!device_is_active && self->connection)
442 update_last_used (self, self->connection);
443 else {
444 gtk_widget_set_visible (GTK_WIDGET (self->last_used_heading_label), FALSE);
445 gtk_widget_set_visible (GTK_WIDGET (self->last_used_label), FALSE);
446 }
447
448 /* Auto connect check */
449 if (g_str_equal (type, NM_SETTING_VPN_SETTING_NAME)) {
450 gtk_widget_hide (GTK_WIDGET (self->auto_connect_check));
451 } else {
452 g_object_bind_property (sc, "autoconnect",
453 self->auto_connect_check, "active",
454 G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
455 g_signal_connect_object (self->auto_connect_check, "toggled", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
456 }
457
458 /* All users check */
459 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->all_user_check),
460 nm_setting_connection_get_num_permissions (sc) == 0);
461 g_signal_connect_object (self->all_user_check, "toggled", G_CALLBACK (all_user_changed), self, G_CONNECT_SWAPPED);
462 g_signal_connect_object (self->all_user_check, "toggled", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
463
464 /* Restrict Data check */
465 update_restrict_data (self);
466
467 /* Forget button */
468 g_signal_connect_object (self->forget_button, "clicked", G_CALLBACK (forget_cb), self, G_CONNECT_SWAPPED);
469
470 if (g_str_equal (type, NM_SETTING_WIRELESS_SETTING_NAME))
471 gtk_button_set_label (self->forget_button, _("Forget Connection"));
472 else if (g_str_equal (type, NM_SETTING_WIRED_SETTING_NAME))
473 gtk_button_set_label (self->forget_button, _("Remove Connection Profile"));
474 else if (g_str_equal (type, NM_SETTING_VPN_SETTING_NAME))
475 gtk_button_set_label (self->forget_button, _("Remove VPN"));
476 else
477 gtk_widget_hide (GTK_WIDGET (self->forget_button));
478 }
479
480 static void
ce_page_details_dispose(GObject * object)481 ce_page_details_dispose (GObject *object)
482 {
483 CEPageDetails *self = CE_PAGE_DETAILS (object);
484
485 g_clear_object (&self->connection);
486
487 G_OBJECT_CLASS (ce_page_details_parent_class)->dispose (object);
488 }
489
490 static const gchar *
ce_page_details_get_title(CEPage * page)491 ce_page_details_get_title (CEPage *page)
492 {
493 return _("Details");
494 }
495
496 static void
ce_page_details_init(CEPageDetails * self)497 ce_page_details_init (CEPageDetails *self)
498 {
499 gtk_widget_init_template (GTK_WIDGET (self));
500 }
501
502 static void
ce_page_details_class_init(CEPageDetailsClass * klass)503 ce_page_details_class_init (CEPageDetailsClass *klass)
504 {
505 GObjectClass *object_class = G_OBJECT_CLASS (klass);
506 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
507
508 object_class->dispose = ce_page_details_dispose;
509
510 gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/network/details-page.ui");
511
512 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, all_user_check);
513 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, auto_connect_check);
514 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, dns4_heading_label);
515 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, dns4_label);
516 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, dns6_heading_label);
517 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, dns6_label);
518 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, forget_button);
519 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, freq_heading_label);
520 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, freq_label);
521 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, ipv4_heading_label);
522 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, ipv4_label);
523 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, ipv6_heading_label);
524 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, ipv6_label);
525 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, last_used_heading_label);
526 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, last_used_label);
527 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, mac_heading_label);
528 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, mac_label);
529 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, restrict_data_check);
530 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, route_heading_label);
531 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, route_label);
532 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, security_heading_label);
533 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, security_label);
534 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, speed_heading_label);
535 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, speed_label);
536 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, strength_heading_label);
537 gtk_widget_class_bind_template_child (widget_class, CEPageDetails, strength_label);
538 }
539
540 static void
ce_page_iface_init(CEPageInterface * iface)541 ce_page_iface_init (CEPageInterface *iface)
542 {
543 iface->get_title = ce_page_details_get_title;
544 }
545
546 CEPageDetails *
ce_page_details_new(NMConnection * connection,NMDevice * device,NMAccessPoint * ap,NetConnectionEditor * editor)547 ce_page_details_new (NMConnection *connection,
548 NMDevice *device,
549 NMAccessPoint *ap,
550 NetConnectionEditor *editor)
551 {
552 CEPageDetails *self;
553
554 self = CE_PAGE_DETAILS (g_object_new (ce_page_details_get_type (), NULL));
555
556 self->connection = g_object_ref (connection);
557 self->editor = editor;
558 self->device = device;
559 self->ap = ap;
560
561 connect_details_page (self);
562
563 return self;
564 }
565