diff options
Diffstat (limited to 'src/mm-generic-cdma.c')
-rw-r--r-- | src/mm-generic-cdma.c | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/src/mm-generic-cdma.c b/src/mm-generic-cdma.c index 58f53546..d81c1b18 100644 --- a/src/mm-generic-cdma.c +++ b/src/mm-generic-cdma.c @@ -518,6 +518,7 @@ serving_system_done (MMSerialPort *port, char *reply = response->str; int class = 0, sid = 99999, num; unsigned char band = 'Z'; + gboolean success = FALSE; if (error) { info->error = g_error_copy (error); @@ -527,27 +528,40 @@ serving_system_done (MMSerialPort *port, if (strstr (reply, "+CSS: ")) reply += 6; - num = sscanf (reply, "%d , %c , %d", &class, &band, &sid); - if (num == 3) { - /* Normalize */ - class = CLAMP (class, 0, 4); - band = CLAMP (band, 'A', 'Z'); + num = sscanf (reply, "? , %d", &sid); + if (num == 1) { + /* UTStarcom modem that uses IS-707-A format */ + success = TRUE; + } else { + num = sscanf (reply, "%d , %c , %d", &class, &band, &sid); + if (num == 3) { + /* Modem uses IS-707-A-2 format */ + + /* Normalize */ + class = CLAMP (class, 0, 4); + band = CLAMP (band, 'A', 'Z'); + success = TRUE; + } + } + + if (success) { + /* 99999 means unknown/no service */ if (sid < 0 || sid > 32767) sid = 99999; - /* 99 means unknown/no service */ - if (sid == 99999) { + if (sid == 0 || sid == 99999) { info->error = g_error_new_literal (MM_MOBILE_ERROR, - MM_MOBILE_ERROR_NO_NETWORK, - "No service"); + MM_MOBILE_ERROR_NO_NETWORK, + "No service"); } else { mm_callback_info_set_data (info, "class", GUINT_TO_POINTER (class), NULL); mm_callback_info_set_data (info, "band", GUINT_TO_POINTER ((guint32) band), NULL); mm_callback_info_set_data (info, "sid", GUINT_TO_POINTER (sid), NULL); } - } else + } else { info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_GENERAL, "Could not parse Serving System results."); + } out: mm_callback_info_schedule (info); |