summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrzej Zaborowski <andrew.zaborowski@intel.com>2009-12-19 02:49:21 +0100
committerDenis Kenzior <denkenz@gmail.com>2010-01-06 13:14:20 -0600
commitb4c3e1c1cc3362d4164da36760d21aa65fddf410 (patch)
tree1ee9f31a68e77e3a923d80a53d28995c6afc748b
parent436c2a7c638e5fa62b2183c8282375aeac436b71 (diff)
downloadofono-b4c3e1c1cc3362d4164da36760d21aa65fddf410.tar.bz2
Index SIM cache by phase also.
-rw-r--r--include/sim.h7
-rw-r--r--src/sim.c54
-rw-r--r--src/simutil.h1
3 files changed, 54 insertions, 8 deletions
diff --git a/include/sim.h b/include/sim.h
index bf13a8e2..3189f123 100644
--- a/include/sim.h
+++ b/include/sim.h
@@ -57,6 +57,12 @@ enum ofono_sim_password_type {
OFONO_SIM_PASSWORD_INVALID,
};
+enum ofono_sim_phase {
+ OFONO_SIM_PHASE_G1,
+ OFONO_SIM_PHASE_G2,
+ OFONO_SIM_PHASE_G3,
+};
+
typedef void (*ofono_sim_file_info_cb_t)(const struct ofono_error *error,
int filelength,
enum ofono_sim_file_structure structure,
@@ -154,6 +160,7 @@ void ofono_sim_set_data(struct ofono_sim *sim, void *data);
void *ofono_sim_get_data(struct ofono_sim *sim);
const char *ofono_sim_get_imsi(struct ofono_sim *sim);
+enum ofono_sim_phase ofono_sim_get_phase(struct ofono_sim *sim);
unsigned int ofono_sim_add_ready_watch(struct ofono_sim *sim,
ofono_sim_ready_notify_cb_t cb,
diff --git a/src/sim.c b/src/sim.c
index 339f2aaa..d85a5c6f 100644
--- a/src/sim.c
+++ b/src/sim.c
@@ -46,8 +46,8 @@
#define SIM_MANAGER_INTERFACE "org.ofono.SimManager"
#define SIM_CACHE_MODE 0600
-#define SIM_CACHE_PATH STORAGEDIR "/%s/%04x"
-#define SIM_CACHE_PATH_LEN(imsilen) (strlen(SIM_CACHE_PATH) - 2 + imsilen)
+#define SIM_CACHE_PATH STORAGEDIR "/%s-%i/%04x"
+#define SIM_CACHE_PATH_LEN(imsilen) (strlen(SIM_CACHE_PATH) - 3 + imsilen)
#define SIM_CACHE_HEADER_SIZE 6
static GSList *g_drivers = NULL;
@@ -72,6 +72,7 @@ struct sim_file_op {
struct ofono_sim {
char *imsi;
+ enum ofono_sim_phase phase;
unsigned char mnc_length;
GSList *own_numbers;
GSList *new_numbers;
@@ -1219,6 +1220,34 @@ static void sim_retrieve_efli_and_efpl(struct ofono_sim *sim)
sim_efpl_read_cb, sim);
}
+static void sim_efphase_read_cb(const struct ofono_error *error,
+ const unsigned char *data, int len, void *user)
+{
+ struct ofono_sim *sim = user;
+
+ if (!error || error->type != OFONO_ERROR_TYPE_NO_ERROR || len != 1)
+ sim->phase = OFONO_SIM_PHASE_G3;
+ else if (data[0] != 0x00)
+ sim->phase = OFONO_SIM_PHASE_G2;
+ else
+ sim->phase = OFONO_SIM_PHASE_G1;
+
+ /* Proceed with SIM initialization */
+ sim_retrieve_efli_and_efpl(sim);
+ sim_pin_check(sim);
+}
+
+static void sim_determine_phase(struct ofono_sim *sim)
+{
+ if (!sim->driver->read_file_transparent) {
+ sim_efphase_read_cb(NULL, NULL, 0, sim);
+ return;
+ }
+
+ sim->driver->read_file_transparent(sim, SIM_EFPHASE_FILEID, 0, 1,
+ sim_efphase_read_cb, sim);
+}
+
static void sim_op_error(struct ofono_sim *sim)
{
struct sim_file_op *op = g_queue_pop_head(sim->simop_q);
@@ -1278,7 +1307,8 @@ static void sim_op_retrieve_cb(const struct ofono_error *error,
cb(1, op->length, op->current, data, op->record_length, op->userdata);
if (op->cache && imsi) {
- char *path = g_strdup_printf(SIM_CACHE_PATH, imsi, op->id);
+ char *path = g_strdup_printf(SIM_CACHE_PATH,
+ imsi, sim->phase, op->id);
op->cache = cache_record(path, op->current, op->record_length,
data);
@@ -1400,8 +1430,8 @@ static void sim_op_info_cb(const struct ofono_error *error, int length,
fileinfo[4] = record_length >> 8;
fileinfo[5] = record_length & 0xff;
- if (write_file(fileinfo, 6, SIM_CACHE_MODE,
- SIM_CACHE_PATH, imsi, op->id) != 6)
+ if (write_file(fileinfo, 6, SIM_CACHE_MODE, SIM_CACHE_PATH,
+ imsi, sim->phase, op->id) != 6)
op->cache = FALSE;
}
}
@@ -1443,7 +1473,7 @@ static gboolean sim_op_check_cached(struct ofono_sim *sim)
if (!imsi)
return FALSE;
- path = g_strdup_printf(SIM_CACHE_PATH, imsi, op->id);
+ path = g_strdup_printf(SIM_CACHE_PATH, imsi, sim->phase, op->id);
fd = TFR(open(path, O_RDONLY));
g_free(path);
@@ -1662,6 +1692,14 @@ const char *ofono_sim_get_imsi(struct ofono_sim *sim)
return sim->imsi;
}
+enum ofono_sim_phase ofono_sim_get_phase(struct ofono_sim *sim)
+{
+ if (sim == NULL)
+ return 0;
+
+ return sim->phase;
+}
+
unsigned int ofono_sim_add_ready_watch(struct ofono_sim *sim,
ofono_sim_ready_notify_cb_t notify,
void *data, ofono_destroy_func destroy)
@@ -1915,6 +1953,7 @@ void ofono_sim_register(struct ofono_sim *sim)
* Read EFecc
* Read EFli and EFpl
* SIM Pin check
+ * Request SIM phase (only in 51.011)
* Read EFust
* Read EFest
* Read IMSI
@@ -1923,8 +1962,7 @@ void ofono_sim_register(struct ofono_sim *sim)
* arbitrary files to be written or read, assuming their presence
* in the EFust
*/
- sim_retrieve_efli_and_efpl(sim);
- sim_pin_check(sim);
+ sim_determine_phase(sim);
}
void ofono_sim_remove(struct ofono_sim *sim)
diff --git a/src/simutil.h b/src/simutil.h
index 24a55d20..13877db2 100644
--- a/src/simutil.h
+++ b/src/simutil.h
@@ -26,6 +26,7 @@ enum sim_fileid {
SIM_EFSPN_FILEID = 0x6f46,
SIM_EFSDN_FILEID = 0x6f49,
SIM_EFAD_FILEID = 0x6fad,
+ SIM_EFPHASE_FILEID = 0x6fae,
SIM_EFPNN_FILEID = 0x6fc5,
SIM_EFOPL_FILEID = 0x6fc6,
SIM_EFMBDN_FILEID = 0x6fc7,