Blame src/connection-editor/page-mobile.c

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