All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 7/8][RFC] Invalidate SIM manager properties when SIM extracted, add Present property.
@ 2010-03-15 21:22 Andrzej Zaborowski
  2010-03-17 21:10 ` Denis Kenzior
  0 siblings, 1 reply; 2+ messages in thread
From: Andrzej Zaborowski @ 2010-03-15 21:22 UTC (permalink / raw)
  To: ofono

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

---
 src/sim.c |  107 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 95 insertions(+), 12 deletions(-)

diff --git a/src/sim.c b/src/sim.c
index cddb3e4..fe535bb 100644
--- a/src/sim.c
+++ b/src/sim.c
@@ -285,6 +285,7 @@ static DBusMessage *sim_get_properties(DBusConnection *conn,
 	char **service_numbers;
 	char **locked_pins;
 	const char *pin_name;
+	dbus_bool_t present = sim->inserted;
 
 	reply = dbus_message_new_method_return(msg);
 	if (!reply)
@@ -296,6 +297,8 @@ static DBusMessage *sim_get_properties(DBusConnection *conn,
 					OFONO_PROPERTIES_ARRAY_SIGNATURE,
 					&dict);
 
+	ofono_dbus_dict_append(&dict, "Present", DBUS_TYPE_BOOLEAN, &present);
+
 	if (sim->imsi)
 		ofono_dbus_dict_append(&dict, "SubscriberIdentity",
 					DBUS_TYPE_STRING, &sim->imsi);
@@ -304,16 +307,20 @@ static DBusMessage *sim_get_properties(DBusConnection *conn,
 		ofono_dbus_dict_append(&dict, "MobileNetworkCodeLength",
 					DBUS_TYPE_BYTE, &sim->mnc_length);
 
-	own_numbers = get_own_numbers(sim->own_numbers);
+	if (sim->inserted) {
+		own_numbers = get_own_numbers(sim->own_numbers);
 
-	ofono_dbus_dict_append_array(&dict, "SubscriberNumbers",
-					DBUS_TYPE_STRING, &own_numbers);
-	g_strfreev(own_numbers);
+		ofono_dbus_dict_append_array(&dict, "SubscriberNumbers",
+						DBUS_TYPE_STRING, &own_numbers);
+		g_strfreev(own_numbers);
+	}
 
-	locked_pins = get_locked_pins(sim);
-	ofono_dbus_dict_append_array(&dict, "LockedPins",
-					DBUS_TYPE_STRING, &locked_pins);
-	g_strfreev(locked_pins);
+	if (sim->inserted) {
+		locked_pins = get_locked_pins(sim);
+		ofono_dbus_dict_append_array(&dict, "LockedPins",
+						DBUS_TYPE_STRING, &locked_pins);
+		g_strfreev(locked_pins);
+	}
 
 	if (sim->service_numbers && sim->sdn_ready) {
 		service_numbers = get_service_numbers(sim->service_numbers);
@@ -329,10 +336,12 @@ static DBusMessage *sim_get_properties(DBusConnection *conn,
 						DBUS_TYPE_STRING,
 						&sim->language_prefs);
 
-	pin_name = sim_passwd_name(sim->pin_type);
-	ofono_dbus_dict_append(&dict, "PinRequired",
-				DBUS_TYPE_STRING,
-				(void *) &pin_name);
+	if (sim->inserted) {
+		pin_name = sim_passwd_name(sim->pin_type);
+		ofono_dbus_dict_append(&dict, "PinRequired",
+					DBUS_TYPE_STRING,
+					(void *) &pin_name);
+	}
 
 	dbus_message_iter_close_container(&iter, &dict);
 
@@ -992,6 +1001,8 @@ static void sim_imsi_cb(const struct ofono_error *error, const char *imsi,
 		void *data)
 {
 	struct ofono_sim *sim = data;
+	DBusConnection *conn = ofono_dbus_get_connection();
+	const char *path = __ofono_atom_get_path(sim->atom);
 
 	if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
 		ofono_error("Unable to read IMSI, emergency calls only");
@@ -1000,6 +1011,11 @@ static void sim_imsi_cb(const struct ofono_error *error, const char *imsi,
 
 	sim->imsi = g_strdup(imsi);
 
+	ofono_dbus_signal_property_changed(conn, path,
+					SIM_MANAGER_INTERFACE,
+					"SubscriberIdentity",
+					DBUS_TYPE_STRING, &sim->imsi);
+
 	/* Read CPHS-support bits, this is still part of the SIM
 	 * initialisation but no order is specified for it.  */
 	ofono_sim_read(sim, SIM_EF_CPHS_INFORMATION_FILEID,
@@ -1755,9 +1771,21 @@ const unsigned char *ofono_sim_get_cphs_service_table(struct ofono_sim *sim)
 	return sim->cphs_service_table;
 }
 
+static void sim_inserted_update(struct ofono_sim *sim)
+{
+	dbus_bool_t present = sim->inserted;
+	DBusConnection *conn = ofono_dbus_get_connection();
+	const char *path = __ofono_atom_get_path(sim->atom);
+
+	ofono_dbus_signal_property_changed(conn, path,
+			SIM_MANAGER_INTERFACE, "Present",
+			DBUS_TYPE_BOOLEAN, &present);
+}
+
 void ofono_sim_inserted(struct ofono_sim *sim)
 {
 	sim->inserted = TRUE;
+	sim_inserted_update(sim);
 
 	/* Perform SIM initialization according to 3GPP 31.102 Section 5.1.1.2
 	 * The assumption here is that if sim manager is being initialized,
@@ -1781,6 +1809,18 @@ void ofono_sim_inserted(struct ofono_sim *sim)
 	sim_determine_phase(sim);
 }
 
+static void sim_file_op_fail(struct sim_file_op *op)
+{
+	if (op->is_read == TRUE)
+		((ofono_sim_file_read_cb_t) op->cb)
+			(0, 0, 0, 0, 0, op->userdata);
+	else
+		((ofono_sim_file_write_cb_t) op->cb)
+			(0, op->userdata);
+
+	sim_file_op_free(op);
+}
+
 void ofono_sim_removed(struct ofono_sim *sim)
 {
 	GSList *l;
@@ -1790,18 +1830,61 @@ void ofono_sim_removed(struct ofono_sim *sim)
 		return;
 
 	sim->inserted = FALSE;
+	sim_inserted_update(sim);
 
 	if (sim->ready == FALSE)
 		return;
 
 	sim->ready = FALSE;
 
+	if (sim->simop_source) {
+		g_source_remove(sim->simop_source);
+		sim->simop_source = 0;
+	}
+
+	if (sim->simop_q) {
+		/* NOTE: there's an assumption here that the op's callback
+		 * does not queue new ops on failure... */
+		g_queue_foreach(sim->simop_q, (GFunc) sim_file_op_fail, NULL);
+		g_queue_free(sim->simop_q);
+		sim->simop_q = NULL;
+	}
+
 	for (l = sim->removed_watches->items; l; l = l->next) {
 		struct ofono_watchlist_item *item = l->data;
 		notify = item->notify;
 
 		notify(item->notify_data);
 	}
+
+	if (sim->imsi) {
+		g_free(sim->imsi);
+		sim->imsi = NULL;
+	}
+
+	if (sim->own_numbers) {
+		g_slist_foreach(sim->own_numbers, (GFunc)g_free, NULL);
+		g_slist_free(sim->own_numbers);
+		sim->own_numbers = NULL;
+	}
+
+	if (sim->service_numbers) {
+		g_slist_foreach(sim->service_numbers,
+				(GFunc)service_number_free, NULL);
+		g_slist_free(sim->service_numbers);
+		sim->service_numbers = NULL;
+	}
+
+	if (sim->efli) {
+		g_free(sim->efli);
+		sim->efli = NULL;
+		sim->efli_length = 0;
+	}
+
+	if (sim->language_prefs) {
+		g_strfreev(sim->language_prefs);
+		sim->language_prefs = NULL;
+	}
 }
 
 static void sim_command_fetch_cb(const struct ofono_error *error,
-- 
1.6.1


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

* Re: [PATCH 7/8][RFC] Invalidate SIM manager properties when SIM extracted, add Present property.
  2010-03-15 21:22 [PATCH 7/8][RFC] Invalidate SIM manager properties when SIM extracted, add Present property Andrzej Zaborowski
@ 2010-03-17 21:10 ` Denis Kenzior
  0 siblings, 0 replies; 2+ messages in thread
From: Denis Kenzior @ 2010-03-17 21:10 UTC (permalink / raw)
  To: ofono

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

Hi Andrew,

> ---
>  src/sim.c |  107
>  ++++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files
>  changed, 95 insertions(+), 12 deletions(-)
> 
> diff --git a/src/sim.c b/src/sim.c
> index cddb3e4..fe535bb 100644
> --- a/src/sim.c
> +++ b/src/sim.c
> @@ -285,6 +285,7 @@ static DBusMessage *sim_get_properties(DBusConnection
>  *conn, char **service_numbers;
>  	char **locked_pins;
>  	const char *pin_name;
> +	dbus_bool_t present = sim->inserted;
> 
>  	reply = dbus_message_new_method_return(msg);
>  	if (!reply)
> @@ -296,6 +297,8 @@ static DBusMessage *sim_get_properties(DBusConnection
>  *conn, OFONO_PROPERTIES_ARRAY_SIGNATURE,
>  					&dict);
> 
> +	ofono_dbus_dict_append(&dict, "Present", DBUS_TYPE_BOOLEAN, &present);
> +

I suggest you simply skip the rest of the properties if Present is false and 
skip checking each and every one afterwards.

> @@ -992,6 +1001,8 @@ static void sim_imsi_cb(const struct ofono_error
>  *error, const char *imsi, void *data)
>  {
>  	struct ofono_sim *sim = data;
> +	DBusConnection *conn = ofono_dbus_get_connection();
> +	const char *path = __ofono_atom_get_path(sim->atom);
> 
>  	if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
>  		ofono_error("Unable to read IMSI, emergency calls only");
> @@ -1000,6 +1011,11 @@ static void sim_imsi_cb(const struct ofono_error
>  *error, const char *imsi,
> 
>  	sim->imsi = g_strdup(imsi);
> 
> +	ofono_dbus_signal_property_changed(conn, path,
> +					SIM_MANAGER_INTERFACE,
> +					"SubscriberIdentity",
> +					DBUS_TYPE_STRING, &sim->imsi);
> +
>  	/* Read CPHS-support bits, this is still part of the SIM
>  	 * initialisation but no order is specified for it.  */
>  	ofono_sim_read(sim, SIM_EF_CPHS_INFORMATION_FILEID,
> @@ -1755,9 +1771,21 @@ const unsigned char
>  *ofono_sim_get_cphs_service_table(struct ofono_sim *sim) return
>  sim->cphs_service_table;
>  }
> 
> +static void sim_inserted_update(struct ofono_sim *sim)
> +{
> +	dbus_bool_t present = sim->inserted;
> +	DBusConnection *conn = ofono_dbus_get_connection();
> +	const char *path = __ofono_atom_get_path(sim->atom);
> +
> +	ofono_dbus_signal_property_changed(conn, path,
> +			SIM_MANAGER_INTERFACE, "Present",
> +			DBUS_TYPE_BOOLEAN, &present);
> +}
> +
>  void ofono_sim_inserted(struct ofono_sim *sim)
>  {
>  	sim->inserted = TRUE;
> +	sim_inserted_update(sim);
> 
>  	/* Perform SIM initialization according to 3GPP 31.102 Section 5.1.1.2
>  	 * The assumption here is that if sim manager is being initialized,
> @@ -1781,6 +1809,18 @@ void ofono_sim_inserted(struct ofono_sim *sim)
>  	sim_determine_phase(sim);
>  }
> 
> +static void sim_file_op_fail(struct sim_file_op *op)
> +{
> +	if (op->is_read == TRUE)
> +		((ofono_sim_file_read_cb_t) op->cb)
> +			(0, 0, 0, 0, 0, op->userdata);
> +	else
> +		((ofono_sim_file_write_cb_t) op->cb)
> +			(0, op->userdata);
> +
> +	sim_file_op_free(op);
> +}
> +
>  void ofono_sim_removed(struct ofono_sim *sim)
>  {
>  	GSList *l;
> @@ -1790,18 +1830,61 @@ void ofono_sim_removed(struct ofono_sim *sim)
>  		return;
> 
>  	sim->inserted = FALSE;
> +	sim_inserted_update(sim);
> 
>  	if (sim->ready == FALSE)
>  		return;
> 
>  	sim->ready = FALSE;
> 
> +	if (sim->simop_source) {
> +		g_source_remove(sim->simop_source);
> +		sim->simop_source = 0;
> +	}
> +
> +	if (sim->simop_q) {
> +		/* NOTE: there's an assumption here that the op's callback
> +		 * does not queue new ops on failure... */
> +		g_queue_foreach(sim->simop_q, (GFunc) sim_file_op_fail, NULL);
> +		g_queue_free(sim->simop_q);
> +		sim->simop_q = NULL;
> +	}
> +

You have to be really careful here, it is possible that we have an operation 
pending with the driver, so the driver will call back for that one.  Also, 
since you're removing everything anyway I see no need to call the error 
callback.

>  	for (l = sim->removed_watches->items; l; l = l->next) {
>  		struct ofono_watchlist_item *item = l->data;
>  		notify = item->notify;
> 
>  		notify(item->notify_data);
>  	}
> +
> +	if (sim->imsi) {
> +		g_free(sim->imsi);
> +		sim->imsi = NULL;
> +	}
> +
> +	if (sim->own_numbers) {
> +		g_slist_foreach(sim->own_numbers, (GFunc)g_free, NULL);
> +		g_slist_free(sim->own_numbers);
> +		sim->own_numbers = NULL;
> +	}
> +
> +	if (sim->service_numbers) {
> +		g_slist_foreach(sim->service_numbers,
> +				(GFunc)service_number_free, NULL);
> +		g_slist_free(sim->service_numbers);
> +		sim->service_numbers = NULL;
> +	}
> +
> +	if (sim->efli) {
> +		g_free(sim->efli);
> +		sim->efli = NULL;
> +		sim->efli_length = 0;
> +	}
> +
> +	if (sim->language_prefs) {
> +		g_strfreev(sim->language_prefs);
> +		sim->language_prefs = NULL;
> +	}

This needs to be put into a common destructor instead of duplicating 
everything twice.

>  }
> 
>  static void sim_command_fetch_cb(const struct ofono_error *error,
> 

Regards,
-Denis

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

end of thread, other threads:[~2010-03-17 21:10 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-03-15 21:22 [PATCH 7/8][RFC] Invalidate SIM manager properties when SIM extracted, add Present property Andrzej Zaborowski
2010-03-17 21:10 ` 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.