diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2011-08-04 17:00:05 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2011-08-04 17:00:05 +0200 |
commit | 703d0a123777c492a510008b34142d8e12744fd9 (patch) | |
tree | affc0f4b7734a86d92e12e45a0268453398d024e /drivers/atmodem/sim.c | |
parent | 59b4f99fec9fb74c86ce3bec9b1b53dbb8be1b3b (diff) | |
download | ofono-703d0a123777c492a510008b34142d8e12744fd9.tar.bz2 |
speedup: Add support for retrieving PIN retry counters
Diffstat (limited to 'drivers/atmodem/sim.c')
-rw-r--r-- | drivers/atmodem/sim.c | 65 |
1 files changed, 65 insertions, 0 deletions
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 <string.h> #include <stdlib.h> #include <stdio.h> +#include <errno.h> #include <glib.h> @@ -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) |