* [PATCH 3/8][RFC] Release calls when SIM is removed.
@ 2010-03-15 21:21 Andrzej Zaborowski
2010-03-17 22:20 ` Denis Kenzior
0 siblings, 1 reply; 2+ messages in thread
From: Andrzej Zaborowski @ 2010-03-15 21:21 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 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);
+}
+
+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)
{
@@ -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)
--
1.6.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH 3/8][RFC] Release calls when SIM is removed.
2010-03-15 21:21 [PATCH 3/8][RFC] Release calls when SIM is removed Andrzej Zaborowski
@ 2010-03-17 22:20 ` Denis Kenzior
0 siblings, 0 replies; 2+ messages in thread
From: Denis Kenzior @ 2010-03-17 22:20 UTC (permalink / raw)
To: ofono
[-- 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)
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2010-03-17 22:20 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:21 [PATCH 3/8][RFC] Release calls when SIM is removed Andrzej Zaborowski
2010-03-17 22:20 ` 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.