📄 jam_msg_handler.c
字号:
kal_retrieve_eg_events( jblendia_eventgroup, JBLENDIA_SYS_EVENT, KAL_OR_CONSUME, &flag, KAL_NO_SUSPEND);
if (flag & JBLENDIA_SYS_EVENT)
{
kal_prompt_trace(MOD_J2ME,"get_event_general returns!");
return J2ME_NO_ERROR;
}
#endif /* __JBLENDIA__ */
kal_get_time(&temp_time);
current_time = temp_time;
if (current_time >= start_time)
{
if ((((current_time - start_time) * 4725) >> 10) > (kal_int64)wait_in_ms)
{
return -1;
}
} else
{
if (((((0xFFFFFFFFL) - start_time + current_time) * 4725) >> 10) > (kal_int64)wait_in_ms)
{
return -1;
}
}
/* Sleep for a while, and polling again. */
kal_sleep_task(10);
} else
{
ASSERT(0);
}
} while (wait_forever || wait_in_ms > 0);
return -1;
}
/*****************************************************************************
* FUNCTION
* get_next_event
* DESCRIPTION
* get next event
* PARAMETERS
* wait_forever [IN]
* expected_msg [IN]
* clean_msg [IN]
* must_match [IN]
* abort_msg_received [?]
* RETURNS
* The important information in the event
*****************************************************************************/
static kal_int32 g_jvm_incoming_call_serial_for_install = 0;
kal_int32 get_next_event(
kal_bool wait_forever,
msg_type expected_msg,
kal_bool clean_msg,
kal_bool must_match,
kal_bool *abort_msg_received)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
ilm_struct current_ilm;
kal_int32 returnValue = 0;
j2me_state_struct *saveState = j2me_current_state;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
reGetMessage:
j2me_current_state = saveState;
/* Wait forever case */
/* Wait forever case */
do
{
kal_status status = KAL_Q_EMPTY;
kal_uint16 msg_size;
if (is_cmcc_715 && (g_jvm_incoming_call_serial_for_install != jvm_incoming_call_serial()) &&
(install_update_status.is_normal_install || install_update_status.is_update))
{
goto incomming_exit;
}
status = kal_deque_msg(task_info_g[INDX_J2ME].task_ext_qid, (void*)¤t_ilm, &msg_size, KAL_NO_WAIT);
if (status == KAL_SUCCESS)
{
/* we should process common event first. add by hjf, modified by Justin */
if (j2me_task_general_msg_handler(¤t_ilm) &&
current_ilm.msg_id != MSG_ID_MMI_JAVA_ABORT_REQ)
{
free_ilm(¤t_ilm);
continue;
}
/* SHK: General message can not handle the incoming message. */
break;
}
else if (status == KAL_Q_EMPTY)
{
if (!wait_forever)
{
return J2ME_NO_ERROR;
}
/* Sleep for a while, and polling again. */
kal_sleep_task(10);
} else
{
ASSERT(0);
}
} while (wait_forever);
kal_trace(TRACE_FUNC, FUNC_J2ME_GET_NEXT_EVENT, expected_msg, current_ilm.msg_id);
/* SHK: If we set must_match, then we fail to receive MSG_ID_MMI_JAVA_ABORT_REQ message. */
if (must_match && current_ilm.msg_id != expected_msg)
{
if(current_ilm.msg_id == MSG_ID_MMI_JAVA_ABORT_REQ)
{
*abort_msg_received = KAL_TRUE;
}
free_ilm(¤t_ilm);
goto reGetMessage;
}
/* handle abort from MMI or WAP */
switch (current_ilm.msg_id)
{
case MSG_ID_MMI_JAVA_ABORT_REQ:
{
mmi_java_abort_req_struct *abort_req_ptr;
mmi_java_abort_cnf_struct *abort_cnf_ptr;
ilm_struct *send_ilm;
abort_req_ptr = (mmi_java_abort_req_struct*) current_ilm.local_para_ptr;
abort_cnf_ptr = construct_local_para(sizeof(mmi_java_abort_cnf_struct), TD_CTRL);
abort_cnf_ptr->session_id = abort_req_ptr->session_id;
abort_cnf_ptr->error_code = J2ME_NO_ERROR;
send_ilm = allocate_ilm(MOD_J2ME);
send_ilm->src_mod_id = MOD_J2ME;
send_ilm->dest_mod_id = MOD_MMI;
send_ilm->local_para_ptr = (local_para_struct*) abort_cnf_ptr;
send_ilm->peer_buff_ptr = NULL;
send_ilm->msg_id = MSG_ID_MMI_JAVA_ABORT_CNF;
send_ilm->sap_id = J2ME_MMI_SAP;
/* ??? can check_incoming_call_and_block() be removed? */
check_incoming_call_and_block();
msg_send_ext_queue(send_ilm);
/* the message should be freed here!!! */
free_ilm(¤t_ilm);
incomming_exit:
install_update_status.can_be_aborted = KAL_FALSE;
install_update_status.is_aborted = KAL_TRUE;
g_jvm_allowed_sending_abort_from_idle = KAL_TRUE;
if (abort_msg_received == NULL)
{
return 0;
} else
{
*abort_msg_received = KAL_TRUE;
return -1;
}
}
/* MIDlet Start/Stop */
case MSG_ID_MMI_JAVA_MID_START_REQ:
J2ME_SET_STATE(run);
j2me_process_ilm(¤t_ilm);
break;
/* Update MIDlet Suite */
case MSG_ID_MMI_JAVA_MIDS_UPDATE_REQ:
mids_update_req_handler(¤t_ilm);
break;
/* Remove MIDlet Suite */
case MSG_ID_MMI_JAVA_MIDS_REMOVE_REQ:
J2ME_SET_STATE(remove);
j2me_process_ilm(¤t_ilm);
break;
/* Install MIDlet Suite */
case MSG_ID_JAVA_WAP_INSTALL_MIDS_IND:
J2ME_SET_STATE(install);
j2me_process_ilm(¤t_ilm);
break;
}
if (clean_msg)
{
kal_trace(TRACE_FUNC, FUNC_J2ME_GET_NEXT_EVENT_CLEAN, current_ilm.msg_id);
free_ilm(¤t_ilm);
/* recursively call until message queue empty */
goto reGetMessage;
}
/* check if the massage should be presented in the current state */
{
/* if (expected_msg == 0) {
kal_int32 msg_indx = current_ilm.msg_id - j2me_current_state->msg_begin;
if ((msg_indx < 0) || (msg_indx >= (kal_int32)j2me_current_state->msgs_limit) ) {
ASSERT(msg_indx == 0);
}
} else
EXT_ASSERT(current_ilm.msg_id == expected_msg, current_ilm.msg_id, expected_msg, 0); */
}
switch (current_ilm.msg_id)
{
/* remove MIDlet Suite confirm response */
case MSG_ID_MMI_JAVA_MIDS_REMOVE_CONFIRM_RES:
{
mmi_java_mids_remove_confirm_res_struct *remove_res_ptr;
remove_res_ptr = (mmi_java_mids_remove_confirm_res_struct*) current_ilm.local_para_ptr;
ASSERT(remove_session_id == remove_res_ptr->session_id);
if (remove_res_ptr->confirm == KAL_TRUE)
{
returnValue = (kal_int32) TRUE;
} else
{
returnValue = (kal_int32) FALSE;
}
break;
}
case MSG_ID_MMI_JAVA_INSTALL_RESET_RMS_RES:
{
mmi_java_install_reset_rms_res_struct *reset_rms_res;
reset_rms_res = (mmi_java_install_reset_rms_res_struct*) current_ilm.local_para_ptr;
ASSERT(install_session_id == reset_rms_res->session_id);
if (reset_rms_res->confirm == KAL_TRUE)
{
returnValue = (kal_int32) TRUE;
} else
{
returnValue = (kal_int32) FALSE;
}
break;
}
case MSG_ID_MMI_JAVA_INSTALL_CONFIRM_RES:
{
mmi_java_install_confirm_res_struct *install_cnf_res;
install_cnf_res = (mmi_java_install_confirm_res_struct*) current_ilm.local_para_ptr;
ASSERT(install_session_id == install_cnf_res->session_id);
if (install_cnf_res->confirm == KAL_TRUE)
{
returnValue = (kal_int32) TRUE;
} else
{
returnValue = (kal_int32) FALSE;
}
break;
}
/* case MSG_ID_MMI_JAVA_GET_FILE_AND_SAVE_RES:
{
mmi_java_get_file_and_save_res_struct *get_file_res;
get_file_res = (mmi_java_get_file_and_save_res_struct *)current_ilm.local_para_ptr;
ASSERT(install_session_id == get_file_res->session_id);
returnValue = get_file_res->progress;
break;
} */
case MSG_ID_JAVA_WAP_GET_FILE_AND_SAVE_CNF:
{
java_wap_get_file_and_save_cnf_struct *get_file_cnf;
get_file_cnf = (java_wap_get_file_and_save_cnf_struct*) current_ilm.local_para_ptr;
download_error_code = get_file_cnf->download_error_code;
ASSERT(install_session_id == get_file_cnf->session_id);
returnValue = get_file_cnf->error_code;
break;
}
case MSG_ID_JAVA_WAP_POST_DATA_CNF:
{
java_wap_post_data_cnf_struct *post_data_cnf;
post_data_cnf = (java_wap_post_data_cnf_struct*) current_ilm.local_para_ptr;
if (post_data_cnf->header != NULL)
{
free_ctrl_buffer(post_data_cnf->header);
}
if (post_data_cnf->error_code == J2ME_NO_ERROR)
{
returnValue = post_data_cnf->http_return_code;
} else
{
returnValue = -1;
}
break;
}
case MSG_ID_MMI_JAVA_GET_FILE_AND_SAVE_RES:
{
returnValue = 0;
}
break;
case MSG_ID_WAP_GET_PROF_CONTENT_RSP:
{
/* backup the wap_get_prof_content_rsp_struct to wap_prof variable */
memcpy((void*)&wap_prof, (void*)current_ilm.local_para_ptr, sizeof(wap_get_prof_content_rsp_struct));
}
break;
case MSG_ID_WAP_MMC_GET_MMS_PROF_RSP:
{
wap_mmc_get_mms_prof_rsp_struct *mms_prof_rsp;
mms_prof_rsp = (wap_mmc_get_mms_prof_rsp_struct*) current_ilm.local_para_ptr;
memset(j2me_mms_mmsc_addr, 0, J2ME_MMS_MMSC_ADDR_LEN);
if (mms_prof_rsp->result == 0)
{ /* success */
int len = mms_prof_rsp->value_len;
if (len > J2ME_MMS_MMSC_ADDR_LEN)
{
len = J2ME_MMS_MMSC_ADDR_LEN;
}
memcpy((void*)j2me_mms_mmsc_addr, (void*)mms_prof_rsp->value, len);
}
}
break;
/* Get user agent header from WAP */
/* case MSG_ID_WAP_GET_USER_AGENT_RSP:
{
wap_get_user_agent_rsp_struct *user_agent_rsp;
user_agent_rsp = (wap_get_user_agent_rsp_struct*) current_ilm.local_para_ptr;
jam_set_user_agent(user_agent_rsp->user_agent, user_agent_rsp->user_agent_len);
}
break; */
case MSG_ID_WAP_GET_BRA_PROF_ID_RSP:
{
/* SHK: I modify the return value to prof_id and query the GPRS/CSD ID pair again. */
/* SHK: Backup the wap_get_prof_content_rsp_struct to wap_bra_prof variable */
memcpy((void*)&wap_bra_prof, (void*)current_ilm.local_para_ptr, sizeof(wap_get_bra_prof_id_rsp_struct));
}
break;
case MSG_ID_MMI_JAVA_GET_CONFIRM_RES:
{
returnValue = ((mmi_java_get_confirm_res_struct*) current_ilm.local_para_ptr)->confirm;
}
break;
case MSG_ID_MMI_JAVA_GET_INSTALL_DRV_RES:
{
returnValue = ((mmi_java_get_install_drv_res_struct*) current_ilm.local_para_ptr)->drv;
}
break;
case MSG_ID_MMS_GET_ACTIVE_MMS_ATTACHMENT_RSP:
{
mms_get_attachment_rsp_struct* msg = (mms_get_attachment_rsp_struct*)current_ilm.local_para_ptr;
if (msg->result == 1)
{
kal_int32 len = get_ucs2_len(msg->filepath);
kal_wchar* file_path = get_ctrl_buffer((len << 1) + 2);
memcpy(file_path, msg->filepath, (len << 1) + 2);
returnValue = (kal_int32) file_path;
} else
{
returnValue = 0;
}
}
break;
case MSG_ID_MMI_JAVA_GET_AUTH_RES:
{
mmi_java_get_auth_res_struct* msg = (mmi_java_get_auth_res_struct*)current_ilm.local_para_ptr;
msg->username[MMI_JAVA_AUTH_LEN_USERNAME - 1] = 0;
msg->password[MMI_JAVA_AUTH_LEN_PASSWORD - 1] = 0;
trans_ucs2_to_utf8((kal_char*)msg->username, (kal_wchar*)msg->username);
trans_ucs2_to_utf8((kal_char*)msg->password, (kal_wchar*)msg->password);
memcpy(ota_user_name, msg->username, MMI_JAVA_AUTH_LEN_USERNAME);
memcpy(ota_passwd, msg->password, MMI_JAVA_AUTH_LEN_PASSWORD);
returnValue = 0;
}
break;
case MSG_ID_WPS_SEC_VERIFY_CERT_CHAIN_RSP:
{
wps_sec_verify_cert_chain_rsp_struct *verify_cert_chain_rsp;
verify_cert_chain_rsp = (wps_sec_verify_cert_chain_rsp_struct*) current_ilm.local_para_ptr;
jnw_http_verify_cert_chain_handler (verify_cert_chain_rsp->format, verify_cert_chain_rsp->root_len, verify_cert_chain_rsp->root_cert);
returnValue = verify_cert_chain_rsp->result;
}
break;
default:
{
free_ilm(¤t_ilm);
goto reGetMessage;
}
}
free_ilm(¤t_ilm);
return returnValue;
}
/*************************************************************************
* Message Handler
*************************************************************************/
/*****************************************************************************
* FUNCTION
* mids_getlist_req_handler
* DESCRIPTION
* a. In mids_getlist_req_handler(), must free last getlist confirm memory
* before to allocate this getlist confirm memory. That means system at
* most use 1 memory region as mids getlist confirm.
*
* b. In mid_getlist_req_handler(), system can keep mids getlist memory.
*
* c. mids getlist mids list memory is allocated from Java runtime memory pool,
* that means the memory will be destroyed after VM start.
* PARAMETERS
* ilm_ptr [?]
* RETURNS
* void
*****************************************************************************/
void mids_getlist_req_handler(ilm_struct *ilm_ptr)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
ilm_struct *send_ilm;
kal_int32 error_code = J2ME_NO_ERROR;
mmi_java_mids_getlist_req_struct *getlist_req_ptr;
mmi_java_mids_getlist_cnf_struct *getlist_cnf_ptr;
mids_list_struct *pmids_list = NULL;
kal_int32 i, mids_count = 0;
mids_list_info_struct *mids_info_ptr;
kal_int32 mids_start_indx, mids_list_count;
game_type_enum type = GAMETYPE_INVALID_TYPE;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_FUNC, FUNC_J2ME_MIDS_GETLIST_REQ_HANDLER);
getlist_req_ptr = (mmi_java_mids_getlist_req_struct*) ilm_ptr->local_para_ptr;
mids_start_indx = (kal_int32) getlist_req_ptr->start_indx;
type = (game_type_enum)getlist_req_ptr->game_type;
/* Update working internal system directory path */
work_sys_dir_path = _jvm_get_dir_path(type);
work_info_ptr = _jvm_get_builtin_file_info(type);
/* Try to get whole list */
error_code = jam_parse_midslistfile(type, mids_start_indx, JAVA_LIST_CACHE_COUNT,
&saved_mids_listfile_ptr);
mids_start_indx = mids_list_count = -1;
if (error_code == J2ME_INSUFFICIENT_MEMORY)
{
/* If have at lease one mids, seem successful */
if (saved_mids_listfile_ptr && (saved_mids_listfile_ptr->mids_avail_count > 0))
{
error_code = J2ME_NO_ERROR;
}
mids_start_indx = saved_mids_listfile_ptr->mids_avail_indx;
mids_list_count = saved_mids_listfile_ptr->mids_avail_count;
} else if (error_code == J2ME_NO_ERROR && saved_mids_listfile_ptr)
{
mids_start_indx = saved_mids_listfile_ptr->mids_avail_indx;
mids_list_count = saved_mids_listfile_ptr->mids_avail_count;
} else
{
/* if error, free previous saved listfile info */
jam_call_back_functions.jam_free_list(type);
mids_start_indx = mids_list_count = 0;
}
if (saved_mids_listfile_ptr && saved_mids_listfile_ptr->mids_avail_count)
{
mids_count = saved_mids_listfile_ptr->mids_count;
getlist_cnf_ptr =
(mmi_java_mids_getlist_cnf_struct*)
construct_local_para(
(kal_uint16) (sizeof(mmi_java_mids_getlist_cnf_struct) + (saved_mids_listfile_ptr->mids_avail_count - 1) * sizeof(mids_list_struct)),
TD_CTRL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -