mbm: query supported modes to the modem with +CFUN=?
We were trying to load the generic modes supported reported by either *CNTI=2 or AT+WS46=?, so that then we could filter out the MBM-specific modes unsupported. But, this may not be ideal, as both these two commands may fail: [mm-broadband-modem.c:1612] modem_load_supported_modes(): loading supported modes... [mm-port-serial.c:1237] mm_port_serial_open(): (ttyACM1) device open count is 3 (open) [mm-port-serial.c:1294] _close_internal(): (ttyACM1) device open count is 2 (close) [mm-port-serial-at.c:440] debug_log(): (ttyACM1): --> 'AT*CNTI=2<CR>' [mm-port-serial-at.c:440] debug_log(): (ttyACM1): <-- '<CR><LF>ERROR<CR><LF>' [mm-serial-parsers.c:364] mm_serial_parser_v1_parse(): Got failure code 100: Unknown error [mm-broadband-modem.c:1546] supported_modes_cnti_ready(): Generic query of supported 3GPP networks with *CNTI failed: 'Unknown error' [mm-port-serial.c:1237] mm_port_serial_open(): (ttyACM1) device open count is 3 (open) [mm-port-serial.c:1294] _close_internal(): (ttyACM1) device open count is 2 (close) [mm-port-serial-at.c:440] debug_log(): (ttyACM1): --> 'AT+WS46=?<CR>' [mm-port-serial-at.c:440] debug_log(): (ttyACM1): <-- '<CR><LF>ERROR<CR><LF>' [mm-serial-parsers.c:364] mm_serial_parser_v1_parse(): Got failure code 100: Unknown error [mm-broadband-modem.c:1494] supported_modes_ws46_test_ready(): Generic query of supported 3GPP networks with WS46=? failed: 'Unknown error' [mm-iface-modem.c:3974] load_supported_modes_ready(): couldn't load Supported Modes: 'Couldn't retrieve supported modes' Instead, we'll ask the modem for the list of modes supported, and return that directly.
This commit is contained in:
@@ -68,6 +68,69 @@ mm_strip_tag (const gchar *str, const gchar *cmd)
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
gchar **
|
||||
mm_split_string_groups (const gchar *str)
|
||||
{
|
||||
GPtrArray *array;
|
||||
const gchar *start;
|
||||
const gchar *next;
|
||||
|
||||
array = g_ptr_array_new ();
|
||||
|
||||
/*
|
||||
* Manually parse splitting groups. Groups may be single elements, or otherwise
|
||||
* lists given between parenthesis, e.g.:
|
||||
*
|
||||
* ("SM","ME"),("SM","ME"),("SM","ME")
|
||||
* "SM","SM","SM"
|
||||
* "SM",("SM","ME"),("SM","ME")
|
||||
*/
|
||||
|
||||
/* Iterate string splitting groups */
|
||||
for (start = str; start; start = next) {
|
||||
gchar *item;
|
||||
gssize len = -1;
|
||||
|
||||
/* skip leading whitespaces */
|
||||
while (*start == ' ')
|
||||
start++;
|
||||
|
||||
if (*start == '(') {
|
||||
start++;
|
||||
next = strchr (start, ')');
|
||||
if (next) {
|
||||
len = next - start;
|
||||
next = strchr (next, ',');
|
||||
if (next)
|
||||
next++;
|
||||
}
|
||||
} else {
|
||||
next = strchr (start, ',');
|
||||
if (next) {
|
||||
len = next - start;
|
||||
next++;
|
||||
}
|
||||
}
|
||||
|
||||
if (len < 0)
|
||||
item = g_strdup (start);
|
||||
else
|
||||
item = g_strndup (start, len);
|
||||
|
||||
g_ptr_array_add (array, item);
|
||||
}
|
||||
|
||||
if (array->len > 0) {
|
||||
g_ptr_array_add (array, NULL);
|
||||
return (gchar **) g_ptr_array_free (array, FALSE);
|
||||
}
|
||||
|
||||
g_ptr_array_unref (array);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
guint
|
||||
mm_count_bits_set (gulong number)
|
||||
{
|
||||
@@ -1290,67 +1353,6 @@ storage_from_str (const gchar *str)
|
||||
return MM_SMS_STORAGE_UNKNOWN;
|
||||
}
|
||||
|
||||
static gchar **
|
||||
helper_split_groups (const gchar *str)
|
||||
{
|
||||
GPtrArray *array;
|
||||
const gchar *start;
|
||||
const gchar *next;
|
||||
|
||||
array = g_ptr_array_new ();
|
||||
|
||||
/*
|
||||
* Manually parse splitting groups. Groups may be single elements, or otherwise
|
||||
* lists given between parenthesis, e.g.:
|
||||
*
|
||||
* ("SM","ME"),("SM","ME"),("SM","ME")
|
||||
* "SM","SM","SM"
|
||||
* "SM",("SM","ME"),("SM","ME")
|
||||
*/
|
||||
|
||||
/* Iterate string splitting groups */
|
||||
for (start = str; start; start = next) {
|
||||
gchar *item;
|
||||
gssize len = -1;
|
||||
|
||||
/* skip leading whitespaces */
|
||||
while (*start == ' ')
|
||||
start++;
|
||||
|
||||
if (*start == '(') {
|
||||
start++;
|
||||
next = strchr (start, ')');
|
||||
if (next) {
|
||||
len = next - start;
|
||||
next = strchr (next, ',');
|
||||
if (next)
|
||||
next++;
|
||||
}
|
||||
} else {
|
||||
next = strchr (start, ',');
|
||||
if (next) {
|
||||
len = next - start;
|
||||
next++;
|
||||
}
|
||||
}
|
||||
|
||||
if (len < 0)
|
||||
item = g_strdup (start);
|
||||
else
|
||||
item = g_strndup (start, len);
|
||||
|
||||
g_ptr_array_add (array, item);
|
||||
}
|
||||
|
||||
if (array->len > 0) {
|
||||
g_ptr_array_add (array, NULL);
|
||||
return (gchar **) g_ptr_array_free (array, FALSE);
|
||||
}
|
||||
|
||||
g_ptr_array_unref (array);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gboolean
|
||||
mm_3gpp_parse_cpms_test_response (const gchar *reply,
|
||||
GArray **mem1,
|
||||
@@ -1370,7 +1372,7 @@ mm_3gpp_parse_cpms_test_response (const gchar *reply,
|
||||
|
||||
#define N_EXPECTED_GROUPS 3
|
||||
|
||||
split = helper_split_groups (mm_strip_tag (reply, "+CPMS:"));
|
||||
split = mm_split_string_groups (mm_strip_tag (reply, "+CPMS:"));
|
||||
if (!split)
|
||||
return FALSE;
|
||||
|
||||
|
Reference in New Issue
Block a user