aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2010-03-26 00:14:47 -0700
committerDan Williams <dcbw@redhat.com>2010-03-26 00:14:47 -0700
commit843a772b4c1f65f4c04d1382a4b1ee69e8fcf22c (patch)
treedd3c289367fa53620773b8e65d75c6ad4b287e4e
parenta83dcdba8a154e32e7112434a96f588dac3303f1 (diff)
option/hso: implement solicited access technology request
-rw-r--r--plugins/mm-modem-hso.c9
-rw-r--r--plugins/mm-modem-option-utils.c130
-rw-r--r--plugins/mm-modem-option.c9
3 files changed, 124 insertions, 24 deletions
diff --git a/plugins/mm-modem-hso.c b/plugins/mm-modem-hso.c
index f3600d08..4f7f9d9e 100644
--- a/plugins/mm-modem-hso.c
+++ b/plugins/mm-modem-hso.c
@@ -682,6 +682,14 @@ set_allowed_mode (MMGenericGsm *gsm,
option_set_allowed_mode (gsm, mode, callback, user_data);
}
+static void
+get_access_technology (MMGenericGsm *gsm,
+ MMModemUIntFn callback,
+ gpointer user_data)
+{
+ option_get_access_technology (gsm, callback, user_data);
+}
+
/*****************************************************************************/
static gboolean
@@ -808,5 +816,6 @@ mm_modem_hso_class_init (MMModemHsoClass *klass)
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;
+ gsm_class->get_access_technology = get_access_technology;
}
diff --git a/plugins/mm-modem-option-utils.c b/plugins/mm-modem-option-utils.c
index 66946357..35dd1acd 100644
--- a/plugins/mm-modem-option-utils.c
+++ b/plugins/mm-modem-option-utils.c
@@ -179,41 +179,58 @@ owcti_to_mm (char owcti, MMModemGsmAccessTech *out_act)
return FALSE;
}
-static void
-octi_request_done (MMAtSerialPort *port,
- GString *response,
- GError *error,
- gpointer user_data)
+static gboolean
+parse_octi_response (GString *response, MMModemGsmAccessTech *act)
{
+ MMModemGsmAccessTech cur_act = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN;
const char *p;
- MMModemGsmAccessTech act = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN;
GRegex *r;
GMatchInfo *match_info;
char *str;
+ gboolean success = FALSE;
- if (!error) {
- p = mm_strip_tag (response->str, "_OCTI:");
+ g_return_val_if_fail (act != NULL, FALSE);
+ g_return_val_if_fail (response != NULL, FALSE);
- r = g_regex_new ("(\\d),(\\d)", G_REGEX_UNGREEDY, 0, NULL);
- g_return_if_fail (r != NULL);
+ p = mm_strip_tag (response->str, "_OCTI:");
- g_regex_match (r, p, 0, &match_info);
- if (g_match_info_matches (match_info)) {
- str = g_match_info_fetch (match_info, 2);
- if (str && octi_to_mm (str[0], &act))
- mm_generic_gsm_update_access_technology (MM_GENERIC_GSM (user_data), act);
- g_free (str);
+ r = g_regex_new ("(\\d),(\\d)", G_REGEX_UNGREEDY, 0, NULL);
+ g_return_val_if_fail (r != NULL, FALSE);
+
+ g_regex_match (r, p, 0, &match_info);
+ if (g_match_info_matches (match_info)) {
+ str = g_match_info_fetch (match_info, 2);
+ if (str && octi_to_mm (str[0], &cur_act)) {
+ *act = cur_act;
+ success = TRUE;
}
- g_match_info_free (match_info);
- g_regex_unref (r);
+ g_free (str);
}
+ g_match_info_free (match_info);
+ g_regex_unref (r);
+
+ return success;
}
static void
-owcti_request_done (MMAtSerialPort *port,
- GString *response,
- GError *error,
- gpointer user_data)
+ossys_octi_request_done (MMAtSerialPort *port,
+ GString *response,
+ GError *error,
+ gpointer user_data)
+{
+ MMModemGsmAccessTech act = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN;
+
+ if (!error) {
+ if (parse_octi_response (response, &act))
+ mm_generic_gsm_update_access_technology (MM_GENERIC_GSM (user_data), act);
+ }
+}
+
+static void
+ossys_owcti_request_done (MMAtSerialPort *port,
+ GString *response,
+ GError *error,
+ gpointer user_data)
{
const char *p;
MMModemGsmAccessTech act = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN;
@@ -254,9 +271,9 @@ option_ossys_tech_changed (MMAtSerialPort *port,
* access technology requests.
*/
if (act == MM_MODEM_GSM_ACCESS_TECH_GPRS)
- mm_at_serial_port_queue_command (port, "AT_OCTI?", 3, octi_request_done, user_data);
+ mm_at_serial_port_queue_command (port, "_OCTI?", 3, ossys_octi_request_done, user_data);
else if (act == MM_MODEM_GSM_ACCESS_TECH_UMTS)
- mm_at_serial_port_queue_command (port, "AT_OWCTI?", 3, owcti_request_done, user_data);
+ mm_at_serial_port_queue_command (port, "_OWCTI?", 3, ossys_owcti_request_done, user_data);
}
static void
@@ -367,3 +384,68 @@ option_change_unsolicited_messages (MMGenericGsm *modem,
mm_at_serial_port_queue_command (primary, enabled ? "_OSQI=1" : "_OSQI=0", 3, unsolicited_msg_done, info);
}
+static void
+get_act_octi_request_done (MMAtSerialPort *port,
+ GString *response,
+ GError *error,
+ gpointer user_data)
+{
+ MMCallbackInfo *info = user_data;
+ MMModemGsmAccessTech octi = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN;
+ MMModemGsmAccessTech owcti;
+
+ if (!error) {
+ if (parse_octi_response (response, &octi)) {
+ /* If no 3G tech yet or current tech isn't 3G, then 2G tech is the best */
+ owcti = GPOINTER_TO_UINT (mm_callback_info_get_data (info, "owcti"));
+ if (octi && !owcti)
+ mm_callback_info_set_result (info, GUINT_TO_POINTER (octi), NULL);
+ }
+ }
+
+ mm_callback_info_chain_complete_one (info);
+}
+
+static void
+get_act_owcti_request_done (MMAtSerialPort *port,
+ GString *response,
+ GError *error,
+ gpointer user_data)
+{
+ MMCallbackInfo *info = user_data;
+ MMModemGsmAccessTech owcti = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN;
+ const char *p;
+
+ if (!error) {
+ p = mm_strip_tag (response->str, "_OWCTI:");
+ if (owcti_to_mm (*p, &owcti)) {
+ /* 3G tech always takes precedence over 2G tech */
+ if (owcti)
+ mm_callback_info_set_result (info, GUINT_TO_POINTER (owcti), NULL);
+ }
+ }
+
+ mm_callback_info_chain_complete_one (info);
+}
+
+static void
+option_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);
+ mm_callback_info_chain_start (info, 2);
+
+ 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, "_OCTI?", 3, get_act_octi_request_done, info);
+ mm_at_serial_port_queue_command (port, "_OWCTI?", 3, get_act_owcti_request_done, info);
+}
+
diff --git a/plugins/mm-modem-option.c b/plugins/mm-modem-option.c
index 97b083f5..676aa287 100644
--- a/plugins/mm-modem-option.c
+++ b/plugins/mm-modem-option.c
@@ -113,6 +113,14 @@ set_allowed_mode (MMGenericGsm *gsm,
option_set_allowed_mode (gsm, mode, callback, user_data);
}
+static void
+get_access_technology (MMGenericGsm *gsm,
+ MMModemUIntFn callback,
+ gpointer user_data)
+{
+ option_get_access_technology (gsm, callback, user_data);
+}
+
/*****************************************************************************/
static void
@@ -221,5 +229,6 @@ mm_modem_option_class_init (MMModemOptionClass *klass)
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;
+ gsm_class->get_access_technology = get_access_technology;
}