EC_BOOL csrv_req_clean(struct _TASK_FUNC *task_req_func) { FUNC_ADDR_NODE *func_addr_node; TYPE_CONV_ITEM *type_conv_item; UINT32 para_idx; if(0 != dbg_fetch_func_addr_node_by_index(task_req_func->func_id, &func_addr_node)) { dbg_log(SEC_0112_CSRV, 0)(LOGSTDOUT, "error:csrv_req_clean: failed to fetch func addr node by func id %lx\n", task_req_func->func_id); return (EC_FALSE); } if(e_dbg_void != func_addr_node->func_ret_type) { type_conv_item = dbg_query_type_conv_item_by_type(func_addr_node->func_ret_type); if( NULL_PTR == type_conv_item ) { dbg_log(SEC_0112_CSRV, 0)(LOGSTDOUT,"error:csrv_req_clean: ret type %ld conv item is not defined\n", func_addr_node->func_ret_type); return (EC_FALSE); } if(EC_TRUE == TYPE_CONV_ITEM_VAR_POINTER_FLAG(type_conv_item) && 0 != task_req_func->func_ret_val) { free_static_mem(TYPE_CONV_ITEM_VAR_MM_TYPE(type_conv_item), (void *)(task_req_func->func_ret_val), LOC_CSRV_0008); task_req_func->func_ret_val = 0; } } for( para_idx = 0; para_idx < task_req_func->func_para_num; para_idx ++ ) { FUNC_PARA *func_para; func_para = &(task_req_func->func_para[ para_idx ]); type_conv_item = dbg_query_type_conv_item_by_type(func_addr_node->func_para_type[ para_idx ]); if( NULL_PTR == type_conv_item ) { dbg_log(SEC_0112_CSRV, 0)(LOGSTDOUT,"error:csrv_req_clean: para %ld type %ld conv item is not defined\n", para_idx, func_addr_node->func_para_type[ para_idx ]); return (EC_FALSE); } if(EC_TRUE == TYPE_CONV_ITEM_VAR_POINTER_FLAG(type_conv_item) && 0 != func_para->para_val) { free_static_mem(TYPE_CONV_ITEM_VAR_MM_TYPE(type_conv_item), (void *)(func_para->para_val), LOC_CSRV_0009); func_para->para_val = 0; } } return (EC_TRUE); }
EC_BOOL cextsrv_req_decode(CEXTSRV *cextsrv, const UINT8 *in_buff, const UINT32 in_buff_len, TASK_FUNC *task_req_func) { UINT32 recv_comm; FUNC_ADDR_NODE *func_addr_node; TYPE_CONV_ITEM *type_conv_item; UINT32 position; recv_comm = CMPI_ANY_COMM; position = 0; cmpi_decode_uint32(recv_comm, in_buff, in_buff_len, &(position), &(task_req_func->func_id)); cmpi_decode_uint32(recv_comm, in_buff, in_buff_len, &(position), &(task_req_func->func_para_num)); if(0 != dbg_fetch_func_addr_node_by_index(task_req_func->func_id, &func_addr_node)) { dbg_log(SEC_0069_CEXTSRV, 0)(LOGSTDOUT, "error:cextsrv_req_decode: failed to fetch func addr node by func id %lx\n", task_req_func->func_id); return (EC_FALSE); } type_conv_item = dbg_query_type_conv_item_by_type(func_addr_node->func_ret_type); if( NULL_PTR == type_conv_item ) { dbg_log(SEC_0069_CEXTSRV, 0)(LOGSTDOUT,"error:cextsrv_req_decode: ret type %ld conv item is not defined\n", func_addr_node->func_ret_type); return (EC_FALSE); } if(EC_TRUE == TYPE_CONV_ITEM_VAR_POINTER_FLAG(type_conv_item)) { alloc_static_mem(MD_TASK, 0, TYPE_CONV_ITEM_VAR_MM_TYPE(type_conv_item), (void **)&(task_req_func->func_ret_val), LOC_CEXTSRV_0007); dbg_tiny_caller(2, TYPE_CONV_ITEM_VAR_INIT_FUNC(type_conv_item), CMPI_ANY_MODI, task_req_func->func_ret_val); } if(EC_FALSE == task_req_func_para_decode(recv_comm, in_buff, in_buff_len, &(position), &(task_req_func->func_para_num), (FUNC_PARA *)task_req_func->func_para, func_addr_node)) { dbg_log(SEC_0069_CEXTSRV, 0)(LOGSTDOUT, "error:cextsrv_req_decode: decode func paras failed\n"); if(EC_TRUE == TYPE_CONV_ITEM_VAR_POINTER_FLAG(type_conv_item) && 0 != task_req_func->func_ret_val) { free_static_mem(MD_TASK, 0, TYPE_CONV_ITEM_VAR_MM_TYPE(type_conv_item), (void *)(task_req_func->func_ret_val), LOC_CEXTSRV_0008); } return (EC_FALSE); } return (EC_TRUE); }
EC_BOOL cextsrv_rsp_encode(CEXTSRV *cextsrv, UINT8 *out_buff, const UINT32 out_buff_max_len, UINT32 *out_buff_len, TASK_FUNC *task_rsp_func) { UINT32 send_comm; FUNC_ADDR_NODE *func_addr_node; TYPE_CONV_ITEM *type_conv_item; UINT32 position; send_comm = CMPI_ANY_COMM; position = 0; if(0 != dbg_fetch_func_addr_node_by_index(task_rsp_func->func_id, &func_addr_node)) { dbg_log(SEC_0069_CEXTSRV, 0)(LOGSTDOUT, "error:cextsrv_rsp_encode: failed to fetch func addr node by func id %lx\n", task_rsp_func->func_id); return (EC_FALSE); } if(e_dbg_void != func_addr_node->func_ret_type) { type_conv_item = dbg_query_type_conv_item_by_type(func_addr_node->func_ret_type); if( NULL_PTR == type_conv_item ) { dbg_log(SEC_0069_CEXTSRV, 0)(LOGSTDOUT,"error:cextsrv_rsp_encode: ret type %ld conv item is not defined\n", func_addr_node->func_ret_type); return (EC_FALSE); } dbg_tiny_caller(5, TYPE_CONV_ITEM_VAR_ENCODE_FUNC(type_conv_item), send_comm, task_rsp_func->func_ret_val, out_buff, out_buff_max_len, &(position)); if(EC_TRUE == TYPE_CONV_ITEM_VAR_POINTER_FLAG(type_conv_item) && 0 != task_rsp_func->func_ret_val) { dbg_tiny_caller(2, TYPE_CONV_ITEM_VAR_CLEAN_FUNC(type_conv_item), CMPI_ANY_MODI, task_rsp_func->func_ret_val);/*WARNING: SHOULD NOT BE 0*/ free_static_mem(MD_TASK, CMPI_ANY_MODI, TYPE_CONV_ITEM_VAR_MM_TYPE(type_conv_item), (void *)task_rsp_func->func_ret_val, LOC_CEXTSRV_0009);/*clean up*/ task_rsp_func->func_ret_val = 0; } } task_rsp_func_para_encode(send_comm, task_rsp_func->func_para_num, (FUNC_PARA *)task_rsp_func->func_para, func_addr_node, out_buff, out_buff_max_len, &(position)); (*out_buff_len) = position;/*set to real length*/ return (EC_TRUE); }