diff options
author | Andrzej Zaborowski <andrew.zaborowski@intel.com> | 2011-02-19 04:54:27 +0100 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2011-03-15 20:20:59 -0500 |
commit | 9c2af56c18d222c1def2aa047d5a7ad367db2106 (patch) | |
tree | 3398a98ed263ec23b90d4030a29c9f6b5fccce50 | |
parent | f2a82b8e8d74bc4d398397e5b41bd088eb8031fd (diff) | |
download | ofono-9c2af56c18d222c1def2aa047d5a7ad367db2106.tar.bz2 |
sim: Watch for changes to EFimg files and EFiidf
-rw-r--r-- | src/sim.c | 55 |
1 files changed, 54 insertions, 1 deletions
@@ -100,6 +100,7 @@ struct ofono_sim { struct ofono_sim_context *early_context; unsigned char *iidf_image; + unsigned int *iidf_watch_ids; DBusMessage *pending; const struct ofono_sim_driver *driver; @@ -929,6 +930,11 @@ static void sim_iidf_read_cb(int ok, int length, int record, sim_iidf_read_clut_cb, sim); } +static void sim_image_data_changed(int id, void *userdata) +{ + /* TODO: notify D-bus clients */ +} + static void sim_get_image(struct ofono_sim *sim, unsigned char id, gpointer user_data) { @@ -942,7 +948,7 @@ static void sim_get_image(struct ofono_sim *sim, unsigned char id, if (image != NULL) { sim_get_image_cb(sim, id, image, FALSE); - return; + goto watch; } if (sim->efimg_length <= (id * 9)) { @@ -959,6 +965,17 @@ static void sim_get_image(struct ofono_sim *sim, unsigned char id, /* read the image data */ ofono_sim_read_bytes(sim->context, iidf_id, iidf_offset, iidf_len, sim_iidf_read_cb, sim); + +watch: + if (sim->efimg_length <= id * 9) + return; + + if (sim->iidf_watch_ids[id] > 0) + return; + + sim->iidf_watch_ids[id] = ofono_sim_add_file_watch(sim->context, + iidf_id, sim_image_data_changed, + sim, NULL); } static DBusMessage *sim_get_icon(DBusConnection *conn, @@ -1272,6 +1289,11 @@ static void sim_efimg_read_cb(int ok, int length, int record, if (sim->efimg == NULL) return; + sim->iidf_watch_ids = g_try_new0(unsigned int, num_records); + + if (sim->iidf_watch_ids == NULL) + return; + sim->efimg_length = num_records * 9; } @@ -1286,6 +1308,33 @@ static void sim_efimg_read_cb(int ok, int length, int record, memcpy(efimg, &data[1], 9); } +static void sim_efimg_changed(int id, void *userdata) +{ + struct ofono_sim *sim = userdata; + int i, watch; + + if (sim->efimg != NULL) { + for (i = sim->efimg_length / 9 - 1; i >= 0; i--) { + watch = sim->iidf_watch_ids[i]; + if (watch == 0) + continue; + + ofono_sim_remove_file_watch(sim->context, watch); + } + + g_free(sim->efimg); + sim->efimg = NULL; + sim->efimg_length = 0; + g_free(sim->iidf_watch_ids); + sim->iidf_watch_ids = NULL; + } + + ofono_sim_read(sim->context, SIM_EFIMG_FILEID, + OFONO_SIM_FILE_STRUCTURE_FIXED, sim_efimg_read_cb, sim); + + /* TODO: notify D-bus clients */ +} + static void sim_ready(enum ofono_sim_state new_state, void *user) { struct ofono_sim *sim = user; @@ -1304,6 +1353,8 @@ static void sim_ready(enum ofono_sim_state new_state, void *user) ofono_sim_read(sim->context, SIM_EFIMG_FILEID, OFONO_SIM_FILE_STRUCTURE_FIXED, sim_efimg_read_cb, sim); + ofono_sim_add_file_watch(sim->context, SIM_EFIMG_FILEID, + sim_efimg_changed, sim, NULL); } static void sim_set_ready(struct ofono_sim *sim) @@ -2209,6 +2260,8 @@ static void sim_free_main_state(struct ofono_sim *sim) g_free(sim->efimg); sim->efimg = NULL; sim->efimg_length = 0; + g_free(sim->iidf_watch_ids); + sim->iidf_watch_ids = NULL; } g_free(sim->iidf_image); |