summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2010-06-07 11:24:13 -0500
committerDenis Kenzior <denkenz@gmail.com>2010-06-07 12:57:50 -0500
commit11c8156543d6b12d7e0c50ce95fe4aeac4bc76bd (patch)
tree8421fa59f6d952f29b4df4bf5eac3d25e48f0a17
parent3d96880f4110a356af0bf6d9b4e99468dc46754f (diff)
downloadofono-11c8156543d6b12d7e0c50ce95fe4aeac4bc76bd.tar.bz2
atmodem: Optimize cops queries
This patch is meant to do two things: - Some modems, like the Novatel, report bogus operator information when not registered, as opposed to simply returning empty strings. In this case we're a little bit more explicit about checking the returned mcc/mnc string - If we determine that the mcc/mnc string is bogus, we don't schedule the alphanumeric cops query and return early.
-rw-r--r--drivers/atmodem/network-registration.c45
1 files changed, 25 insertions, 20 deletions
diff --git a/drivers/atmodem/network-registration.c b/drivers/atmodem/network-registration.c
index c7dcc75d..0d54cefa 100644
--- a/drivers/atmodem/network-registration.c
+++ b/drivers/atmodem/network-registration.c
@@ -151,10 +151,8 @@ static void cops_cb(gboolean ok, GAtResult *result, gpointer user_data)
decode_at_error(&error, g_at_result_final_response(result));
- if (!ok || nd->mcc[0] == '\0' || nd->mnc[0] == '\0') {
- cb(&error, NULL, cbd->data);
- goto out;
- }
+ if (!ok)
+ goto error;
g_at_result_iter_init(&iter, result);
@@ -191,14 +189,12 @@ static void cops_cb(gboolean ok, GAtResult *result, gpointer user_data)
DBG("cops_cb: %s, %s %s %d", name, nd->mcc, nd->mnc, tech);
cb(&error, &op, cbd->data);
-
-out:
g_free(cbd);
return;
error:
- CALLBACK_WITH_FAILURE(cb, NULL, cbd->data);
+ cb(&error, NULL, cbd->data);
g_free(cbd);
}
@@ -207,9 +203,14 @@ static void cops_numeric_cb(gboolean ok, GAtResult *result, gpointer user_data)
{
struct cb_data *cbd = user_data;
struct netreg_data *nd = ofono_netreg_get_data(cbd->user);
+ ofono_netreg_operator_cb_t cb = cbd->cb;
GAtResultIter iter;
const char *str;
int format;
+ int len;
+ struct ofono_error error;
+
+ decode_at_error(&error, g_at_result_final_response(result));
if (!ok)
goto error;
@@ -226,19 +227,31 @@ static void cops_numeric_cb(gboolean ok, GAtResult *result, gpointer user_data)
if (ok == FALSE || format != 2)
goto error;
- if (g_at_result_iter_next_string(&iter, &str) == FALSE ||
- strlen(str) == 0)
+ if (g_at_result_iter_next_string(&iter, &str) == FALSE)
+ goto error;
+
+ len = strspn(str, "0123456789");
+
+ if (len != 5 && len != 6)
goto error;
extract_mcc_mnc(str, nd->mcc, nd->mnc);
DBG("Cops numeric got mcc: %s, mnc: %s", nd->mcc, nd->mnc);
- return;
+ ok = g_at_chat_send(nd->chat, "AT+COPS=3,0", none_prefix,
+ NULL, NULL, NULL);
+
+ if (ok)
+ ok = g_at_chat_send(nd->chat, "AT+COPS?", cops_prefix,
+ cops_cb, cbd, NULL);
+
+ if (ok)
+ return;
error:
- nd->mcc[0] = '\0';
- nd->mnc[0] = '\0';
+ cb(&error, NULL, cbd->data);
+ g_free(cbd);
}
static void at_current_operator(struct ofono_netreg *netreg,
@@ -261,14 +274,6 @@ static void at_current_operator(struct ofono_netreg *netreg,
cops_numeric_cb, cbd, NULL);
if (ok)
- ok = g_at_chat_send(nd->chat, "AT+COPS=3,0", none_prefix,
- NULL, NULL, NULL);
-
- if (ok)
- ok = g_at_chat_send(nd->chat, "AT+COPS?", cops_prefix,
- cops_cb, cbd, NULL);
-
- if (ok)
return;
error: