summaryrefslogtreecommitdiffstats
path: root/drivers/atmodem/sim.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2011-08-04 17:00:05 +0200
committerMarcel Holtmann <marcel@holtmann.org>2011-08-04 17:00:05 +0200
commit703d0a123777c492a510008b34142d8e12744fd9 (patch)
treeaffc0f4b7734a86d92e12e45a0268453398d024e /drivers/atmodem/sim.c
parent59b4f99fec9fb74c86ce3bec9b1b53dbb8be1b3b (diff)
downloadofono-703d0a123777c492a510008b34142d8e12744fd9.tar.bz2
speedup: Add support for retrieving PIN retry counters
Diffstat (limited to 'drivers/atmodem/sim.c')
-rw-r--r--drivers/atmodem/sim.c65
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)