|
Packit Service |
d328f3 |
// SPDX-License-Identifier: GPL-2.0+
|
|
Packit Service |
d328f3 |
/* NetworkManager Connection editor -- Connection editor for NetworkManager
|
|
Packit Service |
d328f3 |
*
|
|
Packit Service |
d328f3 |
* Dan Williams <dcbw@redhat.com>
|
|
Packit Service |
d328f3 |
*
|
|
Packit Service |
d328f3 |
* Copyright 2008 - 2017 Red Hat, Inc.
|
|
Packit Service |
d328f3 |
*/
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#include "nm-default.h"
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#include <string.h>
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#include "page-mobile.h"
|
|
Packit Service |
d328f3 |
#include "nm-connection-editor.h"
|
|
Packit Service |
d328f3 |
#include "nma-mobile-wizard.h"
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
G_DEFINE_TYPE (CEPageMobile, ce_page_mobile, CE_TYPE_PAGE)
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#define CE_PAGE_MOBILE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CE_TYPE_PAGE_MOBILE, CEPageMobilePrivate))
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
typedef struct {
|
|
Packit Service |
d328f3 |
NMSetting *setting;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Common to GSM and CDMA */
|
|
Packit Service |
d328f3 |
GtkEntry *number;
|
|
Packit Service |
d328f3 |
GtkEntry *username;
|
|
Packit Service |
d328f3 |
GtkEntry *password;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* GSM only */
|
|
Packit Service |
d328f3 |
GtkEntry *apn;
|
|
Packit Service |
d328f3 |
GtkButton *apn_button;
|
|
Packit Service |
d328f3 |
GtkEntry *network_id;
|
|
Packit Service |
d328f3 |
GtkToggleButton *roaming_allowed;
|
|
Packit Service |
d328f3 |
GtkEntry *pin;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
GtkWindowGroup *window_group;
|
|
Packit Service |
d328f3 |
gboolean window_added;
|
|
Packit Service |
d328f3 |
} CEPageMobilePrivate;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#define NET_TYPE_ANY 0
|
|
Packit Service |
d328f3 |
#define NET_TYPE_3G 1
|
|
Packit Service |
d328f3 |
#define NET_TYPE_2G 2
|
|
Packit Service |
d328f3 |
#define NET_TYPE_PREFER_3G 3
|
|
Packit Service |
d328f3 |
#define NET_TYPE_PREFER_2G 4
|
|
Packit Service |
d328f3 |
#define NET_TYPE_PREFER_4G 5
|
|
Packit Service |
d328f3 |
#define NET_TYPE_4G 6
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
mobile_private_init (CEPageMobile *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageMobilePrivate *priv = CE_PAGE_MOBILE_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
GtkBuilder *builder;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
builder = CE_PAGE (self)->builder;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
priv->number = GTK_ENTRY (gtk_builder_get_object (builder, "mobile_number"));
|
|
Packit Service |
d328f3 |
priv->username = GTK_ENTRY (gtk_builder_get_object (builder, "mobile_username"));
|
|
Packit Service |
d328f3 |
priv->password = GTK_ENTRY (gtk_builder_get_object (builder, "mobile_password"));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
priv->apn = GTK_ENTRY (gtk_builder_get_object (builder, "mobile_apn"));
|
|
Packit Service |
d328f3 |
priv->apn_button = GTK_BUTTON (gtk_builder_get_object (builder, "mobile_apn_button"));
|
|
Packit Service |
d328f3 |
priv->network_id = GTK_ENTRY (gtk_builder_get_object (builder, "mobile_network_id"));
|
|
Packit Service |
d328f3 |
priv->roaming_allowed = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "mobile_roaming_allowed"));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
priv->pin = GTK_ENTRY (gtk_builder_get_object (builder, "mobile_pin"));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
priv->window_group = gtk_window_group_new ();
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
populate_gsm_ui (CEPageMobile *self, NMConnection *connection)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageMobilePrivate *priv = CE_PAGE_MOBILE_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
NMSettingGsm *setting = NM_SETTING_GSM (priv->setting);
|
|
Packit Service |
d328f3 |
const char *s;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* FIXME: no longer use gsm.number property. It's deprecated and has
|
|
Packit Service |
d328f3 |
* no effect for NetworkManager. */
|
|
Packit Service |
d328f3 |
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
Packit Service |
d328f3 |
s = nm_setting_gsm_get_number (setting);
|
|
Packit Service |
d328f3 |
G_GNUC_END_IGNORE_DEPRECATIONS
|
|
Packit Service |
d328f3 |
if (s)
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (priv->number, s);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
s = nm_setting_gsm_get_username (setting);
|
|
Packit Service |
d328f3 |
if (s)
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (priv->username, s);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
s = nm_setting_gsm_get_apn (setting);
|
|
Packit Service |
d328f3 |
if (s)
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (priv->apn, s);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
s = nm_setting_gsm_get_network_id (setting);
|
|
Packit Service |
d328f3 |
if (s)
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (priv->network_id, s);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
gtk_toggle_button_set_active (priv->roaming_allowed,
|
|
Packit Service |
d328f3 |
!nm_setting_gsm_get_home_only (setting));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
s = nm_setting_gsm_get_password (setting);
|
|
Packit Service |
d328f3 |
if (s)
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (priv->password, s);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
s = nm_setting_gsm_get_pin (setting);
|
|
Packit Service |
d328f3 |
if (s)
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (priv->pin, s);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
populate_cdma_ui (CEPageMobile *self, NMConnection *connection)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageMobilePrivate *priv = CE_PAGE_MOBILE_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
NMSettingCdma *setting = NM_SETTING_CDMA (priv->setting);
|
|
Packit Service |
d328f3 |
const char *s;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
s = nm_setting_cdma_get_number (setting);
|
|
Packit Service |
d328f3 |
if (s)
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (priv->number, s);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
s = nm_setting_cdma_get_username (setting);
|
|
Packit Service |
d328f3 |
if (s)
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (priv->username, s);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
s = nm_setting_cdma_get_password (setting);
|
|
Packit Service |
d328f3 |
if (s)
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (priv->password, s);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Hide GSM specific widgets */
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (CE_PAGE (self)->builder, "mobile_basic_label")));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (CE_PAGE (self)->builder, "mobile_advanced_vbox")));
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
stuff_changed (GtkWidget *w, gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
ce_page_changed (CE_PAGE (user_data));
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
show_passwords (GtkToggleButton *button, gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageMobilePrivate *priv = CE_PAGE_MOBILE_GET_PRIVATE (user_data);
|
|
Packit Service |
d328f3 |
gboolean active;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
active = gtk_toggle_button_get_active (button);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
gtk_entry_set_visibility (priv->password, active);
|
|
Packit Service |
d328f3 |
gtk_entry_set_visibility (priv->pin, active);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
apn_button_mobile_wizard_done (NMAMobileWizard *wizard,
|
|
Packit Service |
d328f3 |
gboolean canceled,
|
|
Packit Service |
d328f3 |
NMAMobileWizardAccessMethod *method,
|
|
Packit Service |
d328f3 |
gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageMobile *self = CE_PAGE_MOBILE (user_data);
|
|
Packit Service |
d328f3 |
CEPageMobilePrivate *priv = CE_PAGE_MOBILE_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (canceled || !method) {
|
|
Packit Service |
d328f3 |
nma_mobile_wizard_destroy (wizard);
|
|
Packit Service |
d328f3 |
return;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (!canceled && method) {
|
|
Packit Service |
d328f3 |
switch (method->devtype) {
|
|
Packit Service |
d328f3 |
case NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS:
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (GTK_ENTRY (priv->username),
|
|
Packit Service |
d328f3 |
method->username ? method->username : "");
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (GTK_ENTRY (priv->password),
|
|
Packit Service |
d328f3 |
method->password ? method->password : "");
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (GTK_ENTRY (priv->apn),
|
|
Packit Service |
d328f3 |
method->gsm_apn ? method->gsm_apn : "");
|
|
Packit Service |
d328f3 |
break;
|
|
Packit Service |
d328f3 |
case NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO:
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (GTK_ENTRY (priv->username),
|
|
Packit Service |
d328f3 |
method->username ? method->username : "");
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (GTK_ENTRY (priv->password),
|
|
Packit Service |
d328f3 |
method->password ? method->password : "");
|
|
Packit Service |
d328f3 |
break;
|
|
Packit Service |
d328f3 |
default:
|
|
Packit Service |
d328f3 |
g_assert_not_reached ();
|
|
Packit Service |
d328f3 |
break;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
nma_mobile_wizard_destroy (wizard);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
apn_button_clicked (GtkButton *button, gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageMobile *self = CE_PAGE_MOBILE (user_data);
|
|
Packit Service |
d328f3 |
CEPageMobilePrivate *priv = CE_PAGE_MOBILE_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
NMAMobileWizard *wizard;
|
|
Packit Service |
d328f3 |
GtkWidget *toplevel;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
toplevel = gtk_widget_get_toplevel (CE_PAGE (self)->page);
|
|
Packit Service |
d328f3 |
g_return_if_fail (gtk_widget_is_toplevel (toplevel));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (!priv->window_added) {
|
|
Packit Service |
d328f3 |
gtk_window_group_add_window (priv->window_group, GTK_WINDOW (toplevel));
|
|
Packit Service |
d328f3 |
priv->window_added = TRUE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
wizard = nma_mobile_wizard_new (GTK_WINDOW (toplevel),
|
|
Packit Service |
d328f3 |
priv->window_group,
|
|
Packit Service |
d328f3 |
NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS,
|
|
Packit Service |
d328f3 |
FALSE,
|
|
Packit Service |
d328f3 |
apn_button_mobile_wizard_done,
|
|
Packit Service |
d328f3 |
self);
|
|
Packit Service |
d328f3 |
if (wizard)
|
|
Packit Service |
d328f3 |
nma_mobile_wizard_present (wizard);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
network_id_filter_cb (GtkEditable *editable,
|
|
Packit Service |
d328f3 |
gchar *text,
|
|
Packit Service |
d328f3 |
gint length,
|
|
Packit Service |
d328f3 |
gint *position,
|
|
Packit Service |
d328f3 |
gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
utils_filter_editable_on_insert_text (editable,
|
|
Packit Service |
d328f3 |
text, length, position, user_data,
|
|
Packit Service |
d328f3 |
utils_char_is_ascii_digit,
|
|
Packit Service |
d328f3 |
network_id_filter_cb);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
apn_filter_cb (GtkEditable *editable,
|
|
Packit Service |
d328f3 |
gchar *text,
|
|
Packit Service |
d328f3 |
gint length,
|
|
Packit Service |
d328f3 |
gint *position,
|
|
Packit Service |
d328f3 |
gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
utils_filter_editable_on_insert_text (editable,
|
|
Packit Service |
d328f3 |
text, length, position, user_data,
|
|
Packit Service |
d328f3 |
utils_char_is_ascii_apn,
|
|
Packit Service |
d328f3 |
apn_filter_cb);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
finish_setup (CEPageMobile *self, gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPage *parent = CE_PAGE (self);
|
|
Packit Service |
d328f3 |
CEPageMobilePrivate *priv = CE_PAGE_MOBILE_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (NM_IS_SETTING_GSM (priv->setting))
|
|
Packit Service |
d328f3 |
populate_gsm_ui (self, parent->connection);
|
|
Packit Service |
d328f3 |
else if (NM_IS_SETTING_CDMA (priv->setting))
|
|
Packit Service |
d328f3 |
populate_cdma_ui (self, parent->connection);
|
|
Packit Service |
d328f3 |
else
|
|
Packit Service |
d328f3 |
g_assert_not_reached ();
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->number, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->username, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->password, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->apn, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit Service |
d328f3 |
gtk_entry_set_max_length (priv->apn, 64); /* APNs are max 64 chars */
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->apn, "insert-text", G_CALLBACK (apn_filter_cb), self);
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->apn_button, "clicked", G_CALLBACK (apn_button_clicked), self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->network_id, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit Service |
d328f3 |
gtk_entry_set_max_length (priv->network_id, 6); /* MCC/MNCs are max 6 chars */
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->network_id, "insert-text", G_CALLBACK (network_id_filter_cb), self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->pin, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->roaming_allowed, "toggled", G_CALLBACK (stuff_changed), self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_signal_connect (GTK_WIDGET (gtk_builder_get_object (parent->builder, "mobile_show_passwords")),
|
|
Packit Service |
d328f3 |
"toggled",
|
|
Packit Service |
d328f3 |
G_CALLBACK (show_passwords),
|
|
Packit Service |
d328f3 |
self);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
CEPage *
|
|
Packit Service |
d328f3 |
ce_page_mobile_new (NMConnectionEditor *editor,
|
|
Packit Service |
d328f3 |
NMConnection *connection,
|
|
Packit Service |
d328f3 |
GtkWindow *parent_window,
|
|
Packit Service |
d328f3 |
NMClient *client,
|
|
Packit Service |
d328f3 |
const char **out_secrets_setting_name,
|
|
Packit Service |
d328f3 |
GError **error)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageMobile *self;
|
|
Packit Service |
d328f3 |
CEPageMobilePrivate *priv;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
self = CE_PAGE_MOBILE (ce_page_new (CE_TYPE_PAGE_MOBILE,
|
|
Packit Service |
d328f3 |
editor,
|
|
Packit Service |
d328f3 |
connection,
|
|
Packit Service |
d328f3 |
parent_window,
|
|
Packit Service |
d328f3 |
client,
|
|
Packit Service |
d328f3 |
"/org/gnome/nm_connection_editor/ce-page-mobile.ui",
|
|
Packit Service |
d328f3 |
"MobilePage",
|
|
Packit Service |
d328f3 |
_("Mobile Broadband")));
|
|
Packit Service |
d328f3 |
if (!self) {
|
|
Packit Service |
d328f3 |
g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("Could not load mobile broadband user interface."));
|
|
Packit Service |
d328f3 |
return NULL;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
mobile_private_init (self);
|
|
Packit Service |
d328f3 |
priv = CE_PAGE_MOBILE_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
priv->setting = nm_connection_get_setting (connection, NM_TYPE_SETTING_GSM);
|
|
Packit Service |
d328f3 |
if (priv->setting)
|
|
Packit Service |
d328f3 |
*out_secrets_setting_name = NM_SETTING_GSM_SETTING_NAME;
|
|
Packit Service |
d328f3 |
else {
|
|
Packit Service |
d328f3 |
priv->setting = nm_connection_get_setting (connection, NM_TYPE_SETTING_CDMA);
|
|
Packit Service |
d328f3 |
if (priv->setting)
|
|
Packit Service |
d328f3 |
*out_secrets_setting_name = NM_SETTING_CDMA_SETTING_NAME;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (!priv->setting) {
|
|
Packit Service |
d328f3 |
g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, "%s", _("Unsupported mobile broadband connection type."));
|
|
Packit Service |
d328f3 |
g_object_unref (self);
|
|
Packit Service |
d328f3 |
return NULL;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_signal_connect (self, CE_PAGE_INITIALIZED, G_CALLBACK (finish_setup), NULL);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
return CE_PAGE (self);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static const char *
|
|
Packit Service |
d328f3 |
nm_entry_get_text (GtkEntry *entry)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
const char *txt;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
txt = gtk_entry_get_text (entry);
|
|
Packit Service |
d328f3 |
if (txt && strlen (txt) > 0)
|
|
Packit Service |
d328f3 |
return txt;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
return NULL;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
gsm_ui_to_setting (CEPageMobile *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageMobilePrivate *priv = CE_PAGE_MOBILE_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
gboolean roaming_allowed;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
roaming_allowed = gtk_toggle_button_get_active (priv->roaming_allowed);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_object_set (priv->setting,
|
|
Packit Service |
d328f3 |
NM_SETTING_GSM_NUMBER, nm_entry_get_text (priv->number),
|
|
Packit Service |
d328f3 |
NM_SETTING_GSM_USERNAME, nm_entry_get_text (priv->username),
|
|
Packit Service |
d328f3 |
NM_SETTING_GSM_PASSWORD, nm_entry_get_text (priv->password),
|
|
Packit Service |
d328f3 |
NM_SETTING_GSM_APN, nm_entry_get_text (priv->apn),
|
|
Packit Service |
d328f3 |
NM_SETTING_GSM_NETWORK_ID, nm_entry_get_text (priv->network_id),
|
|
Packit Service |
d328f3 |
NM_SETTING_GSM_PIN, nm_entry_get_text (priv->pin),
|
|
Packit Service |
d328f3 |
NM_SETTING_GSM_HOME_ONLY, !roaming_allowed,
|
|
Packit Service |
d328f3 |
NULL);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
cdma_ui_to_setting (CEPageMobile *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageMobilePrivate *priv = CE_PAGE_MOBILE_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_object_set (priv->setting,
|
|
Packit Service |
d328f3 |
NM_SETTING_CDMA_NUMBER, nm_entry_get_text (priv->number),
|
|
Packit Service |
d328f3 |
NM_SETTING_CDMA_USERNAME, nm_entry_get_text (priv->username),
|
|
Packit Service |
d328f3 |
NM_SETTING_CDMA_PASSWORD, nm_entry_get_text (priv->password),
|
|
Packit Service |
d328f3 |
NULL);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
ui_to_setting (CEPageMobile *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageMobilePrivate *priv = CE_PAGE_MOBILE_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (NM_IS_SETTING_GSM (priv->setting))
|
|
Packit Service |
d328f3 |
gsm_ui_to_setting (self);
|
|
Packit Service |
d328f3 |
else if (NM_IS_SETTING_CDMA (priv->setting))
|
|
Packit Service |
d328f3 |
cdma_ui_to_setting (self);
|
|
Packit Service |
d328f3 |
else
|
|
Packit Service |
d328f3 |
g_error ("Invalid setting");
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static gboolean
|
|
Packit Service |
d328f3 |
ce_page_validate_v (CEPage *page, NMConnection *connection, GError **error)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageMobile *self = CE_PAGE_MOBILE (page);
|
|
Packit Service |
d328f3 |
CEPageMobilePrivate *priv = CE_PAGE_MOBILE_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
ui_to_setting (self);
|
|
Packit Service |
d328f3 |
return nm_setting_verify (priv->setting, NULL, error);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
dispose (GObject *object)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
g_clear_object (&CE_PAGE_MOBILE_GET_PRIVATE (object)->window_group);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
G_OBJECT_CLASS (ce_page_mobile_parent_class)->dispose (object);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
ce_page_mobile_init (CEPageMobile *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
ce_page_mobile_class_init (CEPageMobileClass *mobile_class)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
GObjectClass *object_class = G_OBJECT_CLASS (mobile_class);
|
|
Packit Service |
d328f3 |
CEPageClass *parent_class = CE_PAGE_CLASS (mobile_class);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_type_class_add_private (object_class, sizeof (CEPageMobilePrivate));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* virtual methods */
|
|
Packit Service |
d328f3 |
parent_class->ce_page_validate_v = ce_page_validate_v;
|
|
Packit Service |
d328f3 |
object_class->dispose = dispose;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
typedef struct {
|
|
Packit Service |
d328f3 |
NMClient *client;
|
|
Packit Service |
d328f3 |
PageNewConnectionResultFunc result_func;
|
|
Packit Service |
d328f3 |
gpointer user_data;
|
|
Packit Service |
d328f3 |
NMConnection *connection;
|
|
Packit Service |
d328f3 |
} WizardInfo;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
new_connection_mobile_wizard_done (NMAMobileWizard *wizard,
|
|
Packit Service |
d328f3 |
gboolean canceled,
|
|
Packit Service |
d328f3 |
NMAMobileWizardAccessMethod *method,
|
|
Packit Service |
d328f3 |
gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
WizardInfo *info = user_data;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (!canceled && method) {
|
|
Packit Service |
d328f3 |
NMSetting *type_setting;
|
|
Packit Service |
d328f3 |
const char *ctype = NULL;
|
|
Packit Service |
d328f3 |
char *detail = NULL;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
switch (method->devtype) {
|
|
Packit Service |
d328f3 |
case NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS:
|
|
Packit Service |
d328f3 |
ctype = NM_SETTING_GSM_SETTING_NAME;
|
|
Packit Service |
d328f3 |
type_setting = nm_setting_gsm_new ();
|
|
Packit Service |
d328f3 |
/* De-facto standard for GSM */
|
|
Packit Service |
d328f3 |
g_object_set (type_setting,
|
|
Packit Service |
d328f3 |
NM_SETTING_GSM_NUMBER, "*99#",
|
|
Packit Service |
d328f3 |
NM_SETTING_GSM_USERNAME, method->username,
|
|
Packit Service |
d328f3 |
NM_SETTING_GSM_PASSWORD, method->password,
|
|
Packit Service |
d328f3 |
NM_SETTING_GSM_APN, method->gsm_apn,
|
|
Packit Service |
d328f3 |
NULL);
|
|
Packit Service |
d328f3 |
break;
|
|
Packit Service |
d328f3 |
case NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO:
|
|
Packit Service |
d328f3 |
ctype = NM_SETTING_CDMA_SETTING_NAME;
|
|
Packit Service |
d328f3 |
type_setting = nm_setting_cdma_new ();
|
|
Packit Service |
d328f3 |
/* De-facto standard for CDMA */
|
|
Packit Service |
d328f3 |
g_object_set (type_setting,
|
|
Packit Service |
d328f3 |
NM_SETTING_CDMA_NUMBER, "#777",
|
|
Packit Service |
d328f3 |
NM_SETTING_GSM_USERNAME, method->username,
|
|
Packit Service |
d328f3 |
NM_SETTING_GSM_PASSWORD, method->password,
|
|
Packit Service |
d328f3 |
NULL);
|
|
Packit Service |
d328f3 |
break;
|
|
Packit Service |
d328f3 |
default:
|
|
Packit Service |
d328f3 |
g_assert_not_reached ();
|
|
Packit Service |
d328f3 |
break;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (method->plan_name)
|
|
Packit Service |
d328f3 |
detail = g_strdup_printf ("%s %s %%d", method->provider_name, method->plan_name);
|
|
Packit Service |
d328f3 |
else
|
|
Packit Service |
d328f3 |
detail = g_strdup_printf ("%s connection %%d", method->provider_name);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
_ensure_connection_own (&info->connection);
|
|
Packit Service |
d328f3 |
ce_page_complete_connection (info->connection,
|
|
Packit Service |
d328f3 |
detail,
|
|
Packit Service |
d328f3 |
ctype,
|
|
Packit Service |
d328f3 |
FALSE,
|
|
Packit Service |
d328f3 |
info->client);
|
|
Packit Service |
d328f3 |
g_free (detail);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
nm_connection_add_setting (info->connection, type_setting);
|
|
Packit Service |
d328f3 |
nm_connection_add_setting (info->connection, nm_setting_ppp_new ());
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
(*info->result_func) (FUNC_TAG_PAGE_NEW_CONNECTION_RESULT_CALL, info->connection, canceled, NULL, info->user_data);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (wizard)
|
|
Packit Service |
d328f3 |
nma_mobile_wizard_destroy (wizard);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_object_unref (info->client);
|
|
Packit Service |
d328f3 |
nm_g_object_unref (info->connection);
|
|
Packit Service |
d328f3 |
g_free (info);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
cancel_dialog (GtkDialog *dialog)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
gtk_dialog_response (dialog, GTK_RESPONSE_CANCEL);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
void
|
|
Packit Service |
d328f3 |
mobile_connection_new (FUNC_TAG_PAGE_NEW_CONNECTION_IMPL,
|
|
Packit Service |
d328f3 |
GtkWindow *parent,
|
|
Packit Service |
d328f3 |
const char *detail,
|
|
Packit Service |
d328f3 |
gpointer detail_data,
|
|
Packit Service |
d328f3 |
NMConnection *connection,
|
|
Packit Service |
d328f3 |
NMClient *client,
|
|
Packit Service |
d328f3 |
PageNewConnectionResultFunc result_func,
|
|
Packit Service |
d328f3 |
gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
NMAMobileWizard *wizard;
|
|
Packit Service |
d328f3 |
WizardInfo *info;
|
|
Packit Service |
d328f3 |
GtkWidget *dialog, *vbox, *gsm_radio, *cdma_radio, *label, *content, *alignment;
|
|
Packit Service |
d328f3 |
GtkWidget *hbox, *image;
|
|
Packit Service |
d328f3 |
gint response;
|
|
Packit Service |
d328f3 |
NMAMobileWizardAccessMethod method;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
info = g_malloc0 (sizeof (WizardInfo));
|
|
Packit Service |
d328f3 |
info->result_func = result_func;
|
|
Packit Service |
d328f3 |
info->client = g_object_ref (client);
|
|
Packit Service |
d328f3 |
info->user_data = user_data;
|
|
Packit Service |
d328f3 |
info->connection = nm_g_object_ref (connection);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
wizard = nma_mobile_wizard_new (parent, NULL, NM_DEVICE_MODEM_CAPABILITY_NONE, FALSE,
|
|
Packit Service |
d328f3 |
new_connection_mobile_wizard_done, info);
|
|
Packit Service |
d328f3 |
if (wizard) {
|
|
Packit Service |
d328f3 |
nma_mobile_wizard_present (wizard);
|
|
Packit Service |
d328f3 |
return;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Fall back to just asking for GSM vs. CDMA */
|
|
Packit Service |
d328f3 |
dialog = gtk_dialog_new_with_buttons (_("Select Mobile Broadband Provider Type"),
|
|
Packit Service |
d328f3 |
parent,
|
|
Packit Service |
d328f3 |
GTK_DIALOG_MODAL,
|
|
Packit Service |
d328f3 |
_("_Cancel"),
|
|
Packit Service |
d328f3 |
GTK_RESPONSE_CANCEL,
|
|
Packit Service |
d328f3 |
_("_OK"),
|
|
Packit Service |
d328f3 |
GTK_RESPONSE_OK,
|
|
Packit Service |
d328f3 |
NULL);
|
|
Packit Service |
d328f3 |
g_signal_connect (dialog, "delete-event", G_CALLBACK (cancel_dialog), NULL);
|
|
Packit Service |
d328f3 |
gtk_window_set_icon_name (GTK_WINDOW (dialog), "nm-device-wwan");
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
content = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
|
|
Packit Service |
d328f3 |
alignment = gtk_alignment_new (0, 0, 0.5, 0.5);
|
|
Packit Service |
d328f3 |
gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 12, 12, 12, 12);
|
|
Packit Service |
d328f3 |
gtk_box_pack_start (GTK_BOX (content), alignment, TRUE, FALSE, 6);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
|
|
Packit Service |
d328f3 |
gtk_container_add (GTK_CONTAINER (alignment), hbox);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
image = gtk_image_new_from_icon_name ("nm-device-wwan", GTK_ICON_SIZE_DIALOG);
|
|
Packit Service |
d328f3 |
gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0);
|
|
Packit Service |
d328f3 |
gtk_misc_set_padding (GTK_MISC (image), 0, 6);
|
|
Packit Service |
d328f3 |
gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 6);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
|
|
Packit Service |
d328f3 |
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, FALSE, 0);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
label = gtk_label_new (_("Select the technology your mobile broadband provider uses. If you are unsure, ask your provider."));
|
|
Packit Service |
d328f3 |
gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
|
|
Packit Service |
d328f3 |
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
|
|
Packit Service |
d328f3 |
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 12);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
gsm_radio = gtk_radio_button_new_with_mnemonic (NULL, _("My provider uses _GSM-based technology (i.e. GPRS, EDGE, UMTS, HSDPA)"));
|
|
Packit Service |
d328f3 |
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gsm_radio), TRUE);
|
|
Packit Service |
d328f3 |
gtk_box_pack_start (GTK_BOX (vbox), gsm_radio, FALSE, FALSE, 6);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
cdma_radio = gtk_radio_button_new_with_mnemonic_from_widget (GTK_RADIO_BUTTON (gsm_radio),
|
|
Packit Service |
d328f3 |
/* Translators: CDMA has 'D' accelerator key; 'C' collides with 'Cancel' button.
|
|
Packit Service |
d328f3 |
You may need to change it according to your language. */
|
|
Packit Service |
d328f3 |
_("My provider uses C_DMA-based technology (i.e. 1xRTT, EVDO)"));
|
|
Packit Service |
d328f3 |
gtk_box_pack_start (GTK_BOX (vbox), cdma_radio, FALSE, FALSE, 6);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
gtk_widget_show_all (dialog);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
memset (&method, 0, sizeof (method));
|
|
Packit Service |
d328f3 |
response = gtk_dialog_run (GTK_DIALOG (dialog));
|
|
Packit Service |
d328f3 |
if (response == GTK_RESPONSE_OK) {
|
|
Packit Service |
d328f3 |
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cdma_radio))) {
|
|
Packit Service |
d328f3 |
method.devtype = NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO;
|
|
Packit Service |
d328f3 |
method.provider_name = _("CDMA");
|
|
Packit Service |
d328f3 |
} else {
|
|
Packit Service |
d328f3 |
method.devtype = NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS;
|
|
Packit Service |
d328f3 |
method.provider_name = _("GSM");
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
gtk_widget_destroy (dialog);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
new_connection_mobile_wizard_done (NULL,
|
|
Packit Service |
d328f3 |
(response != GTK_RESPONSE_OK),
|
|
Packit Service |
d328f3 |
(response == GTK_RESPONSE_OK) ? &method : NULL,
|
|
Packit Service |
d328f3 |
info);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|