All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/4] Query retry counters
@ 2011-01-04 22:22 Lucas De Marchi
  2011-01-04 22:22 ` [PATCH v3 1/4] include: add method to query pin Retries Lucas De Marchi
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Lucas De Marchi @ 2011-01-04 22:22 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 718 bytes --]

Difference from previous version is that now the pin_retries field is no more a
GSList because it's not allowed to be on public header files. So, it's now
passed from drivers to core and stored there as an array of ints.

Lucas De Marchi (4):
  include: add method to query pin Retries
  sim: query remaining pin retries
  doc: detail Retries property
  atmodem: implement query for remaining pin retries

 doc/sim-api.txt       |   12 ++++++
 drivers/atmodem/sim.c |   90 +++++++++++++++++++++++++++++++++++++++++++++
 include/sim.h         |    5 +++
 src/sim.c             |   97 +++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 204 insertions(+), 0 deletions(-)

-- 
1.7.3.4


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v3 1/4] include: add method to query 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
  2011-01-04 22:22 ` [PATCH v3 2/4] sim: query remaining pin retries Lucas De Marchi
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 9+ messages in thread
From: Lucas De Marchi @ 2011-01-04 22:22 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] 9+ 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 ` [PATCH v3 1/4] include: add method to query pin Retries Lucas De Marchi
@ 2011-01-04 22:22 ` Lucas De Marchi
  2011-01-04 22:22 ` [PATCH v3 3/4] doc: detail Retries property Lucas De Marchi
  2011-01-04 22:22 ` [PATCH v3 4/4] atmodem: implement query for remaining pin retries Lucas De Marchi
  3 siblings, 0 replies; 9+ 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] 9+ messages in thread

* [PATCH v3 3/4] doc: detail Retries property
  2011-01-04 22:22 [PATCH v3 0/4] Query retry counters Lucas De Marchi
  2011-01-04 22:22 ` [PATCH v3 1/4] include: add method to query pin Retries Lucas De Marchi
  2011-01-04 22:22 ` [PATCH v3 2/4] sim: query remaining pin retries Lucas De Marchi
@ 2011-01-04 22:22 ` Lucas De Marchi
  2011-01-04 22:22 ` [PATCH v3 4/4] atmodem: implement query for remaining pin retries Lucas De Marchi
  3 siblings, 0 replies; 9+ messages in thread
From: Lucas De Marchi @ 2011-01-04 22:22 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] 9+ messages in thread

* [PATCH v3 4/4] atmodem: implement query for remaining pin retries
  2011-01-04 22:22 [PATCH v3 0/4] Query retry counters Lucas De Marchi
                   ` (2 preceding siblings ...)
  2011-01-04 22:22 ` [PATCH v3 3/4] doc: detail Retries property Lucas De Marchi
@ 2011-01-04 22:22 ` Lucas De Marchi
  2011-01-05 17:23   ` Lucas De Marchi
  3 siblings, 1 reply; 9+ messages in thread
From: Lucas De Marchi @ 2011-01-04 22:22 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] 9+ messages in thread

* Re: [PATCH v3 4/4] atmodem: implement query for remaining pin retries
  2011-01-04 22:22 ` [PATCH v3 4/4] atmodem: implement query for remaining pin retries Lucas De Marchi
@ 2011-01-05 17:23   ` Lucas De Marchi
  0 siblings, 0 replies; 9+ messages in thread
From: Lucas De Marchi @ 2011-01-05 17:23 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 491 bytes --]

Hi Denis,

On Tue, Jan 4, 2011 at 8:22 PM, Lucas De Marchi
<lucas.demarchi@profusion.mobi> wrote:
> Implement query method for the remaining pin retries on huawei modem.
> ---
>  drivers/atmodem/sim.c |   90 +++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 90 insertions(+), 0 deletions(-)
>

I don't know what's happening. Here it shows me as sent as well as the
other 4 patches. Maybe the mailing-list silently filtered it?

regards,
Lucas De Marchi

^ permalink raw reply	[flat|nested] 9+ 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; 9+ 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] 9+ 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; 9+ 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] 9+ 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 ` Lucas De Marchi
  2011-01-05 17:40   ` Lucas De Marchi
  2011-01-10 19:38   ` Denis Kenzior
  0 siblings, 2 replies; 9+ 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] 9+ messages in thread

end of thread, other threads:[~2011-01-10 19:38 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-04 22:22 [PATCH v3 0/4] Query retry counters Lucas De Marchi
2011-01-04 22:22 ` [PATCH v3 1/4] include: add method to query pin Retries Lucas De Marchi
2011-01-04 22:22 ` [PATCH v3 2/4] sim: query remaining pin retries Lucas De Marchi
2011-01-04 22:22 ` [PATCH v3 3/4] doc: detail Retries property Lucas De Marchi
2011-01-04 22:22 ` [PATCH v3 4/4] atmodem: implement query for remaining pin retries Lucas De Marchi
2011-01-05 17:23   ` Lucas De Marchi
2011-01-05 17:20 [PATCH v3 0/4] Query retry counters Lucas De Marchi
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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.