All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 2/5][RfC] Release calls when SIM is removed.
@ 2010-03-31  4:57 Andrzej Zaborowski
  2010-04-01 15:52 ` Denis Kenzior
  0 siblings, 1 reply; 2+ messages in thread
From: Andrzej Zaborowski @ 2010-03-31  4:57 UTC (permalink / raw)
  To: ofono

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

---
 src/voicecall.c |   63 ++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 56 insertions(+), 7 deletions(-)

diff --git a/src/voicecall.c b/src/voicecall.c
index 8bf6379..b0aa5cd 100644
--- a/src/voicecall.c
+++ b/src/voicecall.c
@@ -54,6 +54,8 @@ struct ofono_voicecall {
 	gint emit_calls_source;
 	gint emit_multi_source;
 	unsigned int sim_watch;
+	unsigned int sim_ready_watch;
+	unsigned int sim_removed_watch;
 	const struct ofono_voicecall_driver *driver;
 	void *driver_data;
 	struct ofono_atom *atom;
@@ -1784,6 +1786,10 @@ static void voicecall_unregister(struct ofono_atom *atom)
 static void voicecall_remove(struct ofono_atom *atom)
 {
 	struct ofono_voicecall *vc = __ofono_atom_get_data(atom);
+	struct ofono_modem *modem = __ofono_atom_get_modem(vc->atom);
+	struct ofono_atom *sim_atom =
+		__ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_SIM);
+	struct ofono_sim *sim = NULL;
 
 	DBG("atom: %p", atom);
 
@@ -1805,6 +1811,19 @@ static void voicecall_remove(struct ofono_atom *atom)
 		vc->new_en_list = NULL;
 	}
 
+	if (sim_atom && __ofono_atom_get_registered(sim_atom))
+		sim = __ofono_atom_get_data(sim_atom);
+
+	if (sim && vc->sim_ready_watch) {
+		ofono_sim_remove_ready_watch(sim, vc->sim_ready_watch);
+		vc->sim_ready_watch = 0;
+	}
+
+	if (sim && vc->sim_removed_watch) {
+		ofono_sim_remove_removed_watch(sim, vc->sim_removed_watch);
+		vc->sim_removed_watch = 0;
+	}
+
 	g_free(vc);
 }
 
@@ -1843,6 +1862,34 @@ struct ofono_voicecall *ofono_voicecall_create(struct ofono_modem *modem,
 	return vc;
 }
 
+static void sim_ready_watch(void *user)
+{
+	struct ofono_voicecall *vc = user;
+	struct ofono_modem *modem = __ofono_atom_get_modem(vc->atom);
+	struct ofono_atom *sim_atom =
+		__ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_SIM);
+	struct ofono_sim *sim = __ofono_atom_get_data(sim_atom);
+
+	/* Try both formats, only one or none will work */
+	ofono_sim_read(sim, SIM_EFECC_FILEID,
+			OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
+			ecc_g2_read_cb, vc);
+	ofono_sim_read(sim, SIM_EFECC_FILEID,
+			OFONO_SIM_FILE_STRUCTURE_FIXED,
+			ecc_g3_read_cb, vc);
+}
+
+static void sim_removed_watch(void *user)
+{
+	struct ofono_voicecall *vc = user;
+
+	vc->flags |= VOICECALLS_FLAG_MULTI_RELEASE;
+
+	/* TODO: Don't hang up emergency calls */
+	voicecalls_release_queue(vc, vc->call_list);
+	voicecalls_release_next(vc);
+}
+
 static void sim_watch(struct ofono_atom *atom,
 			enum ofono_atom_watch_condition cond, void *data)
 {
@@ -1850,16 +1897,18 @@ static void sim_watch(struct ofono_atom *atom,
 	struct ofono_sim *sim = __ofono_atom_get_data(atom);
 
 	if (cond == OFONO_ATOM_WATCH_CONDITION_UNREGISTERED) {
+		vc->sim_ready_watch = 0;
+		vc->sim_removed_watch = 0;
 		return;
 	}
 
-	/* Try both formats, only one or none will work */
-	ofono_sim_read(sim, SIM_EFECC_FILEID,
-			OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
-			ecc_g2_read_cb, vc);
-	ofono_sim_read(sim, SIM_EFECC_FILEID,
-			OFONO_SIM_FILE_STRUCTURE_FIXED,
-			ecc_g3_read_cb, vc);
+	vc->sim_ready_watch = ofono_sim_add_ready_watch(sim,
+			sim_ready_watch, vc, NULL);
+	vc->sim_removed_watch = ofono_sim_add_removed_watch(sim,
+			sim_removed_watch, vc, NULL);
+
+	if (ofono_sim_get_ready(sim))
+		sim_ready_watch(vc);
 }
 
 void ofono_voicecall_register(struct ofono_voicecall *vc)
-- 
1.6.1


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

* Re: [PATCH 2/5][RfC] Release calls when SIM is removed.
  2010-03-31  4:57 [PATCH 2/5][RfC] Release calls when SIM is removed Andrzej Zaborowski
@ 2010-04-01 15:52 ` Denis Kenzior
  0 siblings, 0 replies; 2+ messages in thread
From: Denis Kenzior @ 2010-04-01 15:52 UTC (permalink / raw)
  To: ofono

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

Hi Andrew,

> ---
> +static void sim_ready_watch(void *user)
> +{
> +	struct ofono_voicecall *vc = user;
> +	struct ofono_modem *modem = __ofono_atom_get_modem(vc->atom);
> +	struct ofono_atom *sim_atom =
> +		__ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_SIM);
> +	struct ofono_sim *sim = __ofono_atom_get_data(sim_atom);
> +
> +	/* Try both formats, only one or none will work */
> +	ofono_sim_read(sim, SIM_EFECC_FILEID,
> +			OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
> +			ecc_g2_read_cb, vc);
> +	ofono_sim_read(sim, SIM_EFECC_FILEID,
> +			OFONO_SIM_FILE_STRUCTURE_FIXED,
> +			ecc_g3_read_cb, vc);
> +}

This part needs to be done when SIM is inserted.  If you refactor the previous 
patch, then we should also easily have INSERTED state notifications too and get 
this taken care of properly.

> +
> +static void sim_removed_watch(void *user)
> +{
> +	struct ofono_voicecall *vc = user;
> +
> +	vc->flags |= VOICECALLS_FLAG_MULTI_RELEASE;
> +
> +	/* TODO: Don't hang up emergency calls */
> +	voicecalls_release_queue(vc, vc->call_list);
> +	voicecalls_release_next(vc);

I suggest you only shuffle the emergency numbers here.  Let the modem driver 
notify which calls have been terminated.  If this is wrong we can fix it later, 
but sending a CHLD=1X is actually wrong here.

Regards,
-Denis

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

end of thread, other threads:[~2010-04-01 15:52 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-03-31  4:57 [PATCH 2/5][RfC] Release calls when SIM is removed Andrzej Zaborowski
2010-04-01 15:52 ` 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.