All of lore.kernel.org
 help / color / mirror / Atom feed
From: Denis Kenzior <denkenz@gmail.com>
To: ofono@ofono.org
Subject: Re: [PATCH 3/8][RFC] Release calls when SIM is removed.
Date: Wed, 17 Mar 2010 16:20:37 -0600	[thread overview]
Message-ID: <201003171720.37269.denkenz@gmail.com> (raw)
In-Reply-To: <1268688085-3872-1-git-send-email-andrew.zaborowski@intel.com>

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

Hi Andrew,

> ---
>  src/voicecall.c |   63
>  ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 
56
>  insertions(+), 7 deletions(-)
> 
> diff --git a/src/voicecall.c b/src/voicecall.c
> index 18b923f..eef924c 100644
> --- a/src/voicecall.c
> +++ b/src/voicecall.c
> @@ -57,6 +57,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;
> @@ -1788,6 +1790,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);
> 
> @@ -1809,6 +1815,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);
>  }
> 
> @@ -1847,6 +1866,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);
> +}

So does sim_ready now have a different semantic than it used to? (e.g. PIN 
entered successfully)  EFecc has to be read when sim is inserted, not when the 
SIM is truly ready.

> +
> +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);

For now I suggest relying on the modem to tells us which calls have been 
removed.  You must also reset and signal the emergency number list.

> +}
> +
>  static void sim_watch(struct ofono_atom *atom,
>  			enum ofono_atom_watch_condition cond, void *data)
>  {
> @@ -1854,16 +1901,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)
> 

      reply	other threads:[~2010-03-17 22:20 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-03-15 21:21 [PATCH 3/8][RFC] Release calls when SIM is removed Andrzej Zaborowski
2010-03-17 22:20 ` Denis Kenzior [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201003171720.37269.denkenz@gmail.com \
    --to=denkenz@gmail.com \
    --cc=ofono@ofono.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.