📄 phb_handler_write.c
字号:
}
}
phb_control_block_set_param(control_block, WRITE_USIM_ANR, NULL, NULL);
phb_control_block_set(
control_block,
phb_write_continue,
phb_write_usim_handler,
phb_write_err_handler,
WRITE_USIM_ANR);
phb_control_block_set_IO(control_block, l4cphb_write_req->type, phb_entry->index, 1);
/**
* Temporarily stores number of entries to be piggybacked.
* Don't forget to restore it back to control_block->total before read_fake(), if necessary.
*/
control_block->total_piggyback = l4cphb_write_req->total;
/* set storage, record_index, primary_ID, and secondary_ID */
if (phb_se_set_control_block(
control_block,
OP_WRITE,
phb_entry->storage,
phb_entry->record_index) == KAL_FALSE)
{
phb_write_usim_err_handler(NULL, control_block);
return;
}
if (l4c_is_src_from_rmmi(control_block->src_id))
{
phb_entry->index = control_block->index;
}
/* data stores data to be written, and length is record size of storage */
control_block->data = (kal_uint8*) & control_block->temp_entry;
control_block->length = phb_data_desc_get_record_size(phb_data_desc_get_desc_by_ID(control_block->primary_ID));
phb_write_continue(NULL, control_block);
}
/* error */
else
{
phb_write_usim_err_handler(NULL, control_block);
return;
}
}
/* error */
else
{
kal_trace(TRACE_ERROR, ERROR_PHB_STATE);
control_block->actual_count = 0;
phb_free_control_block(control_block);
control_block = NULL;
phb_write_usim_confirm(PHB_ERRNO_BUSY, 0, l4cphb_write_req->src_id, control_block);
return;
}
}
/* Write ANR */
else if (control_block->proc_stage <= WRITE_USIM_ANR && phb_ptr->anra_type != 0)
{
kal_uint16 anr_index = 0;
phb_control_block_set_param(control_block, WRITE_USIM_EMAIL, NULL, NULL);
if (phb_ptr->anra_type == 1)
{
anr_index = control_block->temp_entry.record_index;
}
else if (phb_ptr->anra_type == 2)
{
/* add operation */
if (control_block->temp_anra.adn_record_index == (kal_uint16) PHB_INVALID_VALUE &&
control_block->temp_anra.tel_number.addr_length == 0)
{
/* don't need to write e-mail field */
phb_write_usim_handler(NULL, control_block);
return;
}
else /* add non-empty email or edit operation */
{
anr_index = phb_se_iap_index_find(control_block->temp_anra.adn_record_index, DATA_DESC_ANRA);
if (anr_index == (kal_uint16) PHB_INVALID_VALUE)
{
anr_index = phb_data_desc_find_next_free(DATA_DESC_ANRA);
}
control_block->temp_anra.record_index = anr_index;
}
/* the final adn index. */
control_block->temp_anra.adn_record_index = control_block->temp_entry.record_index;
}
phb_control_block_set(
control_block,
phb_write_continue,
phb_write_usim_handler,
phb_write_err_handler,
WRITE_USIM_EMAIL);
phb_control_block_set_IO(control_block, PHB_ANR, anr_index, 1);
/* set storage, record_index, primary_ID, and secondary_ID */
control_block->primary_ID = FILE_G_ANR_IDX;
control_block->secondary_ID = FILE_G_EXT1_IDX;
kal_mem_cpy(control_block->path, usim_ef_info[FILE_G_PHONEBOOK_IDX].full_path, 4);
control_block->path[4] = phb_ptr->path[DATA_DESC_ANRA][0];
control_block->path[5] = phb_ptr->path[DATA_DESC_ANRA][1];
// TODO: need more test
control_block->record_index = anr_index;
/*
* if (phb_se_set_control_block(control_block,
* OP_WRITE,
* PHB_SIM,
* control_block->temp_entry.index) ==
* KAL_FALSE)
* {
* phb_write_usim_err_handler(NULL, control_block);
* return;
* }
*/
//if (control_block->src_id == RMMI_SRC)
// phb_entry->index = control_block->index;
/* data stores data to be written, and length is record size of storage */
control_block->data = (kal_uint8*) & control_block->temp_anra;
control_block->length = phb_data_desc_get_record_size(phb_data_desc_get_desc_by_ID(control_block->primary_ID));
phb_write_continue(NULL, control_block);
}
/* Write EMAIL */
else if (control_block->proc_stage <= WRITE_USIM_EMAIL && phb_ptr->email_type != 0)
{
kal_uint16 email_index = (kal_uint16) PHB_INVALID_VALUE;
phb_control_block_set_param(control_block, WRITE_USIM_SNE, NULL, NULL);
if (phb_ptr->email_type == 1)
{
email_index = control_block->temp_entry.record_index;
}
else if (phb_ptr->email_type == 2)
{
/* add operation */
if (control_block->temp_email_entry.adn_record_index == (kal_uint16) PHB_INVALID_VALUE &&
control_block->temp_email_entry.email_length == 0)
{
/* don't need to write e-mail field */
phb_write_usim_handler(NULL, control_block);
return;
}
else /* add non-empty email or edit operation */
{
email_index = phb_se_iap_index_find(control_block->temp_email_entry.adn_record_index, DATA_DESC_EMAIL);
if (email_index == (kal_uint16) PHB_INVALID_VALUE && control_block->temp_email_entry.email_length == 0) /* both empty */
{
/* don't need to write e-mail field */
phb_write_usim_handler(NULL, control_block);
return;
}
else if (email_index != (kal_uint16) PHB_INVALID_VALUE && control_block->temp_email_entry.email_length == 0) /* modify from non-empty to empty */
{
/* no releation with adn. */
control_block->temp_email_entry.adn_record_index = 0xFF;
control_block->temp_iap[phb_ptr->iap_email] = 0xFF;
}
else
{
if (email_index == (kal_uint16) PHB_INVALID_VALUE) /* origin is empty */
{
email_index = phb_data_desc_find_next_free(DATA_DESC_EMAIL);
if (email_index == (kal_uint16) PHB_INVALID_VALUE) /* can't find empty record */
{
ASSERT(0);
phb_write_usim_handler(NULL, control_block);
return;
}
}
/* the final adn index. */
control_block->temp_email_entry.adn_record_index = control_block->temp_entry.record_index;
control_block->temp_iap[phb_ptr->iap_email] = email_index;
}
control_block->temp_email_entry.record_index = email_index;
}
}
phb_control_block_set(
control_block,
phb_write_continue,
phb_write_usim_handler,
phb_write_err_handler,
WRITE_USIM_SNE);
phb_control_block_set_IO(control_block, PHB_EMAIL, email_index, 1);
/* set storage, record_index, primary_ID, and secondary_ID */
control_block->primary_ID = FILE_G_EMAIL_IDX;
control_block->secondary_ID = FILE_NONE;
kal_mem_cpy(control_block->path, usim_ef_info[FILE_G_PHONEBOOK_IDX].full_path, 4);
control_block->path[4] = phb_ptr->path[DATA_DESC_EMAIL][0];
control_block->path[5] = phb_ptr->path[DATA_DESC_EMAIL][1];
control_block->record_index = email_index;
/*
* if (phb_se_set_control_block(control_block,
* OP_WRITE,
* PHB_SIM,
* control_block->temp_entry.index) ==
* KAL_FALSE)
* {
* phb_write_usim_err_handler(NULL, control_block);
* return;
* }
*/
//if (control_block->src_id == RMMI_SRC)
// phb_entry->index = control_block->index;
/* data stores data to be written, and length is record size of storage */
control_block->data = (kal_uint8*) & control_block->temp_email_entry;
control_block->length = phb_data_desc_get_record_size(phb_data_desc_get_desc_by_ID(control_block->primary_ID));
phb_write_continue(NULL, control_block);
}
/* Write IAP */
else if (control_block->proc_stage <= WRITE_USIM_IAP &&
phb_ptr->data_desc[DATA_DESC_IAP].record_size > 0)
{
phb_control_block_set_param(control_block,
WRITE_USIM_GRP,
NULL,
NULL);
phb_control_block_set(control_block,
phb_write_continue,
phb_write_usim_handler,
phb_write_err_handler,
WRITE_USIM_CONTINUE);
phb_control_block_set_IO(control_block,
PHB_IAP,
control_block->temp_entry.record_index,
1);
/* set storage, record_index, primary_ID, and secondary_ID */
control_block->primary_ID = FILE_G_IAP_IDX;
control_block->secondary_ID = FILE_NONE;
kal_mem_cpy(control_block->path, usim_ef_info[FILE_G_PHONEBOOK_IDX].full_path, 4);
control_block->path[4] = phb_ptr->path[DATA_DESC_IAP][0];
control_block->path[5] = phb_ptr->path[DATA_DESC_IAP][1];
control_block->record_index = control_block->temp_entry.record_index;
/* data stores data to be written, and length is record size of storage */
control_block->data = control_block->temp_iap;
control_block->length = phb_data_desc_get_record_size(phb_data_desc_get_desc_by_ID(control_block->primary_ID));
phb_write_continue(NULL, control_block);
}
/* Write Group */
else if (control_block->proc_stage <= WRITE_USIM_GRP && phb_ptr->data_desc[DATA_DESC_GRP].is_support)
{
phb_control_block_set_param(control_block, WRITE_USIM_CONTINUE, NULL, NULL);
phb_control_block_set(
control_block,
phb_write_continue,
phb_write_usim_handler,
phb_write_err_handler,
WRITE_USIM_CONTINUE);
phb_control_block_set_IO(control_block, PHB_GRP, control_block->temp_entry.record_index, 1);
/* set storage, record_index, primary_ID, and secondary_ID */
control_block->primary_ID = FILE_G_GRP_IDX;
control_block->secondary_ID = FILE_NONE;
kal_mem_cpy(control_block->path, usim_ef_info[FILE_G_PHONEBOOK_IDX].full_path, 4);
control_block->path[4] = phb_ptr->path[DATA_DESC_GRP][0];
control_block->path[5] = phb_ptr->path[DATA_DESC_GRP][1];
control_block->record_index = control_block->temp_entry.record_index;
/*
* if (phb_se_set_control_block(control_block,
* OP_WRITE,
* PHB_SIM,
* control_block->temp_entry.index) ==
* KAL_FALSE)
* {
* phb_write_usim_err_handler(NULL, control_block);
* return;
* }
*/
//if (control_block->src_id == RMMI_SRC)
// phb_entry->index = control_block->index;
/* data stores data to be written, and length is record size of storage */
*control_block->data = control_block->temp_group_id;
control_block->length = phb_data_desc_get_record_size(phb_data_desc_get_desc_by_ID(control_block->primary_ID));
phb_write_continue(NULL, control_block);
}
/* Write confirmed */
else if (control_block->proc_stage <= WRITE_USIM_CONTINUE)
{
/* Piggyback is not required. */
if (control_block->total_piggyback < 1)
{
phb_write_usim_confirm(
PHB_ERRNO_SUCCESS,
control_block->actual_count,
control_block->src_id,
control_block);
}
/* Piggyback is required */
else
{
/* Now we have to transform the state to a *FAKE* read state. */
phb_entry_struct *phb_entry;
/* Restore total_piggyback */
control_block->total = control_block->total_piggyback;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -