14035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
24035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *
34035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * Redistribution and use in source and binary forms, with or without
44035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * modification, are permitted provided that the following conditions are
54035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * met:
64035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *     * Redistributions of source code must retain the above copyright
74035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       notice, this list of conditions and the following disclaimer.
84035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *     * Redistributions in binary form must reproduce the above
94035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       copyright notice, this list of conditions and the following
104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       disclaimer in the documentation and/or other materials provided
114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       with the distribution.
124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *     * Neither the name of The Linux Foundation, nor the names of its
134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       contributors may be used to endorse or promote products derived
144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       from this software without specific prior written permission.
154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *
164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *
284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin */
294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define LOG_NDDEBUG 0
304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define LOG_TAG "LocSvc_api_rpc"
314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <unistd.h>
334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <math.h>
344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#ifndef USE_GLIB
354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <utils/SystemClock.h>
364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif /* USE_GLIB */
374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <LocApiRpc.h>
384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <LocAdapterBase.h>
394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <loc_api_fixup.h>
404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <loc_api_rpc_glue.h>
414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <log_util.h>
424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <loc_log.h>
434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <loc_api_log.h>
444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#ifdef USE_GLIB
454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <glib.h>
464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif
474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <librpc.h>
484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <platform_lib_includes.h>
494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinusing namespace loc_core;
514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define LOC_XTRA_INJECT_DEFAULT_TIMEOUT (3100)
534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define XTRA_BLOCK_SIZE                 (3072)
544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define LOC_IOCTL_DEFAULT_TIMEOUT 1000 // 1000 milli-seconds
554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define LOC_NI_NOTIF_KEY_ADDRESS           "Address"
564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*===========================================================================
584035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION    loc_event_cb
594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
604035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION
614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   This is the callback function registered by loc_open.
624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
634035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES
644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   N/A
654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
664035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE
674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   RPC_LOC_API_SUCCESS
684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
694035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS
704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   N/A
714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/
734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic int32 loc_event_cb
744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin(
754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    void*                                user,
764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_client_handle_type           client_handle,
774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_event_mask_type              loc_event,
784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    const rpc_loc_event_payload_u_type*  loc_event_payload
794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin)
804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    MODEM_LOG_CALLFLOW(%s, loc_get_event_name(loc_event));
824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    loc_callback_log(loc_event, loc_event_payload);
834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int32 ret_val = ((LocApiRpc*)user)->locEventCB(client_handle, loc_event, loc_event_payload);
844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    EXIT_LOG(%d, ret_val);
854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return ret_val;
864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*===========================================================================
894035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION    loc_eng_rpc_global_cb
904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
914035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION
924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   This is the callback function registered by loc_open for RPC global events
934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
944035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES
954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   N/A
964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
974035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE
984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   RPC_LOC_API_SUCCESS
994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1004035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS
1014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   N/A
1024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/
1044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic void loc_rpc_global_cb(void* user, CLIENT* clnt, enum rpc_reset_event event)
1054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
1064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    MODEM_LOG_CALLFLOW(%s, loc_get_rpc_reset_event_name(event));
1074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ((LocApiRpc*)user)->locRpcGlobalCB(clnt, event);
1084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    EXIT_LOG(%p, VOID_RET);
1094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
1104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinconst LOC_API_ADAPTER_EVENT_MASK_T LocApiRpc::maskAll =
1124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
1134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_API_ADAPTER_BIT_SATELLITE_REPORT |
1144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST |
1154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST |
1164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_API_ADAPTER_BIT_IOCTL_REPORT |
1174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_API_ADAPTER_BIT_STATUS_REPORT |
1184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT |
1194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST;
1204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinconst rpc_loc_event_mask_type LocApiRpc::locBits[] =
1224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
1234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    RPC_LOC_EVENT_PARSED_POSITION_REPORT,
1244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    RPC_LOC_EVENT_SATELLITE_REPORT,
1254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    RPC_LOC_EVENT_NMEA_1HZ_REPORT,
1264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    RPC_LOC_EVENT_NMEA_POSITION_REPORT,
1274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    RPC_LOC_EVENT_NI_NOTIFY_VERIFY_REQUEST,
1284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST,
1294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    RPC_LOC_EVENT_LOCATION_SERVER_REQUEST,
1304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    RPC_LOC_EVENT_IOCTL_REPORT,
1314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    RPC_LOC_EVENT_STATUS_REPORT,
1324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    RPC_LOC_EVENT_WPS_NEEDED_REQUEST
1334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin};
1344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin// constructor
1364035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::LocApiRpc(const MsgTask* msgTask,
1374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                     LOC_API_ADAPTER_EVENT_MASK_T exMask,
1384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                     ContextBase* context) :
1394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LocApiBase(msgTask, exMask, context),
1404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    client_handle(RPC_LOC_CLIENT_HANDLE_INVALID),
1414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    dataEnableLastSet(-1)
1424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
1434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    memset(apnLastSet, 0, sizeof(apnLastSet));
1444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    loc_api_glue_init();
1454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
1464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1474035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::~LocApiRpc()
1484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
1494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    close();
1504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
1514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinrpc_loc_event_mask_type
1534035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::convertMask(LOC_API_ADAPTER_EVENT_MASK_T mask)
1544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
1554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_event_mask_type newMask = 0;
1564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    for (unsigned int i = 0, bit=1; 0 != mask; i++, bit<<=1) {
1584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (mask & bit) {
1594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            newMask |= locBits[i];
1604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            mask ^= bit;
1614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
1624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
1634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return newMask;
1654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
1664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinrpc_loc_lock_e_type
1684035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::convertGpsLockMask(LOC_GPS_LOCK_MASK lockMask)
1694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
1704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (isGpsLockAll(lockMask))
1714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return RPC_LOC_LOCK_ALL;
1724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (isGpsLockMO(lockMask))
1734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return RPC_LOC_LOCK_MI;
1744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (isGpsLockMT(lockMask))
1754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return RPC_LOC_LOCK_MT;
1764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (isGpsLockNone(lockMask))
1774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return RPC_LOC_LOCK_NONE;
1784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return (rpc_loc_lock_e_type)lockMask;
1794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
1804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
1824035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::convertErr(int rpcErr)
1834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
1844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    switch(rpcErr)
1854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
1864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_LOC_API_SUCCESS:
1874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return LOC_API_ADAPTER_ERR_SUCCESS;
1884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_LOC_API_GENERAL_FAILURE:
1894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return LOC_API_ADAPTER_ERR_GENERAL_FAILURE;
1904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_LOC_API_UNSUPPORTED:
1914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return LOC_API_ADAPTER_ERR_UNSUPPORTED;
1924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_LOC_API_INVALID_HANDLE:
1934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return LOC_API_ADAPTER_ERR_INVALID_HANDLE;
1944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_LOC_API_INVALID_PARAMETER:
1954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return LOC_API_ADAPTER_ERR_INVALID_PARAMETER;
1964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_LOC_API_ENGINE_BUSY:
1974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return LOC_API_ADAPTER_ERR_ENGINE_BUSY;
1984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_LOC_API_PHONE_OFFLINE:
1994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return LOC_API_ADAPTER_ERR_PHONE_OFFLINE;
2004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_LOC_API_TIMEOUT:
2014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return LOC_API_ADAPTER_ERR_TIMEOUT;
2024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_LOC_API_RPC_MODEM_RESTART:
2034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return LOC_API_ADAPTER_ERR_ENGINE_DOWN;
2044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_LOC_API_RPC_FAILURE:
2054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return LOC_API_ADAPTER_ERR_FAILURE;
2064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    default:
2074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return LOC_API_ADAPTER_ERR_UNKNOWN;
2084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
2094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
2104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid LocApiRpc::locRpcGlobalCB(CLIENT* clnt, enum rpc_reset_event event)
2124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
2134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    static rpc_loc_engine_state_e_type last_state = RPC_LOC_ENGINE_STATE_MAX;
2144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    switch (event) {
2164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_SUBSYSTEM_RESTART_BEGIN:
2174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (RPC_LOC_ENGINE_STATE_OFF != last_state) {
2184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            last_state = RPC_LOC_ENGINE_STATE_OFF;
2194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            handleEngineDownEvent();
2204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
2214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
2224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_SUBSYSTEM_RESTART_END:
2234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (RPC_LOC_ENGINE_STATE_ON != last_state) {
2244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            last_state = RPC_LOC_ENGINE_STATE_ON;
2254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            handleEngineUpEvent();
2264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
2274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
2284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
2294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
2304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint32 LocApiRpc::locEventCB(rpc_loc_client_handle_type client_handle,
2324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                     rpc_loc_event_mask_type loc_event,
2334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                     const rpc_loc_event_payload_u_type* loc_event_payload)
2344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
2354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // Parsed report
2364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (loc_event & RPC_LOC_EVENT_PARSED_POSITION_REPORT)
2374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
2384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        reportPosition(&loc_event_payload->rpc_loc_event_payload_u_type_u.
2394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                       parsed_location_report);
2404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
2414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // Satellite report
2434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (loc_event & RPC_LOC_EVENT_SATELLITE_REPORT)
2444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
2454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        reportSv(&loc_event_payload->rpc_loc_event_payload_u_type_u.gnss_report);
2464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
2474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // Status report
2494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (loc_event & RPC_LOC_EVENT_STATUS_REPORT)
2504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
2514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        reportStatus(&loc_event_payload->rpc_loc_event_payload_u_type_u.status_report);
2524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
2534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // NMEA
2554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (loc_event & RPC_LOC_EVENT_NMEA_1HZ_REPORT)
2564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
2574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        reportNmea(&(loc_event_payload->rpc_loc_event_payload_u_type_u.nmea_report));
2584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
2594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // XTRA support: supports only XTRA download
2604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (loc_event & RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST)
2614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
2624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (loc_event_payload->rpc_loc_event_payload_u_type_u.assist_data_request.event ==
2634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            RPC_LOC_ASSIST_DATA_PREDICTED_ORBITS_REQ)
2644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
2654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            requestXtraData();
2664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        } else if (loc_event_payload->rpc_loc_event_payload_u_type_u.assist_data_request.event ==
2674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                   RPC_LOC_ASSIST_DATA_TIME_REQ)
2684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
2694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            requestTime();
2704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        } else if (loc_event_payload->rpc_loc_event_payload_u_type_u.assist_data_request.event ==
2714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                   RPC_LOC_ASSIST_DATA_POSITION_INJECTION_REQ)
2724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
2734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            requestLocation();
2744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
2754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
2764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // AGPS data request
2784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (loc_event & RPC_LOC_EVENT_LOCATION_SERVER_REQUEST)
2794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
2804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        ATLEvent(&loc_event_payload->rpc_loc_event_payload_u_type_u.
2814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                 loc_server_request);
2824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
2834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // NI notify request
2854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (loc_event & RPC_LOC_EVENT_NI_NOTIFY_VERIFY_REQUEST)
2864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
2874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        NIEvent(&loc_event_payload->rpc_loc_event_payload_u_type_u.ni_request);
2884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
2894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return RPC_LOC_API_SUCCESS;//We simply want to return sucess here as we do not want to
2914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // cause any issues in RPC thread context
2924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
2934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
2954035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::open(LOC_API_ADAPTER_EVENT_MASK_T mask)
2964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
2974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    enum loc_api_adapter_err ret_val = LOC_API_ADAPTER_ERR_SUCCESS;
2984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // RPC does not dynamically update the event mask. And in the
3004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // case of RPC, all we support are positioning (gps + agps)
3014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // masks anyways, so we simply mask all of them on always.
3024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // After doing so the first time in a power cycle, we know there
3034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // will the following if condition will never be true any more.
3044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    mask = maskAll;
3054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
3064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (mask != mMask) {
3074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (RPC_LOC_CLIENT_HANDLE_INVALID != client_handle) {
3084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            close();
3094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
3104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
3114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        mMask = mask;
3124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        // it is important to cap the mask here, because not all LocApi's
3134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        // can enable the same bits, e.g. foreground and bckground.
3144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        client_handle = loc_open(convertMask(mask),
3154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                 loc_event_cb,
3164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                 loc_rpc_global_cb, this);
3174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
3184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (client_handle < 0) {
3194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            mMask = 0;
3204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            client_handle = RPC_LOC_CLIENT_HANDLE_INVALID;
3214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            ret_val = LOC_API_ADAPTER_ERR_INVALID_HANDLE;
3224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
3234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
3244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
3254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return ret_val;
3264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
3274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
3284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
3294035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::close()
3304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
3314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (RPC_LOC_CLIENT_HANDLE_INVALID != client_handle) {
3324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        loc_clear(client_handle);
3334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
3344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
3354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    loc_close(client_handle);
3364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    mMask = 0;
3374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    client_handle = RPC_LOC_CLIENT_HANDLE_INVALID;
3384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
3394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return LOC_API_ADAPTER_ERR_SUCCESS;
3404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
3414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
3424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
3434035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::startFix(const LocPosMode& posMode) {
3444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   LOC_LOGD("LocApiRpc::startFix() called");
3454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   return convertErr(
3464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       loc_start_fix(client_handle)
3474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       );
3484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
3494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
3504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
3514035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::stopFix() {
3524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   LOC_LOGD("LocApiRpc::stopFix() called");
3534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   return convertErr(
3544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       loc_stop_fix(client_handle)
3554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       );
3564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
3574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
3584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
3594035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::setPositionMode(const LocPosMode& posMode)
3604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
3614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_data_u_type    ioctl_data;
3624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_fix_criteria_s_type *fix_criteria_ptr =
3634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        &ioctl_data.rpc_loc_ioctl_data_u_type_u.fix_criteria;
3644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_e_type         ioctl_type = RPC_LOC_IOCTL_SET_FIX_CRITERIA;
3654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_operation_mode_e_type op_mode;
3664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int                          ret_val;
3674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    const LocPosMode* fixCriteria = &posMode;
3684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
3694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ALOGD ("loc_eng_set_position mode, client = %d, interval = %d, mode = %d\n",
3704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin          (int32) client_handle, fixCriteria->min_interval, fixCriteria->mode);
3714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
3724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    switch (fixCriteria->mode)
3734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
3744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case LOC_POSITION_MODE_MS_BASED:
3754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        op_mode = RPC_LOC_OPER_MODE_MSB;
3764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
3774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case LOC_POSITION_MODE_MS_ASSISTED:
3784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        op_mode = RPC_LOC_OPER_MODE_MSA;
3794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
3804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case LOC_POSITION_MODE_RESERVED_1:
3814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        op_mode = RPC_LOC_OPER_MODE_SPEED_OPTIMAL;
3824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
3834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case LOC_POSITION_MODE_RESERVED_2:
3844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        op_mode = RPC_LOC_OPER_MODE_ACCURACY_OPTIMAL;
3854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
3864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case LOC_POSITION_MODE_RESERVED_3:
3874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        op_mode = RPC_LOC_OPER_MODE_DATA_OPTIMAL;
3884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
3894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case LOC_POSITION_MODE_RESERVED_4:
3904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case LOC_POSITION_MODE_RESERVED_5:
3914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        op_mode = RPC_LOC_OPER_MODE_MSA;
3924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        fix_criteria_ptr->preferred_response_time  = 0;
3934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
3944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    default:
3954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        op_mode = RPC_LOC_OPER_MODE_STANDALONE;
3964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
3974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
3984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    fix_criteria_ptr->valid_mask = RPC_LOC_FIX_CRIT_VALID_PREFERRED_OPERATION_MODE |
3994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                   RPC_LOC_FIX_CRIT_VALID_RECURRENCE_TYPE;
4004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    fix_criteria_ptr->min_interval = fixCriteria->min_interval;
4014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    fix_criteria_ptr->preferred_operation_mode = op_mode;
4024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    fix_criteria_ptr->min_interval = fixCriteria->min_interval;
4044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_MIN_INTERVAL;
4054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (fixCriteria->preferred_accuracy > 0) {
4074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        fix_criteria_ptr->preferred_accuracy = fixCriteria->preferred_accuracy;
4084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_PREFERRED_ACCURACY;
4094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
4104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (fixCriteria->preferred_time > 0) {
4114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        fix_criteria_ptr->preferred_response_time = fixCriteria->preferred_time;
4124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_PREFERRED_RESPONSE_TIME;
4134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
4144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    switch (fixCriteria->recurrence) {
4164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case GPS_POSITION_RECURRENCE_SINGLE:
4174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        fix_criteria_ptr->recurrence_type = RPC_LOC_SINGLE_FIX;
4184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
4194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case GPS_POSITION_RECURRENCE_PERIODIC:
4204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    default:
4214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        fix_criteria_ptr->recurrence_type = RPC_LOC_PERIODIC_FIX;
4224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
4234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
4244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ioctl_data.disc = ioctl_type;
4254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ret_val = loc_eng_ioctl (client_handle,
4274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                             ioctl_type,
4284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                             &ioctl_data,
4294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                             LOC_IOCTL_DEFAULT_TIMEOUT,
4304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                             NULL /* No output information is expected*/);
4314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return convertErr(ret_val);
4334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
4344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
4364035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::setTime(GpsUtcTime time, int64_t timeReference, int uncertainty)
4374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
4384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_data_u_type        ioctl_data;
4394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_assist_data_time_s_type *time_info_ptr;
4404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_e_type             ioctl_type = RPC_LOC_IOCTL_INJECT_UTC_TIME;
4414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int                              ret_val;
4424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD ("loc_eng_inject_time, uncertainty = %d\n", uncertainty);
4444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    time_info_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.assistance_data_time;
4464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    time_info_ptr->time_utc = time;
4474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    time_info_ptr->time_utc += (int64_t)(ELAPSED_MILLIS_SINCE_BOOT_PLATFORM_LIB_ABSTRACTION - timeReference);
4484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    time_info_ptr->uncertainty = uncertainty; // Uncertainty in ms
4494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ioctl_data.disc = ioctl_type;
4514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ret_val = loc_eng_ioctl (client_handle,
4534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                             ioctl_type,
4544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                             &ioctl_data,
4554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                             LOC_IOCTL_DEFAULT_TIMEOUT,
4564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                             NULL /* No output information is expected*/);
4574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return convertErr(ret_val);
4594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
4604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
4624035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::injectPosition(double latitude, double longitude, float accuracy)
4634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
4644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    /* IOCTL data */
4654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_data_u_type ioctl_data;
4664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_assist_data_pos_s_type *assistance_data_position =
4674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        &ioctl_data.rpc_loc_ioctl_data_u_type_u.assistance_data_position;
4684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int                          ret_val;
4694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    /************************************************
4714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin     * Fill in latitude, longitude & accuracy
4724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin     ************************************************/
4734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    /* This combo is required */
4754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    assistance_data_position->valid_mask =
4764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        RPC_LOC_ASSIST_POS_VALID_LATITUDE |
4774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        RPC_LOC_ASSIST_POS_VALID_LONGITUDE |
4784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        RPC_LOC_ASSIST_POS_VALID_HOR_UNC_CIRCULAR |
4794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        RPC_LOC_ASSIST_POS_VALID_CONFIDENCE_HORIZONTAL;
4804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    assistance_data_position->latitude = latitude;
4824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    assistance_data_position->longitude = longitude;
4834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    assistance_data_position->hor_unc_circular = accuracy; /* Meters assumed */
4844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    assistance_data_position->confidence_horizontal = 63;  /* 63% (1 std dev) assumed */
4854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    /* Log */
4874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD("Inject coarse position Lat=%lf, Lon=%lf, Acc=%.2lf\n",
4884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin             (double) assistance_data_position->latitude,
4894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin             (double) assistance_data_position->longitude,
4904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin             (double) assistance_data_position->hor_unc_circular);
4914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
4924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ret_val = loc_eng_ioctl( client_handle,
4934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                             RPC_LOC_IOCTL_INJECT_POSITION,
4944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                             &ioctl_data,
4954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                             LOC_IOCTL_DEFAULT_TIMEOUT,
4964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                             NULL /* No output information is expected*/);
4974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return convertErr(ret_val);
4984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
4994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
5004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
5014035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::informNiResponse(GpsUserResponseType userResponse,
5024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                   const void* passThroughData)
5034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
5044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_data_u_type data;
5054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_callback_s_type callback_payload;
5064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
5074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    memcpy(&data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.ni_event_pass_back,
5084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin           passThroughData, sizeof (rpc_loc_ni_event_s_type));
5094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
5104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ni_user_resp_e_type resp;
5114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    switch (userResponse)
5124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
5134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case GPS_NI_RESPONSE_ACCEPT:
5144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.user_resp =
5154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            RPC_LOC_NI_LCS_NOTIFY_VERIFY_ACCEPT;
5164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
5174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case GPS_NI_RESPONSE_DENY:
5184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.user_resp =
5194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            RPC_LOC_NI_LCS_NOTIFY_VERIFY_DENY;
5204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
5214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case GPS_NI_RESPONSE_NORESP:
5224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    default:
5234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        data.rpc_loc_ioctl_data_u_type_u.user_verify_resp.user_resp =
5244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            RPC_LOC_NI_LCS_NOTIFY_VERIFY_NORESP;
5254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
5264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
5274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
5284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return convertErr(
5294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        loc_eng_ioctl(client_handle,
5304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      RPC_LOC_IOCTL_INFORM_NI_USER_RESPONSE,
5314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      &data,
5324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      LOC_IOCTL_DEFAULT_TIMEOUT,
5334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      &callback_payload)
5344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        );
5354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
5364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
5374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
5384035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::setAPN(char* apn, int len, boolean force)
5394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
5404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    enum loc_api_adapter_err rtv = LOC_API_ADAPTER_ERR_SUCCESS;
5414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int size = sizeof(apnLastSet);
5424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (force || memcmp(apnLastSet, apn, size)) {
5434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (len < size) {
5444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            // size will be not larger than its original value
5454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            size = len + 1;
5464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
5474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        memcpy(apnLastSet, apn, size);
5484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
5494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (!isInSession()) {
5504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_LBS_APN_PROFILE, {0}};
5514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            ioctl_data.rpc_loc_ioctl_data_u_type_u.apn_profiles[0].srv_system_type = LOC_APN_PROFILE_SRV_SYS_MAX;
5524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            ioctl_data.rpc_loc_ioctl_data_u_type_u.apn_profiles[0].pdp_type = LOC_APN_PROFILE_PDN_TYPE_IPV4;
5534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            memcpy(&(ioctl_data.rpc_loc_ioctl_data_u_type_u.apn_profiles[0].apn_name), apn, size);
5544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
5554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            rtv = convertErr(
5564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                loc_eng_ioctl (client_handle,
5574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                               RPC_LOC_IOCTL_SET_LBS_APN_PROFILE,
5584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                               &ioctl_data,
5594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                               LOC_IOCTL_DEFAULT_TIMEOUT,
5604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                               NULL)
5614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                );
5624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
5634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
5644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return rtv;
5654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
5664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
5674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid LocApiRpc::setInSession(bool inSession)
5684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
5694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (!inSession) {
5704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        enableData(dataEnableLastSet, true);
5714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        setAPN(apnLastSet, sizeof(apnLastSet)-1, true);
5724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
5734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
5744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
5754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
5764035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::setServer(const char* url, int len)
5774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
5784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_data_u_type         ioctl_data;
5794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_server_info_s_type       *server_info_ptr;
5804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_e_type              ioctl_cmd;
5814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
5824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ioctl_cmd = RPC_LOC_IOCTL_SET_UMTS_SLP_SERVER_ADDR;
5834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ioctl_data.disc = ioctl_cmd;
5844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    server_info_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.server_addr;
5854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    server_info_ptr->addr_type = RPC_LOC_SERVER_ADDR_URL;
5864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    server_info_ptr->addr_info.disc = server_info_ptr->addr_type;
5874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.length = len;
5884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#if (AMSS_VERSION==3200)
5894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr.addr_val = (char*) url;
5904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr.addr_len= len;
5914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#else
5924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    strlcpy(server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr, url,
5934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            sizeof server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr);
5944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif /* #if (AMSS_VERSION==3200) */
5954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD ("loc_eng_set_server, addr = %s\n", url);
5964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
5974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return convertErr(
5984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        loc_eng_ioctl (client_handle,
5994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                       ioctl_cmd,
6004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                       &ioctl_data,
6014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                       LOC_IOCTL_DEFAULT_TIMEOUT,
6024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                       NULL /* No output information is expected*/)
6034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        );
6044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
6054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
6064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
6074035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::setServer(unsigned int ip, int port, LocServerType type)
6084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
6094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_data_u_type         ioctl_data;
6104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_server_info_s_type       *server_info_ptr;
6114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_e_type              ioctl_cmd;
6124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
6134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    switch (type) {
6144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case LOC_AGPS_MPC_SERVER:
6154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        ioctl_cmd = RPC_LOC_IOCTL_SET_CDMA_MPC_SERVER_ADDR;
6164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
6174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case LOC_AGPS_CUSTOM_PDE_SERVER:
6184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        ioctl_cmd = RPC_LOC_IOCTL_SET_CUSTOM_PDE_SERVER_ADDR;
6194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
6204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    default:
6214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        ioctl_cmd = RPC_LOC_IOCTL_SET_CDMA_PDE_SERVER_ADDR;
6224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
6234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
6244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ioctl_data.disc = ioctl_cmd;
6254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    server_info_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.server_addr;
6264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    server_info_ptr->addr_type = RPC_LOC_SERVER_ADDR_IPV4;
6274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    server_info_ptr->addr_info.disc = server_info_ptr->addr_type;
6284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.ipv4.addr = ip;
6294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.ipv4.port = port;
6304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD ("setServer, addr = %X:%d\n", (unsigned int) ip, (unsigned int) port);
6314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
6324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return convertErr(
6334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        loc_eng_ioctl (client_handle,
6344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                       ioctl_cmd,
6354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                       &ioctl_data,
6364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                       LOC_IOCTL_DEFAULT_TIMEOUT,
6374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                       NULL /* No output information is expected*/)
6384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        );
6394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
6404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
6414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
6424035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::enableData(int enable, boolean force)
6434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
6444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    enum loc_api_adapter_err rtv = LOC_API_ADAPTER_ERR_SUCCESS;
6454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (force || dataEnableLastSet != enable) {
6464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        dataEnableLastSet = enable;
6474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
6484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (!isInSession()) {
6494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_DATA_ENABLE, {0}};
6504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
6514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            ioctl_data.rpc_loc_ioctl_data_u_type_u.data_enable = enable;
6524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            rtv =  convertErr(
6534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                loc_eng_ioctl (client_handle,
6544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                               RPC_LOC_IOCTL_SET_DATA_ENABLE,
6554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                               &ioctl_data,
6564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                               LOC_IOCTL_DEFAULT_TIMEOUT,
6574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                               NULL)
6584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                );
6594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
6604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
6614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return rtv;
6624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
6634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
6644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
6654035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::deleteAidingData(GpsAidingData bits)
6664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
6674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_DELETE_ASSIST_DATA, {0}};
6684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ioctl_data.rpc_loc_ioctl_data_u_type_u.assist_data_delete.type = bits;
6694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
6704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return convertErr(
6714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        loc_eng_ioctl (client_handle,
6724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                       RPC_LOC_IOCTL_DELETE_ASSIST_DATA,
6734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                       &ioctl_data,
6744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                       LOC_IOCTL_DEFAULT_TIMEOUT,
6754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                       NULL)
6764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        );
6774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
6784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
6794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid LocApiRpc::reportPosition(const rpc_loc_parsed_position_s_type *location_report_ptr)
6804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
6814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LocPosTechMask tech_Mask = LOC_POS_TECH_MASK_DEFAULT;
6824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
6834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    UlpLocation location = {0};
6844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    GpsLocationExtended locationExtended = {0};
6854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
6864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    location.size = sizeof(location);
6874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    locationExtended.size = sizeof(locationExtended);
6884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SESSION_STATUS)
6894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
6904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        // Process the position from final and intermediate reports
6914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (location_report_ptr->session_status == RPC_LOC_SESS_STATUS_SUCCESS ||
6924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            location_report_ptr->session_status == RPC_LOC_SESS_STATUS_IN_PROGESS)
6934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
6944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            // Latitude & Longitude
6954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            if ((location_report_ptr->valid_mask & RPC_LOC_POS_VALID_LATITUDE) &&
6964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_LONGITUDE) &&
6974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                (location_report_ptr->latitude != 0 ||
6984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                 location_report_ptr->longitude != 0))
6994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            {
7004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                location.gpsLocation.flags    |= GPS_LOCATION_HAS_LAT_LONG;
7014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                location.gpsLocation.latitude  = location_report_ptr->latitude;
7024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                location.gpsLocation.longitude = location_report_ptr->longitude;
7034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
7044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                // Time stamp (UTC)
7054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_TIMESTAMP_UTC)
7064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                {
7074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    location.gpsLocation.timestamp = location_report_ptr->timestamp_utc;
7084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                }
7094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
7104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                // Altitude
7114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                if (location_report_ptr->valid_mask &  RPC_LOC_POS_VALID_ALTITUDE_WRT_ELLIPSOID )
7124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                {
7134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    location.gpsLocation.flags    |= GPS_LOCATION_HAS_ALTITUDE;
7144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    location.gpsLocation.altitude = location_report_ptr->altitude_wrt_ellipsoid;
7154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                }
7164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
7174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                // Speed
7184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SPEED_HORIZONTAL)
7194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                {
7204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    location.gpsLocation.flags    |= GPS_LOCATION_HAS_SPEED;
7214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    location.gpsLocation.speed = location_report_ptr->speed_horizontal;
7224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                }
7234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
7244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                // Heading
7254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                if (location_report_ptr->valid_mask &  RPC_LOC_POS_VALID_HEADING)
7264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                {
7274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    location.gpsLocation.flags    |= GPS_LOCATION_HAS_BEARING;
7284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    location.gpsLocation.bearing = location_report_ptr->heading;
7294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                }
7304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
7314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                // Uncertainty (circular)
7324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                if ( (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_HOR_UNC_CIRCULAR) )
7334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                {
7344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    location.gpsLocation.flags    |= GPS_LOCATION_HAS_ACCURACY;
7354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    location.gpsLocation.accuracy = location_report_ptr->hor_unc_circular;
7364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                }
7374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
7384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                // Technology Mask
7394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
7404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                tech_Mask  |= location_report_ptr->technology_mask;
7414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                //Mark the location source as from GNSS
7424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                location.gpsLocation.flags |= LOCATION_HAS_SOURCE_INFO;
7434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                location.position_source = ULP_LOCATION_IS_FROM_GNSS;
7444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_ALTITUDE_WRT_MEAN_SEA_LEVEL)
7454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                {
7464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL;
7474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    locationExtended.altitudeMeanSeaLevel = location_report_ptr->altitude_wrt_mean_sea_level;
7484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                }
7494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
7504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                if (location_report_ptr->valid_mask &  RPC_LOC_POS_VALID_MAGNETIC_VARIATION )
7514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                {
7524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_MAG_DEV;
7534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    locationExtended.magneticDeviation = location_report_ptr->magnetic_deviation;
7544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                }
7554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
7564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_VERTICAL_UNC)
7574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                {
7584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                   locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_VERT_UNC;
7594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                   locationExtended.vert_unc = location_report_ptr->vert_unc;
7604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                }
7614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
7624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SPEED_UNC)
7634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                {
7644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                   locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_SPEED_UNC;
7654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                   locationExtended.speed_unc = location_report_ptr->speed_unc;
7664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                }
7674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
7684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                LOC_LOGV("reportPosition: fire callback\n");
7694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                enum loc_sess_status fixStatus =
7704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    (location_report_ptr->session_status
7714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                     == RPC_LOC_SESS_STATUS_IN_PROGESS ?
7724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                     LOC_SESS_INTERMEDIATE : LOC_SESS_SUCCESS);
7734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                LocApiBase::reportPosition(location,
7744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                           locationExtended,
7754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                           (void*)location_report_ptr,
7764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                           fixStatus,
7774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                           tech_Mask);
7784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            }
7794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
7804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        else
7814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
7824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            LocApiBase::reportPosition(location,
7834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                       locationExtended,
7844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                       NULL,
7854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                       LOC_SESS_FAILURE);
7864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            LOC_LOGV("loc_eng_report_position: ignore position report "
7874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                     "when session status = %d\n",
7884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                     location_report_ptr->session_status);
7894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
7904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
7914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    else
7924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
7934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGV("loc_eng_report_position: ignore position report "
7944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                 "when session status is not set\n");
7954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
7964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
7974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
7984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid LocApiRpc::reportSv(const rpc_loc_gnss_info_s_type *gnss_report_ptr)
7994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
8002e0c5f2f0d31e06a817de185fda694ba79f82ce0Dante Russo    QtiGnssSvStatus     SvStatus = {0};
8014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    GpsLocationExtended locationExtended = {0};
8024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    locationExtended.size = sizeof(locationExtended);
8034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int             num_svs_max = 0;
8044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    const rpc_loc_sv_info_s_type *sv_info_ptr;
8054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
8064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_SV_COUNT)
8074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
8084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        num_svs_max = gnss_report_ptr->sv_count;
8094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (num_svs_max > GPS_MAX_SVS)
8104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
8114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            num_svs_max = GPS_MAX_SVS;
8124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
8134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
8144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
8154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_SV_LIST)
8164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
8174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        SvStatus.num_svs = 0;
8184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
8194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        for (int i = 0; i < num_svs_max; i++)
8204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
8214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            sv_info_ptr = &(gnss_report_ptr->sv_list.sv_list_val[i]);
8224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_SYSTEM)
8234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            {
8244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                if (sv_info_ptr->system == RPC_LOC_SV_SYSTEM_GPS)
8254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                {
8264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    SvStatus.sv_list[SvStatus.num_svs].size = sizeof(GpsSvInfo);
8274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    SvStatus.sv_list[SvStatus.num_svs].prn = sv_info_ptr->prn;
8284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
8294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    // We only have the data field to report gps eph and alm mask
8304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_HAS_EPH) &&
8314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                        (sv_info_ptr->has_eph == 1))
8324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    {
8334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                        SvStatus.ephemeris_mask |= (1 << (sv_info_ptr->prn-1));
8344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    }
8354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
8364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_HAS_ALM) &&
8374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                        (sv_info_ptr->has_alm == 1))
8384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    {
8394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                        SvStatus.almanac_mask |= (1 << (sv_info_ptr->prn-1));
8404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    }
8414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
8424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_PROCESS_STATUS) &&
8434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                        (sv_info_ptr->process_status == RPC_LOC_SV_STATUS_TRACK))
8444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    {
8454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                        SvStatus.gps_used_in_fix_mask |= (1 << (sv_info_ptr->prn-1));
8464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    }
8474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                }
8484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                // SBAS: GPS RPN: 120-151,
8494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                // In exteneded measurement report, we follow nmea standard, which is from 33-64.
8504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                else if (sv_info_ptr->system == RPC_LOC_SV_SYSTEM_SBAS)
8514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                {
8524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    SvStatus.sv_list[SvStatus.num_svs].prn = sv_info_ptr->prn + 33 - 120;
8534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                }
8544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                // Gloness: Slot id: 1-32
8554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                // In extended measurement report, we follow nmea standard, which is 65-96
8564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                else if (sv_info_ptr->system == RPC_LOC_SV_SYSTEM_GLONASS)
8574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                {
8584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_PROCESS_STATUS) &&
8594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                        (sv_info_ptr->process_status == RPC_LOC_SV_STATUS_TRACK))
8604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    {
8614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                        SvStatus.glo_used_in_fix_mask |= (1 << (sv_info_ptr->prn-1));
8624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    }
8634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
8644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    SvStatus.sv_list[SvStatus.num_svs].prn = sv_info_ptr->prn + (65-1);
8654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                }
8664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                // Unsupported SV system
8674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                else
8684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                {
8694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    continue;
8704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                }
8714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            }
8724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
8734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_SNR)
8744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            {
8754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                SvStatus.sv_list[SvStatus.num_svs].snr = sv_info_ptr->snr;
8764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            }
8774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
8784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_ELEVATION)
8794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            {
8804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                SvStatus.sv_list[SvStatus.num_svs].elevation = sv_info_ptr->elevation;
8814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            }
8824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
8834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_AZIMUTH)
8844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            {
8854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                SvStatus.sv_list[SvStatus.num_svs].azimuth = sv_info_ptr->azimuth;
8864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            }
8874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
8884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            SvStatus.num_svs++;
8894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
8904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
8914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
8924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if ((gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_POS_DOP) &&
8934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_HOR_DOP) &&
8944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_VERT_DOP))
8954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
8964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        locationExtended.flags |= GPS_LOCATION_EXTENDED_HAS_DOP;
8974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        locationExtended.pdop = gnss_report_ptr->position_dop;
8984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        locationExtended.hdop = gnss_report_ptr->horizontal_dop;
8994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        locationExtended.vdop = gnss_report_ptr->vertical_dop;
9004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
9014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
9024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (SvStatus.num_svs >= 0)
9034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
9044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LocApiBase::reportSv(SvStatus,
9054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                             locationExtended,
9064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                             (void*)gnss_report_ptr);
9074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
9084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
9094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
9104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid LocApiRpc::reportStatus(const rpc_loc_status_event_s_type *status_report_ptr)
9114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
9124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
9134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (status_report_ptr->event == RPC_LOC_STATUS_EVENT_ENGINE_STATE) {
9144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (status_report_ptr->payload.rpc_loc_status_event_payload_u_type_u.engine_state == RPC_LOC_ENGINE_STATE_ON)
9154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
9164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            LocApiBase::reportStatus(GPS_STATUS_ENGINE_ON);
9174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            LocApiBase::reportStatus(GPS_STATUS_SESSION_BEGIN);
9184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
9194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        else if (status_report_ptr->payload.rpc_loc_status_event_payload_u_type_u.engine_state == RPC_LOC_ENGINE_STATE_OFF)
9204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
9214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            LocApiBase::reportStatus(GPS_STATUS_SESSION_END);
9224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            LocApiBase::reportStatus(GPS_STATUS_ENGINE_OFF);
9234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
9244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        else
9254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
9264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            LocApiBase::reportStatus(GPS_STATUS_NONE);
9274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
9284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
9294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
9304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
9314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
9324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid LocApiRpc::reportNmea(const rpc_loc_nmea_report_s_type *nmea_report_ptr)
9334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
9344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
9354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#if (AMSS_VERSION==3200)
9364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LocApiBase::reportNmea(nmea_report_ptr->nmea_sentences.nmea_sentences_val,
9374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                           nmea_report_ptr->nmea_sentences.nmea_sentences_len);
9384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#else
9394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LocApiBase::reportNmea(nmea_report_ptr->nmea_sentences,
9404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                           nmea_report_ptr->length);
9414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD("loc_eng_report_nmea: $%c%c%c\n",
9424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin             nmea_report_ptr->nmea_sentences[3],
9434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin             nmea_report_ptr->nmea_sentences[4],
9444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin             nmea_report_ptr->nmea_sentences[5]);
9454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif /* #if (AMSS_VERSION==3200) */
9464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
9474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
9484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
9494035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::setXtraData(char* data, int length)
9504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
9514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int     rpc_ret_val = RPC_LOC_API_GENERAL_FAILURE;
9524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int     total_parts;
9534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    uint8   part;
9544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    uint16  part_len;
9554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    uint16  len_injected;
9564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_data_u_type            ioctl_data;
9574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_e_type                 ioctl_type = RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA;
9584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_predicted_orbits_data_s_type *predicted_orbits_data_ptr;
9594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
9604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD("qct_loc_eng_inject_xtra_data, xtra size = %d, data ptr = 0x%lx\n", length, (long) data);
9614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
9624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    predicted_orbits_data_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.predicted_orbits_data;
9634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    predicted_orbits_data_ptr->format_type = RPC_LOC_PREDICTED_ORBITS_XTRA;
9644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    predicted_orbits_data_ptr->total_size = length;
9654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    total_parts = (length - 1) / XTRA_BLOCK_SIZE + 1;
9664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    predicted_orbits_data_ptr->total_parts = total_parts;
9674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
9684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    len_injected = 0; // O bytes injected
9694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ioctl_data.disc = ioctl_type;
9704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
9714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // XTRA injection starts with part 1
9724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    for (part = 1; part <= total_parts; part++)
9734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
9744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        predicted_orbits_data_ptr->part = part;
9754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        predicted_orbits_data_ptr->part_len = XTRA_BLOCK_SIZE;
9764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (XTRA_BLOCK_SIZE > (length - len_injected))
9774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
9784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            predicted_orbits_data_ptr->part_len = length - len_injected;
9794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
9804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        predicted_orbits_data_ptr->data_ptr.data_ptr_len = predicted_orbits_data_ptr->part_len;
9814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        predicted_orbits_data_ptr->data_ptr.data_ptr_val = data + len_injected;
9824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
9834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGD("qct_loc_eng_inject_xtra_data, part %d/%d, len = %d, total = %d\n",
9844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                 predicted_orbits_data_ptr->part,
9854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                 total_parts,
9864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                 predicted_orbits_data_ptr->part_len,
9874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                 len_injected);
9884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
9894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (part < total_parts)
9904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
9914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            // No callback in this case
9924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            rpc_ret_val = loc_ioctl (client_handle,
9934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                     ioctl_type,
9944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                     &ioctl_data);
9954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
9964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            if (rpc_ret_val != RPC_LOC_API_SUCCESS)
9974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            {
9984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                LOC_LOGE("loc_ioctl for xtra error: %s\n", loc_get_ioctl_status_name(rpc_ret_val));
9994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                break;
10004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            }
10014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            //Add a delay of 10 ms so that repeated RPC calls dont starve the modem processor
10024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            usleep(10 * 1000);
10034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
10044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        else // part == total_parts
10054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
10064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            // Last part injection, will need to wait for callback
10074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            if (!loc_eng_ioctl(client_handle,
10084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                               ioctl_type,
10094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                               &ioctl_data,
10104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                               LOC_XTRA_INJECT_DEFAULT_TIMEOUT,
10114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                               NULL))
10124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            {
10134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                rpc_ret_val = RPC_LOC_API_GENERAL_FAILURE;
10144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            }
10154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            break; // done with injection
10164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
10174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
10184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        len_injected += predicted_orbits_data_ptr->part_len;
10194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGD("loc_ioctl XTRA injected length: %d\n", len_injected);
10204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
10214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
10224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return convertErr(rpc_ret_val);
10234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
10244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
10254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/* Request the Xtra Server Url from the modem */
10264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
10274035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::requestXtraServer()
10284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
10294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    loc_api_adapter_err           err;
10304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_data_u_type     data;
10314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_callback_s_type callback_data;
10324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
10334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    err = convertErr(loc_eng_ioctl(client_handle,
10344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                   RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE,
10354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                   &data,
10364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                   LOC_IOCTL_DEFAULT_TIMEOUT,
10374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                   &callback_data));
10384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
10394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (LOC_API_ADAPTER_ERR_SUCCESS != err)
10404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
10414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE failed!: err=%d\n", err);
10424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return err;
10434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
10444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    else if (RPC_LOC_SESS_STATUS_SUCCESS != callback_data.status)
10454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
10464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE failed!: status=%ld\n", callback_data.status);
10474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return LOC_API_ADAPTER_ERR_GENERAL_FAILURE;
10484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
10494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    else if (RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE != callback_data.type)
10504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
10514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE is not the type expected! type=%d\n", callback_data.type);
10524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return LOC_API_ADAPTER_ERR_GENERAL_FAILURE;
10534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
10544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    else if (RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE != callback_data.data.disc)
10554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
10564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE is not the disc expected! disc=%d\n", callback_data.data.disc);
10574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return LOC_API_ADAPTER_ERR_GENERAL_FAILURE;
10584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
10594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
10604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    reportXtraServer(callback_data.data.rpc_loc_ioctl_callback_data_u_type_u.
10614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                     predicted_orbits_data_source.servers[0],
10624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                     callback_data.data.rpc_loc_ioctl_callback_data_u_type_u.
10634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                     predicted_orbits_data_source.servers[1],
10644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                     callback_data.data.rpc_loc_ioctl_callback_data_u_type_u.
10654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                     predicted_orbits_data_source.servers[2],
10664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                     255);
10674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
10684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return LOC_API_ADAPTER_ERR_SUCCESS;
10694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
10704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
10714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
10724035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::atlOpenStatus(int handle, int is_succ, char* apn, AGpsBearerType bearer, AGpsType agpsType)
10734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
10744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_server_open_status_e_type open_status = is_succ ? RPC_LOC_SERVER_OPEN_SUCCESS : RPC_LOC_SERVER_OPEN_FAIL;
10754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   rpc_loc_ioctl_data_u_type           ioctl_data;
10764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
10774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (AGPS_TYPE_INVALID == agpsType) {
10784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        rpc_loc_server_open_status_s_type  *conn_open_status_ptr =
10794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            &ioctl_data.rpc_loc_ioctl_data_u_type_u.conn_open_status;
10804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
10814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        // Fill in data
10824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        ioctl_data.disc = RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS;
10834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        conn_open_status_ptr->conn_handle = handle;
10844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        conn_open_status_ptr->open_status = open_status;
10854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#if (AMSS_VERSION==3200)
10864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        conn_open_status_ptr->apn_name = apn; /* requires APN */
10874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#else
10884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (is_succ) {
10894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            strlcpy(conn_open_status_ptr->apn_name, apn,
10904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    sizeof conn_open_status_ptr->apn_name);
10914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        } else {
10924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            conn_open_status_ptr->apn_name[0] = 0;
10934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
10944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif /* #if (AMSS_VERSION==3200) */
10954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
10964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGD("ATL RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS open %s, APN name = [%s]\n",
10974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                 log_succ_fail_string(is_succ),
10984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                 apn);
10994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    } else {
11004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        rpc_loc_server_multi_open_status_s_type  *conn_multi_open_status_ptr =
11014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            &ioctl_data.rpc_loc_ioctl_data_u_type_u.multi_conn_open_status;
11024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
11034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        // Fill in data
11044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        ioctl_data.disc = RPC_LOC_IOCTL_INFORM_SERVER_MULTI_OPEN_STATUS;
11054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        conn_multi_open_status_ptr->conn_handle = handle;
11064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        conn_multi_open_status_ptr->open_status = open_status;
11074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (is_succ) {
11084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            strlcpy(conn_multi_open_status_ptr->apn_name, apn,
11094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    sizeof conn_multi_open_status_ptr->apn_name);
11104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        } else {
11114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            conn_multi_open_status_ptr->apn_name[0] = 0;
11124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
11134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
11144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        switch(bearer)
11154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
11164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        case AGPS_APN_BEARER_IPV4:
11174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            conn_multi_open_status_ptr->pdp_type = RPC_LOC_SERVER_PDP_IP;
11184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            break;
11194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        case AGPS_APN_BEARER_IPV6:
11204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            conn_multi_open_status_ptr->pdp_type = RPC_LOC_SERVER_PDP_IPV6;
11214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            break;
11224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        case AGPS_APN_BEARER_IPV4V6:
11234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            conn_multi_open_status_ptr->pdp_type = RPC_LOC_SERVER_PDP_IPV4V6;
11244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            break;
11254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        default:
11264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            conn_multi_open_status_ptr->pdp_type = RPC_LOC_SERVER_PDP_PPP;
11274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
11284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
11294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGD("ATL RPC_LOC_IOCTL_INFORM_SERVER_MULTI_OPEN_STATUS open %s, APN name = [%s], pdp_type = %d\n",
11304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                 log_succ_fail_string(is_succ),
11314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                 apn,
11324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                 conn_multi_open_status_ptr->pdp_type);
11334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
11344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
11354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // Make the IOCTL call
11364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return convertErr(
11374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        loc_eng_ioctl(client_handle,
11384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      ioctl_data.disc,
11394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      &ioctl_data,
11404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      LOC_IOCTL_DEFAULT_TIMEOUT,
11414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      NULL)
11424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        );
11434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
11444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
11454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
11464035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::atlCloseStatus(int handle, int is_succ)
11474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
11484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_data_u_type           ioctl_data;
11494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ioctl_data.disc = RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS;
11504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
11514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_server_close_status_s_type *conn_close_status_ptr =
11524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        &ioctl_data.rpc_loc_ioctl_data_u_type_u.conn_close_status;
11534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    conn_close_status_ptr->conn_handle = handle;
11544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    conn_close_status_ptr->close_status = is_succ ? RPC_LOC_SERVER_CLOSE_SUCCESS : RPC_LOC_SERVER_CLOSE_FAIL;
11554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
11564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // Make the IOCTL call
11574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return convertErr(
11584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        loc_eng_ioctl(client_handle,
11594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      ioctl_data.disc,
11604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      &ioctl_data,
11614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      LOC_IOCTL_DEFAULT_TIMEOUT,
11624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      NULL)
11634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        );
11644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
11654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
11664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid LocApiRpc::ATLEvent(const rpc_loc_server_request_s_type *server_request_ptr)
11674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
11684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int connHandle;
11694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    AGpsType agps_type;
11704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
11714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGV("RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST event %s)",
11724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin             loc_get_event_atl_open_name(server_request_ptr->event));
11734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    switch (server_request_ptr->event)
11744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
11754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_LOC_SERVER_REQUEST_MULTI_OPEN:
11764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        connHandle = server_request_ptr->payload.rpc_loc_server_request_u_type_u.multi_open_req.conn_handle;
11774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (server_request_ptr->payload.rpc_loc_server_request_u_type_u.multi_open_req.connection_type
11784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            == RPC_LOC_SERVER_CONNECTION_LBS) {
11794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            agps_type = AGPS_TYPE_SUPL;
11804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            LOC_LOGV("ATLEvent: event - RPC_LOC_SERVER_REQUEST_MULTI_OPEN\n            type - AGPS_TYPE_SUPL\n            handle - %d", connHandle);
11814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        } else {
11824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            agps_type = AGPS_TYPE_WWAN_ANY;
11834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            LOC_LOGV("ATLEvent: event - RPC_LOC_SERVER_REQUEST_MULTI_OPEN\n            type - AGPS_TYPE_WWAN_ANY\n            handle - %d", connHandle);
11844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
11854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        requestATL(connHandle, agps_type);
11864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
11874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_LOC_SERVER_REQUEST_OPEN:
11884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        connHandle = server_request_ptr->payload.rpc_loc_server_request_u_type_u.open_req.conn_handle;
11894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGV("ATLEvent: event - RPC_LOC_SERVER_REQUEST_OPEN\n            handle - %d", connHandle);
11904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        requestATL(connHandle, AGPS_TYPE_INVALID);
11914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
11924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_LOC_SERVER_REQUEST_CLOSE:
11934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        connHandle = server_request_ptr->payload.rpc_loc_server_request_u_type_u.close_req.conn_handle;
11944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGV("ATLEvent: event - RPC_LOC_SERVER_REQUEST_CLOSE\n            handle - %d", connHandle);
11954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        releaseATL(connHandle);
11964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
11974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    default:
11984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("ATLEvent: event type %d invalid", server_request_ptr->event);
11994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   }
12004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
12014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
12024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid LocApiRpc::NIEvent(const rpc_loc_ni_event_s_type *ni_req)
12034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
12044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    GpsNiNotification notif = {0};
12054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
12064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    switch (ni_req->event)
12074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
12084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_LOC_NI_EVENT_VX_NOTIFY_VERIFY_REQ:
12094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
12104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        const rpc_loc_ni_vx_notify_verify_req_s_type *vx_req =
12114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            &ni_req->payload.rpc_loc_ni_event_payload_u_type_u.vx_req;
12124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGI("VX Notification");
12134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        notif.ni_type = GPS_NI_TYPE_VOICE;
12144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        // Requestor ID
12154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        hexcode(notif.requestor_id, sizeof notif.requestor_id,
12164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                vx_req->requester_id.requester_id,
12174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                vx_req->requester_id.requester_id_length);
12184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        notif.text_encoding = 0; // No text and no encoding
12194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        notif.requestor_id_encoding = convertNiEncodingType(vx_req->encoding_scheme);
12204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        NIEventFillVerfiyType(notif, vx_req->notification_priv_type);
12214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
12224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
12234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
12244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_LOC_NI_EVENT_UMTS_CP_NOTIFY_VERIFY_REQ:
12254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
12264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        const rpc_loc_ni_umts_cp_notify_verify_req_s_type *umts_cp_req =
12274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            &ni_req->payload.rpc_loc_ni_event_payload_u_type_u.umts_cp_req;
12284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGI("UMTS CP Notification\n");
12294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        notif.ni_type= GPS_NI_TYPE_UMTS_CTRL_PLANE;         // Stores notification text
12304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#if (AMSS_VERSION==3200)
12314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        hexcode(notif.text, sizeof notif.text,
12324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                umts_cp_req->notification_text.notification_text_val,
12334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                umts_cp_req->notification_length);
12344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        hexcode(notif.requestor_id, sizeof notif.requestor_id,
12354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                umts_cp_req->requestor_id.requestor_id_string.requestor_id_string_val,
12364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                umts_cp_req->requestor_id.string_len);
12374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#else
12384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        hexcode(notif.text, sizeof notif.text,
12394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                umts_cp_req->notification_text,
12404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                umts_cp_req->notification_length);
12414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        hexcode(notif.requestor_id, sizeof notif.requestor_id,
12424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                umts_cp_req->requestor_id.requestor_id_string,
12434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                umts_cp_req->requestor_id.string_len);
12444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif
12454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        notif.text_encoding = convertNiEncodingType(umts_cp_req->datacoding_scheme);
12464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        notif.requestor_id_encoding = notif.text_encoding;
12474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        NIEventFillVerfiyType(notif, umts_cp_req->notification_priv_type);
12484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
12494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        // LCS address (using extras field)
12504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (umts_cp_req->ext_client_address_data.ext_client_address_len != 0)
12514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
12524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            // Copy LCS Address into notif.extras in the format: Address = 012345
12534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            strlcat(notif.extras, LOC_NI_NOTIF_KEY_ADDRESS, sizeof notif.extras);
12544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            strlcat(notif.extras, " = ", sizeof notif.extras);
12554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            int addr_len = 0;
12564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            const char *address_source = NULL;
12574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
12584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#if (AMSS_VERSION==3200)
12594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            address_source = umts_cp_req->ext_client_address_data.ext_client_address.ext_client_address_val;
12604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#else
12614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            address_source = umts_cp_req->ext_client_address_data.ext_client_address;
12624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif /* #if (AMSS_VERSION==3200) */
12634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
12644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            char lcs_addr[32]; // Decoded LCS address for UMTS CP NI
12654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            addr_len = decodeAddress(lcs_addr, sizeof lcs_addr, address_source,
12664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                     umts_cp_req->ext_client_address_data.ext_client_address_len);
12674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
12684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            // The address is ASCII string
12694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            if (addr_len)
12704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            {
12714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                strlcat(notif.extras, lcs_addr, sizeof notif.extras);
12724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            }
12734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
12744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
12754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
12764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
12774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case RPC_LOC_NI_EVENT_SUPL_NOTIFY_VERIFY_REQ:
12784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
12794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        const rpc_loc_ni_supl_notify_verify_req_s_type *supl_req =
12804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            &ni_req->payload.rpc_loc_ni_event_payload_u_type_u.supl_req;
12814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGI("SUPL Notification\n");
12824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        notif.ni_type = GPS_NI_TYPE_UMTS_SUPL;
12834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
12844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (supl_req->flags & RPC_LOC_NI_CLIENT_NAME_PRESENT)
12854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
12864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#if (AMSS_VERSION==3200)
12874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            hexcode(notif.text, sizeof notif.text,
12884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    supl_req->client_name.client_name_string.client_name_string_val,   /* buffer */
12894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    supl_req->client_name.string_len                                   /* length */
12904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            );
12914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#else
12924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            hexcode(notif.text, sizeof notif.text,
12934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                            supl_req->client_name.client_name_string,   /* buffer */
12944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                            supl_req->client_name.string_len            /* length */
12954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            );
12964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif /* #if (AMSS_VERSION==3200) */
12974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            LOC_LOGV("SUPL NI: client_name: %s len=%d", notif.text, supl_req->client_name.string_len);
12984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
12994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        else {
13004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            LOC_LOGV("SUPL NI: client_name not present.");
13014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
13024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
13034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        // Requestor ID
13044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (supl_req->flags & RPC_LOC_NI_REQUESTOR_ID_PRESENT)
13054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
13064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#if (AMSS_VERSION==3200)
13074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            hexcode(notif.requestor_id, sizeof notif.requestor_id,
13084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    supl_req->requestor_id.requestor_id_string.requestor_id_string_val,  /* buffer */
13094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    supl_req->requestor_id.string_len                                    /* length */
13104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                );
13114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#else
13124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            hexcode(notif.requestor_id, sizeof notif.requestor_id,
13134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    supl_req->requestor_id.requestor_id_string,  /* buffer */
13144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    supl_req->requestor_id.string_len            /* length */
13154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                );
13164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif /* #if (AMSS_VERSION==3200) */
13174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            LOC_LOGV("SUPL NI: requestor_id: %s len=%d", notif.requestor_id, supl_req->requestor_id.string_len);
13184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
13194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        else {
13204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            LOC_LOGV("SUPL NI: requestor_id not present.");
13214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
13224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
13234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        // Encoding type
13244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (supl_req->flags & RPC_LOC_NI_ENCODING_TYPE_PRESENT)
13254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        {
13264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            notif.text_encoding = convertNiEncodingType(supl_req->datacoding_scheme);
13274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            notif.requestor_id_encoding = notif.text_encoding;
13284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
13294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        else {
13304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            notif.text_encoding = notif.requestor_id_encoding = GPS_ENC_UNKNOWN;
13314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
13324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
13334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        NIEventFillVerfiyType(notif, ni_req->payload.rpc_loc_ni_event_payload_u_type_u.supl_req.notification_priv_type);
13344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
13354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        break;
13364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
13374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    default:
13384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("Unknown NI event: %x\n", (int) ni_req->event);
13394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return;
13404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
13414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
13424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // this copy will get freed in loc_eng_ni when loc_ni_respond() is called
13434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ni_event_s_type *copy = (rpc_loc_ni_event_s_type *)malloc(sizeof(*copy));
13444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    memcpy(copy, ni_req, sizeof(*copy));
13454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    requestNiNotify(notif, (const void*)copy);
13464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
13474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
13484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint LocApiRpc::NIEventFillVerfiyType(GpsNiNotification &notif,
13494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                                rpc_loc_ni_notify_verify_e_type notif_priv)
13504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
13514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   switch (notif_priv)
13524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   {
13534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   case RPC_LOC_NI_USER_NO_NOTIFY_NO_VERIFY:
13544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       notif.notify_flags = 0;
13554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       notif.default_response = GPS_NI_RESPONSE_NORESP;
13564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       return 1;
13574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   case RPC_LOC_NI_USER_NOTIFY_ONLY:
13584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       notif.notify_flags = GPS_NI_NEED_NOTIFY;
13594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       notif.default_response = GPS_NI_RESPONSE_NORESP;
13604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       return 1;
13614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   case RPC_LOC_NI_USER_NOTIFY_VERIFY_ALLOW_NO_RESP:
13624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       notif.notify_flags = GPS_NI_NEED_NOTIFY | GPS_NI_NEED_VERIFY;
13634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       notif.default_response = GPS_NI_RESPONSE_ACCEPT;
13644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       return 1;
13654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   case RPC_LOC_NI_USER_NOTIFY_VERIFY_NOT_ALLOW_NO_RESP:
13664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       notif.notify_flags = GPS_NI_NEED_NOTIFY | GPS_NI_NEED_VERIFY;
13674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       notif.default_response = GPS_NI_RESPONSE_DENY;
13684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       return 1;
13694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   case RPC_LOC_NI_USER_PRIVACY_OVERRIDE:
13704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       notif.notify_flags = GPS_NI_PRIVACY_OVERRIDE;
13714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       notif.default_response = GPS_NI_RESPONSE_NORESP;
13724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       return 1;
13734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   default:
13744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      return 0;
13754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   }
13764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
13774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
13784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinenum loc_api_adapter_err
13794035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiRpc::setSUPLVersion(uint32_t version)
13804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
13814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_SUPL_VERSION, {0}};
13824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   ioctl_data.rpc_loc_ioctl_data_u_type_u.supl_version = (int)version;
13834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   return convertErr(
13844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       loc_eng_ioctl (client_handle,
13854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      RPC_LOC_IOCTL_SET_SUPL_VERSION,
13864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      &ioctl_data,
13874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      LOC_IOCTL_DEFAULT_TIMEOUT,
13884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      NULL)
13894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       );
13904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
13914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
13924035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinGpsNiEncodingType LocApiRpc::convertNiEncodingType(int loc_encoding)
13934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
13944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   switch (loc_encoding)
13954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   {
13964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   case RPC_LOC_NI_SUPL_UTF8:
13974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       return GPS_ENC_SUPL_UTF8;
13984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   case RPC_LOC_NI_SUPL_UCS2:
13994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       return GPS_ENC_SUPL_UCS2;
14004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   case RPC_LOC_NI_SUPL_GSM_DEFAULT:
14014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      return GPS_ENC_SUPL_GSM_DEFAULT;
14024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   case RPC_LOC_NI_SS_LANGUAGE_UNSPEC:
14034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      return GPS_ENC_SUPL_GSM_DEFAULT; // SS_LANGUAGE_UNSPEC = GSM
14044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   default:
14054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       return GPS_ENC_UNKNOWN;
14064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   }
14074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
14084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
14094035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiBase* getLocApi(const MsgTask* msgTask,
14104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      LOC_API_ADAPTER_EVENT_MASK_T exMask,
14114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                      ContextBase *context) {
14124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return new LocApiRpc(msgTask, exMask, context);
14134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
14144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
14154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*Values for lock
14164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin  1 = Do not lock any position sessions
14174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin  2 = Lock MI position sessions
14184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin  3 = Lock MT position sessions
14194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin  4 = Lock all position sessions
14204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin*/
14214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint LocApiRpc::setGpsLock(LOC_GPS_LOCK_MASK lockMask)
14224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
14234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_data_u_type    ioctl_data;
14244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    boolean ret_val;
14254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD("%s:%d]: lock: %x\n", __func__, __LINE__, lockMask);
14264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ioctl_data.rpc_loc_ioctl_data_u_type_u.engine_lock = convertGpsLockMask(lockMask);
14274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ioctl_data.disc = RPC_LOC_IOCTL_SET_ENGINE_LOCK;
14284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ret_val = loc_eng_ioctl (loc_eng_data.client_handle,
14294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                            RPC_LOC_IOCTL_SET_ENGINE_LOCK,
14304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                            &ioctl_data,
14314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                            LOC_IOCTL_DEFAULT_TIMEOUT,
14324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                            NULL /* No output information is expected*/);
14334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
14344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD("%s:%d]: ret_val: %d\n", __func__, __LINE__, (int)ret_val);
14354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return (ret_val == TRUE ? 0 : -1);
14364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
14374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
14384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*
14394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin  Returns
14404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin  Current value of GPS lock on success
14414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin  -1 on failure
14424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin*/
14434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint LocApiRpc :: getGpsLock()
14444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
14454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_data_u_type    ioctl_data;
14464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    rpc_loc_ioctl_callback_s_type callback_payload;
14474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    boolean ret_val;
14484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int ret=0;
14494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD("%s:%d]: Enter\n", __func__, __LINE__);
14504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    ret_val = loc_eng_ioctl (loc_eng_data.client_handle,
14514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                            RPC_LOC_IOCTL_GET_ENGINE_LOCK,
14524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                            &ioctl_data,
14534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                            LOC_IOCTL_DEFAULT_TIMEOUT,
14544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                            &callback_payload);
14554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if(ret_val == TRUE) {
14564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        ret = (int)callback_payload.data.engine_lock;
14574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGD("%s:%d]: Lock type: %d\n", __func__, __LINE__, ret);
14584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
14594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    else {
14604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("%s:%d]: Ioctl failed", __func__, __LINE__);
14614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        ret = -1;
14624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
14634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD("%s:%d]: Exit\n", __func__, __LINE__);
14644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return ret;
14654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
1466