From: Denis Kenzior <denkenz@gmail.com>
To: ofono@ofono.org
Subject: Re: [PATCH 3/5] sim: Implement file watching and basic refresh.
Date: Wed, 12 Jan 2011 15:55:38 -0600 [thread overview]
Message-ID: <4D2E235A.5000006@gmail.com> (raw)
In-Reply-To: <1294657295-14041-3-git-send-email-andrew.zaborowski@intel.com>
[-- Attachment #1: Type: text/plain, Size: 4558 bytes --]
Hi Andrew,
> +void __ofono_sim_refresh(struct ofono_sim *sim, GSList *file_list,
> + ofono_bool_t full_file_change, ofono_bool_t naa_init)
> +{
> + GSList *l, *filel;
> + enum sim_reset_state {
> + RESET_STATE_NOT_PRESENT = OFONO_SIM_STATE_NOT_PRESENT,
> + RESET_STATE_INSERTED = OFONO_SIM_STATE_INSERTED,
> + RESET_STATE_READY = OFONO_SIM_STATE_READY,
> + RESET_STATE_NONE,
> + } reset_state = RESET_STATE_NONE;
> +
> + /* Flush cached content for affected files */
> + if (full_file_change)
> + sim_fs_cache_flush(sim->simfs);
> + else
> + for (filel = file_list; filel; filel = filel->next) {
> + struct stk_file *file = filel->data;
> + int id = (file->file[file->len - 2] << 8) |
> + (file->file[file->len - 1] << 0);
> +
> + sim_file_changed_flush(sim, id);
> + }
Just a nitpick, but when you have such compound statements inside
if/while/for, could you enclose them in parentheses? I think that makes
the code a bit more readable.
e.g.
if (foo)
else {
for () {
}
}
> +
> + if (naa_init)
> + reset_state = RESET_STATE_INSERTED;
> +
> + /*
> + * Check if we have file change handlers for all of the affected
> + * files. If not, we will fall back to re-initialising the
> + * application which ensures that all files are re-read.
> + */
> + for (l = sim->fs_watches; l; l = l->next) {
> + struct fs_watch *w = l->data;
> +
> + if (full_file_change) {
> + if (w->notify)
> + continue;
> +
> + if (w->reset_state < reset_state)
> + reset_state = reset_state;
> +
> + continue;
> + }
> +
> + for (filel = file_list; filel; filel = filel->next) {
> + struct stk_file *file = filel->data;
> + int id = (file->file[file->len - 2] << 8) |
> + (file->file[file->len - 1] << 0);
> +
> + if (id != w->id)
> + continue;
> +
> + if (w->notify)
> + break;
> +
> + if (w->reset_state < reset_state)
> + reset_state = reset_state;
> +
> + break;
> + }
> + }
> +
> + /*
> + * Notify the subscribers of files that have changed unless we
> + * have determined that a re-initialisation is necessary and
> + * will trigger re-reading of those files anyway.
> + */
> + for (l = sim->fs_watches; l; l = l->next) {
> + struct fs_watch *w = l->data;
> +
> + if (full_file_change) {
> + if (w->reset_state < reset_state)
> + w->notify(w->id, w->notify_data);
> +
> + continue;
> + }
> +
> + for (filel = file_list; filel; filel = filel->next) {
> + struct stk_file *file = filel->data;
> + int id = (file->file[file->len - 2] << 8) |
> + (file->file[file->len - 1] << 0);
> +
> + if (id != w->id)
> + continue;
> +
> + if (w->reset_state < reset_state)
> + w->notify(w->id, w->notify_data);
> +
> + break;
> + }
> + }
> +
> + switch (reset_state) {
> + case RESET_STATE_NOT_PRESENT:
> + ofono_sim_inserted_notify(sim, FALSE);
> + ofono_sim_inserted_notify(sim, TRUE);
Are you sure we can do it this way? I would assume that the modem might
require some time to perform its own SIM initialization and would have
to signal the sim_inserted itself...
> + break;
> + case RESET_STATE_INSERTED:
> + sim_free_state(sim);
> + sim->state = OFONO_SIM_STATE_INSERTED;
> + sim_initialize(sim);
What about removing all the post_sim / online atoms? In theory
something like EFfdn could have been changed and now we're stuck in
fixed dialing mode. We should not keep the atoms around in this case.
> + break;
> + case RESET_STATE_READY:
> + sim->state = OFONO_SIM_STATE_INSERTED;
> + for (l = sim->state_watches->items; l; l = l->next) {
> + struct ofono_watchlist_item *item = l->data;
> + ofono_sim_state_event_cb_t notify = item->notify;
> +
> + notify(sim->state, item->notify_data);
I'm having trouble understanding the need for this for loop. Isn't the
SIM already inserted?
> + }
> +
> + sim_set_ready(sim);
> + break;
> + case RESET_STATE_NONE:
> + break;
> + }
> +}
Overall it seems like there are two categories of files that we should
worry about:
- Those handled inside sim.c that affect sim initialization:
- EFust, EFest, EFsst
- EFbdn, EFfdn
- EFphase, EFcphs_info (these ones are really unlikely outside of a
full sim reset)
- EFad (This one is unlikely as it would affect the IMSI)
- The ones that don't
To me it sounds like we should just special case the ones affecting sim
initialization inside this function and use a simplified API for the rest.
Regards,
-Denis
next prev parent reply other threads:[~2011-01-12 21:55 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-10 11:01 [PATCH 1/5] sim: Cache flushing functions Andrzej Zaborowski
2011-01-10 11:01 ` [PATCH 2/5] Add SIM filesystem watch api Andrzej Zaborowski
2011-01-10 11:01 ` [PATCH 3/5] sim: Implement file watching and basic refresh Andrzej Zaborowski
2011-01-12 21:55 ` Denis Kenzior [this message]
2011-01-31 17:23 ` Andrzej Zaborowski
2011-01-31 17:45 ` Denis Kenzior
2011-01-31 18:29 ` Andrzej Zaborowski
2011-01-10 11:01 ` [PATCH 4/5] Watch files that ofono keeps in memory Andrzej Zaborowski
2011-01-10 11:01 ` [PATCH 5/5] stk: Partially handle Refresh command Andrzej Zaborowski
2011-01-12 20:09 ` [PATCH 1/5] sim: Cache flushing functions Denis Kenzior
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=4D2E235A.5000006@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox