Implement ofono_sim_read_bytes(). For transparent files, this will read num_bytes from a specified offset of a given fileid. --- include/sim.h | 5 +++++ src/sim.c | 29 ++++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/include/sim.h b/include/sim.h index 36a99b9..15cd6b8 100644 --- a/include/sim.h +++ b/include/sim.h @@ -198,6 +198,11 @@ int ofono_sim_read(struct ofono_sim *sim, int id, enum ofono_sim_file_structure expected, ofono_sim_file_read_cb_t cb, void *data); +int ofono_sim_read_bytes(struct ofono_sim *sim, int id, + enum ofono_sim_file_structure expected, + unsigned short offset, int num_bytes, + ofono_sim_file_read_cb_t cb, void *data); + int ofono_sim_write(struct ofono_sim *sim, int id, ofono_sim_file_write_cb_t cb, enum ofono_sim_file_structure structure, int record, diff --git a/src/sim.c b/src/sim.c index 2514e7b..cd1cbf5 100644 --- a/src/sim.c +++ b/src/sim.c @@ -60,6 +60,8 @@ struct sim_file_op { int id; gboolean cache; enum ofono_sim_file_structure structure; + unsigned short offset; + int num_bytes; int length; int record_length; int current; @@ -1434,7 +1436,7 @@ static void sim_op_retrieve_cb(const struct ofono_error *error, return; } - cb(1, op->length, op->current, data, op->record_length, op->userdata); + cb(1, len, op->current, data, op->record_length, op->userdata); if (op->cache && imsi) { char *path = g_strdup_printf(SIM_CACHE_PATH, @@ -1472,7 +1474,16 @@ static gboolean sim_op_retrieve_next(gpointer user) return FALSE; } - sim->driver->read_file_transparent(sim, op->id, 0, op->length, + if (op->offset + op->num_bytes > op->length) { + sim_op_error(sim); + return FALSE; + } + + if (op->num_bytes < 0) + op->num_bytes = op->length; + + sim->driver->read_file_transparent(sim, op->id, op->offset, + op->num_bytes, sim_op_retrieve_cb, sim); break; case OFONO_SIM_FILE_STRUCTURE_FIXED: @@ -1723,8 +1734,9 @@ static gboolean sim_op_next(gpointer user_data) return FALSE; } -int ofono_sim_read(struct ofono_sim *sim, int id, +int ofono_sim_read_bytes(struct ofono_sim *sim, int id, enum ofono_sim_file_structure expected_type, + unsigned short offset, int num_bytes, ofono_sim_file_read_cb_t cb, void *data) { struct sim_file_op *op; @@ -1755,6 +1767,10 @@ int ofono_sim_read(struct ofono_sim *sim, int id, op->cb = cb; op->userdata = data; op->is_read = TRUE; + op->offset = offset; + + if (num_bytes > 0) + op->num_bytes = num_bytes; g_queue_push_tail(sim->simop_q, op); @@ -1764,6 +1780,13 @@ int ofono_sim_read(struct ofono_sim *sim, int id, return 0; } +int ofono_sim_read(struct ofono_sim *sim, int id, + enum ofono_sim_file_structure expected_type, + ofono_sim_file_read_cb_t cb, void *data) +{ + return ofono_sim_read_bytes(sim, id, expected_type, 0, -1, cb, data); +} + int ofono_sim_write(struct ofono_sim *sim, int id, ofono_sim_file_write_cb_t cb, enum ofono_sim_file_structure structure, int record, -- 1.7.1.1 _______________________________________________ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono