diff options
-rw-r--r-- | plugins/mm-modem-sierra-gsm.c | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/plugins/mm-modem-sierra-gsm.c b/plugins/mm-modem-sierra-gsm.c index 02be144f..e11f64f5 100644 --- a/plugins/mm-modem-sierra-gsm.c +++ b/plugins/mm-modem-sierra-gsm.c @@ -50,6 +50,136 @@ mm_modem_sierra_gsm_new (const char *device, } /*****************************************************************************/ + +static void +get_allowed_mode_done (MMAtSerialPort *port, + GString *response, + GError *error, + gpointer user_data) +{ + MMCallbackInfo *info = (MMCallbackInfo *) user_data; + GRegex *r = NULL; + GMatchInfo *match_info; + + info->error = mm_modem_check_removed (info->modem, error); + if (info->error) + goto done; + + /* Example response: !SELRAT: 03, UMTS 3G Preferred */ + r = g_regex_new ("!SELRAT:\\s*(\\d+).*$", 0, 0, NULL); + if (!r) { + info->error = g_error_new_literal (MM_MODEM_ERROR, + MM_MODEM_ERROR_GENERAL, + "Failed to parse the allowed mode response"); + goto done; + } + + if (g_regex_match_full (r, response->str, response->len, 0, 0, &match_info, &info->error)) { + MMModemGsmAllowedMode mode = MM_MODEM_GSM_ALLOWED_MODE_ANY; + char *str; + + str = g_match_info_fetch (match_info, 1); + switch (atoi (str)) { + case 0: + mode = MM_MODEM_GSM_ALLOWED_MODE_ANY; + break; + case 1: + mode = MM_MODEM_GSM_ALLOWED_MODE_3G_ONLY; + break; + case 2: + mode = MM_MODEM_GSM_ALLOWED_MODE_2G_ONLY; + break; + case 3: + mode = MM_MODEM_GSM_ALLOWED_MODE_3G_PREFERRED; + break; + case 4: + mode = MM_MODEM_GSM_ALLOWED_MODE_2G_PREFERRED; + break; + default: + info->error = g_error_new (MM_MODEM_ERROR, + MM_MODEM_ERROR_GENERAL, + "Failed to parse the allowed mode response: '%s'", + response->str); + break; + } + g_free (str); + + mm_callback_info_set_result (info, GUINT_TO_POINTER (mode), NULL); + } + +done: + if (r) + g_regex_unref (r); + mm_callback_info_schedule (info); +} + +static void +get_allowed_mode (MMGenericGsm *gsm, + MMModemUIntFn callback, + gpointer user_data) +{ + MMCallbackInfo *info; + MMAtSerialPort *primary; + + info = mm_callback_info_uint_new (MM_MODEM (gsm), callback, user_data); + primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY); + g_assert (primary); + mm_at_serial_port_queue_command (primary, "!SELRAT?", 3, get_allowed_mode_done, info); +} + +static void +set_allowed_mode_done (MMAtSerialPort *port, + GString *response, + GError *error, + gpointer user_data) +{ + MMCallbackInfo *info = (MMCallbackInfo *) user_data; + + if (error) + info->error = g_error_copy (error); + + mm_callback_info_schedule (info); +} + +static void +set_allowed_mode (MMGenericGsm *gsm, + MMModemGsmAllowedMode mode, + MMModemFn callback, + gpointer user_data) +{ + MMCallbackInfo *info; + MMAtSerialPort *primary; + char *command; + int idx = 0; + + info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data); + + switch (mode) { + case MM_MODEM_GSM_ALLOWED_MODE_2G_ONLY: + idx = 2; + break; + case MM_MODEM_GSM_ALLOWED_MODE_3G_ONLY: + idx = 1; + break; + case MM_MODEM_GSM_ALLOWED_MODE_2G_PREFERRED: + idx = 4; + break; + case MM_MODEM_GSM_ALLOWED_MODE_3G_PREFERRED: + idx = 3; + break; + case MM_MODEM_GSM_ALLOWED_MODE_ANY: + default: + break; + } + + command = g_strdup_printf ("!SELRAT=%d", idx); + primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY); + g_assert (primary); + mm_at_serial_port_queue_command (primary, command, 3, set_allowed_mode_done, info); + g_free (command); +} + +/*****************************************************************************/ /* Modem class override functions */ /*****************************************************************************/ @@ -159,5 +289,7 @@ mm_modem_sierra_gsm_class_init (MMModemSierraGsmClass *klass) object_class->dispose = dispose; gsm_class->do_enable_power_up_done = real_do_enable_power_up_done; + gsm_class->set_allowed_mode = set_allowed_mode; + gsm_class->get_allowed_mode = get_allowed_mode; } |