diff options
author | Andrzej Zaborowski <andrew.zaborowski@intel.com> | 2009-07-20 18:11:39 +0200 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2009-07-27 17:09:46 -0500 |
commit | 5c981d421eacef2644a39b4f1fbe68cea2a04fee (patch) | |
tree | f6ee866b0d913a4c57560ddf8a3016edf2b1e7d9 | |
parent | 4dae83636c4da4f9439e1e7dbb9fc0be85dfe058 (diff) | |
download | ofono-5c981d421eacef2644a39b4f1fbe68cea2a04fee.tar.bz2 |
Return SIM file access conditions from read_file_info.
-rw-r--r-- | drivers/atmodem/sim.c | 28 | ||||
-rw-r--r-- | src/driver.h | 23 | ||||
-rw-r--r-- | src/sim.c | 3 |
3 files changed, 47 insertions, 7 deletions
diff --git a/drivers/atmodem/sim.c b/drivers/atmodem/sim.c index 01b5719b..81b566ae 100644 --- a/drivers/atmodem/sim.c +++ b/drivers/atmodem/sim.c @@ -40,6 +40,13 @@ static const char *crsm_prefix[] = { "+CRSM:", NULL }; +static inline enum ofono_sim_file_access file_access_condition_decode(int bcd) +{ + if (bcd >= 4 && bcd <= 14) + return OFONO_SIM_FILE_ACCESS_ADM; + return bcd; +} + static void at_crsm_info_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; @@ -50,12 +57,13 @@ static void at_crsm_info_cb(gboolean ok, GAtResult *result, gpointer user_data) gint sw1, sw2, len; int flen, rlen; enum ofono_sim_file_structure str; + enum ofono_sim_file_access access[__OFONO_SIM_FILE_CONDITION_NUM]; dump_response("at_crsm_info_cb", ok, result); decode_at_error(&error, g_at_result_final_response(result)); if (!ok) { - cb(&error, -1, -1, -1, cbd->data); + cb(&error, -1, -1, -1, NULL, cbd->data); return; } @@ -64,7 +72,7 @@ static void at_crsm_info_cb(gboolean ok, GAtResult *result, gpointer user_data) if (!g_at_result_iter_next(&iter, "+CRSM:")) { DECLARE_FAILURE(e); - cb(&e, -1, -1, -1, cbd->data); + cb(&e, -1, -1, -1, NULL, cbd->data); return; } @@ -78,7 +86,7 @@ static void at_crsm_info_cb(gboolean ok, GAtResult *result, gpointer user_data) (response[13] == 0x01 && len < 15)) { DECLARE_FAILURE(e); - cb(&e, -1, -1, -1, cbd->data); + cb(&e, -1, -1, -1, NULL, cbd->data); return; } @@ -86,13 +94,23 @@ static void at_crsm_info_cb(gboolean ok, GAtResult *result, gpointer user_data) flen = (response[2] << 8) | response[3]; str = response[13]; + access[OFONO_SIM_FILE_CONDITION_UPDATE] = + file_access_condition_decode((response[9] >> 4) & 0xf); + access[OFONO_SIM_FILE_CONDITION_READ] = + file_access_condition_decode((response[9] >> 0) & 0xf); + access[OFONO_SIM_FILE_CONDITION_INCREASE] = + file_access_condition_decode((response[10] >> 0) & 0xf); + access[OFONO_SIM_FILE_CONDITION_INVALIDATE] = + file_access_condition_decode((response[11] >> 4) & 0xf); + access[OFONO_SIM_FILE_CONDITION_REHABILITATE] = + file_access_condition_decode((response[11] >> 0) & 0xf); if (str == 0x01) rlen = response[14]; else rlen = 0; - cb(&error, flen, str, rlen, cbd->data); + cb(&error, flen, str, rlen, access, cbd->data); } static void at_sim_read_info(struct ofono_modem *modem, int fileid, @@ -118,7 +136,7 @@ error: { DECLARE_FAILURE(error); - cb(&error, -1, -1, -1, data); + cb(&error, -1, -1, -1, NULL, data); } } diff --git a/src/driver.h b/src/driver.h index 8078b130..dfd28a0f 100644 --- a/src/driver.h +++ b/src/driver.h @@ -101,6 +101,25 @@ enum ofono_sim_file_structure { OFONO_SIM_FILE_STRUCTURE_CYCLIC = 3 }; +/* 51.011 Section 9.3 */ +enum ofono_sim_file_access { + OFONO_SIM_FILE_ACCESS_ALWAYS = 0, + OFONO_SIM_FILE_ACCESS_CHV1 = 1, + OFONO_SIM_FILE_ACCESS_CHV2 = 2, + OFONO_SIM_FILE_ACCESS_RESERVED = 3, + OFONO_SIM_FILE_ACCESS_ADM = 4, + OFONO_SIM_FILE_ACCESS_NEVER = 15, +}; + +enum ofono_sim_file_condition { + OFONO_SIM_FILE_CONDITION_READ = 0, + OFONO_SIM_FILE_CONDITION_UPDATE, + OFONO_SIM_FILE_CONDITION_INCREASE, + OFONO_SIM_FILE_CONDITION_INVALIDATE, + OFONO_SIM_FILE_CONDITION_REHABILITATE, + __OFONO_SIM_FILE_CONDITION_NUM, +}; + /* Notification functions, the integer values here should map to * values obtained from the modem. The enumerations are the same * as the values for the fields found in 3GPP TS 27.007 @@ -162,7 +181,9 @@ typedef void (*ofono_call_barring_cb_t)(const struct ofono_error *error, typedef void (*ofono_sim_file_info_cb_t)(const struct ofono_error *error, int filelength, enum ofono_sim_file_structure structure, - int recordlength, void *data); + int recordlength, + enum ofono_sim_file_access *access, + void *data); typedef void (*ofono_sim_read_cb_t)(const struct ofono_error *error, const unsigned char *sdata, int length, @@ -356,7 +356,8 @@ static gboolean sim_op_retrieve_next(gpointer user) static void sim_op_info_cb(const struct ofono_error *error, int length, enum ofono_sim_file_structure structure, - int record_length, void *data) + int record_length, + enum ofono_sim_file_access *access, void *data) { struct ofono_modem *modem = data; struct sim_manager_data *sim = modem->sim_manager; |