147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
234ee09551764b045fdc02df754157473125edf60Kevin Tang *
334ee09551764b045fdc02df754157473125edf60Kevin Tang * Redistribution and use in source and binary forms, with or without
434ee09551764b045fdc02df754157473125edf60Kevin Tang * modification, are permitted provided that the following conditions are
534ee09551764b045fdc02df754157473125edf60Kevin Tang * met:
634ee09551764b045fdc02df754157473125edf60Kevin Tang *     * Redistributions of source code must retain the above copyright
734ee09551764b045fdc02df754157473125edf60Kevin Tang *       notice, this list of conditions and the following disclaimer.
834ee09551764b045fdc02df754157473125edf60Kevin Tang *     * Redistributions in binary form must reproduce the above
934ee09551764b045fdc02df754157473125edf60Kevin Tang *       copyright notice, this list of conditions and the following
1034ee09551764b045fdc02df754157473125edf60Kevin Tang *       disclaimer in the documentation and/or other materials provided
1134ee09551764b045fdc02df754157473125edf60Kevin Tang *       with the distribution.
12e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo *     * Neither the name of The Linux Foundation, nor the names of its
1334ee09551764b045fdc02df754157473125edf60Kevin Tang *       contributors may be used to endorse or promote products derived
1434ee09551764b045fdc02df754157473125edf60Kevin Tang *       from this software without specific prior written permission.
1534ee09551764b045fdc02df754157473125edf60Kevin Tang *
1634ee09551764b045fdc02df754157473125edf60Kevin Tang * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1734ee09551764b045fdc02df754157473125edf60Kevin Tang * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1834ee09551764b045fdc02df754157473125edf60Kevin Tang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
1934ee09551764b045fdc02df754157473125edf60Kevin Tang * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2034ee09551764b045fdc02df754157473125edf60Kevin Tang * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2134ee09551764b045fdc02df754157473125edf60Kevin Tang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2234ee09551764b045fdc02df754157473125edf60Kevin Tang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2334ee09551764b045fdc02df754157473125edf60Kevin Tang * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2434ee09551764b045fdc02df754157473125edf60Kevin Tang * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2534ee09551764b045fdc02df754157473125edf60Kevin Tang * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2634ee09551764b045fdc02df754157473125edf60Kevin Tang * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2734ee09551764b045fdc02df754157473125edf60Kevin Tang *
2834ee09551764b045fdc02df754157473125edf60Kevin Tang */
2934ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOG_NDDEBUG 0
30e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#define LOG_TAG "LocSvc_api_rpc"
3134ee09551764b045fdc02df754157473125edf60Kevin Tang
3234ee09551764b045fdc02df754157473125edf60Kevin Tang#include <unistd.h>
3334ee09551764b045fdc02df754157473125edf60Kevin Tang#include <math.h>
34e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#ifndef USE_GLIB
3534ee09551764b045fdc02df754157473125edf60Kevin Tang#include <utils/SystemClock.h>
36e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#endif /* USE_GLIB */
37e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <LocApiRpc.h>
38e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <LocAdapterBase.h>
39e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <loc_api_fixup.h>
40e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <loc_api_rpc_glue.h>
41e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <log_util.h>
42e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <loc_log.h>
43e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <loc_api_log.h>
44e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#ifdef USE_GLIB
45e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <glib.h>
46e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#endif
47e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <librpc.h>
48e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <platform_lib_includes.h>
49e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
50e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russousing namespace loc_core;
5134ee09551764b045fdc02df754157473125edf60Kevin Tang
5234ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOC_XTRA_INJECT_DEFAULT_TIMEOUT (3100)
5334ee09551764b045fdc02df754157473125edf60Kevin Tang#define XTRA_BLOCK_SIZE                 (3072)
5434ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOC_IOCTL_DEFAULT_TIMEOUT 1000 // 1000 milli-seconds
5534ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOC_NI_NOTIF_KEY_ADDRESS           "Address"
5634ee09551764b045fdc02df754157473125edf60Kevin Tang
5734ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
5834ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_event_cb
5934ee09551764b045fdc02df754157473125edf60Kevin Tang
6034ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
6134ee09551764b045fdc02df754157473125edf60Kevin Tang   This is the callback function registered by loc_open.
6234ee09551764b045fdc02df754157473125edf60Kevin Tang
6334ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
6434ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
6534ee09551764b045fdc02df754157473125edf60Kevin Tang
6634ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
6734ee09551764b045fdc02df754157473125edf60Kevin Tang   RPC_LOC_API_SUCCESS
6834ee09551764b045fdc02df754157473125edf60Kevin Tang
6934ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
7034ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
7134ee09551764b045fdc02df754157473125edf60Kevin Tang
7234ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
7334ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int32 loc_event_cb
7434ee09551764b045fdc02df754157473125edf60Kevin Tang(
7534ee09551764b045fdc02df754157473125edf60Kevin Tang    void*                                user,
7634ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_client_handle_type           client_handle,
7734ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_event_mask_type              loc_event,
7834ee09551764b045fdc02df754157473125edf60Kevin Tang    const rpc_loc_event_payload_u_type*  loc_event_payload
7934ee09551764b045fdc02df754157473125edf60Kevin Tang)
8034ee09551764b045fdc02df754157473125edf60Kevin Tang{
8134ee09551764b045fdc02df754157473125edf60Kevin Tang    MODEM_LOG_CALLFLOW(%s, loc_get_event_name(loc_event));
8234ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_callback_log(loc_event, loc_event_payload);
83e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    int32 ret_val = ((LocApiRpc*)user)->locEventCB(client_handle, loc_event, loc_event_payload);
8434ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%d, ret_val);
8534ee09551764b045fdc02df754157473125edf60Kevin Tang    return ret_val;
8634ee09551764b045fdc02df754157473125edf60Kevin Tang}
8734ee09551764b045fdc02df754157473125edf60Kevin Tang
8834ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
8934ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_eng_rpc_global_cb
9034ee09551764b045fdc02df754157473125edf60Kevin Tang
9134ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
9234ee09551764b045fdc02df754157473125edf60Kevin Tang   This is the callback function registered by loc_open for RPC global events
9334ee09551764b045fdc02df754157473125edf60Kevin Tang
9434ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
9534ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
9634ee09551764b045fdc02df754157473125edf60Kevin Tang
9734ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
9834ee09551764b045fdc02df754157473125edf60Kevin Tang   RPC_LOC_API_SUCCESS
9934ee09551764b045fdc02df754157473125edf60Kevin Tang
10034ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
10134ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
10234ee09551764b045fdc02df754157473125edf60Kevin Tang
10334ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
10434ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_rpc_global_cb(void* user, CLIENT* clnt, enum rpc_reset_event event)
10534ee09551764b045fdc02df754157473125edf60Kevin Tang{
10634ee09551764b045fdc02df754157473125edf60Kevin Tang    MODEM_LOG_CALLFLOW(%s, loc_get_rpc_reset_event_name(event));
107e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    ((LocApiRpc*)user)->locRpcGlobalCB(clnt, event);
10834ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%p, VOID_RET);
10934ee09551764b045fdc02df754157473125edf60Kevin Tang}
11034ee09551764b045fdc02df754157473125edf60Kevin Tang
111e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoconst LOC_API_ADAPTER_EVENT_MASK_T LocApiRpc::maskAll =
112e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
113e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LOC_API_ADAPTER_BIT_SATELLITE_REPORT |
114e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST |
115e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST |
116e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LOC_API_ADAPTER_BIT_IOCTL_REPORT |
117e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LOC_API_ADAPTER_BIT_STATUS_REPORT |
118e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT |
119e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST;
120e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
121e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoconst rpc_loc_event_mask_type LocApiRpc::locBits[] =
12234ee09551764b045fdc02df754157473125edf60Kevin Tang{
12334ee09551764b045fdc02df754157473125edf60Kevin Tang    RPC_LOC_EVENT_PARSED_POSITION_REPORT,
12434ee09551764b045fdc02df754157473125edf60Kevin Tang    RPC_LOC_EVENT_SATELLITE_REPORT,
12534ee09551764b045fdc02df754157473125edf60Kevin Tang    RPC_LOC_EVENT_NMEA_1HZ_REPORT,
12634ee09551764b045fdc02df754157473125edf60Kevin Tang    RPC_LOC_EVENT_NMEA_POSITION_REPORT,
12734ee09551764b045fdc02df754157473125edf60Kevin Tang    RPC_LOC_EVENT_NI_NOTIFY_VERIFY_REQUEST,
12834ee09551764b045fdc02df754157473125edf60Kevin Tang    RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST,
12934ee09551764b045fdc02df754157473125edf60Kevin Tang    RPC_LOC_EVENT_LOCATION_SERVER_REQUEST,
13034ee09551764b045fdc02df754157473125edf60Kevin Tang    RPC_LOC_EVENT_IOCTL_REPORT,
131e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    RPC_LOC_EVENT_STATUS_REPORT,
132e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    RPC_LOC_EVENT_WPS_NEEDED_REQUEST
13334ee09551764b045fdc02df754157473125edf60Kevin Tang};
13434ee09551764b045fdc02df754157473125edf60Kevin Tang
135e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo// constructor
136e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::LocApiRpc(const MsgTask* msgTask,
13747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                     LOC_API_ADAPTER_EVENT_MASK_T exMask,
13847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                     ContextBase* context) :
13947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    LocApiBase(msgTask, exMask, context),
14034ee09551764b045fdc02df754157473125edf60Kevin Tang    client_handle(RPC_LOC_CLIENT_HANDLE_INVALID),
141e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    dataEnableLastSet(-1)
14234ee09551764b045fdc02df754157473125edf60Kevin Tang{
143e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    memset(apnLastSet, 0, sizeof(apnLastSet));
14434ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_api_glue_init();
14534ee09551764b045fdc02df754157473125edf60Kevin Tang}
14634ee09551764b045fdc02df754157473125edf60Kevin Tang
147e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::~LocApiRpc()
14834ee09551764b045fdc02df754157473125edf60Kevin Tang{
149e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    close();
15034ee09551764b045fdc02df754157473125edf60Kevin Tang}
15134ee09551764b045fdc02df754157473125edf60Kevin Tang
15234ee09551764b045fdc02df754157473125edf60Kevin Tangrpc_loc_event_mask_type
153e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::convertMask(LOC_API_ADAPTER_EVENT_MASK_T mask)
15434ee09551764b045fdc02df754157473125edf60Kevin Tang{
15534ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_event_mask_type newMask = 0;
15634ee09551764b045fdc02df754157473125edf60Kevin Tang
15734ee09551764b045fdc02df754157473125edf60Kevin Tang    for (unsigned int i = 0, bit=1; 0 != mask; i++, bit<<=1) {
15834ee09551764b045fdc02df754157473125edf60Kevin Tang        if (mask & bit) {
15934ee09551764b045fdc02df754157473125edf60Kevin Tang            newMask |= locBits[i];
16034ee09551764b045fdc02df754157473125edf60Kevin Tang            mask ^= bit;
16134ee09551764b045fdc02df754157473125edf60Kevin Tang        }
16234ee09551764b045fdc02df754157473125edf60Kevin Tang    }
16334ee09551764b045fdc02df754157473125edf60Kevin Tang
16434ee09551764b045fdc02df754157473125edf60Kevin Tang    return newMask;
16534ee09551764b045fdc02df754157473125edf60Kevin Tang}
16634ee09551764b045fdc02df754157473125edf60Kevin Tang
1678aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tangrpc_loc_lock_e_type
1688aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin TangLocApiRpc::convertGpsLockMask(LOC_GPS_LOCK_MASK lockMask)
1698aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang{
1708aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang    if (isGpsLockAll(lockMask))
1718aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang        return RPC_LOC_LOCK_ALL;
1728aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang    if (isGpsLockMO(lockMask))
1738aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang        return RPC_LOC_LOCK_MI;
1748aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang    if (isGpsLockMT(lockMask))
1758aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang        return RPC_LOC_LOCK_MT;
1768aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang    if (isGpsLockNone(lockMask))
1778aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang        return RPC_LOC_LOCK_NONE;
1788aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang    return (rpc_loc_lock_e_type)lockMask;
1798aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang}
1808aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang
18134ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
182e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::convertErr(int rpcErr)
18334ee09551764b045fdc02df754157473125edf60Kevin Tang{
18434ee09551764b045fdc02df754157473125edf60Kevin Tang    switch(rpcErr)
18534ee09551764b045fdc02df754157473125edf60Kevin Tang    {
18634ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_LOC_API_SUCCESS:
18734ee09551764b045fdc02df754157473125edf60Kevin Tang        return LOC_API_ADAPTER_ERR_SUCCESS;
18834ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_LOC_API_GENERAL_FAILURE:
18934ee09551764b045fdc02df754157473125edf60Kevin Tang        return LOC_API_ADAPTER_ERR_GENERAL_FAILURE;
19034ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_LOC_API_UNSUPPORTED:
19134ee09551764b045fdc02df754157473125edf60Kevin Tang        return LOC_API_ADAPTER_ERR_UNSUPPORTED;
19234ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_LOC_API_INVALID_HANDLE:
19334ee09551764b045fdc02df754157473125edf60Kevin Tang        return LOC_API_ADAPTER_ERR_INVALID_HANDLE;
19434ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_LOC_API_INVALID_PARAMETER:
19534ee09551764b045fdc02df754157473125edf60Kevin Tang        return LOC_API_ADAPTER_ERR_INVALID_PARAMETER;
19634ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_LOC_API_ENGINE_BUSY:
19734ee09551764b045fdc02df754157473125edf60Kevin Tang        return LOC_API_ADAPTER_ERR_ENGINE_BUSY;
19834ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_LOC_API_PHONE_OFFLINE:
19934ee09551764b045fdc02df754157473125edf60Kevin Tang        return LOC_API_ADAPTER_ERR_PHONE_OFFLINE;
20034ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_LOC_API_TIMEOUT:
20134ee09551764b045fdc02df754157473125edf60Kevin Tang        return LOC_API_ADAPTER_ERR_TIMEOUT;
20234ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_LOC_API_RPC_MODEM_RESTART:
20334ee09551764b045fdc02df754157473125edf60Kevin Tang        return LOC_API_ADAPTER_ERR_ENGINE_DOWN;
20434ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_LOC_API_RPC_FAILURE:
20534ee09551764b045fdc02df754157473125edf60Kevin Tang        return LOC_API_ADAPTER_ERR_FAILURE;
20634ee09551764b045fdc02df754157473125edf60Kevin Tang    default:
20734ee09551764b045fdc02df754157473125edf60Kevin Tang        return LOC_API_ADAPTER_ERR_UNKNOWN;
20834ee09551764b045fdc02df754157473125edf60Kevin Tang    }
20934ee09551764b045fdc02df754157473125edf60Kevin Tang}
21034ee09551764b045fdc02df754157473125edf60Kevin Tang
211e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocApiRpc::locRpcGlobalCB(CLIENT* clnt, enum rpc_reset_event event)
21234ee09551764b045fdc02df754157473125edf60Kevin Tang{
21334ee09551764b045fdc02df754157473125edf60Kevin Tang    static rpc_loc_engine_state_e_type last_state = RPC_LOC_ENGINE_STATE_MAX;
21434ee09551764b045fdc02df754157473125edf60Kevin Tang
21534ee09551764b045fdc02df754157473125edf60Kevin Tang    switch (event) {
21634ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_SUBSYSTEM_RESTART_BEGIN:
21734ee09551764b045fdc02df754157473125edf60Kevin Tang        if (RPC_LOC_ENGINE_STATE_OFF != last_state) {
21834ee09551764b045fdc02df754157473125edf60Kevin Tang            last_state = RPC_LOC_ENGINE_STATE_OFF;
21934ee09551764b045fdc02df754157473125edf60Kevin Tang            handleEngineDownEvent();
22034ee09551764b045fdc02df754157473125edf60Kevin Tang        }
22134ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
22234ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_SUBSYSTEM_RESTART_END:
22334ee09551764b045fdc02df754157473125edf60Kevin Tang        if (RPC_LOC_ENGINE_STATE_ON != last_state) {
22434ee09551764b045fdc02df754157473125edf60Kevin Tang            last_state = RPC_LOC_ENGINE_STATE_ON;
22534ee09551764b045fdc02df754157473125edf60Kevin Tang            handleEngineUpEvent();
22634ee09551764b045fdc02df754157473125edf60Kevin Tang        }
22734ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
22834ee09551764b045fdc02df754157473125edf60Kevin Tang    }
22934ee09551764b045fdc02df754157473125edf60Kevin Tang}
23034ee09551764b045fdc02df754157473125edf60Kevin Tang
231e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoint32 LocApiRpc::locEventCB(rpc_loc_client_handle_type client_handle,
23234ee09551764b045fdc02df754157473125edf60Kevin Tang                     rpc_loc_event_mask_type loc_event,
23334ee09551764b045fdc02df754157473125edf60Kevin Tang                     const rpc_loc_event_payload_u_type* loc_event_payload)
23434ee09551764b045fdc02df754157473125edf60Kevin Tang{
23534ee09551764b045fdc02df754157473125edf60Kevin Tang    // Parsed report
23634ee09551764b045fdc02df754157473125edf60Kevin Tang    if (loc_event & RPC_LOC_EVENT_PARSED_POSITION_REPORT)
23734ee09551764b045fdc02df754157473125edf60Kevin Tang    {
23834ee09551764b045fdc02df754157473125edf60Kevin Tang        reportPosition(&loc_event_payload->rpc_loc_event_payload_u_type_u.
23934ee09551764b045fdc02df754157473125edf60Kevin Tang                       parsed_location_report);
24034ee09551764b045fdc02df754157473125edf60Kevin Tang    }
24134ee09551764b045fdc02df754157473125edf60Kevin Tang
24234ee09551764b045fdc02df754157473125edf60Kevin Tang    // Satellite report
24334ee09551764b045fdc02df754157473125edf60Kevin Tang    if (loc_event & RPC_LOC_EVENT_SATELLITE_REPORT)
24434ee09551764b045fdc02df754157473125edf60Kevin Tang    {
24534ee09551764b045fdc02df754157473125edf60Kevin Tang        reportSv(&loc_event_payload->rpc_loc_event_payload_u_type_u.gnss_report);
24634ee09551764b045fdc02df754157473125edf60Kevin Tang    }
24734ee09551764b045fdc02df754157473125edf60Kevin Tang
24834ee09551764b045fdc02df754157473125edf60Kevin Tang    // Status report
24934ee09551764b045fdc02df754157473125edf60Kevin Tang    if (loc_event & RPC_LOC_EVENT_STATUS_REPORT)
25034ee09551764b045fdc02df754157473125edf60Kevin Tang    {
25134ee09551764b045fdc02df754157473125edf60Kevin Tang        reportStatus(&loc_event_payload->rpc_loc_event_payload_u_type_u.status_report);
25234ee09551764b045fdc02df754157473125edf60Kevin Tang    }
25334ee09551764b045fdc02df754157473125edf60Kevin Tang
25434ee09551764b045fdc02df754157473125edf60Kevin Tang    // NMEA
25534ee09551764b045fdc02df754157473125edf60Kevin Tang    if (loc_event & RPC_LOC_EVENT_NMEA_1HZ_REPORT)
25634ee09551764b045fdc02df754157473125edf60Kevin Tang    {
25734ee09551764b045fdc02df754157473125edf60Kevin Tang        reportNmea(&(loc_event_payload->rpc_loc_event_payload_u_type_u.nmea_report));
25834ee09551764b045fdc02df754157473125edf60Kevin Tang    }
25934ee09551764b045fdc02df754157473125edf60Kevin Tang    // XTRA support: supports only XTRA download
26034ee09551764b045fdc02df754157473125edf60Kevin Tang    if (loc_event & RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST)
26134ee09551764b045fdc02df754157473125edf60Kevin Tang    {
26234ee09551764b045fdc02df754157473125edf60Kevin Tang        if (loc_event_payload->rpc_loc_event_payload_u_type_u.assist_data_request.event ==
26334ee09551764b045fdc02df754157473125edf60Kevin Tang            RPC_LOC_ASSIST_DATA_PREDICTED_ORBITS_REQ)
26434ee09551764b045fdc02df754157473125edf60Kevin Tang        {
26534ee09551764b045fdc02df754157473125edf60Kevin Tang            requestXtraData();
26634ee09551764b045fdc02df754157473125edf60Kevin Tang        } else if (loc_event_payload->rpc_loc_event_payload_u_type_u.assist_data_request.event ==
26734ee09551764b045fdc02df754157473125edf60Kevin Tang                   RPC_LOC_ASSIST_DATA_TIME_REQ)
26834ee09551764b045fdc02df754157473125edf60Kevin Tang        {
26934ee09551764b045fdc02df754157473125edf60Kevin Tang            requestTime();
27034ee09551764b045fdc02df754157473125edf60Kevin Tang        } else if (loc_event_payload->rpc_loc_event_payload_u_type_u.assist_data_request.event ==
27134ee09551764b045fdc02df754157473125edf60Kevin Tang                   RPC_LOC_ASSIST_DATA_POSITION_INJECTION_REQ)
27234ee09551764b045fdc02df754157473125edf60Kevin Tang        {
27334ee09551764b045fdc02df754157473125edf60Kevin Tang            requestLocation();
27434ee09551764b045fdc02df754157473125edf60Kevin Tang        }
27534ee09551764b045fdc02df754157473125edf60Kevin Tang    }
27634ee09551764b045fdc02df754157473125edf60Kevin Tang
27734ee09551764b045fdc02df754157473125edf60Kevin Tang    // AGPS data request
27834ee09551764b045fdc02df754157473125edf60Kevin Tang    if (loc_event & RPC_LOC_EVENT_LOCATION_SERVER_REQUEST)
27934ee09551764b045fdc02df754157473125edf60Kevin Tang    {
28034ee09551764b045fdc02df754157473125edf60Kevin Tang        ATLEvent(&loc_event_payload->rpc_loc_event_payload_u_type_u.
28134ee09551764b045fdc02df754157473125edf60Kevin Tang                 loc_server_request);
28234ee09551764b045fdc02df754157473125edf60Kevin Tang    }
28334ee09551764b045fdc02df754157473125edf60Kevin Tang
28434ee09551764b045fdc02df754157473125edf60Kevin Tang    // NI notify request
28534ee09551764b045fdc02df754157473125edf60Kevin Tang    if (loc_event & RPC_LOC_EVENT_NI_NOTIFY_VERIFY_REQUEST)
28634ee09551764b045fdc02df754157473125edf60Kevin Tang    {
28734ee09551764b045fdc02df754157473125edf60Kevin Tang        NIEvent(&loc_event_payload->rpc_loc_event_payload_u_type_u.ni_request);
28834ee09551764b045fdc02df754157473125edf60Kevin Tang    }
28934ee09551764b045fdc02df754157473125edf60Kevin Tang
29034ee09551764b045fdc02df754157473125edf60Kevin Tang    return RPC_LOC_API_SUCCESS;//We simply want to return sucess here as we do not want to
29134ee09551764b045fdc02df754157473125edf60Kevin Tang    // cause any issues in RPC thread context
29234ee09551764b045fdc02df754157473125edf60Kevin Tang}
29334ee09551764b045fdc02df754157473125edf60Kevin Tang
29434ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
295e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::open(LOC_API_ADAPTER_EVENT_MASK_T mask)
29634ee09551764b045fdc02df754157473125edf60Kevin Tang{
29734ee09551764b045fdc02df754157473125edf60Kevin Tang    enum loc_api_adapter_err ret_val = LOC_API_ADAPTER_ERR_SUCCESS;
29834ee09551764b045fdc02df754157473125edf60Kevin Tang
299e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    // RPC does not dynamically update the event mask. And in the
300e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    // case of RPC, all we support are positioning (gps + agps)
301e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    // masks anyways, so we simply mask all of them on always.
302e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    // After doing so the first time in a power cycle, we know there
303e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    // will the following if condition will never be true any more.
304e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    mask = maskAll;
30534ee09551764b045fdc02df754157473125edf60Kevin Tang
306e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (mask != mMask) {
307e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        if (RPC_LOC_CLIENT_HANDLE_INVALID != client_handle) {
308e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            close();
309e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        }
310e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
311e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        mMask = mask;
312e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        // it is important to cap the mask here, because not all LocApi's
313e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        // can enable the same bits, e.g. foreground and bckground.
314e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        client_handle = loc_open(convertMask(mask),
315e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                 loc_event_cb,
316e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                 loc_rpc_global_cb, this);
317e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
318e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        if (client_handle < 0) {
319e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            mMask = 0;
320e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            client_handle = RPC_LOC_CLIENT_HANDLE_INVALID;
321e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            ret_val = LOC_API_ADAPTER_ERR_INVALID_HANDLE;
322e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        }
32334ee09551764b045fdc02df754157473125edf60Kevin Tang    }
32434ee09551764b045fdc02df754157473125edf60Kevin Tang
32534ee09551764b045fdc02df754157473125edf60Kevin Tang    return ret_val;
32634ee09551764b045fdc02df754157473125edf60Kevin Tang}
32734ee09551764b045fdc02df754157473125edf60Kevin Tang
32834ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
329e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::close()
330e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
331e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (RPC_LOC_CLIENT_HANDLE_INVALID != client_handle) {
332e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        loc_clear(client_handle);
333e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
334e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
335e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    loc_close(client_handle);
336e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    mMask = 0;
337e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    client_handle = RPC_LOC_CLIENT_HANDLE_INVALID;
338e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
339e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    return LOC_API_ADAPTER_ERR_SUCCESS;
340e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
341e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
342e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoenum loc_api_adapter_err
343e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::startFix(const LocPosMode& posMode) {
344e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo   LOC_LOGD("LocApiRpc::startFix() called");
34534ee09551764b045fdc02df754157473125edf60Kevin Tang   return convertErr(
34634ee09551764b045fdc02df754157473125edf60Kevin Tang       loc_start_fix(client_handle)
34734ee09551764b045fdc02df754157473125edf60Kevin Tang       );
34834ee09551764b045fdc02df754157473125edf60Kevin Tang}
34934ee09551764b045fdc02df754157473125edf60Kevin Tang
35034ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
351e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::stopFix() {
352e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo   LOC_LOGD("LocApiRpc::stopFix() called");
35334ee09551764b045fdc02df754157473125edf60Kevin Tang   return convertErr(
35434ee09551764b045fdc02df754157473125edf60Kevin Tang       loc_stop_fix(client_handle)
35534ee09551764b045fdc02df754157473125edf60Kevin Tang       );
35634ee09551764b045fdc02df754157473125edf60Kevin Tang}
35734ee09551764b045fdc02df754157473125edf60Kevin Tang
35834ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
359e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::setPositionMode(const LocPosMode& posMode)
36034ee09551764b045fdc02df754157473125edf60Kevin Tang{
36134ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_data_u_type    ioctl_data;
362e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    rpc_loc_fix_criteria_s_type *fix_criteria_ptr =
363e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        &ioctl_data.rpc_loc_ioctl_data_u_type_u.fix_criteria;
36434ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_e_type         ioctl_type = RPC_LOC_IOCTL_SET_FIX_CRITERIA;
36534ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_operation_mode_e_type op_mode;
36634ee09551764b045fdc02df754157473125edf60Kevin Tang    int                          ret_val;
367e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    const LocPosMode* fixCriteria = &posMode;
36834ee09551764b045fdc02df754157473125edf60Kevin Tang
369e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    ALOGD ("loc_eng_set_position mode, client = %d, interval = %d, mode = %d\n",
370e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo          (int32) client_handle, fixCriteria->min_interval, fixCriteria->mode);
37134ee09551764b045fdc02df754157473125edf60Kevin Tang
372e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    switch (fixCriteria->mode)
37334ee09551764b045fdc02df754157473125edf60Kevin Tang    {
37434ee09551764b045fdc02df754157473125edf60Kevin Tang    case LOC_POSITION_MODE_MS_BASED:
37534ee09551764b045fdc02df754157473125edf60Kevin Tang        op_mode = RPC_LOC_OPER_MODE_MSB;
37634ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
37734ee09551764b045fdc02df754157473125edf60Kevin Tang    case LOC_POSITION_MODE_MS_ASSISTED:
37834ee09551764b045fdc02df754157473125edf60Kevin Tang        op_mode = RPC_LOC_OPER_MODE_MSA;
37934ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
38034ee09551764b045fdc02df754157473125edf60Kevin Tang    case LOC_POSITION_MODE_RESERVED_1:
38134ee09551764b045fdc02df754157473125edf60Kevin Tang        op_mode = RPC_LOC_OPER_MODE_SPEED_OPTIMAL;
38234ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
38334ee09551764b045fdc02df754157473125edf60Kevin Tang    case LOC_POSITION_MODE_RESERVED_2:
38434ee09551764b045fdc02df754157473125edf60Kevin Tang        op_mode = RPC_LOC_OPER_MODE_ACCURACY_OPTIMAL;
38534ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
38634ee09551764b045fdc02df754157473125edf60Kevin Tang    case LOC_POSITION_MODE_RESERVED_3:
38734ee09551764b045fdc02df754157473125edf60Kevin Tang        op_mode = RPC_LOC_OPER_MODE_DATA_OPTIMAL;
38834ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
38934ee09551764b045fdc02df754157473125edf60Kevin Tang    case LOC_POSITION_MODE_RESERVED_4:
390e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    case LOC_POSITION_MODE_RESERVED_5:
39134ee09551764b045fdc02df754157473125edf60Kevin Tang        op_mode = RPC_LOC_OPER_MODE_MSA;
39234ee09551764b045fdc02df754157473125edf60Kevin Tang        fix_criteria_ptr->preferred_response_time  = 0;
39334ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
39434ee09551764b045fdc02df754157473125edf60Kevin Tang    default:
39534ee09551764b045fdc02df754157473125edf60Kevin Tang        op_mode = RPC_LOC_OPER_MODE_STANDALONE;
39634ee09551764b045fdc02df754157473125edf60Kevin Tang    }
39734ee09551764b045fdc02df754157473125edf60Kevin Tang
39834ee09551764b045fdc02df754157473125edf60Kevin Tang    fix_criteria_ptr->valid_mask = RPC_LOC_FIX_CRIT_VALID_PREFERRED_OPERATION_MODE |
39934ee09551764b045fdc02df754157473125edf60Kevin Tang                                   RPC_LOC_FIX_CRIT_VALID_RECURRENCE_TYPE;
400e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    fix_criteria_ptr->min_interval = fixCriteria->min_interval;
40134ee09551764b045fdc02df754157473125edf60Kevin Tang    fix_criteria_ptr->preferred_operation_mode = op_mode;
40234ee09551764b045fdc02df754157473125edf60Kevin Tang
403e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    fix_criteria_ptr->min_interval = fixCriteria->min_interval;
404e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_MIN_INTERVAL;
405e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
406e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (fixCriteria->preferred_accuracy > 0) {
407e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        fix_criteria_ptr->preferred_accuracy = fixCriteria->preferred_accuracy;
40834ee09551764b045fdc02df754157473125edf60Kevin Tang        fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_PREFERRED_ACCURACY;
40934ee09551764b045fdc02df754157473125edf60Kevin Tang    }
410e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (fixCriteria->preferred_time > 0) {
411e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        fix_criteria_ptr->preferred_response_time = fixCriteria->preferred_time;
41234ee09551764b045fdc02df754157473125edf60Kevin Tang        fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_PREFERRED_RESPONSE_TIME;
41334ee09551764b045fdc02df754157473125edf60Kevin Tang    }
41434ee09551764b045fdc02df754157473125edf60Kevin Tang
415e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    switch (fixCriteria->recurrence) {
41634ee09551764b045fdc02df754157473125edf60Kevin Tang    case GPS_POSITION_RECURRENCE_SINGLE:
41734ee09551764b045fdc02df754157473125edf60Kevin Tang        fix_criteria_ptr->recurrence_type = RPC_LOC_SINGLE_FIX;
41834ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
41934ee09551764b045fdc02df754157473125edf60Kevin Tang    case GPS_POSITION_RECURRENCE_PERIODIC:
42034ee09551764b045fdc02df754157473125edf60Kevin Tang    default:
42134ee09551764b045fdc02df754157473125edf60Kevin Tang        fix_criteria_ptr->recurrence_type = RPC_LOC_PERIODIC_FIX;
42234ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
42334ee09551764b045fdc02df754157473125edf60Kevin Tang    }
42434ee09551764b045fdc02df754157473125edf60Kevin Tang    ioctl_data.disc = ioctl_type;
42534ee09551764b045fdc02df754157473125edf60Kevin Tang
42634ee09551764b045fdc02df754157473125edf60Kevin Tang    ret_val = loc_eng_ioctl (client_handle,
42734ee09551764b045fdc02df754157473125edf60Kevin Tang                             ioctl_type,
42834ee09551764b045fdc02df754157473125edf60Kevin Tang                             &ioctl_data,
42934ee09551764b045fdc02df754157473125edf60Kevin Tang                             LOC_IOCTL_DEFAULT_TIMEOUT,
43034ee09551764b045fdc02df754157473125edf60Kevin Tang                             NULL /* No output information is expected*/);
43134ee09551764b045fdc02df754157473125edf60Kevin Tang
43234ee09551764b045fdc02df754157473125edf60Kevin Tang    return convertErr(ret_val);
43334ee09551764b045fdc02df754157473125edf60Kevin Tang}
43434ee09551764b045fdc02df754157473125edf60Kevin Tang
43534ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
436e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::setTime(GpsUtcTime time, int64_t timeReference, int uncertainty)
43734ee09551764b045fdc02df754157473125edf60Kevin Tang{
43834ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_data_u_type        ioctl_data;
43934ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_assist_data_time_s_type *time_info_ptr;
44034ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_e_type             ioctl_type = RPC_LOC_IOCTL_INJECT_UTC_TIME;
44134ee09551764b045fdc02df754157473125edf60Kevin Tang    int                              ret_val;
44234ee09551764b045fdc02df754157473125edf60Kevin Tang
44334ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_LOGD ("loc_eng_inject_time, uncertainty = %d\n", uncertainty);
44434ee09551764b045fdc02df754157473125edf60Kevin Tang
44534ee09551764b045fdc02df754157473125edf60Kevin Tang    time_info_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.assistance_data_time;
44634ee09551764b045fdc02df754157473125edf60Kevin Tang    time_info_ptr->time_utc = time;
447e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    time_info_ptr->time_utc += (int64_t)(ELAPSED_MILLIS_SINCE_BOOT_PLATFORM_LIB_ABSTRACTION - timeReference);
44834ee09551764b045fdc02df754157473125edf60Kevin Tang    time_info_ptr->uncertainty = uncertainty; // Uncertainty in ms
44934ee09551764b045fdc02df754157473125edf60Kevin Tang
45034ee09551764b045fdc02df754157473125edf60Kevin Tang    ioctl_data.disc = ioctl_type;
45134ee09551764b045fdc02df754157473125edf60Kevin Tang
45234ee09551764b045fdc02df754157473125edf60Kevin Tang    ret_val = loc_eng_ioctl (client_handle,
45334ee09551764b045fdc02df754157473125edf60Kevin Tang                             ioctl_type,
45434ee09551764b045fdc02df754157473125edf60Kevin Tang                             &ioctl_data,
45534ee09551764b045fdc02df754157473125edf60Kevin Tang                             LOC_IOCTL_DEFAULT_TIMEOUT,
45634ee09551764b045fdc02df754157473125edf60Kevin Tang                             NULL /* No output information is expected*/);
45734ee09551764b045fdc02df754157473125edf60Kevin Tang
45834ee09551764b045fdc02df754157473125edf60Kevin Tang    return convertErr(ret_val);
45934ee09551764b045fdc02df754157473125edf60Kevin Tang}
46034ee09551764b045fdc02df754157473125edf60Kevin Tang
46134ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
462e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::injectPosition(double latitude, double longitude, float accuracy)
46334ee09551764b045fdc02df754157473125edf60Kevin Tang{
46434ee09551764b045fdc02df754157473125edf60Kevin Tang    /* IOCTL data */
46534ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_data_u_type ioctl_data;
46634ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_assist_data_pos_s_type *assistance_data_position =
46734ee09551764b045fdc02df754157473125edf60Kevin Tang        &ioctl_data.rpc_loc_ioctl_data_u_type_u.assistance_data_position;
46834ee09551764b045fdc02df754157473125edf60Kevin Tang    int                          ret_val;
46934ee09551764b045fdc02df754157473125edf60Kevin Tang
47034ee09551764b045fdc02df754157473125edf60Kevin Tang    /************************************************
47134ee09551764b045fdc02df754157473125edf60Kevin Tang     * Fill in latitude, longitude & accuracy
47234ee09551764b045fdc02df754157473125edf60Kevin Tang     ************************************************/
47334ee09551764b045fdc02df754157473125edf60Kevin Tang
47434ee09551764b045fdc02df754157473125edf60Kevin Tang    /* This combo is required */
47534ee09551764b045fdc02df754157473125edf60Kevin Tang    assistance_data_position->valid_mask =
47634ee09551764b045fdc02df754157473125edf60Kevin Tang        RPC_LOC_ASSIST_POS_VALID_LATITUDE |
47734ee09551764b045fdc02df754157473125edf60Kevin Tang        RPC_LOC_ASSIST_POS_VALID_LONGITUDE |
47834ee09551764b045fdc02df754157473125edf60Kevin Tang        RPC_LOC_ASSIST_POS_VALID_HOR_UNC_CIRCULAR |
47934ee09551764b045fdc02df754157473125edf60Kevin Tang        RPC_LOC_ASSIST_POS_VALID_CONFIDENCE_HORIZONTAL;
48034ee09551764b045fdc02df754157473125edf60Kevin Tang
48134ee09551764b045fdc02df754157473125edf60Kevin Tang    assistance_data_position->latitude = latitude;
48234ee09551764b045fdc02df754157473125edf60Kevin Tang    assistance_data_position->longitude = longitude;
48334ee09551764b045fdc02df754157473125edf60Kevin Tang    assistance_data_position->hor_unc_circular = accuracy; /* Meters assumed */
48434ee09551764b045fdc02df754157473125edf60Kevin Tang    assistance_data_position->confidence_horizontal = 63;  /* 63% (1 std dev) assumed */
48534ee09551764b045fdc02df754157473125edf60Kevin Tang
48634ee09551764b045fdc02df754157473125edf60Kevin Tang    /* Log */
48734ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_LOGD("Inject coarse position Lat=%lf, Lon=%lf, Acc=%.2lf\n",
48834ee09551764b045fdc02df754157473125edf60Kevin Tang             (double) assistance_data_position->latitude,
48934ee09551764b045fdc02df754157473125edf60Kevin Tang             (double) assistance_data_position->longitude,
49034ee09551764b045fdc02df754157473125edf60Kevin Tang             (double) assistance_data_position->hor_unc_circular);
49134ee09551764b045fdc02df754157473125edf60Kevin Tang
49234ee09551764b045fdc02df754157473125edf60Kevin Tang    ret_val = loc_eng_ioctl( client_handle,
49334ee09551764b045fdc02df754157473125edf60Kevin Tang                             RPC_LOC_IOCTL_INJECT_POSITION,
49434ee09551764b045fdc02df754157473125edf60Kevin Tang                             &ioctl_data,
49534ee09551764b045fdc02df754157473125edf60Kevin Tang                             LOC_IOCTL_DEFAULT_TIMEOUT,
49634ee09551764b045fdc02df754157473125edf60Kevin Tang                             NULL /* No output information is expected*/);
49734ee09551764b045fdc02df754157473125edf60Kevin Tang    return convertErr(ret_val);
49834ee09551764b045fdc02df754157473125edf60Kevin Tang}
49934ee09551764b045fdc02df754157473125edf60Kevin Tang
50034ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
501e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::informNiResponse(GpsUserResponseType userResponse,
50234ee09551764b045fdc02df754157473125edf60Kevin Tang                                   const void* passThroughData)
50334ee09551764b045fdc02df754157473125edf60Kevin Tang{
50434ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_data_u_type data;
50534ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_callback_s_type callback_payload;
50634ee09551764b045fdc02df754157473125edf60Kevin Tang
50734ee09551764b045fdc02df754157473125edf60Kevin Tang    memcpy(&data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.ni_event_pass_back,
50834ee09551764b045fdc02df754157473125edf60Kevin Tang           passThroughData, sizeof (rpc_loc_ni_event_s_type));
50934ee09551764b045fdc02df754157473125edf60Kevin Tang
51034ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ni_user_resp_e_type resp;
51134ee09551764b045fdc02df754157473125edf60Kevin Tang    switch (userResponse)
51234ee09551764b045fdc02df754157473125edf60Kevin Tang    {
51334ee09551764b045fdc02df754157473125edf60Kevin Tang    case GPS_NI_RESPONSE_ACCEPT:
51434ee09551764b045fdc02df754157473125edf60Kevin Tang        data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.user_resp =
51534ee09551764b045fdc02df754157473125edf60Kevin Tang            RPC_LOC_NI_LCS_NOTIFY_VERIFY_ACCEPT;
51634ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
51734ee09551764b045fdc02df754157473125edf60Kevin Tang    case GPS_NI_RESPONSE_DENY:
51834ee09551764b045fdc02df754157473125edf60Kevin Tang        data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.user_resp =
51934ee09551764b045fdc02df754157473125edf60Kevin Tang            RPC_LOC_NI_LCS_NOTIFY_VERIFY_DENY;
52034ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
52134ee09551764b045fdc02df754157473125edf60Kevin Tang    case GPS_NI_RESPONSE_NORESP:
52234ee09551764b045fdc02df754157473125edf60Kevin Tang    default:
52334ee09551764b045fdc02df754157473125edf60Kevin Tang        data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.user_resp =
52434ee09551764b045fdc02df754157473125edf60Kevin Tang            RPC_LOC_NI_LCS_NOTIFY_VERIFY_NORESP;
52534ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
52634ee09551764b045fdc02df754157473125edf60Kevin Tang    }
52734ee09551764b045fdc02df754157473125edf60Kevin Tang
52834ee09551764b045fdc02df754157473125edf60Kevin Tang    return convertErr(
52934ee09551764b045fdc02df754157473125edf60Kevin Tang        loc_eng_ioctl(client_handle,
53034ee09551764b045fdc02df754157473125edf60Kevin Tang                      RPC_LOC_IOCTL_INFORM_NI_USER_RESPONSE,
53134ee09551764b045fdc02df754157473125edf60Kevin Tang                      &data,
53234ee09551764b045fdc02df754157473125edf60Kevin Tang                      LOC_IOCTL_DEFAULT_TIMEOUT,
53334ee09551764b045fdc02df754157473125edf60Kevin Tang                      &callback_payload)
53434ee09551764b045fdc02df754157473125edf60Kevin Tang        );
53534ee09551764b045fdc02df754157473125edf60Kevin Tang}
53634ee09551764b045fdc02df754157473125edf60Kevin Tang
53734ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
538e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::setAPN(char* apn, int len, boolean force)
53934ee09551764b045fdc02df754157473125edf60Kevin Tang{
540e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    enum loc_api_adapter_err rtv = LOC_API_ADAPTER_ERR_SUCCESS;
541e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    int size = sizeof(apnLastSet);
542e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (force || memcmp(apnLastSet, apn, size)) {
543e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        if (len < size) {
544e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            // size will be not larger than its original value
545e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            size = len + 1;
546e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        }
547e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        memcpy(apnLastSet, apn, size);
548e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
549e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        if (!isInSession()) {
550e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_LBS_APN_PROFILE, {0}};
551e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            ioctl_data.rpc_loc_ioctl_data_u_type_u.apn_profiles[0].srv_system_type = LOC_APN_PROFILE_SRV_SYS_MAX;
552e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            ioctl_data.rpc_loc_ioctl_data_u_type_u.apn_profiles[0].pdp_type = LOC_APN_PROFILE_PDN_TYPE_IPV4;
553e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            memcpy(&(ioctl_data.rpc_loc_ioctl_data_u_type_u.apn_profiles[0].apn_name), apn, size);
554e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
555e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            rtv = convertErr(
556e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                loc_eng_ioctl (client_handle,
557e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                               RPC_LOC_IOCTL_SET_LBS_APN_PROFILE,
558e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                               &ioctl_data,
559e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                               LOC_IOCTL_DEFAULT_TIMEOUT,
560e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                               NULL)
561e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                );
562e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        }
563e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
564e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    return rtv;
565e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
566e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
567e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocApiRpc::setInSession(bool inSession)
568e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
569e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (!inSession) {
570e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        enableData(dataEnableLastSet, true);
571e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        setAPN(apnLastSet, sizeof(apnLastSet)-1, true);
572e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
57334ee09551764b045fdc02df754157473125edf60Kevin Tang}
57434ee09551764b045fdc02df754157473125edf60Kevin Tang
57534ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
576e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::setServer(const char* url, int len)
57734ee09551764b045fdc02df754157473125edf60Kevin Tang{
57834ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_data_u_type         ioctl_data;
57934ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_server_info_s_type       *server_info_ptr;
58034ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_e_type              ioctl_cmd;
58134ee09551764b045fdc02df754157473125edf60Kevin Tang
58234ee09551764b045fdc02df754157473125edf60Kevin Tang    ioctl_cmd = RPC_LOC_IOCTL_SET_UMTS_SLP_SERVER_ADDR;
58334ee09551764b045fdc02df754157473125edf60Kevin Tang    ioctl_data.disc = ioctl_cmd;
58434ee09551764b045fdc02df754157473125edf60Kevin Tang    server_info_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.server_addr;
58534ee09551764b045fdc02df754157473125edf60Kevin Tang    server_info_ptr->addr_type = RPC_LOC_SERVER_ADDR_URL;
58634ee09551764b045fdc02df754157473125edf60Kevin Tang    server_info_ptr->addr_info.disc = server_info_ptr->addr_type;
58734ee09551764b045fdc02df754157473125edf60Kevin Tang    server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.length = len;
58834ee09551764b045fdc02df754157473125edf60Kevin Tang#if (AMSS_VERSION==3200)
58934ee09551764b045fdc02df754157473125edf60Kevin Tang    server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr.addr_val = (char*) url;
59034ee09551764b045fdc02df754157473125edf60Kevin Tang    server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr.addr_len= len;
59134ee09551764b045fdc02df754157473125edf60Kevin Tang#else
59234ee09551764b045fdc02df754157473125edf60Kevin Tang    strlcpy(server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr, url,
59334ee09551764b045fdc02df754157473125edf60Kevin Tang            sizeof server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr);
59434ee09551764b045fdc02df754157473125edf60Kevin Tang#endif /* #if (AMSS_VERSION==3200) */
59534ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_LOGD ("loc_eng_set_server, addr = %s\n", url);
59634ee09551764b045fdc02df754157473125edf60Kevin Tang
59734ee09551764b045fdc02df754157473125edf60Kevin Tang    return convertErr(
59834ee09551764b045fdc02df754157473125edf60Kevin Tang        loc_eng_ioctl (client_handle,
59934ee09551764b045fdc02df754157473125edf60Kevin Tang                       ioctl_cmd,
60034ee09551764b045fdc02df754157473125edf60Kevin Tang                       &ioctl_data,
60134ee09551764b045fdc02df754157473125edf60Kevin Tang                       LOC_IOCTL_DEFAULT_TIMEOUT,
60234ee09551764b045fdc02df754157473125edf60Kevin Tang                       NULL /* No output information is expected*/)
60334ee09551764b045fdc02df754157473125edf60Kevin Tang        );
60434ee09551764b045fdc02df754157473125edf60Kevin Tang}
60534ee09551764b045fdc02df754157473125edf60Kevin Tang
60634ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
607e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::setServer(unsigned int ip, int port, LocServerType type)
60834ee09551764b045fdc02df754157473125edf60Kevin Tang{
60934ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_data_u_type         ioctl_data;
61034ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_server_info_s_type       *server_info_ptr;
61134ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_e_type              ioctl_cmd;
61234ee09551764b045fdc02df754157473125edf60Kevin Tang
61334ee09551764b045fdc02df754157473125edf60Kevin Tang    switch (type) {
61434ee09551764b045fdc02df754157473125edf60Kevin Tang    case LOC_AGPS_MPC_SERVER:
61534ee09551764b045fdc02df754157473125edf60Kevin Tang        ioctl_cmd = RPC_LOC_IOCTL_SET_CDMA_MPC_SERVER_ADDR;
61634ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
61734ee09551764b045fdc02df754157473125edf60Kevin Tang    case LOC_AGPS_CUSTOM_PDE_SERVER:
61834ee09551764b045fdc02df754157473125edf60Kevin Tang        ioctl_cmd = RPC_LOC_IOCTL_SET_CUSTOM_PDE_SERVER_ADDR;
61934ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
62034ee09551764b045fdc02df754157473125edf60Kevin Tang    default:
62134ee09551764b045fdc02df754157473125edf60Kevin Tang        ioctl_cmd = RPC_LOC_IOCTL_SET_CDMA_PDE_SERVER_ADDR;
62234ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
62334ee09551764b045fdc02df754157473125edf60Kevin Tang    }
62434ee09551764b045fdc02df754157473125edf60Kevin Tang    ioctl_data.disc = ioctl_cmd;
62534ee09551764b045fdc02df754157473125edf60Kevin Tang    server_info_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.server_addr;
62634ee09551764b045fdc02df754157473125edf60Kevin Tang    server_info_ptr->addr_type = RPC_LOC_SERVER_ADDR_IPV4;
62734ee09551764b045fdc02df754157473125edf60Kevin Tang    server_info_ptr->addr_info.disc = server_info_ptr->addr_type;
62834ee09551764b045fdc02df754157473125edf60Kevin Tang    server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.ipv4.addr = ip;
62934ee09551764b045fdc02df754157473125edf60Kevin Tang    server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.ipv4.port = port;
63034ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_LOGD ("setServer, addr = %X:%d\n", (unsigned int) ip, (unsigned int) port);
63134ee09551764b045fdc02df754157473125edf60Kevin Tang
63234ee09551764b045fdc02df754157473125edf60Kevin Tang    return convertErr(
63334ee09551764b045fdc02df754157473125edf60Kevin Tang        loc_eng_ioctl (client_handle,
63434ee09551764b045fdc02df754157473125edf60Kevin Tang                       ioctl_cmd,
63534ee09551764b045fdc02df754157473125edf60Kevin Tang                       &ioctl_data,
63634ee09551764b045fdc02df754157473125edf60Kevin Tang                       LOC_IOCTL_DEFAULT_TIMEOUT,
63734ee09551764b045fdc02df754157473125edf60Kevin Tang                       NULL /* No output information is expected*/)
63834ee09551764b045fdc02df754157473125edf60Kevin Tang        );
63934ee09551764b045fdc02df754157473125edf60Kevin Tang}
64034ee09551764b045fdc02df754157473125edf60Kevin Tang
64134ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
642e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::enableData(int enable, boolean force)
64334ee09551764b045fdc02df754157473125edf60Kevin Tang{
644e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    enum loc_api_adapter_err rtv = LOC_API_ADAPTER_ERR_SUCCESS;
645e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (force || dataEnableLastSet != enable) {
646e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        dataEnableLastSet = enable;
64734ee09551764b045fdc02df754157473125edf60Kevin Tang
648e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        if (!isInSession()) {
649e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_DATA_ENABLE, {0}};
650e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
651e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            ioctl_data.rpc_loc_ioctl_data_u_type_u.data_enable = enable;
652e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            rtv =  convertErr(
653e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                loc_eng_ioctl (client_handle,
654e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                               RPC_LOC_IOCTL_SET_DATA_ENABLE,
655e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                               &ioctl_data,
656e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                               LOC_IOCTL_DEFAULT_TIMEOUT,
657e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                               NULL)
658e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                );
659e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        }
660e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
661e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    return rtv;
66234ee09551764b045fdc02df754157473125edf60Kevin Tang}
66334ee09551764b045fdc02df754157473125edf60Kevin Tang
66434ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
665e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::deleteAidingData(GpsAidingData bits)
66634ee09551764b045fdc02df754157473125edf60Kevin Tang{
66734ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_DELETE_ASSIST_DATA, {0}};
66834ee09551764b045fdc02df754157473125edf60Kevin Tang    ioctl_data.rpc_loc_ioctl_data_u_type_u.assist_data_delete.type = bits;
66934ee09551764b045fdc02df754157473125edf60Kevin Tang
67034ee09551764b045fdc02df754157473125edf60Kevin Tang    return convertErr(
67134ee09551764b045fdc02df754157473125edf60Kevin Tang        loc_eng_ioctl (client_handle,
67234ee09551764b045fdc02df754157473125edf60Kevin Tang                       RPC_LOC_IOCTL_DELETE_ASSIST_DATA,
67334ee09551764b045fdc02df754157473125edf60Kevin Tang                       &ioctl_data,
67434ee09551764b045fdc02df754157473125edf60Kevin Tang                       LOC_IOCTL_DEFAULT_TIMEOUT,
67534ee09551764b045fdc02df754157473125edf60Kevin Tang                       NULL)
67634ee09551764b045fdc02df754157473125edf60Kevin Tang        );
67734ee09551764b045fdc02df754157473125edf60Kevin Tang}
67834ee09551764b045fdc02df754157473125edf60Kevin Tang
679e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocApiRpc::reportPosition(const rpc_loc_parsed_position_s_type *location_report_ptr)
68034ee09551764b045fdc02df754157473125edf60Kevin Tang{
681e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LocPosTechMask tech_Mask = LOC_POS_TECH_MASK_DEFAULT;
682e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
683e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    UlpLocation location = {0};
684e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    GpsLocationExtended locationExtended = {0};
68534ee09551764b045fdc02df754157473125edf60Kevin Tang
68634ee09551764b045fdc02df754157473125edf60Kevin Tang    location.size = sizeof(location);
687e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    locationExtended.size = sizeof(locationExtended);
68834ee09551764b045fdc02df754157473125edf60Kevin Tang    if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SESSION_STATUS)
68934ee09551764b045fdc02df754157473125edf60Kevin Tang    {
69034ee09551764b045fdc02df754157473125edf60Kevin Tang        // Process the position from final and intermediate reports
69134ee09551764b045fdc02df754157473125edf60Kevin Tang        if (location_report_ptr->session_status == RPC_LOC_SESS_STATUS_SUCCESS ||
69234ee09551764b045fdc02df754157473125edf60Kevin Tang            location_report_ptr->session_status == RPC_LOC_SESS_STATUS_IN_PROGESS)
69334ee09551764b045fdc02df754157473125edf60Kevin Tang        {
69434ee09551764b045fdc02df754157473125edf60Kevin Tang            // Latitude & Longitude
69534ee09551764b045fdc02df754157473125edf60Kevin Tang            if ((location_report_ptr->valid_mask & RPC_LOC_POS_VALID_LATITUDE) &&
69634ee09551764b045fdc02df754157473125edf60Kevin Tang                (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_LONGITUDE) &&
69734ee09551764b045fdc02df754157473125edf60Kevin Tang                (location_report_ptr->latitude != 0 ||
69834ee09551764b045fdc02df754157473125edf60Kevin Tang                 location_report_ptr->longitude != 0))
69934ee09551764b045fdc02df754157473125edf60Kevin Tang            {
700e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                location.gpsLocation.flags    |= GPS_LOCATION_HAS_LAT_LONG;
701e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                location.gpsLocation.latitude  = location_report_ptr->latitude;
702e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                location.gpsLocation.longitude = location_report_ptr->longitude;
70334ee09551764b045fdc02df754157473125edf60Kevin Tang
70434ee09551764b045fdc02df754157473125edf60Kevin Tang                // Time stamp (UTC)
70534ee09551764b045fdc02df754157473125edf60Kevin Tang                if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_TIMESTAMP_UTC)
70634ee09551764b045fdc02df754157473125edf60Kevin Tang                {
707e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                    location.gpsLocation.timestamp = location_report_ptr->timestamp_utc;
70834ee09551764b045fdc02df754157473125edf60Kevin Tang                }
70934ee09551764b045fdc02df754157473125edf60Kevin Tang
71034ee09551764b045fdc02df754157473125edf60Kevin Tang                // Altitude
71134ee09551764b045fdc02df754157473125edf60Kevin Tang                if (location_report_ptr->valid_mask &  RPC_LOC_POS_VALID_ALTITUDE_WRT_ELLIPSOID )
71234ee09551764b045fdc02df754157473125edf60Kevin Tang                {
713e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                    location.gpsLocation.flags    |= GPS_LOCATION_HAS_ALTITUDE;
714e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                    location.gpsLocation.altitude = location_report_ptr->altitude_wrt_ellipsoid;
71534ee09551764b045fdc02df754157473125edf60Kevin Tang                }
71634ee09551764b045fdc02df754157473125edf60Kevin Tang
71734ee09551764b045fdc02df754157473125edf60Kevin Tang                // Speed
71834ee09551764b045fdc02df754157473125edf60Kevin Tang                if ((location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SPEED_HORIZONTAL) &&
71934ee09551764b045fdc02df754157473125edf60Kevin Tang                    (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SPEED_VERTICAL))
72034ee09551764b045fdc02df754157473125edf60Kevin Tang                {
721e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                    location.gpsLocation.flags    |= GPS_LOCATION_HAS_SPEED;
722e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                    location.gpsLocation.speed = sqrt(location_report_ptr->speed_horizontal * location_report_ptr->speed_horizontal +
72334ee09551764b045fdc02df754157473125edf60Kevin Tang                                          location_report_ptr->speed_vertical * location_report_ptr->speed_vertical);
72434ee09551764b045fdc02df754157473125edf60Kevin Tang                }
72534ee09551764b045fdc02df754157473125edf60Kevin Tang
72634ee09551764b045fdc02df754157473125edf60Kevin Tang                // Heading
72734ee09551764b045fdc02df754157473125edf60Kevin Tang                if (location_report_ptr->valid_mask &  RPC_LOC_POS_VALID_HEADING)
72834ee09551764b045fdc02df754157473125edf60Kevin Tang                {
729e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                    location.gpsLocation.flags    |= GPS_LOCATION_HAS_BEARING;
730e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                    location.gpsLocation.bearing = location_report_ptr->heading;
73134ee09551764b045fdc02df754157473125edf60Kevin Tang                }
73234ee09551764b045fdc02df754157473125edf60Kevin Tang
73334ee09551764b045fdc02df754157473125edf60Kevin Tang                // Uncertainty (circular)
73434ee09551764b045fdc02df754157473125edf60Kevin Tang                if ( (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_HOR_UNC_CIRCULAR) )
73534ee09551764b045fdc02df754157473125edf60Kevin Tang                {
736e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                    location.gpsLocation.flags    |= GPS_LOCATION_HAS_ACCURACY;
737e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                    location.gpsLocation.accuracy = location_report_ptr->hor_unc_circular;
738e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                }
739e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
740e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                // Technology Mask
741e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
742e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                tech_Mask  |= location_report_ptr->technology_mask;
743e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                //Mark the location source as from GNSS
744e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                location.gpsLocation.flags |= LOCATION_HAS_SOURCE_INFO;
745e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                location.position_source = ULP_LOCATION_IS_FROM_GNSS;
746e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_ALTITUDE_WRT_MEAN_SEA_LEVEL)
747e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                {
748e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                    locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL;
749e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                    locationExtended.altitudeMeanSeaLevel = location_report_ptr->altitude_wrt_mean_sea_level;
750e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                }
751e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
752e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                if (location_report_ptr->valid_mask &  RPC_LOC_POS_VALID_MAGNETIC_VARIATION )
753e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                {
754e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                    locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_MAG_DEV;
755e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                    locationExtended.magneticDeviation = location_report_ptr->magnetic_deviation;
756e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                }
757e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
758e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_VERTICAL_UNC)
759e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                {
760e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                   locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_VERT_UNC;
761e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                   locationExtended.vert_unc = location_report_ptr->vert_unc;
762e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                }
763e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
764e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SPEED_UNC)
765e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                {
766e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                   locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_SPEED_UNC;
767e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                   locationExtended.speed_unc = location_report_ptr->speed_unc;
76834ee09551764b045fdc02df754157473125edf60Kevin Tang                }
76934ee09551764b045fdc02df754157473125edf60Kevin Tang
77034ee09551764b045fdc02df754157473125edf60Kevin Tang                LOC_LOGV("reportPosition: fire callback\n");
771e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                enum loc_sess_status fixStatus =
772e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                    (location_report_ptr->session_status
773e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                     == RPC_LOC_SESS_STATUS_IN_PROGESS ?
774e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                     LOC_SESS_INTERMEDIATE : LOC_SESS_SUCCESS);
775e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                LocApiBase::reportPosition(location,
776e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                           locationExtended,
777e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                           (void*)location_report_ptr,
778e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                           fixStatus,
779e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                           tech_Mask);
78034ee09551764b045fdc02df754157473125edf60Kevin Tang            }
78134ee09551764b045fdc02df754157473125edf60Kevin Tang        }
78234ee09551764b045fdc02df754157473125edf60Kevin Tang        else
78334ee09551764b045fdc02df754157473125edf60Kevin Tang        {
784e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            LocApiBase::reportPosition(location,
785e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                       locationExtended,
786e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                       NULL,
787e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                       LOC_SESS_FAILURE);
788e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            LOC_LOGV("loc_eng_report_position: ignore position report "
789e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                     "when session status = %d\n",
790e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                     location_report_ptr->session_status);
79134ee09551764b045fdc02df754157473125edf60Kevin Tang        }
79234ee09551764b045fdc02df754157473125edf60Kevin Tang    }
79334ee09551764b045fdc02df754157473125edf60Kevin Tang    else
79434ee09551764b045fdc02df754157473125edf60Kevin Tang    {
795e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        LOC_LOGV("loc_eng_report_position: ignore position report "
796e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                 "when session status is not set\n");
79734ee09551764b045fdc02df754157473125edf60Kevin Tang    }
79834ee09551764b045fdc02df754157473125edf60Kevin Tang}
79934ee09551764b045fdc02df754157473125edf60Kevin Tang
800e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocApiRpc::reportSv(const rpc_loc_gnss_info_s_type *gnss_report_ptr)
80134ee09551764b045fdc02df754157473125edf60Kevin Tang{
80234ee09551764b045fdc02df754157473125edf60Kevin Tang    GpsSvStatus     SvStatus = {0};
803e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    GpsLocationExtended locationExtended = {0};
804e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    locationExtended.size = sizeof(locationExtended);
80534ee09551764b045fdc02df754157473125edf60Kevin Tang    int             num_svs_max = 0;
80634ee09551764b045fdc02df754157473125edf60Kevin Tang    const rpc_loc_sv_info_s_type *sv_info_ptr;
80734ee09551764b045fdc02df754157473125edf60Kevin Tang
80834ee09551764b045fdc02df754157473125edf60Kevin Tang    if (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_SV_COUNT)
80934ee09551764b045fdc02df754157473125edf60Kevin Tang    {
81034ee09551764b045fdc02df754157473125edf60Kevin Tang        num_svs_max = gnss_report_ptr->sv_count;
81134ee09551764b045fdc02df754157473125edf60Kevin Tang        if (num_svs_max > GPS_MAX_SVS)
81234ee09551764b045fdc02df754157473125edf60Kevin Tang        {
81334ee09551764b045fdc02df754157473125edf60Kevin Tang            num_svs_max = GPS_MAX_SVS;
81434ee09551764b045fdc02df754157473125edf60Kevin Tang        }
81534ee09551764b045fdc02df754157473125edf60Kevin Tang    }
81634ee09551764b045fdc02df754157473125edf60Kevin Tang
81734ee09551764b045fdc02df754157473125edf60Kevin Tang    if (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_SV_LIST)
81834ee09551764b045fdc02df754157473125edf60Kevin Tang    {
81934ee09551764b045fdc02df754157473125edf60Kevin Tang        SvStatus.num_svs = 0;
82034ee09551764b045fdc02df754157473125edf60Kevin Tang
82134ee09551764b045fdc02df754157473125edf60Kevin Tang        for (int i = 0; i < num_svs_max; i++)
82234ee09551764b045fdc02df754157473125edf60Kevin Tang        {
82334ee09551764b045fdc02df754157473125edf60Kevin Tang            sv_info_ptr = &(gnss_report_ptr->sv_list.sv_list_val[i]);
82434ee09551764b045fdc02df754157473125edf60Kevin Tang            if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_SYSTEM)
82534ee09551764b045fdc02df754157473125edf60Kevin Tang            {
82634ee09551764b045fdc02df754157473125edf60Kevin Tang                if (sv_info_ptr->system == RPC_LOC_SV_SYSTEM_GPS)
82734ee09551764b045fdc02df754157473125edf60Kevin Tang                {
82834ee09551764b045fdc02df754157473125edf60Kevin Tang                    SvStatus.sv_list[SvStatus.num_svs].size = sizeof(GpsSvStatus);
82934ee09551764b045fdc02df754157473125edf60Kevin Tang                    SvStatus.sv_list[SvStatus.num_svs].prn = sv_info_ptr->prn;
83034ee09551764b045fdc02df754157473125edf60Kevin Tang
83134ee09551764b045fdc02df754157473125edf60Kevin Tang                    // We only have the data field to report gps eph and alm mask
83234ee09551764b045fdc02df754157473125edf60Kevin Tang                    if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_HAS_EPH) &&
83334ee09551764b045fdc02df754157473125edf60Kevin Tang                        (sv_info_ptr->has_eph == 1))
83434ee09551764b045fdc02df754157473125edf60Kevin Tang                    {
83534ee09551764b045fdc02df754157473125edf60Kevin Tang                        SvStatus.ephemeris_mask |= (1 << (sv_info_ptr->prn-1));
83634ee09551764b045fdc02df754157473125edf60Kevin Tang                    }
83734ee09551764b045fdc02df754157473125edf60Kevin Tang
83834ee09551764b045fdc02df754157473125edf60Kevin Tang                    if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_HAS_ALM) &&
83934ee09551764b045fdc02df754157473125edf60Kevin Tang                        (sv_info_ptr->has_alm == 1))
84034ee09551764b045fdc02df754157473125edf60Kevin Tang                    {
84134ee09551764b045fdc02df754157473125edf60Kevin Tang                        SvStatus.almanac_mask |= (1 << (sv_info_ptr->prn-1));
84234ee09551764b045fdc02df754157473125edf60Kevin Tang                    }
84334ee09551764b045fdc02df754157473125edf60Kevin Tang
84434ee09551764b045fdc02df754157473125edf60Kevin Tang                    if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_PROCESS_STATUS) &&
84534ee09551764b045fdc02df754157473125edf60Kevin Tang                        (sv_info_ptr->process_status == RPC_LOC_SV_STATUS_TRACK))
84634ee09551764b045fdc02df754157473125edf60Kevin Tang                    {
84734ee09551764b045fdc02df754157473125edf60Kevin Tang                        SvStatus.used_in_fix_mask |= (1 << (sv_info_ptr->prn-1));
84834ee09551764b045fdc02df754157473125edf60Kevin Tang                    }
84934ee09551764b045fdc02df754157473125edf60Kevin Tang                }
85034ee09551764b045fdc02df754157473125edf60Kevin Tang                // SBAS: GPS RPN: 120-151,
85134ee09551764b045fdc02df754157473125edf60Kevin Tang                // In exteneded measurement report, we follow nmea standard, which is from 33-64.
85234ee09551764b045fdc02df754157473125edf60Kevin Tang                else if (sv_info_ptr->system == RPC_LOC_SV_SYSTEM_SBAS)
85334ee09551764b045fdc02df754157473125edf60Kevin Tang                {
85434ee09551764b045fdc02df754157473125edf60Kevin Tang                    SvStatus.sv_list[SvStatus.num_svs].prn = sv_info_ptr->prn + 33 - 120;
85534ee09551764b045fdc02df754157473125edf60Kevin Tang                }
85634ee09551764b045fdc02df754157473125edf60Kevin Tang                // Gloness: Slot id: 1-32
85734ee09551764b045fdc02df754157473125edf60Kevin Tang                // In extended measurement report, we follow nmea standard, which is 65-96
85834ee09551764b045fdc02df754157473125edf60Kevin Tang                else if (sv_info_ptr->system == RPC_LOC_SV_SYSTEM_GLONASS)
85934ee09551764b045fdc02df754157473125edf60Kevin Tang                {
86034ee09551764b045fdc02df754157473125edf60Kevin Tang                    SvStatus.sv_list[SvStatus.num_svs].prn = sv_info_ptr->prn + (65-1);
86134ee09551764b045fdc02df754157473125edf60Kevin Tang                }
86234ee09551764b045fdc02df754157473125edf60Kevin Tang                // Unsupported SV system
86334ee09551764b045fdc02df754157473125edf60Kevin Tang                else
86434ee09551764b045fdc02df754157473125edf60Kevin Tang                {
86534ee09551764b045fdc02df754157473125edf60Kevin Tang                    continue;
86634ee09551764b045fdc02df754157473125edf60Kevin Tang                }
86734ee09551764b045fdc02df754157473125edf60Kevin Tang            }
86834ee09551764b045fdc02df754157473125edf60Kevin Tang
86934ee09551764b045fdc02df754157473125edf60Kevin Tang            if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_SNR)
87034ee09551764b045fdc02df754157473125edf60Kevin Tang            {
87134ee09551764b045fdc02df754157473125edf60Kevin Tang                SvStatus.sv_list[SvStatus.num_svs].snr = sv_info_ptr->snr;
87234ee09551764b045fdc02df754157473125edf60Kevin Tang            }
87334ee09551764b045fdc02df754157473125edf60Kevin Tang
87434ee09551764b045fdc02df754157473125edf60Kevin Tang            if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_ELEVATION)
87534ee09551764b045fdc02df754157473125edf60Kevin Tang            {
87634ee09551764b045fdc02df754157473125edf60Kevin Tang                SvStatus.sv_list[SvStatus.num_svs].elevation = sv_info_ptr->elevation;
87734ee09551764b045fdc02df754157473125edf60Kevin Tang            }
87834ee09551764b045fdc02df754157473125edf60Kevin Tang
87934ee09551764b045fdc02df754157473125edf60Kevin Tang            if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_AZIMUTH)
88034ee09551764b045fdc02df754157473125edf60Kevin Tang            {
88134ee09551764b045fdc02df754157473125edf60Kevin Tang                SvStatus.sv_list[SvStatus.num_svs].azimuth = sv_info_ptr->azimuth;
88234ee09551764b045fdc02df754157473125edf60Kevin Tang            }
88334ee09551764b045fdc02df754157473125edf60Kevin Tang
88434ee09551764b045fdc02df754157473125edf60Kevin Tang            SvStatus.num_svs++;
88534ee09551764b045fdc02df754157473125edf60Kevin Tang        }
88634ee09551764b045fdc02df754157473125edf60Kevin Tang    }
88734ee09551764b045fdc02df754157473125edf60Kevin Tang
888e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if ((gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_POS_DOP) &&
889e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_HOR_DOP) &&
890e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_VERT_DOP))
891e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    {
892e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_DOP;
893e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        locationExtended.pdop = gnss_report_ptr->position_dop;
894e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        locationExtended.hdop = gnss_report_ptr->horizontal_dop;
895e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        locationExtended.vdop = gnss_report_ptr->vertical_dop;
896e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
897e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
89834ee09551764b045fdc02df754157473125edf60Kevin Tang    if (SvStatus.num_svs >= 0)
89934ee09551764b045fdc02df754157473125edf60Kevin Tang    {
900e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        LocApiBase::reportSv(SvStatus,
901e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                             locationExtended,
902e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                             (void*)gnss_report_ptr);
90334ee09551764b045fdc02df754157473125edf60Kevin Tang    }
90434ee09551764b045fdc02df754157473125edf60Kevin Tang}
90534ee09551764b045fdc02df754157473125edf60Kevin Tang
906e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocApiRpc::reportStatus(const rpc_loc_status_event_s_type *status_report_ptr)
90734ee09551764b045fdc02df754157473125edf60Kevin Tang{
90834ee09551764b045fdc02df754157473125edf60Kevin Tang
90934ee09551764b045fdc02df754157473125edf60Kevin Tang    if (status_report_ptr->event == RPC_LOC_STATUS_EVENT_ENGINE_STATE) {
91034ee09551764b045fdc02df754157473125edf60Kevin Tang        if (status_report_ptr->payload.rpc_loc_status_event_payload_u_type_u.engine_state == RPC_LOC_ENGINE_STATE_ON)
91134ee09551764b045fdc02df754157473125edf60Kevin Tang        {
912e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            LocApiBase::reportStatus(GPS_STATUS_ENGINE_ON);
913e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            LocApiBase::reportStatus(GPS_STATUS_SESSION_BEGIN);
91434ee09551764b045fdc02df754157473125edf60Kevin Tang        }
91534ee09551764b045fdc02df754157473125edf60Kevin Tang        else if (status_report_ptr->payload.rpc_loc_status_event_payload_u_type_u.engine_state == RPC_LOC_ENGINE_STATE_OFF)
91634ee09551764b045fdc02df754157473125edf60Kevin Tang        {
917e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            LocApiBase::reportStatus(GPS_STATUS_SESSION_END);
918e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            LocApiBase::reportStatus(GPS_STATUS_ENGINE_OFF);
91934ee09551764b045fdc02df754157473125edf60Kevin Tang        }
92034ee09551764b045fdc02df754157473125edf60Kevin Tang        else
92134ee09551764b045fdc02df754157473125edf60Kevin Tang        {
922e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            LocApiBase::reportStatus(GPS_STATUS_NONE);
92334ee09551764b045fdc02df754157473125edf60Kevin Tang        }
92434ee09551764b045fdc02df754157473125edf60Kevin Tang    }
92534ee09551764b045fdc02df754157473125edf60Kevin Tang
92634ee09551764b045fdc02df754157473125edf60Kevin Tang}
92734ee09551764b045fdc02df754157473125edf60Kevin Tang
928e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocApiRpc::reportNmea(const rpc_loc_nmea_report_s_type *nmea_report_ptr)
92934ee09551764b045fdc02df754157473125edf60Kevin Tang{
93034ee09551764b045fdc02df754157473125edf60Kevin Tang
93134ee09551764b045fdc02df754157473125edf60Kevin Tang#if (AMSS_VERSION==3200)
932e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LocApiBase::reportNmea(nmea_report_ptr->nmea_sentences.nmea_sentences_val,
933e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                           nmea_report_ptr->nmea_sentences.nmea_sentences_len);
93434ee09551764b045fdc02df754157473125edf60Kevin Tang#else
935e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LocApiBase::reportNmea(nmea_report_ptr->nmea_sentences,
936e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                           nmea_report_ptr->length);
93734ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_LOGD("loc_eng_report_nmea: $%c%c%c\n",
938e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo             nmea_report_ptr->nmea_sentences[3],
939e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo             nmea_report_ptr->nmea_sentences[4],
94034ee09551764b045fdc02df754157473125edf60Kevin Tang             nmea_report_ptr->nmea_sentences[5]);
94134ee09551764b045fdc02df754157473125edf60Kevin Tang#endif /* #if (AMSS_VERSION==3200) */
94234ee09551764b045fdc02df754157473125edf60Kevin Tang}
94334ee09551764b045fdc02df754157473125edf60Kevin Tang
94434ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
945e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::setXtraData(char* data, int length)
94634ee09551764b045fdc02df754157473125edf60Kevin Tang{
94734ee09551764b045fdc02df754157473125edf60Kevin Tang    int     rpc_ret_val = RPC_LOC_API_GENERAL_FAILURE;
94834ee09551764b045fdc02df754157473125edf60Kevin Tang    int     total_parts;
94934ee09551764b045fdc02df754157473125edf60Kevin Tang    uint8   part;
95034ee09551764b045fdc02df754157473125edf60Kevin Tang    uint16  part_len;
95134ee09551764b045fdc02df754157473125edf60Kevin Tang    uint16  len_injected;
95234ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_data_u_type            ioctl_data;
95334ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_e_type                 ioctl_type = RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA;
95434ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_predicted_orbits_data_s_type *predicted_orbits_data_ptr;
95534ee09551764b045fdc02df754157473125edf60Kevin Tang
95634ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_LOGD("qct_loc_eng_inject_xtra_data, xtra size = %d, data ptr = 0x%lx\n", length, (long) data);
95734ee09551764b045fdc02df754157473125edf60Kevin Tang
95834ee09551764b045fdc02df754157473125edf60Kevin Tang    predicted_orbits_data_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.predicted_orbits_data;
95934ee09551764b045fdc02df754157473125edf60Kevin Tang    predicted_orbits_data_ptr->format_type = RPC_LOC_PREDICTED_ORBITS_XTRA;
96034ee09551764b045fdc02df754157473125edf60Kevin Tang    predicted_orbits_data_ptr->total_size = length;
96134ee09551764b045fdc02df754157473125edf60Kevin Tang    total_parts = (length - 1) / XTRA_BLOCK_SIZE + 1;
96234ee09551764b045fdc02df754157473125edf60Kevin Tang    predicted_orbits_data_ptr->total_parts = total_parts;
96334ee09551764b045fdc02df754157473125edf60Kevin Tang
96434ee09551764b045fdc02df754157473125edf60Kevin Tang    len_injected = 0; // O bytes injected
96534ee09551764b045fdc02df754157473125edf60Kevin Tang    ioctl_data.disc = ioctl_type;
96634ee09551764b045fdc02df754157473125edf60Kevin Tang
96734ee09551764b045fdc02df754157473125edf60Kevin Tang    // XTRA injection starts with part 1
96834ee09551764b045fdc02df754157473125edf60Kevin Tang    for (part = 1; part <= total_parts; part++)
96934ee09551764b045fdc02df754157473125edf60Kevin Tang    {
97034ee09551764b045fdc02df754157473125edf60Kevin Tang        predicted_orbits_data_ptr->part = part;
97134ee09551764b045fdc02df754157473125edf60Kevin Tang        predicted_orbits_data_ptr->part_len = XTRA_BLOCK_SIZE;
97234ee09551764b045fdc02df754157473125edf60Kevin Tang        if (XTRA_BLOCK_SIZE > (length - len_injected))
97334ee09551764b045fdc02df754157473125edf60Kevin Tang        {
97434ee09551764b045fdc02df754157473125edf60Kevin Tang            predicted_orbits_data_ptr->part_len = length - len_injected;
97534ee09551764b045fdc02df754157473125edf60Kevin Tang        }
97634ee09551764b045fdc02df754157473125edf60Kevin Tang        predicted_orbits_data_ptr->data_ptr.data_ptr_len = predicted_orbits_data_ptr->part_len;
97734ee09551764b045fdc02df754157473125edf60Kevin Tang        predicted_orbits_data_ptr->data_ptr.data_ptr_val = data + len_injected;
97834ee09551764b045fdc02df754157473125edf60Kevin Tang
97934ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGD("qct_loc_eng_inject_xtra_data, part %d/%d, len = %d, total = %d\n",
98034ee09551764b045fdc02df754157473125edf60Kevin Tang                 predicted_orbits_data_ptr->part,
98134ee09551764b045fdc02df754157473125edf60Kevin Tang                 total_parts,
98234ee09551764b045fdc02df754157473125edf60Kevin Tang                 predicted_orbits_data_ptr->part_len,
98334ee09551764b045fdc02df754157473125edf60Kevin Tang                 len_injected);
98434ee09551764b045fdc02df754157473125edf60Kevin Tang
98534ee09551764b045fdc02df754157473125edf60Kevin Tang        if (part < total_parts)
98634ee09551764b045fdc02df754157473125edf60Kevin Tang        {
98734ee09551764b045fdc02df754157473125edf60Kevin Tang            // No callback in this case
98834ee09551764b045fdc02df754157473125edf60Kevin Tang            rpc_ret_val = loc_ioctl (client_handle,
98934ee09551764b045fdc02df754157473125edf60Kevin Tang                                     ioctl_type,
99034ee09551764b045fdc02df754157473125edf60Kevin Tang                                     &ioctl_data);
99134ee09551764b045fdc02df754157473125edf60Kevin Tang
99234ee09551764b045fdc02df754157473125edf60Kevin Tang            if (rpc_ret_val != RPC_LOC_API_SUCCESS)
99334ee09551764b045fdc02df754157473125edf60Kevin Tang            {
99434ee09551764b045fdc02df754157473125edf60Kevin Tang                LOC_LOGE("loc_ioctl for xtra error: %s\n", loc_get_ioctl_status_name(rpc_ret_val));
99534ee09551764b045fdc02df754157473125edf60Kevin Tang                break;
99634ee09551764b045fdc02df754157473125edf60Kevin Tang            }
99734ee09551764b045fdc02df754157473125edf60Kevin Tang            //Add a delay of 10 ms so that repeated RPC calls dont starve the modem processor
99834ee09551764b045fdc02df754157473125edf60Kevin Tang            usleep(10 * 1000);
99934ee09551764b045fdc02df754157473125edf60Kevin Tang        }
100034ee09551764b045fdc02df754157473125edf60Kevin Tang        else // part == total_parts
100134ee09551764b045fdc02df754157473125edf60Kevin Tang        {
100234ee09551764b045fdc02df754157473125edf60Kevin Tang            // Last part injection, will need to wait for callback
100334ee09551764b045fdc02df754157473125edf60Kevin Tang            if (!loc_eng_ioctl(client_handle,
100434ee09551764b045fdc02df754157473125edf60Kevin Tang                               ioctl_type,
100534ee09551764b045fdc02df754157473125edf60Kevin Tang                               &ioctl_data,
100634ee09551764b045fdc02df754157473125edf60Kevin Tang                               LOC_XTRA_INJECT_DEFAULT_TIMEOUT,
100734ee09551764b045fdc02df754157473125edf60Kevin Tang                               NULL))
100834ee09551764b045fdc02df754157473125edf60Kevin Tang            {
100934ee09551764b045fdc02df754157473125edf60Kevin Tang                rpc_ret_val = RPC_LOC_API_GENERAL_FAILURE;
101034ee09551764b045fdc02df754157473125edf60Kevin Tang            }
101134ee09551764b045fdc02df754157473125edf60Kevin Tang            break; // done with injection
101234ee09551764b045fdc02df754157473125edf60Kevin Tang        }
101334ee09551764b045fdc02df754157473125edf60Kevin Tang
101434ee09551764b045fdc02df754157473125edf60Kevin Tang        len_injected += predicted_orbits_data_ptr->part_len;
101534ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGD("loc_ioctl XTRA injected length: %d\n", len_injected);
101634ee09551764b045fdc02df754157473125edf60Kevin Tang    }
101734ee09551764b045fdc02df754157473125edf60Kevin Tang
101834ee09551764b045fdc02df754157473125edf60Kevin Tang    return convertErr(rpc_ret_val);
101934ee09551764b045fdc02df754157473125edf60Kevin Tang}
102034ee09551764b045fdc02df754157473125edf60Kevin Tang
1021e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo/* Request the Xtra Server Url from the modem */
1022e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoenum loc_api_adapter_err
1023e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::requestXtraServer()
1024e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{
1025e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    loc_api_adapter_err           err;
1026e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    rpc_loc_ioctl_data_u_type     data;
1027e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    rpc_loc_ioctl_callback_s_type callback_data;
1028e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
1029e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    err = convertErr(loc_eng_ioctl(client_handle,
1030e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                   RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE,
1031e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                   &data,
1032e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                   LOC_IOCTL_DEFAULT_TIMEOUT,
1033e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                   &callback_data));
1034e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
1035e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (LOC_API_ADAPTER_ERR_SUCCESS != err)
1036e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    {
1037e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        LOC_LOGE("RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE failed!: err=%d\n", err);
1038e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        return err;
1039e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
1040e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    else if (RPC_LOC_SESS_STATUS_SUCCESS != callback_data.status)
1041e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    {
1042e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        LOC_LOGE("RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE failed!: status=%ld\n", callback_data.status);
1043e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        return LOC_API_ADAPTER_ERR_GENERAL_FAILURE;
1044e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
1045e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    else if (RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE != callback_data.type)
1046e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    {
1047e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        LOC_LOGE("RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE is not the type expected! type=%d\n", callback_data.type);
1048e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        return LOC_API_ADAPTER_ERR_GENERAL_FAILURE;
1049e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
1050e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    else if (RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE != callback_data.data.disc)
1051e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    {
1052e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        LOC_LOGE("RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE is not the disc expected! disc=%d\n", callback_data.data.disc);
1053e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        return LOC_API_ADAPTER_ERR_GENERAL_FAILURE;
1054e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
1055e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
1056e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    reportXtraServer(callback_data.data.rpc_loc_ioctl_callback_data_u_type_u.
1057e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                     predicted_orbits_data_source.servers[0],
1058e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                     callback_data.data.rpc_loc_ioctl_callback_data_u_type_u.
1059e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                     predicted_orbits_data_source.servers[1],
1060e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                     callback_data.data.rpc_loc_ioctl_callback_data_u_type_u.
1061e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                     predicted_orbits_data_source.servers[2],
1062e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                     255);
1063e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
1064e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    return LOC_API_ADAPTER_ERR_SUCCESS;
1065e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
1066e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
106734ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
1068e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::atlOpenStatus(int handle, int is_succ, char* apn, AGpsBearerType bearer, AGpsType agpsType)
106934ee09551764b045fdc02df754157473125edf60Kevin Tang{
107034ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_server_open_status_e_type open_status = is_succ ? RPC_LOC_SERVER_OPEN_SUCCESS : RPC_LOC_SERVER_OPEN_FAIL;
107134ee09551764b045fdc02df754157473125edf60Kevin Tang   rpc_loc_ioctl_data_u_type           ioctl_data;
107234ee09551764b045fdc02df754157473125edf60Kevin Tang
107334ee09551764b045fdc02df754157473125edf60Kevin Tang    if (AGPS_TYPE_INVALID == agpsType) {
107434ee09551764b045fdc02df754157473125edf60Kevin Tang        rpc_loc_server_open_status_s_type  *conn_open_status_ptr =
107534ee09551764b045fdc02df754157473125edf60Kevin Tang            &ioctl_data.rpc_loc_ioctl_data_u_type_u.conn_open_status;
107634ee09551764b045fdc02df754157473125edf60Kevin Tang
107734ee09551764b045fdc02df754157473125edf60Kevin Tang        // Fill in data
107834ee09551764b045fdc02df754157473125edf60Kevin Tang        ioctl_data.disc = RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS;
107934ee09551764b045fdc02df754157473125edf60Kevin Tang        conn_open_status_ptr->conn_handle = handle;
108034ee09551764b045fdc02df754157473125edf60Kevin Tang        conn_open_status_ptr->open_status = open_status;
108134ee09551764b045fdc02df754157473125edf60Kevin Tang#if (AMSS_VERSION==3200)
108234ee09551764b045fdc02df754157473125edf60Kevin Tang        conn_open_status_ptr->apn_name = apn; /* requires APN */
108334ee09551764b045fdc02df754157473125edf60Kevin Tang#else
108434ee09551764b045fdc02df754157473125edf60Kevin Tang        if (is_succ) {
108534ee09551764b045fdc02df754157473125edf60Kevin Tang            strlcpy(conn_open_status_ptr->apn_name, apn,
108634ee09551764b045fdc02df754157473125edf60Kevin Tang                    sizeof conn_open_status_ptr->apn_name);
108734ee09551764b045fdc02df754157473125edf60Kevin Tang        } else {
108834ee09551764b045fdc02df754157473125edf60Kevin Tang            conn_open_status_ptr->apn_name[0] = 0;
108934ee09551764b045fdc02df754157473125edf60Kevin Tang        }
109034ee09551764b045fdc02df754157473125edf60Kevin Tang#endif /* #if (AMSS_VERSION==3200) */
109134ee09551764b045fdc02df754157473125edf60Kevin Tang
109234ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGD("ATL RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS open %s, APN name = [%s]\n",
109334ee09551764b045fdc02df754157473125edf60Kevin Tang                 log_succ_fail_string(is_succ),
109434ee09551764b045fdc02df754157473125edf60Kevin Tang                 apn);
109534ee09551764b045fdc02df754157473125edf60Kevin Tang    } else {
109634ee09551764b045fdc02df754157473125edf60Kevin Tang        rpc_loc_server_multi_open_status_s_type  *conn_multi_open_status_ptr =
109734ee09551764b045fdc02df754157473125edf60Kevin Tang            &ioctl_data.rpc_loc_ioctl_data_u_type_u.multi_conn_open_status;
109834ee09551764b045fdc02df754157473125edf60Kevin Tang
109934ee09551764b045fdc02df754157473125edf60Kevin Tang        // Fill in data
110034ee09551764b045fdc02df754157473125edf60Kevin Tang        ioctl_data.disc = RPC_LOC_IOCTL_INFORM_SERVER_MULTI_OPEN_STATUS;
110134ee09551764b045fdc02df754157473125edf60Kevin Tang        conn_multi_open_status_ptr->conn_handle = handle;
110234ee09551764b045fdc02df754157473125edf60Kevin Tang        conn_multi_open_status_ptr->open_status = open_status;
110334ee09551764b045fdc02df754157473125edf60Kevin Tang        if (is_succ) {
110434ee09551764b045fdc02df754157473125edf60Kevin Tang            strlcpy(conn_multi_open_status_ptr->apn_name, apn,
110534ee09551764b045fdc02df754157473125edf60Kevin Tang                    sizeof conn_multi_open_status_ptr->apn_name);
110634ee09551764b045fdc02df754157473125edf60Kevin Tang        } else {
110734ee09551764b045fdc02df754157473125edf60Kevin Tang            conn_multi_open_status_ptr->apn_name[0] = 0;
110834ee09551764b045fdc02df754157473125edf60Kevin Tang        }
110934ee09551764b045fdc02df754157473125edf60Kevin Tang
111034ee09551764b045fdc02df754157473125edf60Kevin Tang        switch(bearer)
111134ee09551764b045fdc02df754157473125edf60Kevin Tang        {
111234ee09551764b045fdc02df754157473125edf60Kevin Tang        case AGPS_APN_BEARER_IPV4:
111334ee09551764b045fdc02df754157473125edf60Kevin Tang            conn_multi_open_status_ptr->pdp_type = RPC_LOC_SERVER_PDP_IP;
111434ee09551764b045fdc02df754157473125edf60Kevin Tang            break;
111534ee09551764b045fdc02df754157473125edf60Kevin Tang        case AGPS_APN_BEARER_IPV6:
111634ee09551764b045fdc02df754157473125edf60Kevin Tang            conn_multi_open_status_ptr->pdp_type = RPC_LOC_SERVER_PDP_IPV6;
111734ee09551764b045fdc02df754157473125edf60Kevin Tang            break;
111834ee09551764b045fdc02df754157473125edf60Kevin Tang        case AGPS_APN_BEARER_IPV4V6:
111934ee09551764b045fdc02df754157473125edf60Kevin Tang            conn_multi_open_status_ptr->pdp_type = RPC_LOC_SERVER_PDP_IPV4V6;
112034ee09551764b045fdc02df754157473125edf60Kevin Tang            break;
112134ee09551764b045fdc02df754157473125edf60Kevin Tang        default:
112234ee09551764b045fdc02df754157473125edf60Kevin Tang            conn_multi_open_status_ptr->pdp_type = RPC_LOC_SERVER_PDP_PPP;
112334ee09551764b045fdc02df754157473125edf60Kevin Tang        }
112434ee09551764b045fdc02df754157473125edf60Kevin Tang
112534ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGD("ATL RPC_LOC_IOCTL_INFORM_SERVER_MULTI_OPEN_STATUS open %s, APN name = [%s], pdp_type = %d\n",
112634ee09551764b045fdc02df754157473125edf60Kevin Tang                 log_succ_fail_string(is_succ),
112734ee09551764b045fdc02df754157473125edf60Kevin Tang                 apn,
112834ee09551764b045fdc02df754157473125edf60Kevin Tang                 conn_multi_open_status_ptr->pdp_type);
112934ee09551764b045fdc02df754157473125edf60Kevin Tang    }
113034ee09551764b045fdc02df754157473125edf60Kevin Tang
113134ee09551764b045fdc02df754157473125edf60Kevin Tang    // Make the IOCTL call
113234ee09551764b045fdc02df754157473125edf60Kevin Tang    return convertErr(
113334ee09551764b045fdc02df754157473125edf60Kevin Tang        loc_eng_ioctl(client_handle,
113434ee09551764b045fdc02df754157473125edf60Kevin Tang                      ioctl_data.disc,
113534ee09551764b045fdc02df754157473125edf60Kevin Tang                      &ioctl_data,
113634ee09551764b045fdc02df754157473125edf60Kevin Tang                      LOC_IOCTL_DEFAULT_TIMEOUT,
113734ee09551764b045fdc02df754157473125edf60Kevin Tang                      NULL)
113834ee09551764b045fdc02df754157473125edf60Kevin Tang        );
113934ee09551764b045fdc02df754157473125edf60Kevin Tang}
114034ee09551764b045fdc02df754157473125edf60Kevin Tang
114134ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
1142e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::atlCloseStatus(int handle, int is_succ)
114334ee09551764b045fdc02df754157473125edf60Kevin Tang{
114434ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_data_u_type           ioctl_data;
114534ee09551764b045fdc02df754157473125edf60Kevin Tang    ioctl_data.disc = RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS;
114634ee09551764b045fdc02df754157473125edf60Kevin Tang
114734ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_server_close_status_s_type *conn_close_status_ptr =
114834ee09551764b045fdc02df754157473125edf60Kevin Tang        &ioctl_data.rpc_loc_ioctl_data_u_type_u.conn_close_status;
114934ee09551764b045fdc02df754157473125edf60Kevin Tang    conn_close_status_ptr->conn_handle = handle;
115034ee09551764b045fdc02df754157473125edf60Kevin Tang    conn_close_status_ptr->close_status = is_succ ? RPC_LOC_SERVER_CLOSE_SUCCESS : RPC_LOC_SERVER_CLOSE_FAIL;
115134ee09551764b045fdc02df754157473125edf60Kevin Tang
115234ee09551764b045fdc02df754157473125edf60Kevin Tang    // Make the IOCTL call
115334ee09551764b045fdc02df754157473125edf60Kevin Tang    return convertErr(
115434ee09551764b045fdc02df754157473125edf60Kevin Tang        loc_eng_ioctl(client_handle,
115534ee09551764b045fdc02df754157473125edf60Kevin Tang                      ioctl_data.disc,
115634ee09551764b045fdc02df754157473125edf60Kevin Tang                      &ioctl_data,
115734ee09551764b045fdc02df754157473125edf60Kevin Tang                      LOC_IOCTL_DEFAULT_TIMEOUT,
115834ee09551764b045fdc02df754157473125edf60Kevin Tang                      NULL)
115934ee09551764b045fdc02df754157473125edf60Kevin Tang        );
116034ee09551764b045fdc02df754157473125edf60Kevin Tang}
116134ee09551764b045fdc02df754157473125edf60Kevin Tang
1162e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocApiRpc::ATLEvent(const rpc_loc_server_request_s_type *server_request_ptr)
116334ee09551764b045fdc02df754157473125edf60Kevin Tang{
116434ee09551764b045fdc02df754157473125edf60Kevin Tang    int connHandle;
116534ee09551764b045fdc02df754157473125edf60Kevin Tang    AGpsType agps_type;
116634ee09551764b045fdc02df754157473125edf60Kevin Tang
116734ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_LOGV("RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST event %s)",
116834ee09551764b045fdc02df754157473125edf60Kevin Tang             loc_get_event_atl_open_name(server_request_ptr->event));
116934ee09551764b045fdc02df754157473125edf60Kevin Tang    switch (server_request_ptr->event)
117034ee09551764b045fdc02df754157473125edf60Kevin Tang    {
117134ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_LOC_SERVER_REQUEST_MULTI_OPEN:
117234ee09551764b045fdc02df754157473125edf60Kevin Tang        connHandle = server_request_ptr->payload.rpc_loc_server_request_u_type_u.multi_open_req.conn_handle;
117334ee09551764b045fdc02df754157473125edf60Kevin Tang        if (server_request_ptr->payload.rpc_loc_server_request_u_type_u.multi_open_req.connection_type
117434ee09551764b045fdc02df754157473125edf60Kevin Tang            == RPC_LOC_SERVER_CONNECTION_LBS) {
117534ee09551764b045fdc02df754157473125edf60Kevin Tang            agps_type = AGPS_TYPE_SUPL;
117634ee09551764b045fdc02df754157473125edf60Kevin Tang            LOC_LOGV("ATLEvent: event - RPC_LOC_SERVER_REQUEST_MULTI_OPEN\n            type - AGPS_TYPE_SUPL\n            handle - %d", connHandle);
117734ee09551764b045fdc02df754157473125edf60Kevin Tang        } else {
117834ee09551764b045fdc02df754157473125edf60Kevin Tang            agps_type = AGPS_TYPE_WWAN_ANY;
117934ee09551764b045fdc02df754157473125edf60Kevin Tang            LOC_LOGV("ATLEvent: event - RPC_LOC_SERVER_REQUEST_MULTI_OPEN\n            type - AGPS_TYPE_WWAN_ANY\n            handle - %d", connHandle);
118034ee09551764b045fdc02df754157473125edf60Kevin Tang        }
118134ee09551764b045fdc02df754157473125edf60Kevin Tang        requestATL(connHandle, agps_type);
118234ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
118334ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_LOC_SERVER_REQUEST_OPEN:
118434ee09551764b045fdc02df754157473125edf60Kevin Tang        connHandle = server_request_ptr->payload.rpc_loc_server_request_u_type_u.open_req.conn_handle;
118534ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGV("ATLEvent: event - RPC_LOC_SERVER_REQUEST_OPEN\n            handle - %d", connHandle);
118634ee09551764b045fdc02df754157473125edf60Kevin Tang        requestATL(connHandle, AGPS_TYPE_INVALID);
118734ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
118834ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_LOC_SERVER_REQUEST_CLOSE:
118934ee09551764b045fdc02df754157473125edf60Kevin Tang        connHandle = server_request_ptr->payload.rpc_loc_server_request_u_type_u.close_req.conn_handle;
119034ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGV("ATLEvent: event - RPC_LOC_SERVER_REQUEST_CLOSE\n            handle - %d", connHandle);
119134ee09551764b045fdc02df754157473125edf60Kevin Tang        releaseATL(connHandle);
119234ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
119334ee09551764b045fdc02df754157473125edf60Kevin Tang    default:
119434ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGE("ATLEvent: event type %d invalid", server_request_ptr->event);
119534ee09551764b045fdc02df754157473125edf60Kevin Tang   }
119634ee09551764b045fdc02df754157473125edf60Kevin Tang}
119734ee09551764b045fdc02df754157473125edf60Kevin Tang
1198e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russovoid LocApiRpc::NIEvent(const rpc_loc_ni_event_s_type *ni_req)
119934ee09551764b045fdc02df754157473125edf60Kevin Tang{
120034ee09551764b045fdc02df754157473125edf60Kevin Tang    GpsNiNotification notif = {0};
120134ee09551764b045fdc02df754157473125edf60Kevin Tang
120234ee09551764b045fdc02df754157473125edf60Kevin Tang    switch (ni_req->event)
120334ee09551764b045fdc02df754157473125edf60Kevin Tang    {
120434ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_LOC_NI_EVENT_VX_NOTIFY_VERIFY_REQ:
120534ee09551764b045fdc02df754157473125edf60Kevin Tang    {
120634ee09551764b045fdc02df754157473125edf60Kevin Tang        const rpc_loc_ni_vx_notify_verify_req_s_type *vx_req =
120734ee09551764b045fdc02df754157473125edf60Kevin Tang            &ni_req->payload.rpc_loc_ni_event_payload_u_type_u.vx_req;
120834ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGI("VX Notification");
120934ee09551764b045fdc02df754157473125edf60Kevin Tang        notif.ni_type = GPS_NI_TYPE_VOICE;
121034ee09551764b045fdc02df754157473125edf60Kevin Tang        // Requestor ID
121134ee09551764b045fdc02df754157473125edf60Kevin Tang        hexcode(notif.requestor_id, sizeof notif.requestor_id,
121234ee09551764b045fdc02df754157473125edf60Kevin Tang                vx_req->requester_id.requester_id,
121334ee09551764b045fdc02df754157473125edf60Kevin Tang                vx_req->requester_id.requester_id_length);
121434ee09551764b045fdc02df754157473125edf60Kevin Tang        notif.text_encoding = 0; // No text and no encoding
121534ee09551764b045fdc02df754157473125edf60Kevin Tang        notif.requestor_id_encoding = convertNiEncodingType(vx_req->encoding_scheme);
121634ee09551764b045fdc02df754157473125edf60Kevin Tang        NIEventFillVerfiyType(notif, vx_req->notification_priv_type);
121734ee09551764b045fdc02df754157473125edf60Kevin Tang    }
121834ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
121934ee09551764b045fdc02df754157473125edf60Kevin Tang
122034ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_LOC_NI_EVENT_UMTS_CP_NOTIFY_VERIFY_REQ:
122134ee09551764b045fdc02df754157473125edf60Kevin Tang    {
122234ee09551764b045fdc02df754157473125edf60Kevin Tang        const rpc_loc_ni_umts_cp_notify_verify_req_s_type *umts_cp_req =
122334ee09551764b045fdc02df754157473125edf60Kevin Tang            &ni_req->payload.rpc_loc_ni_event_payload_u_type_u.umts_cp_req;
122434ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGI("UMTS CP Notification\n");
122534ee09551764b045fdc02df754157473125edf60Kevin Tang        notif.ni_type= GPS_NI_TYPE_UMTS_CTRL_PLANE;         // Stores notification text
122634ee09551764b045fdc02df754157473125edf60Kevin Tang#if (AMSS_VERSION==3200)
122734ee09551764b045fdc02df754157473125edf60Kevin Tang        hexcode(notif.text, sizeof notif.text,
122834ee09551764b045fdc02df754157473125edf60Kevin Tang                umts_cp_req->notification_text.notification_text_val,
122934ee09551764b045fdc02df754157473125edf60Kevin Tang                umts_cp_req->notification_length);
123034ee09551764b045fdc02df754157473125edf60Kevin Tang        hexcode(notif.requestor_id, sizeof notif.requestor_id,
123134ee09551764b045fdc02df754157473125edf60Kevin Tang                umts_cp_req->requestor_id.requestor_id_string.requestor_id_string_val,
123234ee09551764b045fdc02df754157473125edf60Kevin Tang                umts_cp_req->requestor_id.string_len);
123334ee09551764b045fdc02df754157473125edf60Kevin Tang#else
123434ee09551764b045fdc02df754157473125edf60Kevin Tang        hexcode(notif.text, sizeof notif.text,
123534ee09551764b045fdc02df754157473125edf60Kevin Tang                umts_cp_req->notification_text,
123634ee09551764b045fdc02df754157473125edf60Kevin Tang                umts_cp_req->notification_length);
123734ee09551764b045fdc02df754157473125edf60Kevin Tang        hexcode(notif.requestor_id, sizeof notif.requestor_id,
123834ee09551764b045fdc02df754157473125edf60Kevin Tang                umts_cp_req->requestor_id.requestor_id_string,
123934ee09551764b045fdc02df754157473125edf60Kevin Tang                umts_cp_req->requestor_id.string_len);
124034ee09551764b045fdc02df754157473125edf60Kevin Tang#endif
124134ee09551764b045fdc02df754157473125edf60Kevin Tang        notif.text_encoding = convertNiEncodingType(umts_cp_req->datacoding_scheme);
124234ee09551764b045fdc02df754157473125edf60Kevin Tang        notif.requestor_id_encoding = notif.text_encoding;
124334ee09551764b045fdc02df754157473125edf60Kevin Tang        NIEventFillVerfiyType(notif, umts_cp_req->notification_priv_type);
124434ee09551764b045fdc02df754157473125edf60Kevin Tang
124534ee09551764b045fdc02df754157473125edf60Kevin Tang        // LCS address (using extras field)
124634ee09551764b045fdc02df754157473125edf60Kevin Tang        if (umts_cp_req->ext_client_address_data.ext_client_address_len != 0)
124734ee09551764b045fdc02df754157473125edf60Kevin Tang        {
124834ee09551764b045fdc02df754157473125edf60Kevin Tang            // Copy LCS Address into notif.extras in the format: Address = 012345
124934ee09551764b045fdc02df754157473125edf60Kevin Tang            strlcat(notif.extras, LOC_NI_NOTIF_KEY_ADDRESS, sizeof notif.extras);
125034ee09551764b045fdc02df754157473125edf60Kevin Tang            strlcat(notif.extras, " = ", sizeof notif.extras);
125134ee09551764b045fdc02df754157473125edf60Kevin Tang            int addr_len = 0;
125234ee09551764b045fdc02df754157473125edf60Kevin Tang            const char *address_source = NULL;
125334ee09551764b045fdc02df754157473125edf60Kevin Tang
125434ee09551764b045fdc02df754157473125edf60Kevin Tang#if (AMSS_VERSION==3200)
125534ee09551764b045fdc02df754157473125edf60Kevin Tang            address_source = umts_cp_req->ext_client_address_data.ext_client_address.ext_client_address_val;
125634ee09551764b045fdc02df754157473125edf60Kevin Tang#else
125734ee09551764b045fdc02df754157473125edf60Kevin Tang            address_source = umts_cp_req->ext_client_address_data.ext_client_address;
125834ee09551764b045fdc02df754157473125edf60Kevin Tang#endif /* #if (AMSS_VERSION==3200) */
125934ee09551764b045fdc02df754157473125edf60Kevin Tang
126034ee09551764b045fdc02df754157473125edf60Kevin Tang            char lcs_addr[32]; // Decoded LCS address for UMTS CP NI
1261e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            addr_len = decodeAddress(lcs_addr, sizeof lcs_addr, address_source,
1262e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                     umts_cp_req->ext_client_address_data.ext_client_address_len);
126334ee09551764b045fdc02df754157473125edf60Kevin Tang
126434ee09551764b045fdc02df754157473125edf60Kevin Tang            // The address is ASCII string
126534ee09551764b045fdc02df754157473125edf60Kevin Tang            if (addr_len)
126634ee09551764b045fdc02df754157473125edf60Kevin Tang            {
126734ee09551764b045fdc02df754157473125edf60Kevin Tang                strlcat(notif.extras, lcs_addr, sizeof notif.extras);
126834ee09551764b045fdc02df754157473125edf60Kevin Tang            }
126934ee09551764b045fdc02df754157473125edf60Kevin Tang        }
127034ee09551764b045fdc02df754157473125edf60Kevin Tang    }
127134ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
127234ee09551764b045fdc02df754157473125edf60Kevin Tang
127334ee09551764b045fdc02df754157473125edf60Kevin Tang    case RPC_LOC_NI_EVENT_SUPL_NOTIFY_VERIFY_REQ:
127434ee09551764b045fdc02df754157473125edf60Kevin Tang    {
127534ee09551764b045fdc02df754157473125edf60Kevin Tang        const rpc_loc_ni_supl_notify_verify_req_s_type *supl_req =
127634ee09551764b045fdc02df754157473125edf60Kevin Tang            &ni_req->payload.rpc_loc_ni_event_payload_u_type_u.supl_req;
127734ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGI("SUPL Notification\n");
127834ee09551764b045fdc02df754157473125edf60Kevin Tang        notif.ni_type = GPS_NI_TYPE_UMTS_SUPL;
127934ee09551764b045fdc02df754157473125edf60Kevin Tang
128034ee09551764b045fdc02df754157473125edf60Kevin Tang        if (supl_req->flags & RPC_LOC_NI_CLIENT_NAME_PRESENT)
128134ee09551764b045fdc02df754157473125edf60Kevin Tang        {
128234ee09551764b045fdc02df754157473125edf60Kevin Tang#if (AMSS_VERSION==3200)
128334ee09551764b045fdc02df754157473125edf60Kevin Tang            hexcode(notif.text, sizeof notif.text,
128434ee09551764b045fdc02df754157473125edf60Kevin Tang                    supl_req->client_name.client_name_string.client_name_string_val,   /* buffer */
128534ee09551764b045fdc02df754157473125edf60Kevin Tang                    supl_req->client_name.string_len                                   /* length */
128634ee09551764b045fdc02df754157473125edf60Kevin Tang            );
128734ee09551764b045fdc02df754157473125edf60Kevin Tang#else
128834ee09551764b045fdc02df754157473125edf60Kevin Tang            hexcode(notif.text, sizeof notif.text,
128934ee09551764b045fdc02df754157473125edf60Kevin Tang                            supl_req->client_name.client_name_string,   /* buffer */
129034ee09551764b045fdc02df754157473125edf60Kevin Tang                            supl_req->client_name.string_len            /* length */
129134ee09551764b045fdc02df754157473125edf60Kevin Tang            );
129234ee09551764b045fdc02df754157473125edf60Kevin Tang#endif /* #if (AMSS_VERSION==3200) */
129334ee09551764b045fdc02df754157473125edf60Kevin Tang            LOC_LOGV("SUPL NI: client_name: %s len=%d", notif.text, supl_req->client_name.string_len);
129434ee09551764b045fdc02df754157473125edf60Kevin Tang        }
129534ee09551764b045fdc02df754157473125edf60Kevin Tang        else {
129634ee09551764b045fdc02df754157473125edf60Kevin Tang            LOC_LOGV("SUPL NI: client_name not present.");
129734ee09551764b045fdc02df754157473125edf60Kevin Tang        }
129834ee09551764b045fdc02df754157473125edf60Kevin Tang
129934ee09551764b045fdc02df754157473125edf60Kevin Tang        // Requestor ID
130034ee09551764b045fdc02df754157473125edf60Kevin Tang        if (supl_req->flags & RPC_LOC_NI_REQUESTOR_ID_PRESENT)
130134ee09551764b045fdc02df754157473125edf60Kevin Tang        {
130234ee09551764b045fdc02df754157473125edf60Kevin Tang#if (AMSS_VERSION==3200)
130334ee09551764b045fdc02df754157473125edf60Kevin Tang            hexcode(notif.requestor_id, sizeof notif.requestor_id,
130434ee09551764b045fdc02df754157473125edf60Kevin Tang                    supl_req->requestor_id.requestor_id_string.requestor_id_string_val,  /* buffer */
130534ee09551764b045fdc02df754157473125edf60Kevin Tang                    supl_req->requestor_id.string_len                                    /* length */
130634ee09551764b045fdc02df754157473125edf60Kevin Tang                );
130734ee09551764b045fdc02df754157473125edf60Kevin Tang#else
130834ee09551764b045fdc02df754157473125edf60Kevin Tang            hexcode(notif.requestor_id, sizeof notif.requestor_id,
130934ee09551764b045fdc02df754157473125edf60Kevin Tang                    supl_req->requestor_id.requestor_id_string,  /* buffer */
131034ee09551764b045fdc02df754157473125edf60Kevin Tang                    supl_req->requestor_id.string_len            /* length */
131134ee09551764b045fdc02df754157473125edf60Kevin Tang                );
131234ee09551764b045fdc02df754157473125edf60Kevin Tang#endif /* #if (AMSS_VERSION==3200) */
131334ee09551764b045fdc02df754157473125edf60Kevin Tang            LOC_LOGV("SUPL NI: requestor_id: %s len=%d", notif.requestor_id, supl_req->requestor_id.string_len);
131434ee09551764b045fdc02df754157473125edf60Kevin Tang        }
131534ee09551764b045fdc02df754157473125edf60Kevin Tang        else {
131634ee09551764b045fdc02df754157473125edf60Kevin Tang            LOC_LOGV("SUPL NI: requestor_id not present.");
131734ee09551764b045fdc02df754157473125edf60Kevin Tang        }
131834ee09551764b045fdc02df754157473125edf60Kevin Tang
131934ee09551764b045fdc02df754157473125edf60Kevin Tang        // Encoding type
132034ee09551764b045fdc02df754157473125edf60Kevin Tang        if (supl_req->flags & RPC_LOC_NI_ENCODING_TYPE_PRESENT)
132134ee09551764b045fdc02df754157473125edf60Kevin Tang        {
132234ee09551764b045fdc02df754157473125edf60Kevin Tang            notif.text_encoding = convertNiEncodingType(supl_req->datacoding_scheme);
132334ee09551764b045fdc02df754157473125edf60Kevin Tang            notif.requestor_id_encoding = notif.text_encoding;
132434ee09551764b045fdc02df754157473125edf60Kevin Tang        }
132534ee09551764b045fdc02df754157473125edf60Kevin Tang        else {
132634ee09551764b045fdc02df754157473125edf60Kevin Tang            notif.text_encoding = notif.requestor_id_encoding = GPS_ENC_UNKNOWN;
132734ee09551764b045fdc02df754157473125edf60Kevin Tang        }
132834ee09551764b045fdc02df754157473125edf60Kevin Tang
132934ee09551764b045fdc02df754157473125edf60Kevin Tang        NIEventFillVerfiyType(notif, ni_req->payload.rpc_loc_ni_event_payload_u_type_u.supl_req.notification_priv_type);
133034ee09551764b045fdc02df754157473125edf60Kevin Tang    }
133134ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
133234ee09551764b045fdc02df754157473125edf60Kevin Tang
133334ee09551764b045fdc02df754157473125edf60Kevin Tang    default:
133434ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGE("Unknown NI event: %x\n", (int) ni_req->event);
133534ee09551764b045fdc02df754157473125edf60Kevin Tang        return;
133634ee09551764b045fdc02df754157473125edf60Kevin Tang    }
133734ee09551764b045fdc02df754157473125edf60Kevin Tang
133834ee09551764b045fdc02df754157473125edf60Kevin Tang    // this copy will get freed in loc_eng_ni when loc_ni_respond() is called
133934ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ni_event_s_type *copy = (rpc_loc_ni_event_s_type *)malloc(sizeof(*copy));
134034ee09551764b045fdc02df754157473125edf60Kevin Tang    memcpy(copy, ni_req, sizeof(*copy));
1341e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    requestNiNotify(notif, (const void*)copy);
134234ee09551764b045fdc02df754157473125edf60Kevin Tang}
134334ee09551764b045fdc02df754157473125edf60Kevin Tang
1344e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoint LocApiRpc::NIEventFillVerfiyType(GpsNiNotification &notif,
134534ee09551764b045fdc02df754157473125edf60Kevin Tang                                rpc_loc_ni_notify_verify_e_type notif_priv)
134634ee09551764b045fdc02df754157473125edf60Kevin Tang{
134734ee09551764b045fdc02df754157473125edf60Kevin Tang   switch (notif_priv)
134834ee09551764b045fdc02df754157473125edf60Kevin Tang   {
134934ee09551764b045fdc02df754157473125edf60Kevin Tang   case RPC_LOC_NI_USER_NO_NOTIFY_NO_VERIFY:
135034ee09551764b045fdc02df754157473125edf60Kevin Tang       notif.notify_flags = 0;
135134ee09551764b045fdc02df754157473125edf60Kevin Tang       notif.default_response = GPS_NI_RESPONSE_NORESP;
135234ee09551764b045fdc02df754157473125edf60Kevin Tang       return 1;
135334ee09551764b045fdc02df754157473125edf60Kevin Tang   case RPC_LOC_NI_USER_NOTIFY_ONLY:
135434ee09551764b045fdc02df754157473125edf60Kevin Tang       notif.notify_flags = GPS_NI_NEED_NOTIFY;
135534ee09551764b045fdc02df754157473125edf60Kevin Tang       notif.default_response = GPS_NI_RESPONSE_NORESP;
135634ee09551764b045fdc02df754157473125edf60Kevin Tang       return 1;
135734ee09551764b045fdc02df754157473125edf60Kevin Tang   case RPC_LOC_NI_USER_NOTIFY_VERIFY_ALLOW_NO_RESP:
135834ee09551764b045fdc02df754157473125edf60Kevin Tang       notif.notify_flags = GPS_NI_NEED_NOTIFY | GPS_NI_NEED_VERIFY;
135934ee09551764b045fdc02df754157473125edf60Kevin Tang       notif.default_response = GPS_NI_RESPONSE_ACCEPT;
136034ee09551764b045fdc02df754157473125edf60Kevin Tang       return 1;
136134ee09551764b045fdc02df754157473125edf60Kevin Tang   case RPC_LOC_NI_USER_NOTIFY_VERIFY_NOT_ALLOW_NO_RESP:
136234ee09551764b045fdc02df754157473125edf60Kevin Tang       notif.notify_flags = GPS_NI_NEED_NOTIFY | GPS_NI_NEED_VERIFY;
136334ee09551764b045fdc02df754157473125edf60Kevin Tang       notif.default_response = GPS_NI_RESPONSE_DENY;
136434ee09551764b045fdc02df754157473125edf60Kevin Tang       return 1;
136534ee09551764b045fdc02df754157473125edf60Kevin Tang   case RPC_LOC_NI_USER_PRIVACY_OVERRIDE:
136634ee09551764b045fdc02df754157473125edf60Kevin Tang       notif.notify_flags = GPS_NI_PRIVACY_OVERRIDE;
136734ee09551764b045fdc02df754157473125edf60Kevin Tang       notif.default_response = GPS_NI_RESPONSE_NORESP;
136834ee09551764b045fdc02df754157473125edf60Kevin Tang       return 1;
136934ee09551764b045fdc02df754157473125edf60Kevin Tang   default:
137034ee09551764b045fdc02df754157473125edf60Kevin Tang      return 0;
137134ee09551764b045fdc02df754157473125edf60Kevin Tang   }
137234ee09551764b045fdc02df754157473125edf60Kevin Tang}
137334ee09551764b045fdc02df754157473125edf60Kevin Tang
137434ee09551764b045fdc02df754157473125edf60Kevin Tangenum loc_api_adapter_err
1375e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiRpc::setSUPLVersion(uint32_t version)
137634ee09551764b045fdc02df754157473125edf60Kevin Tang{
137734ee09551764b045fdc02df754157473125edf60Kevin Tang   rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_SUPL_VERSION, {0}};
137834ee09551764b045fdc02df754157473125edf60Kevin Tang   ioctl_data.rpc_loc_ioctl_data_u_type_u.supl_version = (int)version;
137934ee09551764b045fdc02df754157473125edf60Kevin Tang   return convertErr(
138034ee09551764b045fdc02df754157473125edf60Kevin Tang       loc_eng_ioctl (client_handle,
138134ee09551764b045fdc02df754157473125edf60Kevin Tang                      RPC_LOC_IOCTL_SET_SUPL_VERSION,
138234ee09551764b045fdc02df754157473125edf60Kevin Tang                      &ioctl_data,
138334ee09551764b045fdc02df754157473125edf60Kevin Tang                      LOC_IOCTL_DEFAULT_TIMEOUT,
138434ee09551764b045fdc02df754157473125edf60Kevin Tang                      NULL)
138534ee09551764b045fdc02df754157473125edf60Kevin Tang       );
138634ee09551764b045fdc02df754157473125edf60Kevin Tang}
138734ee09551764b045fdc02df754157473125edf60Kevin Tang
1388e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoGpsNiEncodingType LocApiRpc::convertNiEncodingType(int loc_encoding)
138934ee09551764b045fdc02df754157473125edf60Kevin Tang{
139034ee09551764b045fdc02df754157473125edf60Kevin Tang   switch (loc_encoding)
139134ee09551764b045fdc02df754157473125edf60Kevin Tang   {
139234ee09551764b045fdc02df754157473125edf60Kevin Tang   case RPC_LOC_NI_SUPL_UTF8:
139334ee09551764b045fdc02df754157473125edf60Kevin Tang       return GPS_ENC_SUPL_UTF8;
139434ee09551764b045fdc02df754157473125edf60Kevin Tang   case RPC_LOC_NI_SUPL_UCS2:
139534ee09551764b045fdc02df754157473125edf60Kevin Tang       return GPS_ENC_SUPL_UCS2;
139634ee09551764b045fdc02df754157473125edf60Kevin Tang   case RPC_LOC_NI_SUPL_GSM_DEFAULT:
139734ee09551764b045fdc02df754157473125edf60Kevin Tang      return GPS_ENC_SUPL_GSM_DEFAULT;
139834ee09551764b045fdc02df754157473125edf60Kevin Tang   case RPC_LOC_NI_SS_LANGUAGE_UNSPEC:
139934ee09551764b045fdc02df754157473125edf60Kevin Tang      return GPS_ENC_SUPL_GSM_DEFAULT; // SS_LANGUAGE_UNSPEC = GSM
140034ee09551764b045fdc02df754157473125edf60Kevin Tang   default:
140134ee09551764b045fdc02df754157473125edf60Kevin Tang       return GPS_ENC_UNKNOWN;
140234ee09551764b045fdc02df754157473125edf60Kevin Tang   }
140334ee09551764b045fdc02df754157473125edf60Kevin Tang}
1404e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
1405e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocApiBase* getLocApi(const MsgTask* msgTask,
140647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                      LOC_API_ADAPTER_EVENT_MASK_T exMask,
140747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                      ContextBase *context) {
140847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    return new LocApiRpc(msgTask, exMask, context);
140947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo}
141047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
141147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo/*Values for lock
141247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo  1 = Do not lock any position sessions
141347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo  2 = Lock MI position sessions
141447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo  3 = Lock MT position sessions
141547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo  4 = Lock all position sessions
141647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo*/
14178aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tangint LocApiRpc::setGpsLock(LOC_GPS_LOCK_MASK lockMask)
141847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo{
141947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    rpc_loc_ioctl_data_u_type    ioctl_data;
142047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    boolean ret_val;
14218aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang    LOC_LOGD("%s:%d]: lock: %x\n", __func__, __LINE__, lockMask);
14228aa503a872e8c8cf241061f6ffed4e9fba125ffeKevin Tang    ioctl_data.rpc_loc_ioctl_data_u_type_u.engine_lock = convertGpsLockMask(lockMask);
142347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    ioctl_data.disc = RPC_LOC_IOCTL_SET_ENGINE_LOCK;
142447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    ret_val = loc_eng_ioctl (loc_eng_data.client_handle,
142547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                            RPC_LOC_IOCTL_SET_ENGINE_LOCK,
142647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                            &ioctl_data,
142747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                            LOC_IOCTL_DEFAULT_TIMEOUT,
142847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                            NULL /* No output information is expected*/);
142947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
143047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    LOC_LOGD("%s:%d]: ret_val: %d\n", __func__, __LINE__, (int)ret_val);
143147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    return (ret_val == TRUE ? 0 : -1);
143247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo}
143347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
143447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo/*
143547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo  Returns
143647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo  Current value of GPS lock on success
143747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo  -1 on failure
143847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo*/
143947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russoint LocApiRpc :: getGpsLock()
144047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo{
144147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    rpc_loc_ioctl_data_u_type    ioctl_data;
144247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    rpc_loc_ioctl_callback_s_type callback_payload;
144347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    boolean ret_val;
144447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    int ret=0;
144547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    LOC_LOGD("%s:%d]: Enter\n", __func__, __LINE__);
144647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    ret_val = loc_eng_ioctl (loc_eng_data.client_handle,
144747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                            RPC_LOC_IOCTL_GET_ENGINE_LOCK,
144847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                            &ioctl_data,
144947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                            LOC_IOCTL_DEFAULT_TIMEOUT,
145047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                            &callback_payload);
145147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if(ret_val == TRUE) {
145247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        ret = (int)callback_payload.data.engine_lock;
145347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        LOC_LOGD("%s:%d]: Lock type: %d\n", __func__, __LINE__, ret);
145447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    }
145547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    else {
145647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        LOC_LOGE("%s:%d]: Ioctl failed", __func__, __LINE__);
145747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        ret = -1;
145847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    }
145947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    LOC_LOGD("%s:%d]: Exit\n", __func__, __LINE__);
146047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    return ret;
1461e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo}
1462