summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrzej Zaborowski <andrew.zaborowski@intel.com>2011-02-19 04:54:27 +0100
committerDenis Kenzior <denkenz@gmail.com>2011-03-15 20:20:59 -0500
commit9c2af56c18d222c1def2aa047d5a7ad367db2106 (patch)
tree3398a98ed263ec23b90d4030a29c9f6b5fccce50
parentf2a82b8e8d74bc4d398397e5b41bd088eb8031fd (diff)
downloadofono-9c2af56c18d222c1def2aa047d5a7ad367db2106.tar.bz2
sim: Watch for changes to EFimg files and EFiidf
-rw-r--r--src/sim.c55
1 files changed, 54 insertions, 1 deletions
diff --git a/src/sim.c b/src/sim.c
index 4bd7c5c5..46e63f4b 100644
--- a/src/sim.c
+++ b/src/sim.c
@@ -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);