diff options
Diffstat (limited to 'src/mm-generic-cdma.c')
-rw-r--r-- | src/mm-generic-cdma.c | 196 |
1 files changed, 106 insertions, 90 deletions
diff --git a/src/mm-generic-cdma.c b/src/mm-generic-cdma.c index 1d20760a..e3c6004f 100644 --- a/src/mm-generic-cdma.c +++ b/src/mm-generic-cdma.c @@ -11,7 +11,7 @@ * GNU General Public License for more details: * * Copyright (C) 2008 - 2009 Novell, Inc. - * Copyright (C) 2009 Red Hat, Inc. + * Copyright (C) 2009 - 2010 Red Hat, Inc. */ #include <string.h> @@ -478,13 +478,15 @@ static void disable_all_done (MMModem *modem, GError *error, gpointer user_data) { MMCallbackInfo *info = user_data; - MMGenericCdma *self = MM_GENERIC_CDMA (info->modem); - MMGenericCdmaPrivate *priv = MM_GENERIC_CDMA_GET_PRIVATE (self); - if (error) { - disable_set_previous_state (MM_MODEM (modem), info); - info->error = g_error_copy (error); + info->error = mm_modem_check_removed (modem, error); + if (info->error) { + if (modem) + disable_set_previous_state (modem, info); } else { + MMGenericCdma *self = MM_GENERIC_CDMA (info->modem); + MMGenericCdmaPrivate *priv = MM_GENERIC_CDMA_GET_PRIVATE (self); + mm_serial_port_close (priv->primary); mm_modem_set_state (modem, MM_MODEM_STATE_DISABLED, MM_MODEM_STATE_REASON_NONE); @@ -501,18 +503,22 @@ disable_flash_done (MMSerialPort *port, gpointer user_data) { MMCallbackInfo *info = user_data; - MMGenericCdma *self = MM_GENERIC_CDMA (info->modem); + MMGenericCdma *self; - if (error) { - disable_set_previous_state (info->modem, info); - info->error = g_error_copy (error); + info->error = mm_modem_check_removed (info->modem, error); + if (info->error) { + if (info->modem) + disable_set_previous_state (info->modem, info); mm_callback_info_schedule (info); - } else { - if (MM_GENERIC_CDMA_GET_CLASS (self)->post_disable) - MM_GENERIC_CDMA_GET_CLASS (self)->post_disable (self, disable_all_done, info); - else - disable_all_done (MM_MODEM (self), NULL, info); + return; } + + self = MM_GENERIC_CDMA (info->modem); + + if (MM_GENERIC_CDMA_GET_CLASS (self)->post_disable) + MM_GENERIC_CDMA_GET_CLASS (self)->post_disable (self, disable_all_done, info); + else + disable_all_done (MM_MODEM (self), NULL, info); } static void @@ -557,13 +563,15 @@ dial_done (MMSerialPort *port, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMGenericCdma *self = MM_GENERIC_CDMA (info->modem); - MMGenericCdmaPrivate *priv = MM_GENERIC_CDMA_GET_PRIVATE (self);; - if (error) { - info->error = g_error_copy (error); - update_enabled_state (MM_GENERIC_CDMA (info->modem), FALSE, MM_MODEM_STATE_REASON_NONE); + info->error = mm_modem_check_removed (info->modem, error); + if (info->error) { + if (info->modem) + update_enabled_state (MM_GENERIC_CDMA (info->modem), FALSE, MM_MODEM_STATE_REASON_NONE); } else { + MMGenericCdma *self = MM_GENERIC_CDMA (info->modem); + MMGenericCdmaPrivate *priv = MM_GENERIC_CDMA_GET_PRIVATE (self); + /* Clear reg tries; we're obviously registered by this point */ registration_cleanup (self, 0, 0); @@ -598,25 +606,22 @@ disconnect_flash_done (MMSerialPort *port, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMGenericCdmaPrivate *priv = MM_GENERIC_CDMA_GET_PRIVATE (info->modem); - - if (error) { - MMModemState prev_state; - - /* Reset old state since the operation failed */ - prev_state = GPOINTER_TO_UINT (mm_callback_info_get_data (info, MM_GENERIC_CDMA_PREV_STATE_TAG)); - mm_modem_set_state (MM_MODEM (info->modem), - prev_state, - MM_MODEM_STATE_REASON_NONE); + MMModemState prev_state; - info->error = g_error_copy (error); - mm_callback_info_schedule (info); - return; + info->error = mm_modem_check_removed (info->modem, error); + if (info->error) { + if (info->modem) { + /* Reset old state since the operation failed */ + prev_state = GPOINTER_TO_UINT (mm_callback_info_get_data (info, MM_GENERIC_CDMA_PREV_STATE_TAG)); + mm_modem_set_state (MM_MODEM (info->modem), + prev_state, + MM_MODEM_STATE_REASON_NONE); + } + } else { + mm_port_set_connected (MM_GENERIC_CDMA_GET_PRIVATE (info->modem)->data, FALSE); + update_enabled_state (MM_GENERIC_CDMA (info->modem), FALSE, MM_MODEM_STATE_REASON_NONE); } - mm_port_set_connected (priv->data, FALSE); - update_enabled_state (MM_GENERIC_CDMA (info->modem), FALSE, MM_MODEM_STATE_REASON_NONE); - mm_callback_info_schedule (info); } @@ -727,21 +732,28 @@ get_card_info (MMModem *modem, { MMGenericCdmaPrivate *priv = MM_GENERIC_CDMA_GET_PRIVATE (modem); MMCallbackInfo *info; + MMSerialPort *port = priv->primary; info = mm_callback_info_new_full (MM_MODEM (modem), card_info_invoke, G_CALLBACK (callback), user_data); - mm_serial_port_queue_command_cached (priv->secondary ? priv->secondary : priv->primary, - "+GMI", 3, - get_manufacturer_done, info); - mm_serial_port_queue_command_cached (priv->secondary ? priv->secondary : priv->primary, - "+GMM", 3, - get_model_done, info); - mm_serial_port_queue_command_cached (priv->secondary ? priv->secondary : priv->primary, - "+GMR", 3, - get_version_done, info); + if (mm_port_get_connected (MM_PORT (priv->primary))) { + if (!priv->secondary) { + info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED, + "Cannot modem info while connected"); + mm_callback_info_schedule (info); + return; + } + + /* Use secondary port if primary is connected */ + port = priv->secondary; + } + + mm_serial_port_queue_command_cached (port, "+GMI", 3, get_manufacturer_done, info); + mm_serial_port_queue_command_cached (port, "+GMM", 3, get_model_done, info); + mm_serial_port_queue_command_cached (port, "+GMR", 3, get_version_done, info); } /*****************************************************************************/ @@ -839,20 +851,21 @@ get_signal_quality (MMModemCdma *modem, { MMGenericCdmaPrivate *priv = MM_GENERIC_CDMA_GET_PRIVATE (modem); MMCallbackInfo *info; - gboolean connected; + MMSerialPort *port = priv->primary; - connected = mm_port_get_connected (MM_PORT (priv->primary)); - if (connected && !priv->secondary) { - g_message ("Returning saved signal quality %d", priv->cdma1x_quality); - callback (MM_MODEM (modem), priv->cdma1x_quality, NULL, user_data); - return; + if (mm_port_get_connected (MM_PORT (priv->primary))) { + if (!priv->secondary) { + g_message ("Returning saved signal quality %d", priv->cdma1x_quality); + callback (MM_MODEM (modem), priv->cdma1x_quality, NULL, user_data); + return; + } + + /* Use secondary port if primary is connected */ + port = priv->secondary; } info = mm_callback_info_uint_new (MM_MODEM (modem), callback, user_data); - /* Prefer secondary port for signal strength */ - mm_serial_port_queue_command (priv->secondary ? priv->secondary : priv->primary, - "+CSQ", 3, - get_signal_quality_done, info); + mm_serial_port_queue_command (port, "+CSQ", 3, get_signal_quality_done, info); } static void @@ -881,22 +894,24 @@ get_esn (MMModemCdma *modem, { MMGenericCdmaPrivate *priv = MM_GENERIC_CDMA_GET_PRIVATE (modem); MMCallbackInfo *info; - gboolean connected; GError *error; + MMSerialPort *port = priv->primary; - connected = mm_port_get_connected (MM_PORT (priv->primary)); - if (connected && !priv->secondary) { - error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED, - "Cannot get ESN while connected"); - callback (MM_MODEM (modem), NULL, error, user_data); - g_error_free (error); - return; + if (mm_port_get_connected (MM_PORT (priv->primary))) { + if (!priv->secondary) { + error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED, + "Cannot get ESN while connected"); + callback (MM_MODEM (modem), NULL, error, user_data); + g_error_free (error); + return; + } + + /* Use secondary port if primary is connected */ + port = priv->secondary; } info = mm_callback_info_string_new (MM_MODEM (modem), callback, user_data); - mm_serial_port_queue_command_cached (priv->secondary ? priv->secondary : priv->primary, - "+GSN", 3, - get_string_done, info); + mm_serial_port_queue_command_cached (port, "+GSN", 3, get_string_done, info); } static void @@ -1098,16 +1113,20 @@ get_serving_system (MMModemCdma *modem, { MMGenericCdmaPrivate *priv = MM_GENERIC_CDMA_GET_PRIVATE (modem); MMCallbackInfo *info; - gboolean connected; GError *error; + MMSerialPort *port = priv->primary; - connected = mm_port_get_connected (MM_PORT (priv->primary)); - if (connected && !priv->secondary) { - error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED, - "Cannot get serving system while connected"); - callback (modem, 0, 0, 0, error, user_data); - g_error_free (error); - return; + if (mm_port_get_connected (MM_PORT (priv->primary))) { + if (!priv->secondary) { + error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED, + "Cannot get serving system while connected"); + callback (modem, 0, 0, 0, error, user_data); + g_error_free (error); + return; + } + + /* Use secondary port if primary is connected */ + port = priv->secondary; } info = mm_callback_info_new_full (MM_MODEM (modem), @@ -1115,9 +1134,7 @@ get_serving_system (MMModemCdma *modem, G_CALLBACK (callback), user_data); - mm_serial_port_queue_command (priv->secondary ? priv->secondary : priv->primary, - "+CSS?", 3, - serving_system_done, info); + mm_serial_port_queue_command (port, "+CSS?", 3, serving_system_done, info); } #define CDMA_1X_STATE_TAG "cdma-1x-reg-state" @@ -1323,23 +1340,22 @@ get_registration_state (MMModemCdma *modem, { MMGenericCdmaPrivate *priv = MM_GENERIC_CDMA_GET_PRIVATE (modem); MMCallbackInfo *info; - gboolean connected; + MMSerialPort *port = priv->primary; - connected = mm_port_get_connected (MM_PORT (priv->primary)); - if (connected && !priv->secondary) { - g_message ("Returning saved registration states: 1x: %d EVDO: %d", - priv->cdma_1x_reg_state, priv->evdo_reg_state); - callback (MM_MODEM_CDMA (modem), priv->cdma_1x_reg_state, priv->evdo_reg_state, NULL, user_data); - return; + if (mm_port_get_connected (MM_PORT (priv->primary))) { + if (!priv->secondary) { + g_message ("Returning saved registration states: 1x: %d EVDO: %d", + priv->cdma_1x_reg_state, priv->evdo_reg_state); + callback (MM_MODEM_CDMA (modem), priv->cdma_1x_reg_state, priv->evdo_reg_state, NULL, user_data); + return; + } + + /* Use secondary port if primary is connected */ + port = priv->secondary; } info = mm_generic_cdma_query_reg_state_callback_info_new (MM_GENERIC_CDMA (modem), callback, user_data); - - /* Prefer secondary port for registration state */ - mm_serial_port_queue_command (priv->secondary ? priv->secondary : priv->primary, - "+CAD?", - 3, - get_analog_digital_done, info); + mm_serial_port_queue_command (port, "+CAD?", 3, get_analog_digital_done, info); } /*****************************************************************************/ |