diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-generic-cdma.c | 100 | ||||
-rw-r--r-- | src/mm-generic-cdma.h | 14 |
2 files changed, 87 insertions, 27 deletions
diff --git a/src/mm-generic-cdma.c b/src/mm-generic-cdma.c index 5093d2b1..d535e28e 100644 --- a/src/mm-generic-cdma.c +++ b/src/mm-generic-cdma.c @@ -347,27 +347,53 @@ registration_cleanup (MMGenericCdma *self, GQuark error_class, guint32 error_num } static void +enable_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) + info->error = g_error_copy (error); + else { + /* Open up the second port, if one exists */ + if (priv->secondary) { + if (!mm_serial_port_open (priv->secondary, &info->error)) { + g_assert (info->error); + goto out; + } + } + + update_enabled_state (self, FALSE, MM_MODEM_STATE_REASON_NONE); + } + +out: + if (info->error) { + mm_modem_set_state (MM_MODEM (info->modem), + MM_MODEM_STATE_DISABLED, + MM_MODEM_STATE_REASON_NONE); + } + + mm_callback_info_schedule (info); +} + +static void enable_error_reporting_done (MMSerialPort *port, GString *response, GError *error, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMGenericCdmaPrivate *priv = MM_GENERIC_CDMA_GET_PRIVATE (info->modem); + MMGenericCdma *self = MM_GENERIC_CDMA (info->modem); + /* Just ignore errors, see comment in init_done() */ if (error) g_warning ("Your CDMA modem does not support +CMEE command"); - /* Open up the second port, if one exists */ - if (priv->secondary) { - if (!mm_serial_port_open (priv->secondary, &info->error)) - g_assert (info->error); - } - - update_enabled_state (MM_GENERIC_CDMA (info->modem), FALSE, MM_MODEM_STATE_REASON_NONE); - - /* Ignore errors, see FIXME in init_done() */ - mm_callback_info_schedule (info); + if (MM_GENERIC_CDMA_GET_CLASS (self)->post_enable) + MM_GENERIC_CDMA_GET_CLASS (self)->post_enable (self, enable_all_done, info); + else + enable_all_done (MM_MODEM (self), NULL, info); } static void @@ -439,28 +465,28 @@ enable (MMModem *modem, } static void -disable_flash_done (MMSerialPort *port, - GError *error, - gpointer user_data) +disable_set_previous_state (MMModem *modem, MMCallbackInfo *info) { - MMCallbackInfo *info = user_data; - MMGenericCdmaPrivate *priv = MM_GENERIC_CDMA_GET_PRIVATE (info->modem); + MMModemState prev_state; - 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 (modem, prev_state, MM_MODEM_STATE_REASON_NONE); +} - /* 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); +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); } else { - mm_serial_port_close (port); - mm_modem_set_state (MM_MODEM (info->modem), - MM_MODEM_STATE_DISABLED, - MM_MODEM_STATE_REASON_NONE); + mm_serial_port_close (priv->primary); + mm_modem_set_state (modem, MM_MODEM_STATE_DISABLED, MM_MODEM_STATE_REASON_NONE); priv->cdma_1x_reg_state = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN; priv->evdo_reg_state = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN; @@ -470,6 +496,26 @@ disable_flash_done (MMSerialPort *port, } static void +disable_flash_done (MMSerialPort *port, + GError *error, + gpointer user_data) +{ + MMCallbackInfo *info = user_data; + MMGenericCdma *self = MM_GENERIC_CDMA (info->modem); + + if (error) { + disable_set_previous_state (info->modem, info); + info->error = g_error_copy (error); + 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); + } +} + +static void disable (MMModem *modem, MMModemFn callback, gpointer user_data) diff --git a/src/mm-generic-cdma.h b/src/mm-generic-cdma.h index e84182ad..fc042fee 100644 --- a/src/mm-generic-cdma.h +++ b/src/mm-generic-cdma.h @@ -43,6 +43,20 @@ typedef struct { void (*query_registration_state) (MMGenericCdma *self, MMModemCdmaRegistrationStateFn callback, gpointer user_data); + + /* Called after generic enable operations, but before the modem has entered + * the ENABLED state. + */ + void (*post_enable) (MMGenericCdma *self, + MMModemFn callback, + gpointer user_data); + + /* Called after generic disable operations, but before the modem has entered + * the DISABLED state. + */ + void (*post_disable) (MMGenericCdma *self, + MMModemFn callback, + gpointer user_data); } MMGenericCdmaClass; GType mm_generic_cdma_get_type (void); |