示例#1
0
/*===========================================================================

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;
}