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

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