From 703d0a123777c492a510008b34142d8e12744fd9 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Thu, 4 Aug 2011 17:00:05 +0200 Subject: [PATCH] speedup: Add support for retrieving PIN retry counters --- drivers/atmodem/sim.c | 65 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/drivers/atmodem/sim.c b/drivers/atmodem/sim.c index c79ad5c8..4d715392 100644 --- a/drivers/atmodem/sim.c +++ b/drivers/atmodem/sim.c @@ -27,6 +27,7 @@ #include #include #include +#include #include @@ -619,6 +620,65 @@ error: CALLBACK_WITH_FAILURE(cb, NULL, cbd->data); } +static void cpnnum_cb(gboolean ok, GAtResult *result, gpointer user_data) +{ + struct cb_data *cbd = user_data; + ofono_sim_pin_retries_cb_t cb = cbd->cb; + const char *final = g_at_result_final_response(result); + GAtResultIter iter; + struct ofono_error error; + const char *line; + int num; + char **entries; + int retries[OFONO_SIM_PASSWORD_INVALID]; + size_t i; + + decode_at_error(&error, final); + + if (!ok) { + cb(&error, NULL, cbd->data); + return; + } + + g_at_result_iter_init(&iter, result); + + for (num = 0; num < g_at_result_num_response_lines(result); num++) + g_at_result_iter_next(&iter, NULL); + + line = g_at_result_iter_raw_line(&iter); + + DBG("%s", line); + + for (i = 0; i < OFONO_SIM_PASSWORD_INVALID; i++) + retries[i] = -1; + + entries = g_strsplit(line, "; ", -1); + + for (num = 0; entries[num]; num++) { + int retry; + + if (strlen(entries[num]) < 5) + continue; + + retry = strtol(entries[num] + 5, NULL, 10); + if (retry == 0 && errno == EINVAL) + continue; + + if (g_str_has_prefix(entries[num], "PIN1=") == TRUE) + retries[OFONO_SIM_PASSWORD_SIM_PIN] = retry; + else if (g_str_has_prefix(entries[num], "PUK1=") == TRUE) + retries[OFONO_SIM_PASSWORD_SIM_PUK] = retry; + else if (g_str_has_prefix(entries[num], "PIN2=") == TRUE) + retries[OFONO_SIM_PASSWORD_SIM_PIN2] = retry; + else if (g_str_has_prefix(entries[num], "PUK2=") == TRUE) + retries[OFONO_SIM_PASSWORD_SIM_PUK2] = retry; + } + + g_strfreev(entries); + + cb(&error, retries, cbd->data); +} + static void at_epin_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; @@ -717,6 +777,11 @@ static void at_pin_retries_query(struct ofono_sim *sim, xpincnt_cb, cbd, g_free) > 0) return; break; + case OFONO_VENDOR_SPEEDUP: + if (g_at_chat_send(sd->chat, "AT+CPNNUM", NULL, + cpnnum_cb, cbd, g_free) > 0) + return; + break; case OFONO_VENDOR_HUAWEI: if (g_at_chat_send(sd->chat, "AT^CPIN?", huawei_cpin_prefix, huawei_cpin_cb, cbd, g_free) > 0)