summary refs log tree commit diff
path: root/src/modem-manager/nm-modem.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2011-04-21 10:42:53 +0200
committerMichael Biebl <biebl@debian.org>2011-04-21 10:42:53 +0200
commit8baa1aca8dfd35e3190d7d5655eb83b5b901e263 (patch)
treea9ac1e67d0c22a48330c76f08fc5291f85307055 /src/modem-manager/nm-modem.c
parentf75dd6fd1975146623052b843b182dc32c3fbe46 (diff)
Imported Upstream version 0.8.4.0 upstream/0.8.4.0
Diffstat (limited to 'src/modem-manager/nm-modem.c')
-rw-r--r--src/modem-manager/nm-modem.c234
1 files changed, 95 insertions, 139 deletions
diff --git a/src/modem-manager/nm-modem.c b/src/modem-manager/nm-modem.c
index 449370eb..9471ef87 100644
--- a/src/modem-manager/nm-modem.c
+++ b/src/modem-manager/nm-modem.c
@@ -15,7 +15,7 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Copyright (C) 2009 - 2011 Red Hat, Inc.
+ * Copyright (C) 2009 - 2010 Red Hat, Inc.
  * Copyright (C) 2009 Novell, Inc.
  */
 
@@ -33,6 +33,8 @@
 #include "nm-device-interface.h"
 #include "nm-dbus-glib-types.h"
 
+#include "nm-serial-device-glue.h"
+
 G_DEFINE_TYPE (NMModem, nm_modem, G_TYPE_OBJECT)
 
 #define NM_MODEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_MODEM, NMModemPrivate))
@@ -60,9 +62,7 @@ typedef struct {
 	char *device;
 	char *iface;
 
-	NMActRequest *act_request;
 	guint32 secrets_tries;
-	guint32 secrets_id;
 
 	DBusGProxyCall *call;
 
@@ -78,22 +78,13 @@ enum {
 	PPP_FAILED,
 	PREPARE_RESULT,
 	IP4_CONFIG_RESULT,
-	AUTH_REQUESTED,
-	AUTH_RESULT,
+	NEED_AUTH,
 
 	LAST_SIGNAL
 };
 
 static guint signals[LAST_SIGNAL] = { 0 };
 
-NMPPPManager *
-nm_modem_get_ppp_manager (NMModem *self)
-{
-	g_return_val_if_fail (NM_IS_MODEM (self), NULL);
-
-	return NM_MODEM_GET_PRIVATE (self)->ppp_manager;
-}
-
 gboolean
 nm_modem_get_mm_enabled (NMModem *self)
 {
@@ -476,60 +467,67 @@ nm_modem_stage4_get_ip4_config (NMModem *self,
 	return ret;
 }
 
-static void
-cancel_get_secrets (NMModem *self)
+gboolean
+nm_modem_connection_secrets_updated (NMModem *self,
+                                     NMActRequest *req,
+                                     NMConnection *connection,
+                                     GSList *updated_settings,
+                                     RequestSecretsCaller caller)
 {
-	NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (self);
+	NMModemPrivate *priv;
+	gboolean found = FALSE;
+	const char *setting_name;
+	GSList *iter;
 
-	if (priv->secrets_id) {
-		nm_act_request_cancel_secrets (priv->act_request, priv->secrets_id);
-		priv->secrets_id = 0;
-	}
-}
+	g_return_val_if_fail (self != NULL, FALSE);
+	g_return_val_if_fail (NM_IS_MODEM (self), FALSE);
+	g_return_val_if_fail (req != NULL, FALSE);
+	g_return_val_if_fail (NM_IS_ACT_REQUEST (req), FALSE);
+	g_return_val_if_fail (connection != NULL, FALSE);
+	g_return_val_if_fail (NM_IS_ACT_REQUEST (req), FALSE);
 
-static void
-modem_secrets_cb (NMActRequest *req,
-                  guint32 call_id,
-                  NMConnection *connection,
-                  GError *error,
-                  gpointer user_data)
-{
-	NMModem *self = NM_MODEM (user_data);
-	NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (self);
+	priv = NM_MODEM_GET_PRIVATE (self);
 
-	g_return_if_fail (call_id == priv->secrets_id);
+	if (caller == SECRETS_CALLER_PPP) {
+		const char *user = NULL;
+		const char *pass = NULL;
+
+		g_return_val_if_fail (priv->ppp_manager != NULL, FALSE);
+
+		if (!NM_MODEM_GET_CLASS (self)->get_user_pass (self, connection, &user, &pass)) {
+			/* Shouldn't ever happen */
+			nm_ppp_manager_update_secrets (priv->ppp_manager,
+										   priv->iface,
+										   NULL,
+										   NULL,
+										   "missing GSM/CDMA setting; no secrets could be found.");
+		} else {
+			nm_ppp_manager_update_secrets (priv->ppp_manager,
+										   priv->iface,
+										   user ? user : "",
+										   pass ? pass : "",
+										   NULL);
+		}
+		return TRUE;
+	}
 
-	priv->secrets_id = 0;
+	g_return_val_if_fail (caller == SECRETS_CALLER_MOBILE_BROADBAND, FALSE);
 
-	if (error)
-		nm_log_warn (LOGD_MB, "%s", error->message);
+	g_assert (NM_MODEM_GET_CLASS (self)->get_setting_name);
+	setting_name = NM_MODEM_GET_CLASS (self)->get_setting_name (self);
 
-	g_signal_emit (self, signals[AUTH_RESULT], 0, error);
-}
+	for (iter = updated_settings; iter; iter = g_slist_next (iter)) {
+		const char *candidate_setting_name = (const char *) iter->data;
 
-gboolean
-nm_modem_get_secrets (NMModem *self,
-                      const char *setting_name,
-                      gboolean request_new,
-                      const char *hint)
-{
-	NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (self);
-	NMSettingsGetSecretsFlags flags = NM_SETTINGS_GET_SECRETS_FLAG_ALLOW_INTERACTION;
-
-	cancel_get_secrets (self);
-
-	if (request_new)
-		flags |= NM_SETTINGS_GET_SECRETS_FLAG_REQUEST_NEW;
-	priv->secrets_id = nm_act_request_get_secrets (priv->act_request,
-	                                               setting_name,
-	                                               flags,
-	                                               hint,
-	                                               modem_secrets_cb,
-	                                               self);
-	if (priv->secrets_id)
-		g_signal_emit (self, signals[AUTH_REQUESTED], 0);
-
-	return !!(priv->secrets_id);
+		if (!strcmp (candidate_setting_name, setting_name))
+			found = TRUE;
+		else {
+			nm_log_warn (LOGD_MB, "ignoring updated secrets for setting '%s'.",
+			            candidate_setting_name);
+		}
+	}
+
+	return found;
 }
 
 static NMActStageReturn
@@ -552,11 +550,6 @@ nm_modem_act_stage1_prepare (NMModem *self,
 	NMActStageReturn ret;
 	GPtrArray *hints = NULL;
 	const char *setting_name = NULL;
-	NMSettingsGetSecretsFlags flags = NM_SETTINGS_GET_SECRETS_FLAG_ALLOW_INTERACTION;
-
-	if (priv->act_request)
-		g_object_unref (priv->act_request);
-	priv->act_request = g_object_ref (req);
 
 	ret = NM_MODEM_GET_CLASS (self)->act_stage1_prepare (self,
 	                                                     req,
@@ -564,22 +557,23 @@ nm_modem_act_stage1_prepare (NMModem *self,
 	                                                     &setting_name,
 	                                                     reason);
 	if ((ret == NM_ACT_STAGE_RETURN_POSTPONE) && setting_name) {
-		if (priv->secrets_tries++)
-			flags |= NM_SETTINGS_GET_SECRETS_FLAG_REQUEST_NEW;
-
-		priv->secrets_id = nm_act_request_get_secrets (req,
-		                                               setting_name,
-		                                               flags,
-		                                               hints ? g_ptr_array_index (hints, 0) : NULL,
-		                                               modem_secrets_cb,
-		                                               self);
-		if (priv->secrets_id)
-			g_signal_emit (self, signals[AUTH_REQUESTED], 0);
-		else {
-			*reason = NM_DEVICE_STATE_REASON_NO_SECRETS;
-			ret = NM_ACT_STAGE_RETURN_FAILURE;
+		const char *hint1 = NULL, *hint2 = NULL;
+
+		/* Need some secrets */
+		if (hints) {
+			if (hints->len > 0)
+				hint1 = g_ptr_array_index (hints, 0);
+			if (hints->len > 1)
+				hint2 = g_ptr_array_index (hints, 1);
 		}
 
+		g_signal_emit (self, signals[NEED_AUTH], 0,
+		               setting_name, 
+	                   priv->secrets_tries++ ? TRUE : FALSE,
+	                   SECRETS_CALLER_MOBILE_BROADBAND,
+	                   hint1,
+	                   hint2);
+
 		if (hints)
 			g_ptr_array_free (hints, TRUE);
 	}
@@ -622,19 +616,8 @@ nm_modem_check_connection_compatible (NMModem *self,
 	return FALSE;
 }
 
-gboolean
-nm_modem_complete_connection (NMModem *self,
-                              NMConnection *connection,
-                              const GSList *existing_connections,
-                              GError **error)
-{
-	if (NM_MODEM_GET_CLASS (self)->complete_connection)
-		return NM_MODEM_GET_CLASS (self)->complete_connection (self, connection, existing_connections, error);
-	return FALSE;
-}
-
 static void
-real_deactivate (NMModem *self, NMDevice *device)
+real_deactivate_quickly (NMModem *self, NMDevice *device)
 {
 	NMModemPrivate *priv;
 	const char *iface;
@@ -648,12 +631,6 @@ real_deactivate (NMModem *self, NMDevice *device)
 
 	priv->secrets_tries = 0;
 
-	if (priv->act_request) {
-		cancel_get_secrets (self);
-		g_object_unref (priv->act_request);
-		priv->act_request = NULL;
-	}
-
 	if (priv->call) {
 		dbus_g_proxy_cancel_call (priv->proxy, priv->call);
 		priv->call = NULL;
@@ -666,12 +643,13 @@ real_deactivate (NMModem *self, NMDevice *device)
 
 	priv->in_bytes = priv->out_bytes = 0;
 
+	if (priv->ppp_manager) {
+		g_object_unref (priv->ppp_manager);
+		priv->ppp_manager = NULL;
+	}
+
 	switch (priv->ip_method) {
 	case MM_MODEM_IP_METHOD_PPP:
-		if (priv->ppp_manager) {
-			g_object_unref (priv->ppp_manager);
-			priv->ppp_manager = NULL;
-		}
 		break;
 	case MM_MODEM_IP_METHOD_STATIC:
 	case MM_MODEM_IP_METHOD_DHCP:
@@ -688,9 +666,9 @@ real_deactivate (NMModem *self, NMDevice *device)
 }
 
 void
-nm_modem_deactivate (NMModem *self, NMDevice *device)
+nm_modem_deactivate_quickly (NMModem *self, NMDevice *device)
 {
-	NM_MODEM_GET_CLASS (self)->deactivate (self, device);
+	NM_MODEM_GET_CLASS (self)->deactivate_quickly (self, device);
 }
 
 static void
@@ -712,7 +690,6 @@ nm_modem_device_state_changed (NMModem *self,
                                NMDeviceStateReason reason)
 {
 	gboolean was_connected = FALSE;
-	NMModemPrivate *priv;
 
 	g_return_if_fail (self != NULL);
 	g_return_if_fail (NM_IS_MODEM (self));
@@ -720,26 +697,16 @@ nm_modem_device_state_changed (NMModem *self,
 	if (IS_ACTIVATING_STATE (old_state) || (old_state == NM_DEVICE_STATE_ACTIVATED))
 		was_connected = TRUE;
 
-	priv = NM_MODEM_GET_PRIVATE (self);
-
 	/* Make sure we don't leave the serial device open */
 	switch (new_state) {
 	case NM_DEVICE_STATE_NEED_AUTH:
-		if (priv->ppp_manager)
+		if (NM_MODEM_GET_PRIVATE (self)->ppp_manager)
 			break;
 		/* else fall through */
 	case NM_DEVICE_STATE_UNMANAGED:
 	case NM_DEVICE_STATE_UNAVAILABLE:
 	case NM_DEVICE_STATE_FAILED:
 	case NM_DEVICE_STATE_DISCONNECTED:
-		if (new_state != NM_DEVICE_STATE_NEED_AUTH) {
-			if (priv->act_request) {
-				cancel_get_secrets (self);
-				g_object_unref (priv->act_request);
-				priv->act_request = NULL;
-			}
-		}
-
 		if (was_connected) {
 			dbus_g_proxy_begin_call (nm_modem_get_proxy (self, MM_DBUS_INTERFACE_MODEM),
 			                         "Disconnect",
@@ -754,12 +721,6 @@ nm_modem_device_state_changed (NMModem *self,
 	}
 }
 
-static gboolean
-_state_is_active (NMDeviceState state)
-{
-	return (state >= NM_DEVICE_STATE_IP_CONFIG && state <= NM_DEVICE_STATE_DEACTIVATING);
-}
-
 gboolean
 nm_modem_hw_is_up (NMModem *self, NMDevice *device)
 {
@@ -770,7 +731,7 @@ nm_modem_hw_is_up (NMModem *self, NMDevice *device)
 		NMDeviceState state;
 
 		state = nm_device_interface_get_state (NM_DEVICE_INTERFACE (device));
-		if (priv->pending_ip4_config || _state_is_active (state))
+		if (priv->pending_ip4_config || state == NM_DEVICE_STATE_IP_CONFIG || state == NM_DEVICE_STATE_ACTIVATED)
 			return nm_system_device_is_up (device);
 	}
 
@@ -787,7 +748,7 @@ nm_modem_hw_bring_up (NMModem *self, NMDevice *device, gboolean *no_firmware)
 		NMDeviceState state;
 
 		state = nm_device_interface_get_state (NM_DEVICE_INTERFACE (device));
-		if (priv->pending_ip4_config || _state_is_active (state))
+		if (priv->pending_ip4_config || state == NM_DEVICE_STATE_IP_CONFIG || state == NM_DEVICE_STATE_ACTIVATED)
 			return nm_system_device_set_up_down (device, TRUE, no_firmware);
 	}
 
@@ -1054,9 +1015,6 @@ finalize (GObject *object)
 {
 	NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (object);
 
-	if (priv->act_request)
-		g_object_unref (priv->act_request);
-
 	if (priv->proxy)
 		g_object_unref (priv->proxy);
 
@@ -1086,7 +1044,7 @@ nm_modem_class_init (NMModemClass *klass)
 	object_class->finalize = finalize;
 
 	klass->act_stage1_prepare = real_act_stage1_prepare;
-	klass->deactivate = real_deactivate;
+	klass->deactivate_quickly = real_deactivate_quickly;
 
 	/* Properties */
 	g_object_class_install_property
@@ -1169,22 +1127,20 @@ nm_modem_class_init (NMModemClass *klass)
 					  _nm_marshal_VOID__BOOLEAN_UINT,
 					  G_TYPE_NONE, 2, G_TYPE_BOOLEAN, G_TYPE_UINT);
 
-	signals[AUTH_REQUESTED] =
-		g_signal_new (NM_MODEM_AUTH_REQUESTED,
+	signals[NEED_AUTH] =
+		g_signal_new (NM_MODEM_NEED_AUTH,
 					  G_OBJECT_CLASS_TYPE (object_class),
 					  G_SIGNAL_RUN_FIRST,
-					  G_STRUCT_OFFSET (NMModemClass, auth_requested),
+					  G_STRUCT_OFFSET (NMModemClass, need_auth),
 					  NULL, NULL,
-					  g_cclosure_marshal_VOID__VOID,
-					  G_TYPE_NONE, 0);
+					  _nm_marshal_VOID__STRING_BOOLEAN_UINT_STRING_STRING,
+					  G_TYPE_NONE, 5,
+					  G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING);
+}
 
-	signals[AUTH_RESULT] =
-		g_signal_new (NM_MODEM_AUTH_RESULT,
-					  G_OBJECT_CLASS_TYPE (object_class),
-					  G_SIGNAL_RUN_FIRST,
-					  G_STRUCT_OFFSET (NMModemClass, auth_result),
-					  NULL, NULL,
-					  g_cclosure_marshal_VOID__POINTER,
-					  G_TYPE_NONE, 1, G_TYPE_POINTER);
+const DBusGObjectInfo *
+nm_modem_get_serial_dbus_info (void)
+{
+	return &dbus_glib_nm_serial_device_object_info;
 }