* [PATCH v3 1/4] include: add method to query pin Retries
2011-01-05 17:20 [PATCH v3 0/4] Query retry counters Lucas De Marchi
@ 2011-01-05 17:20 ` Lucas De Marchi
2011-01-05 17:20 ` [PATCH v3 2/4] sim: query remaining pin retries Lucas De Marchi
` (2 subsequent siblings)
3 siblings, 0 replies; 8+ messages in thread
From: Lucas De Marchi @ 2011-01-05 17:20 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 1064 bytes --]
---
include/sim.h | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/include/sim.h b/include/sim.h
index 7860e24..830322a 100644
--- a/include/sim.h
+++ b/include/sim.h
@@ -108,6 +108,9 @@ typedef void (*ofono_sim_passwd_cb_t)(const struct ofono_error *error,
enum ofono_sim_password_type type,
void *data);
+typedef void (*ofono_sim_pin_retries_cb_t)(const struct ofono_error *error,
+ int retries[OFONO_SIM_PASSWORD_INVALID], void *data);
+
typedef void (*ofono_sim_lock_unlock_cb_t)(const struct ofono_error *error,
void *data);
@@ -144,6 +147,8 @@ struct ofono_sim_driver {
ofono_sim_passwd_cb_t cb, void *data);
void (*send_passwd)(struct ofono_sim *sim, const char *passwd,
ofono_sim_lock_unlock_cb_t cb, void *data);
+ void (*query_pin_retries)(struct ofono_sim *sim,
+ ofono_sim_pin_retries_cb_t cb, void *data);
void (*reset_passwd)(struct ofono_sim *sim, const char *puk,
const char *passwd,
ofono_sim_lock_unlock_cb_t cb, void *data);
--
1.7.3.4
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v3 2/4] sim: query remaining pin retries
2011-01-05 17:20 [PATCH v3 0/4] Query retry counters Lucas De Marchi
2011-01-05 17:20 ` [PATCH v3 1/4] include: add method to query pin Retries Lucas De Marchi
@ 2011-01-05 17:20 ` Lucas De Marchi
2011-01-05 17:40 ` Lucas De Marchi
2011-01-10 19:38 ` Denis Kenzior
2011-01-05 17:20 ` [PATCH v3 3/4] doc: detail Retries property Lucas De Marchi
2011-01-05 17:20 ` [PATCH v3 4/4] atmodem: implement query for remaining pin retries Lucas De Marchi
3 siblings, 2 replies; 8+ messages in thread
From: Lucas De Marchi @ 2011-01-05 17:20 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 5329 bytes --]
Check the remaining pin retries after each operation that might have
changed it, i.e. locking, unlocking, reseting or changing pin.
---
src/sim.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 97 insertions(+), 0 deletions(-)
diff --git a/src/sim.c b/src/sim.c
index 335f611..5374da1 100644
--- a/src/sim.c
+++ b/src/sim.c
@@ -62,6 +62,8 @@ struct ofono_sim {
enum ofono_sim_password_type pin_type;
gboolean locked_pins[OFONO_SIM_PASSWORD_SIM_PUK]; /* Number of PINs */
+ int pin_retries[OFONO_SIM_PASSWORD_INVALID];
+
enum ofono_sim_phase phase;
unsigned char mnc_length;
enum ofono_sim_cphs_phase cphs_phase;
@@ -248,6 +250,33 @@ static char **get_locked_pins(struct ofono_sim *sim)
return ret;
}
+static void **get_pin_retries(struct ofono_sim *sim)
+{
+ int i, nelem;
+ void **ret;
+
+ for (i = 1, nelem = 0; i < OFONO_SIM_PASSWORD_INVALID; i++) {
+ if (sim->pin_retries[i] == -1)
+ continue;
+
+ nelem+=1;
+ }
+
+ ret = g_new0(void *, nelem * 2 + 1);
+
+ nelem = 0;
+
+ for (i = 1; i < OFONO_SIM_PASSWORD_INVALID; i++) {
+ if (sim->pin_retries[i] == -1)
+ continue;
+
+ ret[nelem++] = (void *)(sim_passwd_name(i));
+ ret[nelem++] = &sim->pin_retries[i];
+ }
+
+ return ret;
+}
+
static char **get_service_numbers(GSList *service_numbers)
{
int nelem;
@@ -287,6 +316,7 @@ static DBusMessage *sim_get_properties(DBusConnection *conn,
char **service_numbers;
char **locked_pins;
const char *pin_name;
+ void **pin_retries;
dbus_bool_t present = sim->state != OFONO_SIM_STATE_NOT_PRESENT;
dbus_bool_t fdn;
dbus_bool_t bdn;
@@ -369,12 +399,63 @@ static DBusMessage *sim_get_properties(DBusConnection *conn,
DBUS_TYPE_STRING,
(void *) &pin_name);
+ pin_retries = get_pin_retries(sim);
+
+ ofono_dbus_dict_append_dict(&dict, "Retries", DBUS_TYPE_BYTE,
+ &pin_retries);
+
+ g_free(pin_retries);
+
done:
dbus_message_iter_close_container(&iter, &dict);
return reply;
}
+static void sim_pin_retries_query_cb(const struct ofono_error *error,
+ int retries[OFONO_SIM_PASSWORD_INVALID],
+ void *data)
+{
+ struct ofono_sim *sim = data;
+ DBusConnection *conn = ofono_dbus_get_connection();
+ const char *path = __ofono_atom_get_path(sim->atom);
+ int i;
+ void **pin_retries;
+
+ if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
+ ofono_error("Querying remaining pin retries failed");
+
+ return;
+ }
+
+ for (i = 1; i < OFONO_SIM_PASSWORD_INVALID; i++) {
+ if (retries[i] != sim->pin_retries[i])
+ break;
+ }
+
+ if (i == OFONO_SIM_PASSWORD_INVALID)
+ return;
+
+ memcpy(sim->pin_retries, retries, sizeof(sim->pin_retries));
+
+ pin_retries = get_pin_retries(sim);
+
+ ofono_dbus_signal_dict_property_changed(conn, path,
+ OFONO_SIM_MANAGER_INTERFACE, "Retries",
+ DBUS_TYPE_BYTE, &pin_retries);
+
+ g_free(pin_retries);
+}
+
+static void sim_pin_retries_check(struct ofono_sim *sim)
+{
+ if (sim->driver->query_pin_retries == NULL)
+ return;
+
+ sim->driver->query_pin_retries(sim, sim_pin_retries_query_cb, sim);
+}
+
+
static void msisdn_set_done(struct msisdn_set_request *req)
{
DBusMessage *reply;
@@ -549,6 +630,8 @@ static void sim_locked_cb(struct ofono_sim *sim, gboolean locked)
"LockedPins", DBUS_TYPE_STRING,
&locked_pins);
g_strfreev(locked_pins);
+
+ sim_pin_retries_check(sim);
}
static void sim_unlock_cb(const struct ofono_error *error, void *data)
@@ -557,7 +640,10 @@ static void sim_unlock_cb(const struct ofono_error *error, void *data)
if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
DBusMessage *reply = __ofono_error_failed(sim->pending);
+
__ofono_dbus_pending_reply(&sim->pending, reply);
+ sim_pin_retries_check(sim);
+
return;
}
@@ -570,7 +656,10 @@ static void sim_lock_cb(const struct ofono_error *error, void *data)
if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
DBusMessage *reply = __ofono_error_failed(sim->pending);
+
__ofono_dbus_pending_reply(&sim->pending, reply);
+ sim_pin_retries_check(sim);
+
return;
}
@@ -639,11 +728,16 @@ static void sim_change_pin_cb(const struct ofono_error *error, void *data)
if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
__ofono_dbus_pending_reply(&sim->pending,
__ofono_error_failed(sim->pending));
+
+ sim_pin_retries_check(sim);
+
return;
}
__ofono_dbus_pending_reply(&sim->pending,
dbus_message_new_method_return(sim->pending));
+
+ sim_pin_retries_check(sim);
}
static DBusMessage *sim_change_pin(DBusConnection *conn, DBusMessage *msg,
@@ -1594,6 +1688,8 @@ static void sim_pin_query_cb(const struct ofono_error *error,
&pin_name);
}
+ sim_pin_retries_check(sim);
+
checkdone:
if (pin_type == OFONO_SIM_PASSWORD_NONE)
sim_initialize_after_pin(sim);
@@ -2196,6 +2292,7 @@ struct ofono_sim *ofono_sim_create(struct ofono_modem *modem,
sim->phase = OFONO_SIM_PHASE_UNKNOWN;
sim->atom = __ofono_modem_add_atom(modem, OFONO_ATOM_TYPE_SIM,
sim_remove, sim);
+ memset(sim->pin_retries, -1, sizeof(sim->pin_retries));
for (l = g_drivers; l; l = l->next) {
const struct ofono_sim_driver *drv = l->data;
--
1.7.3.4
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH v3 2/4] sim: query remaining pin retries
2011-01-05 17:20 ` [PATCH v3 2/4] sim: query remaining pin retries Lucas De Marchi
@ 2011-01-05 17:40 ` Lucas De Marchi
2011-01-10 19:38 ` Denis Kenzior
1 sibling, 0 replies; 8+ messages in thread
From: Lucas De Marchi @ 2011-01-05 17:40 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 439 bytes --]
Hi, Denis
On Wed, Jan 5, 2011 at 3:20 PM, Lucas De Marchi
<lucas.demarchi@profusion.mobi> wrote:
> Check the remaining pin retries after each operation that might have
> changed it, i.e. locking, unlocking, reseting or changing pin.
> ---
> src/sim.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 97 insertions(+), 0 deletions(-)
>
What about this patch?
Lucas De Marchi
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v3 2/4] sim: query remaining pin retries
2011-01-05 17:20 ` [PATCH v3 2/4] sim: query remaining pin retries Lucas De Marchi
2011-01-05 17:40 ` Lucas De Marchi
@ 2011-01-10 19:38 ` Denis Kenzior
1 sibling, 0 replies; 8+ messages in thread
From: Denis Kenzior @ 2011-01-10 19:38 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 6232 bytes --]
Hi Lucas,
On 01/05/2011 11:20 AM, Lucas De Marchi wrote:
> Check the remaining pin retries after each operation that might have
> changed it, i.e. locking, unlocking, reseting or changing pin.
> ---
> src/sim.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 97 insertions(+), 0 deletions(-)
>
> diff --git a/src/sim.c b/src/sim.c
> index 335f611..5374da1 100644
> --- a/src/sim.c
> +++ b/src/sim.c
> @@ -62,6 +62,8 @@ struct ofono_sim {
> enum ofono_sim_password_type pin_type;
> gboolean locked_pins[OFONO_SIM_PASSWORD_SIM_PUK]; /* Number of PINs */
>
> + int pin_retries[OFONO_SIM_PASSWORD_INVALID];
> +
> enum ofono_sim_phase phase;
> unsigned char mnc_length;
> enum ofono_sim_cphs_phase cphs_phase;
> @@ -248,6 +250,33 @@ static char **get_locked_pins(struct ofono_sim *sim)
> return ret;
> }
>
> +static void **get_pin_retries(struct ofono_sim *sim)
> +{
> + int i, nelem;
> + void **ret;
> +
> + for (i = 1, nelem = 0; i < OFONO_SIM_PASSWORD_INVALID; i++) {
> + if (sim->pin_retries[i] == -1)
> + continue;
> +
> + nelem+=1;
> + }
> +
> + ret = g_new0(void *, nelem * 2 + 1);
> +
> + nelem = 0;
> +
> + for (i = 1; i < OFONO_SIM_PASSWORD_INVALID; i++) {
> + if (sim->pin_retries[i] == -1)
> + continue;
> +
> + ret[nelem++] = (void *)(sim_passwd_name(i));
Do you really need parentheses around the sim_passwd_name call? Also,
you need a space after the cast. e.g. (void *) sim_passwd_name(i);
> + ret[nelem++] = &sim->pin_retries[i];
> + }
> +
> + return ret;
> +}
> +
> static char **get_service_numbers(GSList *service_numbers)
> {
> int nelem;
> @@ -287,6 +316,7 @@ static DBusMessage *sim_get_properties(DBusConnection *conn,
> char **service_numbers;
> char **locked_pins;
> const char *pin_name;
> + void **pin_retries;
> dbus_bool_t present = sim->state != OFONO_SIM_STATE_NOT_PRESENT;
> dbus_bool_t fdn;
> dbus_bool_t bdn;
> @@ -369,12 +399,63 @@ static DBusMessage *sim_get_properties(DBusConnection *conn,
> DBUS_TYPE_STRING,
> (void *) &pin_name);
>
> + pin_retries = get_pin_retries(sim);
> +
We're not always consistent, but I prefer to logically group operations
together. So there should be no empty lines between pin_retries,
ofono_dbus_dict_append_dict and g_free.
> + ofono_dbus_dict_append_dict(&dict, "Retries", DBUS_TYPE_BYTE,
> + &pin_retries);
> +
> + g_free(pin_retries);
> +
> done:
> dbus_message_iter_close_container(&iter, &dict);
>
> return reply;
> }
>
> +static void sim_pin_retries_query_cb(const struct ofono_error *error,
> + int retries[OFONO_SIM_PASSWORD_INVALID],
> + void *data)
> +{
> + struct ofono_sim *sim = data;
> + DBusConnection *conn = ofono_dbus_get_connection();
> + const char *path = __ofono_atom_get_path(sim->atom);
> + int i;
> + void **pin_retries;
> +
> + if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
> + ofono_error("Querying remaining pin retries failed");
> +
> + return;
> + }
> +
> + for (i = 1; i < OFONO_SIM_PASSWORD_INVALID; i++) {
> + if (retries[i] != sim->pin_retries[i])
> + break;
> + }
> +
> + if (i == OFONO_SIM_PASSWORD_INVALID)
> + return;
> +
I think the above for and if statements can be easily handled by using
memcmp.
> + memcpy(sim->pin_retries, retries, sizeof(sim->pin_retries));
> +
> + pin_retries = get_pin_retries(sim);
> +
> + ofono_dbus_signal_dict_property_changed(conn, path,
> + OFONO_SIM_MANAGER_INTERFACE, "Retries",
> + DBUS_TYPE_BYTE, &pin_retries);
> +
> + g_free(pin_retries);
Same comment as above about grouping.
> +}
> +
> +static void sim_pin_retries_check(struct ofono_sim *sim)
> +{
> + if (sim->driver->query_pin_retries == NULL)
> + return;
> +
> + sim->driver->query_pin_retries(sim, sim_pin_retries_query_cb, sim);
> +}
> +
> +
> static void msisdn_set_done(struct msisdn_set_request *req)
> {
> DBusMessage *reply;
> @@ -549,6 +630,8 @@ static void sim_locked_cb(struct ofono_sim *sim, gboolean locked)
> "LockedPins", DBUS_TYPE_STRING,
> &locked_pins);
> g_strfreev(locked_pins);
> +
> + sim_pin_retries_check(sim);
> }
>
> static void sim_unlock_cb(const struct ofono_error *error, void *data)
> @@ -557,7 +640,10 @@ static void sim_unlock_cb(const struct ofono_error *error, void *data)
>
> if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
> DBusMessage *reply = __ofono_error_failed(sim->pending);
> +
> __ofono_dbus_pending_reply(&sim->pending, reply);
> + sim_pin_retries_check(sim);
> +
> return;
> }
>
> @@ -570,7 +656,10 @@ static void sim_lock_cb(const struct ofono_error *error, void *data)
>
> if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
> DBusMessage *reply = __ofono_error_failed(sim->pending);
> +
> __ofono_dbus_pending_reply(&sim->pending, reply);
> + sim_pin_retries_check(sim);
> +
> return;
> }
>
> @@ -639,11 +728,16 @@ static void sim_change_pin_cb(const struct ofono_error *error, void *data)
> if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
> __ofono_dbus_pending_reply(&sim->pending,
> __ofono_error_failed(sim->pending));
> +
> + sim_pin_retries_check(sim);
> +
> return;
> }
>
> __ofono_dbus_pending_reply(&sim->pending,
> dbus_message_new_method_return(sim->pending));
> +
> + sim_pin_retries_check(sim);
> }
>
> static DBusMessage *sim_change_pin(DBusConnection *conn, DBusMessage *msg,
> @@ -1594,6 +1688,8 @@ static void sim_pin_query_cb(const struct ofono_error *error,
> &pin_name);
> }
>
> + sim_pin_retries_check(sim);
> +
> checkdone:
> if (pin_type == OFONO_SIM_PASSWORD_NONE)
> sim_initialize_after_pin(sim);
> @@ -2196,6 +2292,7 @@ struct ofono_sim *ofono_sim_create(struct ofono_modem *modem,
> sim->phase = OFONO_SIM_PHASE_UNKNOWN;
> sim->atom = __ofono_modem_add_atom(modem, OFONO_ATOM_TYPE_SIM,
> sim_remove, sim);
> + memset(sim->pin_retries, -1, sizeof(sim->pin_retries));
>
> for (l = g_drivers; l; l = l->next) {
> const struct ofono_sim_driver *drv = l->data;
Regards,
-Denis
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v3 3/4] doc: detail Retries property
2011-01-05 17:20 [PATCH v3 0/4] Query retry counters Lucas De Marchi
2011-01-05 17:20 ` [PATCH v3 1/4] include: add method to query pin Retries Lucas De Marchi
2011-01-05 17:20 ` [PATCH v3 2/4] sim: query remaining pin retries Lucas De Marchi
@ 2011-01-05 17:20 ` Lucas De Marchi
2011-01-05 17:20 ` [PATCH v3 4/4] atmodem: implement query for remaining pin retries Lucas De Marchi
3 siblings, 0 replies; 8+ messages in thread
From: Lucas De Marchi @ 2011-01-05 17:20 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 851 bytes --]
---
doc/sim-api.txt | 12 ++++++++++++
1 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/doc/sim-api.txt b/doc/sim-api.txt
index 89c321e..65c920d 100644
--- a/doc/sim-api.txt
+++ b/doc/sim-api.txt
@@ -145,3 +145,15 @@ Properties boolean Present [readonly]
If BDN is enabled, oFono halts the SIM initialization
procedure and only emergency calls are allowed.
+
+ dict{string,byte} Retries [readonly]
+
+ Contains all the retry counters available. The possible
+ values for the first field are the same as in
+ PinRequired property. The second field contains is the
+ counter for that pin type.
+
+ This property is updated after each operation that
+ might have changed the retry counters, i.e. calls to
+ ChangePin(), EnterPin(), ResetPin() LockPin(),
+ UnlockPin().
--
1.7.3.4
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v3 4/4] atmodem: implement query for remaining pin retries
2011-01-05 17:20 [PATCH v3 0/4] Query retry counters Lucas De Marchi
` (2 preceding siblings ...)
2011-01-05 17:20 ` [PATCH v3 3/4] doc: detail Retries property Lucas De Marchi
@ 2011-01-05 17:20 ` Lucas De Marchi
3 siblings, 0 replies; 8+ messages in thread
From: Lucas De Marchi @ 2011-01-05 17:20 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 3487 bytes --]
Implement query method for the remaining pin retries on huawei modem.
---
drivers/atmodem/sim.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 90 insertions(+), 0 deletions(-)
diff --git a/drivers/atmodem/sim.c b/drivers/atmodem/sim.c
index 1653ede..98fb195 100644
--- a/drivers/atmodem/sim.c
+++ b/drivers/atmodem/sim.c
@@ -44,6 +44,8 @@
#define EF_STATUS_INVALIDATED 0
#define EF_STATUS_VALID 1
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+
struct sim_data {
GAtChat *chat;
unsigned int vendor;
@@ -52,6 +54,7 @@ struct sim_data {
static const char *crsm_prefix[] = { "+CRSM:", NULL };
static const char *cpin_prefix[] = { "+CPIN:", NULL };
+static const char *xcpin_prefix[] = { "^CPIN:", NULL };
static const char *clck_prefix[] = { "+CLCK:", NULL };
static const char *none_prefix[] = { NULL };
@@ -456,6 +459,92 @@ static struct {
{ OFONO_SIM_PASSWORD_PHCORP_PUK, "PH-CORP PUK" },
};
+static void at_xcpin_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;
+ int retries[OFONO_SIM_PASSWORD_INVALID];
+ size_t i;
+ static enum ofono_sim_password_type _password_types[] = {
+ OFONO_SIM_PASSWORD_SIM_PUK,
+ OFONO_SIM_PASSWORD_SIM_PIN,
+ OFONO_SIM_PASSWORD_SIM_PUK2,
+ OFONO_SIM_PASSWORD_SIM_PIN2,
+ };
+
+ decode_at_error(&error, final);
+
+ if (!ok) {
+ cb(&error, NULL, cbd->data);
+ return;
+ }
+
+ g_at_result_iter_init(&iter, result);
+
+ if (!g_at_result_iter_next(&iter, "^CPIN:"))
+ goto error;
+
+ /* Skip status since we are not interested in this */
+ if (!g_at_result_iter_skip_next(&iter))
+ goto error;
+
+ /* Skip "overall counter" since we'll grab each one individually */
+ if (!g_at_result_iter_skip_next(&iter))
+ goto error;
+
+ memset(retries, -1, sizeof(retries));
+
+ for (i = 0; i < ARRAY_SIZE(_password_types); i++) {
+ int val;
+
+ if (!g_at_result_iter_next_number(&iter, &val))
+ goto error;
+
+ retries[_password_types[i]]= val;
+
+ DBG("retry counter id=%d, val=%d", _password_types[i],
+ retries[_password_types[i]]);
+ }
+
+ cb(&error, retries, cbd->data);
+
+ return;
+
+error:
+ CALLBACK_WITH_FAILURE(cb, NULL, cbd->data);
+}
+
+static void at_pin_retries_query(struct ofono_sim *sim,
+ ofono_sim_pin_retries_cb_t cb, void *data)
+{
+ struct sim_data *sd = ofono_sim_get_data(sim);
+
+ DBG("");
+
+ if (sd->vendor == OFONO_VENDOR_QUALCOMM_MSM) {
+ struct cb_data *cbd = cb_data_new(cb, data);
+
+ if (cbd == NULL) {
+ CALLBACK_WITH_FAILURE(cb, NULL, data);
+
+ return;
+ }
+
+ if (g_at_chat_send(sd->chat, "AT^CPIN?", xcpin_prefix,
+ at_xcpin_cb, cbd, g_free) > 0)
+ return;
+
+ g_free(cbd);
+
+ CALLBACK_WITH_FAILURE(cb, NULL, data);
+ }
+
+ CALLBACK_WITH_SUCCESS(cb, NULL, data);
+}
+
static void at_cpin_cb(gboolean ok, GAtResult *result, gpointer user_data)
{
struct cb_data *cbd = user_data;
@@ -886,6 +975,7 @@ static struct ofono_sim_driver driver = {
.write_file_cyclic = at_sim_update_cyclic,
.read_imsi = at_read_imsi,
.query_passwd_state = at_pin_query,
+ .query_pin_retries = at_pin_retries_query,
.send_passwd = at_pin_send,
.reset_passwd = at_pin_send_puk,
.lock = at_pin_enable,
--
1.7.3.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v3 2/4] sim: query remaining pin retries
2011-01-04 22:22 [PATCH v3 0/4] Query retry counters Lucas De Marchi
@ 2011-01-04 22:22 ` Lucas De Marchi
0 siblings, 0 replies; 8+ messages in thread
From: Lucas De Marchi @ 2011-01-04 22:22 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 5329 bytes --]
Check the remaining pin retries after each operation that might have
changed it, i.e. locking, unlocking, reseting or changing pin.
---
src/sim.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 97 insertions(+), 0 deletions(-)
diff --git a/src/sim.c b/src/sim.c
index 335f611..5374da1 100644
--- a/src/sim.c
+++ b/src/sim.c
@@ -62,6 +62,8 @@ struct ofono_sim {
enum ofono_sim_password_type pin_type;
gboolean locked_pins[OFONO_SIM_PASSWORD_SIM_PUK]; /* Number of PINs */
+ int pin_retries[OFONO_SIM_PASSWORD_INVALID];
+
enum ofono_sim_phase phase;
unsigned char mnc_length;
enum ofono_sim_cphs_phase cphs_phase;
@@ -248,6 +250,33 @@ static char **get_locked_pins(struct ofono_sim *sim)
return ret;
}
+static void **get_pin_retries(struct ofono_sim *sim)
+{
+ int i, nelem;
+ void **ret;
+
+ for (i = 1, nelem = 0; i < OFONO_SIM_PASSWORD_INVALID; i++) {
+ if (sim->pin_retries[i] == -1)
+ continue;
+
+ nelem+=1;
+ }
+
+ ret = g_new0(void *, nelem * 2 + 1);
+
+ nelem = 0;
+
+ for (i = 1; i < OFONO_SIM_PASSWORD_INVALID; i++) {
+ if (sim->pin_retries[i] == -1)
+ continue;
+
+ ret[nelem++] = (void *)(sim_passwd_name(i));
+ ret[nelem++] = &sim->pin_retries[i];
+ }
+
+ return ret;
+}
+
static char **get_service_numbers(GSList *service_numbers)
{
int nelem;
@@ -287,6 +316,7 @@ static DBusMessage *sim_get_properties(DBusConnection *conn,
char **service_numbers;
char **locked_pins;
const char *pin_name;
+ void **pin_retries;
dbus_bool_t present = sim->state != OFONO_SIM_STATE_NOT_PRESENT;
dbus_bool_t fdn;
dbus_bool_t bdn;
@@ -369,12 +399,63 @@ static DBusMessage *sim_get_properties(DBusConnection *conn,
DBUS_TYPE_STRING,
(void *) &pin_name);
+ pin_retries = get_pin_retries(sim);
+
+ ofono_dbus_dict_append_dict(&dict, "Retries", DBUS_TYPE_BYTE,
+ &pin_retries);
+
+ g_free(pin_retries);
+
done:
dbus_message_iter_close_container(&iter, &dict);
return reply;
}
+static void sim_pin_retries_query_cb(const struct ofono_error *error,
+ int retries[OFONO_SIM_PASSWORD_INVALID],
+ void *data)
+{
+ struct ofono_sim *sim = data;
+ DBusConnection *conn = ofono_dbus_get_connection();
+ const char *path = __ofono_atom_get_path(sim->atom);
+ int i;
+ void **pin_retries;
+
+ if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
+ ofono_error("Querying remaining pin retries failed");
+
+ return;
+ }
+
+ for (i = 1; i < OFONO_SIM_PASSWORD_INVALID; i++) {
+ if (retries[i] != sim->pin_retries[i])
+ break;
+ }
+
+ if (i == OFONO_SIM_PASSWORD_INVALID)
+ return;
+
+ memcpy(sim->pin_retries, retries, sizeof(sim->pin_retries));
+
+ pin_retries = get_pin_retries(sim);
+
+ ofono_dbus_signal_dict_property_changed(conn, path,
+ OFONO_SIM_MANAGER_INTERFACE, "Retries",
+ DBUS_TYPE_BYTE, &pin_retries);
+
+ g_free(pin_retries);
+}
+
+static void sim_pin_retries_check(struct ofono_sim *sim)
+{
+ if (sim->driver->query_pin_retries == NULL)
+ return;
+
+ sim->driver->query_pin_retries(sim, sim_pin_retries_query_cb, sim);
+}
+
+
static void msisdn_set_done(struct msisdn_set_request *req)
{
DBusMessage *reply;
@@ -549,6 +630,8 @@ static void sim_locked_cb(struct ofono_sim *sim, gboolean locked)
"LockedPins", DBUS_TYPE_STRING,
&locked_pins);
g_strfreev(locked_pins);
+
+ sim_pin_retries_check(sim);
}
static void sim_unlock_cb(const struct ofono_error *error, void *data)
@@ -557,7 +640,10 @@ static void sim_unlock_cb(const struct ofono_error *error, void *data)
if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
DBusMessage *reply = __ofono_error_failed(sim->pending);
+
__ofono_dbus_pending_reply(&sim->pending, reply);
+ sim_pin_retries_check(sim);
+
return;
}
@@ -570,7 +656,10 @@ static void sim_lock_cb(const struct ofono_error *error, void *data)
if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
DBusMessage *reply = __ofono_error_failed(sim->pending);
+
__ofono_dbus_pending_reply(&sim->pending, reply);
+ sim_pin_retries_check(sim);
+
return;
}
@@ -639,11 +728,16 @@ static void sim_change_pin_cb(const struct ofono_error *error, void *data)
if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
__ofono_dbus_pending_reply(&sim->pending,
__ofono_error_failed(sim->pending));
+
+ sim_pin_retries_check(sim);
+
return;
}
__ofono_dbus_pending_reply(&sim->pending,
dbus_message_new_method_return(sim->pending));
+
+ sim_pin_retries_check(sim);
}
static DBusMessage *sim_change_pin(DBusConnection *conn, DBusMessage *msg,
@@ -1594,6 +1688,8 @@ static void sim_pin_query_cb(const struct ofono_error *error,
&pin_name);
}
+ sim_pin_retries_check(sim);
+
checkdone:
if (pin_type == OFONO_SIM_PASSWORD_NONE)
sim_initialize_after_pin(sim);
@@ -2196,6 +2292,7 @@ struct ofono_sim *ofono_sim_create(struct ofono_modem *modem,
sim->phase = OFONO_SIM_PHASE_UNKNOWN;
sim->atom = __ofono_modem_add_atom(modem, OFONO_ATOM_TYPE_SIM,
sim_remove, sim);
+ memset(sim->pin_retries, -1, sizeof(sim->pin_retries));
for (l = g_drivers; l; l = l->next) {
const struct ofono_sim_driver *drv = l->data;
--
1.7.3.4
^ permalink raw reply related [flat|nested] 8+ messages in thread