/*=========================================================================== FUNCTION loc_ni_respond DESCRIPTION Displays the NI request and awaits user input. If a previous request is in session, the new one is handled using sys.ni_default_response (if exists); otherwise, it is denied. DEPENDENCY Do not lock the data by mutex loc_ni_lock RETURN VALUE none ===========================================================================*/ static void loc_ni_respond(rpc_loc_ni_user_resp_e_type resp, const rpc_loc_ni_event_s_type *request_pass_back ) { ALOGD("Sending NI response: %s\n", respond_from_enum(resp)); rpc_loc_ioctl_data_u_type data; rpc_loc_ioctl_callback_s_type callback_payload; memcpy(&data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.ni_event_pass_back, request_pass_back, sizeof (rpc_loc_ni_event_s_type)); data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.user_resp = resp; loc_eng_ioctl( loc_eng_data.client_handle, RPC_LOC_IOCTL_INFORM_NI_USER_RESPONSE, &data, LOC_IOCTL_DEFAULT_TIMEOUT, &callback_payload ); }
/*=========================================================================== FUNCTION qct_loc_eng_inject_xtra_data DESCRIPTION Injects XTRA file into the engine. DEPENDENCIES N/A RETURN VALUE 0: success error code > 0 SIDE EFFECTS N/A ===========================================================================*/ static int qct_loc_eng_inject_xtra_data_one(char* data, int length) { int rpc_ret_val = RPC_LOC_API_GENERAL_FAILURE; boolean ret_val = 0; int total_parts; uint8 part; uint16 part_len; uint16 len_injected; rpc_loc_ioctl_data_u_type ioctl_data; rpc_loc_ioctl_e_type ioctl_type = RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA; rpc_loc_predicted_orbits_data_s_type *predicted_orbits_data_ptr; LOC_LOGD("qct_loc_eng_inject_xtra_data, xtra size = %d, data ptr = 0x%x\n", length, (int) data); predicted_orbits_data_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.predicted_orbits_data; predicted_orbits_data_ptr->format_type = RPC_LOC_PREDICTED_ORBITS_XTRA; predicted_orbits_data_ptr->total_size = length; total_parts = (length - 1) / XTRA_BLOCK_SIZE + 1; predicted_orbits_data_ptr->total_parts = total_parts; len_injected = 0; // O bytes injected ioctl_data.disc = ioctl_type; // XTRA injection starts with part 1 for (part = 1; part <= total_parts; part++) { predicted_orbits_data_ptr->part = part; predicted_orbits_data_ptr->part_len = XTRA_BLOCK_SIZE; if (XTRA_BLOCK_SIZE > (length - len_injected)) { predicted_orbits_data_ptr->part_len = length - len_injected; } predicted_orbits_data_ptr->data_ptr.data_ptr_len = predicted_orbits_data_ptr->part_len; predicted_orbits_data_ptr->data_ptr.data_ptr_val = data + len_injected; LOC_LOGD("qct_loc_eng_inject_xtra_data, part %d/%d, len = %d, total = %d\n", predicted_orbits_data_ptr->part, total_parts, predicted_orbits_data_ptr->part_len, len_injected); if (part < total_parts) { // No callback in this case rpc_ret_val = loc_ioctl (loc_eng_data.client_handle, ioctl_type, &ioctl_data); if (rpc_ret_val != RPC_LOC_API_SUCCESS) { ret_val = EIO; // return error LOC_LOGE("loc_ioctl for xtra error: %s\n", loc_get_ioctl_status_name(rpc_ret_val)); break; } } else // part == total_parts { // Last part injection, will need to wait for callback if (!loc_eng_ioctl(loc_eng_data.client_handle, ioctl_type, &ioctl_data, LOC_XTRA_INJECT_DEFAULT_TIMEOUT, NULL)) { ret_val = EIO; LOC_LOGE("loc_eng_ioctl for xtra error\n"); } break; // done with injection } len_injected += predicted_orbits_data_ptr->part_len; LOC_LOGD("loc_ioctl XTRA injected length: %d\n", len_injected); } return ret_val; }
/*=========================================================================== FUNCTION qct_loc_eng_inject_xtra_data DESCRIPTION Injects XTRA file into the engine. DEPENDENCIES N/A RETURN VALUE 0: success >0: failure SIDE EFFECTS N/A ===========================================================================*/ static int qct_loc_eng_inject_xtra_data(char* data, int length) { int rpc_ret_val = RPC_LOC_API_GENERAL_FAILURE; boolean ret_val = 0; int total_parts; uint8 part; uint16 part_len; uint16 len_injected; rpc_loc_ioctl_data_u_type ioctl_data; rpc_loc_predicted_orbits_data_s_type *predicted_orbits_data_ptr; LOGV ("qct_loc_eng_inject_xtra_data, xtra size = %d, data ptr = 0x%x\n", length, (int) data); ioctl_data.disc = RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA; predicted_orbits_data_ptr = &(ioctl_data.rpc_loc_ioctl_data_u_type_u.predicted_orbits_data); predicted_orbits_data_ptr->format_type = RPC_LOC_PREDICTED_ORBITS_XTRA; predicted_orbits_data_ptr->total_size = length; total_parts = (length / XTRA_BLOCK_SIZE); if ((total_parts % XTRA_BLOCK_SIZE) != 0) { total_parts += 1; } predicted_orbits_data_ptr->total_parts = total_parts; len_injected = 0; // O bytes injected // XTRA injection starts with part 1 for (part = 1; part <= total_parts; part++) { predicted_orbits_data_ptr->part = part; predicted_orbits_data_ptr->part_len = XTRA_BLOCK_SIZE; if (XTRA_BLOCK_SIZE > (length - len_injected)) { predicted_orbits_data_ptr->part_len = length - len_injected; } predicted_orbits_data_ptr->data_ptr.data_ptr_len = predicted_orbits_data_ptr->part_len; predicted_orbits_data_ptr->data_ptr.data_ptr_val = data + len_injected; LOGV ("qct_loc_eng_inject_xtra_data, inject part = %d, len = %d, len = %d\n", predicted_orbits_data_ptr->part, predicted_orbits_data_ptr->part_len, predicted_orbits_data_ptr->data_ptr.data_ptr_len); LOGV ("qct_loc_eng_inject_xtra_data, total part = %d, len = %d \n", predicted_orbits_data_ptr->part, predicted_orbits_data_ptr->part_len); if (part < total_parts) { // No callback in this case rpc_ret_val = loc_ioctl (loc_eng_data.client_handle, RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA, &ioctl_data); if (rpc_ret_val != RPC_LOC_API_SUCCESS) { LOGE ("loc_ioctl for xtra returned %d \n", rpc_ret_val); ret_val = EINVAL; // return error break; } } else // part == total_parts { // Last part injection, will need to wait for callback ret_val = loc_eng_ioctl (loc_eng_data.client_handle, RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA, &ioctl_data, LOC_XTRA_INJECT_DEFAULT_TIMEOUT, NULL /* No output information is expected*/); break; // done with injection } len_injected += predicted_orbits_data_ptr->part_len; LOGV ("loc_ioctl for xtra len injected %d \n", len_injected); } return ret_val; }