diff options
Diffstat (limited to 'plugins/mm-modem-x22x-gsm.c')
-rw-r--r-- | plugins/mm-modem-x22x-gsm.c | 65 |
1 files changed, 62 insertions, 3 deletions
diff --git a/plugins/mm-modem-x22x-gsm.c b/plugins/mm-modem-x22x-gsm.c index ff23297..012733d 100644 --- a/plugins/mm-modem-x22x-gsm.c +++ b/plugins/mm-modem-x22x-gsm.c @@ -115,8 +115,14 @@ get_allowed_mode_done (MMAtSerialPort *port, MMCallbackInfo *info = (MMCallbackInfo *) user_data; MMModemGsmAllowedMode mode = MM_MODEM_GSM_ALLOWED_MODE_ANY; - info->error = mm_modem_check_removed (info->modem, error); - if (!info->error) { + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + + if (error) + info->error = g_error_copy (error); + else { parse_syssel_response (response, &mode, &info->error); mm_callback_info_set_result (info, GUINT_TO_POINTER (mode), NULL); } @@ -151,7 +157,14 @@ set_allowed_mode_done (MMAtSerialPort *port, { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - info->error = mm_modem_check_removed (info->modem, error); + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + + if (error) + info->error = g_error_copy (error); + mm_callback_info_schedule (info); } @@ -189,6 +202,51 @@ set_allowed_mode (MMGenericGsm *gsm, mm_at_serial_port_queue_command (port, command, 3, set_allowed_mode_done, info); } +static void +get_act_request_done (MMAtSerialPort *port, + GString *response, + GError *error, + gpointer user_data) +{ + MMCallbackInfo *info = user_data; + MMModemGsmAccessTech act = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN; + const char *p; + + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + + if (error) + info->error = g_error_copy (error); + else { + p = mm_strip_tag (response->str, "+SSND:"); + act = mm_gsm_string_to_access_tech (p); + } + + mm_callback_info_set_result (info, GUINT_TO_POINTER (act), NULL); + mm_callback_info_schedule (info); +} + +static void +get_access_technology (MMGenericGsm *modem, + MMModemUIntFn callback, + gpointer user_data) +{ + MMAtSerialPort *port; + MMCallbackInfo *info; + + info = mm_callback_info_uint_new (MM_MODEM (modem), callback, user_data); + + port = mm_generic_gsm_get_best_at_port (modem, &info->error); + if (!port) { + mm_callback_info_schedule (info); + return; + } + + mm_at_serial_port_queue_command (port, "+SSND?", 3, get_act_request_done, info); +} + /*****************************************************************************/ static void @@ -205,5 +263,6 @@ mm_modem_x22x_gsm_class_init (MMModemX22xGsmClass *klass) gsm_class->set_allowed_mode = set_allowed_mode; gsm_class->get_allowed_mode = get_allowed_mode; + gsm_class->get_access_technology = get_access_technology; } |