All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/5] sim: Cache flushing functions.
@ 2010-12-28  9:17 Andrzej Zaborowski
  2010-12-28  9:17 ` [PATCH 2/5] Add SIM filesystem watch api Andrzej Zaborowski
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Andrzej Zaborowski @ 2010-12-28  9:17 UTC (permalink / raw)
  To: ofono

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

---
 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


^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2010-12-30 17:11 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-28  9:17 [PATCH 1/5] sim: Cache flushing functions Andrzej Zaborowski
2010-12-28  9:17 ` [PATCH 2/5] Add SIM filesystem watch api Andrzej Zaborowski
2010-12-28  9:17 ` [PATCH 3/5][RfC] sim: Implement file watching and basic refresh Andrzej Zaborowski
2010-12-28  9:17 ` [PATCH 4/5] sim: Watch files that ofono keeps in memory Andrzej Zaborowski
2010-12-28  9:17 ` [PATCH 5/5][RfC] stk: Partially handle Refresh command Andrzej Zaborowski
2010-12-28  9:17 ` [PATCH] doc: Fix wording Andrzej Zaborowski
2010-12-30 17:11   ` 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.