Open Source Telephony
 help / color / mirror / Atom feed
From: Kristen Carlson Accardi <kristen@linux.intel.com>
To: ofono@ofono.org
Subject: [PATCH 4/7] sim: allow partial reads of files
Date: Thu, 05 Aug 2010 14:32:37 -0700	[thread overview]
Message-ID: <1281043960-9616-5-git-send-email-kristen@linux.intel.com> (raw)
In-Reply-To: <1281043960-9616-1-git-send-email-kristen@linux.intel.com>

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

---
 include/sim.h |    5 +++++
 src/sim.c     |   54 ++++++++++++++++++++++++++++++++++++++++++++----------
 2 files changed, 49 insertions(+), 10 deletions(-)

diff --git a/include/sim.h b/include/sim.h
index 36a99b9..6c5a657 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_type,
+			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 6d723bb..fa3823b 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;
@@ -1498,7 +1500,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,
@@ -1536,7 +1538,16 @@ static gboolean sim_op_retrieve_next(gpointer user)
 			return FALSE;
 		}
 
-		sim->driver->read_file_transparent(sim, op->id, 0, op->length,
+		if (op->num_bytes < 0)
+			op->num_bytes = op->length;
+
+		if (op->offset + op->num_bytes > op->length) {
+			sim_op_error(sim);
+			return FALSE;
+		}
+
+		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:
@@ -1663,6 +1674,8 @@ static gboolean sim_op_check_cached(struct ofono_sim *sim)
 	unsigned int record;
 	guint8 *buffer = NULL;
 	gboolean ret = FALSE;
+	unsigned int read_bytes;
+	unsigned int num_records;
 
 	if (!imsi)
 		return FALSE;
@@ -1694,8 +1707,19 @@ static gboolean sim_op_check_cached(struct ofono_sim *sim)
 	structure = fileinfo[3];
 	record_length = (fileinfo[4] << 8) | fileinfo[5];
 
-	if (structure == OFONO_SIM_FILE_STRUCTURE_TRANSPARENT)
-		record_length = file_length;
+	if (op->num_bytes < 0)
+		op->num_bytes = file_length;
+
+	read_bytes = op->num_bytes;
+
+	num_records = file_length / record_length;
+
+	/* add a seek to the correct offset here */
+	if (structure == OFONO_SIM_FILE_STRUCTURE_TRANSPARENT) {
+		TFR(lseek(fd, op->offset, SEEK_CUR));
+		num_records = 1;
+		record_length = read_bytes;
+	}
 
 	if (record_length == 0 || file_length < record_length)
 		goto cleanup;
@@ -1707,18 +1731,18 @@ static gboolean sim_op_check_cached(struct ofono_sim *sim)
 		goto cleanup;
 	}
 
-	buffer = g_try_malloc(file_length);
+	buffer = g_try_malloc(read_bytes);
 
 	if (buffer == NULL)
 		goto cleanup;
 
-	len = TFR(read(fd, buffer, file_length));
+	len = TFR(read(fd, buffer, read_bytes));
 
-	if (len < (ssize_t)file_length)
+	if (len < (ssize_t) read_bytes)
 		goto cleanup;
 
-	for (record = 0; record < file_length / record_length; record++) {
-		cb(1, file_length, record + 1, &buffer[record * record_length],
+	for (record = 0; record < num_records; record++) {
+		cb(1, read_bytes, record + 1, &buffer[record * record_length],
 			record_length, op->userdata);
 	}
 
@@ -1787,8 +1811,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;
@@ -1819,6 +1844,8 @@ int ofono_sim_read(struct ofono_sim *sim, int id,
 	op->cb = cb;
 	op->userdata = data;
 	op->is_read = TRUE;
+	op->offset = offset;
+	op->num_bytes = num_bytes;
 
 	g_queue_push_tail(sim->simop_q, op);
 
@@ -1828,6 +1855,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


  parent reply	other threads:[~2010-08-05 21:32 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-05 21:32 [PATCH 0/7] add support for icons Kristen Carlson Accardi
2010-08-05 21:32 ` [PATCH 1/7] simutil: add fileid for EFimg Kristen Carlson Accardi
2010-08-05 21:32 ` [PATCH 2/7] stkutil: change uint32_t to guint32 Kristen Carlson Accardi
2010-08-05 21:32 ` [PATCH 3/7] sim: read EFimg Kristen Carlson Accardi
2010-08-05 21:32 ` Kristen Carlson Accardi [this message]
2010-08-05 21:32 ` [PATCH 5/7] sim: read an image from an EFiidf Kristen Carlson Accardi
2010-08-05 21:32 ` [PATCH 6/7] sim: implement GetIcon dbus interface Kristen Carlson Accardi
2010-08-05 21:32 ` [PATCH 7/7] test: add get-icon script Kristen Carlson Accardi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1281043960-9616-5-git-send-email-kristen@linux.intel.com \
    --to=kristen@linux.intel.com \
    --cc=ofono@ofono.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox