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

Reply via email to