---
src/sim.c | 23 ++++++++++++++++++++
src/simfs.c | 68 ++++++++++++++++++++++++++++++++++++++++++++--------------
src/simfs.h | 5 ++++
3 files changed, 79 insertions(+), 17 deletions(-)
diff --git a/src/sim.c b/src/sim.c
index 335f611..27ff572 100644
--- a/src/sim.c
+++ b/src/sim.c
@@ -2255,3 +2255,26 @@ void *ofono_sim_get_data(struct ofono_sim *sim)
{
return sim->driver_data;
}
+
+static void sim_file_changed_flush(struct ofono_sim *sim, int id)
+{
+ int i, imgid;
+
+ if (id == SIM_EFIMG_FILEID)
+ /* All cached images become invalid */
+ sim_fs_image_cache_flush(sim->simfs);
+ else if (sim->efimg)
+ /*
+ * Data and CLUT for image instances stored in the changed
+ * file need to be re-read.
+ */
+ for (i = sim->efimg_length / 9 - 1; i >= 0; i--) {
+ imgid = (sim->efimg[i * 9 + 3] << 8) |
+ sim->efimg[i * 9 + 4];
+
+ if (imgid == id)
+ sim_fs_image_cache_flush_file(sim->simfs, i);
+ }
+
+ sim_fs_cache_flush_file(sim->simfs, id);
+}
diff --git a/src/simfs.c b/src/simfs.c
index 617af14..a99a2c6 100644
--- a/src/simfs.c
+++ b/src/simfs.c
@@ -907,9 +907,6 @@ void sim_fs_check_version(struct sim_fs *fs)
const char *imsi = ofono_sim_get_imsi(fs->sim);
enum ofono_sim_phase phase = ofono_sim_get_phase(fs->sim);
unsigned char version;
- struct dirent **entries;
- int len;
- char *path;
if (imsi == NULL || phase == OFONO_SIM_PHASE_UNKNOWN)
return;
@@ -918,10 +915,20 @@ void sim_fs_check_version(struct sim_fs *fs)
if (version == SIM_FS_VERSION)
return;
- path = g_strdup_printf(SIM_CACHE_BASEPATH, imsi, phase);
+ sim_fs_cache_flush(fs);
+
+ version = SIM_FS_VERSION;
+ write_file(&version, 1, SIM_CACHE_MODE, SIM_CACHE_VERSION, imsi, phase);
+}
+
+void sim_fs_cache_flush(struct sim_fs *fs)
+{
+ const char *imsi = ofono_sim_get_imsi(fs->sim);
+ enum ofono_sim_phase phase = ofono_sim_get_phase(fs->sim);
+ char *path = g_strdup_printf(SIM_CACHE_BASEPATH, imsi, phase);
+ struct dirent **entries;
+ int len = scandir(path, &entries, NULL, alphasort);
- ofono_info("Detected old simfs version in %s, removing", path);
- len = scandir(path, &entries, NULL, alphasort);
g_free(path);
if (len > 0) {
@@ -934,20 +941,47 @@ void sim_fs_check_version(struct sim_fs *fs)
g_free(entries);
}
- path = g_strdup_printf(SIM_IMAGE_CACHE_BASEPATH, imsi, phase);
- len = scandir(path, &entries, NULL, alphasort);
+ sim_fs_image_cache_flush(fs);
+}
+
+void sim_fs_cache_flush_file(struct sim_fs *fs, int id)
+{
+ const char *imsi = ofono_sim_get_imsi(fs->sim);
+ enum ofono_sim_phase phase = ofono_sim_get_phase(fs->sim);
+ char *path = g_strdup_printf(SIM_CACHE_PATH, imsi, phase, id);
+
+ remove(path);
g_free(path);
+}
- if (len > 0) {
- /* Remove everything */
- while (len--) {
- remove_imagefile(imsi, phase, entries[len]);
- g_free(entries[len]);
- }
+void sim_fs_image_cache_flush(struct sim_fs *fs)
+{
+ const char *imsi = ofono_sim_get_imsi(fs->sim);
+ enum ofono_sim_phase phase = ofono_sim_get_phase(fs->sim);
+ char *path = g_strdup_printf(SIM_IMAGE_CACHE_BASEPATH, imsi, phase);
+ struct dirent **entries;
+ int len = scandir(path, &entries, NULL, alphasort);
- g_free(entries);
+ g_free(path);
+
+ if (len == 0)
+ return;
+
+ /* Remove everything */
+ while (len--) {
+ remove_imagefile(imsi, phase, entries[len]);
+ g_free(entries[len]);
}
- version = SIM_FS_VERSION;
- write_file(&version, 1, SIM_CACHE_MODE, SIM_CACHE_VERSION, imsi, phase);
+ g_free(entries);
+}
+
+void sim_fs_image_cache_flush_file(struct sim_fs *fs, int id)
+{
+ const char *imsi = ofono_sim_get_imsi(fs->sim);
+ enum ofono_sim_phase phase = ofono_sim_get_phase(fs->sim);
+ char *path = g_strdup_printf(SIM_IMAGE_CACHE_PATH, imsi, phase, id);
+
+ remove(path);
+ g_free(path);
}
diff --git a/src/simfs.h b/src/simfs.h
index ef962db..8c6f761 100644
--- a/src/simfs.h
+++ b/src/simfs.h
@@ -47,4 +47,9 @@ char *sim_fs_get_cached_image(struct sim_fs *fs, int id);
void sim_fs_cache_image(struct sim_fs *fs, const char *image, int id);
+void sim_fs_cache_flush(struct sim_fs *fs);
+void sim_fs_cache_flush_file(struct sim_fs *fs, int id);
+void sim_fs_image_cache_flush(struct sim_fs *fs);
+void sim_fs_image_cache_flush_file(struct sim_fs *fs, int id);
+
void sim_fs_free(struct sim_fs *fs);
--
1.7.1.86.g0e460.dirty
_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono