18c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Copyright (c) 2009-2014, The Linux Foundation. All rights reserved.
28c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *
38c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * Redistribution and use in source and binary forms, with or without
48c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * modification, are permitted provided that the following conditions are
58c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * met:
68c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *     * Redistributions of source code must retain the above copyright
78c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       notice, this list of conditions and the following disclaimer.
88c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *     * Redistributions in binary form must reproduce the above
98c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       copyright notice, this list of conditions and the following
108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       disclaimer in the documentation and/or other materials provided
118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       with the distribution.
128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *     * Neither the name of The Linux Foundation, nor the names of its
138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       contributors may be used to endorse or promote products derived
148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       from this software without specific prior written permission.
158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *
168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *
288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam */
298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOG_NDDEBUG 0
318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOG_TAG "LocSvc_eng"
328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <stdio.h>
348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <stdlib.h>
358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <sys/time.h>
368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <pthread.h>
378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <errno.h>
388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <string.h>
398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <ctype.h>
408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <unistd.h>
418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <time.h>
428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <MsgTask.h>
438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <loc_eng.h>
458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "log_util.h"
478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "platform_lib_includes.h"
488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
498c2d3d5afc51d3f35150f748f263870367771b6fEd Tamusing namespace loc_core;
508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=============================================================================
528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *
538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *                             DATA DECLARATION
548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *
558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *============================================================================*/
568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=============================================================================
588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *
598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *                             FUNCTION DECLARATIONS
608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *
618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *============================================================================*/
628c2d3d5afc51d3f35150f748f263870367771b6fEd Tamstatic void* ni_thread_proc(void *args);
638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
648c2d3d5afc51d3f35150f748f263870367771b6fEd Tamstruct LocEngInformNiResponse : public LocMsg {
658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LocEngAdapter* mAdapter;
668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    const GpsUserResponseType mResponse;
678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    const void *mPayload;
688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    inline LocEngInformNiResponse(LocEngAdapter* adapter,
698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                                  GpsUserResponseType resp,
708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                                  const void* data) :
718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        LocMsg(), mAdapter(adapter),
728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        mResponse(resp), mPayload(data)
738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    {
748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        locallog();
758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    inline ~LocEngInformNiResponse()
778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    {
788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        // this is a bit weird since mPayload is not
798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        // allocated by this class.  But there is no better way.
808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        // mPayload actually won't be NULL here.
818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        free((void*)mPayload);
828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    inline virtual void proc() const
848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    {
858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        mAdapter->informNiResponse(mResponse, mPayload);
868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    inline void locallog() const
888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    {
898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        LOC_LOGV("LocEngInformNiResponse - "
908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                 "response: %s\n  mPayload: %p",
918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                 loc_get_ni_response_name(mResponse),
928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                 mPayload);
938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    inline virtual void log() const
958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    {
968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        locallog();
978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam};
998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*===========================================================================
1018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1028c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_eng_ni_request_handler
1038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1048c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION
1058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   Displays the NI request and awaits user input. If a previous request is
1068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   in session, it is ignored.
1078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1088c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE
1098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   none
1108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/
1128c2d3d5afc51d3f35150f748f263870367771b6fEd Tamvoid loc_eng_ni_request_handler(loc_eng_data_s_type &loc_eng_data,
1138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                            const GpsNiNotification *notif,
1148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                            const void* passThrough)
1158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
1168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    ENTRY_LOG();
1178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    char lcs_addr[32]; // Decoded LCS address for UMTS CP NI
1188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data.loc_eng_ni_data;
1198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    loc_eng_ni_session_s_type* pSession = NULL;
1208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (NULL == loc_eng_data.ni_notify_cb) {
1228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        EXIT_LOG(%s, "loc_eng_ni_init hasn't happened yet.");
1238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        return;
1248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
1258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (notif->ni_type == GPS_NI_TYPE_EMERGENCY_SUPL) {
1278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        if (NULL != loc_eng_ni_data_p->sessionEs.rawRequest) {
1288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            LOC_LOGW("loc_eng_ni_request_handler, supl es NI in progress, new supl es NI ignored, type: %d",
1298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                     notif->ni_type);
1308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            if (NULL != passThrough) {
1318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                free((void*)passThrough);
1328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            }
1338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        } else {
1348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            pSession = &loc_eng_ni_data_p->sessionEs;
1358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        }
1368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    } else {
1378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        if (NULL != loc_eng_ni_data_p->session.rawRequest ||
1388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            NULL != loc_eng_ni_data_p->sessionEs.rawRequest) {
1398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            LOC_LOGW("loc_eng_ni_request_handler, supl NI in progress, new supl NI ignored, type: %d",
1408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                     notif->ni_type);
1418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            if (NULL != passThrough) {
1428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                free((void*)passThrough);
1438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            }
1448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        } else {
1458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            pSession = &loc_eng_ni_data_p->session;
1468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        }
1478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
1488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (pSession) {
1518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        /* Save request */
1528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pSession->rawRequest = (void*)passThrough;
1538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pSession->reqID = ++loc_eng_ni_data_p->reqIDCounter;
1548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pSession->adapter = loc_eng_data.adapter;
1558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        /* Fill in notification */
1578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        ((GpsNiNotification*)notif)->notification_id = pSession->reqID;
1588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        if (notif->notify_flags == GPS_NI_PRIVACY_OVERRIDE)
1608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        {
1618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            loc_eng_mute_one_session(loc_eng_data);
1628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        }
1638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        /* Log requestor ID and text for debugging */
1658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        LOC_LOGI("Notification: notif_type: %d, timeout: %d, default_resp: %d", notif->ni_type, notif->timeout, notif->default_response);
1668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        LOC_LOGI("              requestor_id: %s (encoding: %d)", notif->requestor_id, notif->requestor_id_encoding);
1678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        LOC_LOGI("              text: %s text (encoding: %d)", notif->text, notif->text_encoding);
1688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        if (notif->extras[0])
1698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        {
1708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            LOC_LOGI("              extras: %s", notif->extras);
1718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        }
1728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        /* For robustness, spawn a thread at this point to timeout to clear up the notification status, even though
1748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam         * the OEM layer in java does not do so.
1758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam         **/
1768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pSession->respTimeLeft = 5 + (notif->timeout != 0 ? notif->timeout : LOC_NI_NO_RESPONSE_TIME);
1778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        LOC_LOGI("Automatically sends 'no response' in %d seconds (to clear status)\n", pSession->respTimeLeft);
1788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        int rc = 0;
1808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        rc = pthread_create(&pSession->thread, NULL, ni_thread_proc, pSession);
1818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        if (rc)
1828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        {
1838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            LOC_LOGE("Loc NI thread is not created.\n");
1848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        }
1858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        rc = pthread_detach(pSession->thread);
1868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        if (rc)
1878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        {
1888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            LOC_LOGE("Loc NI thread is not detached.\n");
1898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        }
1908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        CALLBACK_LOG_CALLFLOW("ni_notify_cb - id", %d, notif->notification_id);
1928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        loc_eng_data.ni_notify_cb((GpsNiNotification*)notif);
1938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
1948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    EXIT_LOG(%s, VOID_RET);
1958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
1968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*===========================================================================
1988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1998c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION ni_thread_proc
2008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/
2028c2d3d5afc51d3f35150f748f263870367771b6fEd Tamstatic void* ni_thread_proc(void *args)
2038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
2048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    ENTRY_LOG();
2058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    loc_eng_ni_session_s_type* pSession = (loc_eng_ni_session_s_type*)args;
2078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int rc = 0;          /* return code from pthread calls */
2088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    struct timeval present_time;
2108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    struct timespec expire_time;
2118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_LOGD("Starting Loc NI thread...\n");
2138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    pthread_mutex_lock(&pSession->tLock);
2148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    /* Calculate absolute expire time */
2158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    gettimeofday(&present_time, NULL);
2168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    expire_time.tv_sec  = present_time.tv_sec + pSession->respTimeLeft;
2178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    expire_time.tv_nsec = present_time.tv_usec * 1000;
2188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_LOGD("ni_thread_proc-Time out set for abs time %ld with delay %d sec\n",
2198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam             (long) expire_time.tv_sec, pSession->respTimeLeft );
2208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    while (!pSession->respRecvd)
2228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    {
2238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        rc = pthread_cond_timedwait(&pSession->tCond,
2248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                                    &pSession->tLock,
2258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                                    &expire_time);
2268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        if (rc == ETIMEDOUT)
2278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        {
2288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            pSession->resp = GPS_NI_RESPONSE_NORESP;
2298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            LOC_LOGD("ni_thread_proc-Thread time out after valting for specified time. Ret Val %d\n",rc );
2308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
2318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        }
2328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
2338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_LOGD("ni_thread_proc-Java layer has sent us a user response and return value from "
2348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam             "pthread_cond_timedwait = %d\n",rc );
2358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    pSession->respRecvd = FALSE; /* Reset the user response flag for the next session*/
2368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_LOGD("pSession->resp is %d\n",pSession->resp);
2388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    // adding this check to support modem restart, in which case, we need the thread
2408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    // to exit without calling sending data. We made sure that rawRequest is NULL in
2418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    // loc_eng_ni_reset_on_engine_restart()
2428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LocEngAdapter* adapter = pSession->adapter;
2438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LocEngInformNiResponse *msg = NULL;
2448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (NULL != pSession->rawRequest) {
2468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        if (pSession->resp != GPS_NI_RESPONSE_IGNORE) {
2478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            LOC_LOGD("pSession->resp != GPS_NI_RESPONSE_IGNORE \n");
2488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            msg = new LocEngInformNiResponse(adapter,
2498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                                             pSession->resp,
2508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                                             pSession->rawRequest);
2518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        } else {
2528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            LOC_LOGD("this is the ignore reply for SUPL ES\n");
2538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            free(pSession->rawRequest);
2548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        }
2558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pSession->rawRequest = NULL;
2568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
2578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    pthread_mutex_unlock(&pSession->tLock);
2588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    pSession->respTimeLeft = 0;
2608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    pSession->reqID = 0;
2618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (NULL != msg) {
2638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        LOC_LOGD("ni_thread_proc: adapter->sendMsg(msg)\n");
2648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        adapter->sendMsg(msg);
2658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
2668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    EXIT_LOG(%s, VOID_RET);
2688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    return NULL;
2698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
2708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2718c2d3d5afc51d3f35150f748f263870367771b6fEd Tamvoid loc_eng_ni_reset_on_engine_restart(loc_eng_data_s_type &loc_eng_data)
2728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
2738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    ENTRY_LOG();
2748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data.loc_eng_ni_data;
2758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (NULL == loc_eng_data.ni_notify_cb) {
2778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        EXIT_LOG(%s, "loc_eng_ni_init hasn't happened yet.");
2788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        return;
2798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
2808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    // only if modem has requested but then died.
2828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (NULL != loc_eng_ni_data_p->sessionEs.rawRequest) {
2838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        free(loc_eng_ni_data_p->sessionEs.rawRequest);
2848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        loc_eng_ni_data_p->sessionEs.rawRequest = NULL;
2858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pthread_mutex_lock(&loc_eng_ni_data_p->sessionEs.tLock);
2878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        // the goal is to wake up ni_thread_proc
2888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        // and let it exit.
2898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        loc_eng_ni_data_p->sessionEs.respRecvd = TRUE;
2908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pthread_cond_signal(&loc_eng_ni_data_p->sessionEs.tCond);
2918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pthread_mutex_unlock(&loc_eng_ni_data_p->sessionEs.tLock);
2928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
2938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (NULL != loc_eng_ni_data_p->session.rawRequest) {
2958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        free(loc_eng_ni_data_p->session.rawRequest);
2968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        loc_eng_ni_data_p->session.rawRequest = NULL;
2978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pthread_mutex_lock(&loc_eng_ni_data_p->session.tLock);
2998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        // the goal is to wake up ni_thread_proc
3008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        // and let it exit.
3018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        loc_eng_ni_data_p->session.respRecvd = TRUE;
3028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pthread_cond_signal(&loc_eng_ni_data_p->session.tCond);
3038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pthread_mutex_unlock(&loc_eng_ni_data_p->session.tLock);
3048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
3058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    EXIT_LOG(%s, VOID_RET);
3078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
3088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*===========================================================================
3108c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION    loc_eng_ni_init
3118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3128c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION
3138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   This function initializes the NI interface
3148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3158c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES
3168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   NONE
3178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3188c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE
3198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   None
3208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3218c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS
3228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   N/A
3238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/
3258c2d3d5afc51d3f35150f748f263870367771b6fEd Tamvoid loc_eng_ni_init(loc_eng_data_s_type &loc_eng_data, GpsNiExtCallbacks *callbacks)
3268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
3278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    ENTRY_LOG_CALLFLOW();
3288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if(callbacks == NULL)
3308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        EXIT_LOG(%s, "loc_eng_ni_init: failed, cb is NULL");
3318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    else if (NULL == callbacks->notify_cb) {
3328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        EXIT_LOG(%s, "loc_eng_ni_init: failed, no cb.");
3338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    } else if (NULL != loc_eng_data.ni_notify_cb) {
3348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        EXIT_LOG(%s, "loc_eng_ni_init: already inited.");
3358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    } else {
3368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data.loc_eng_ni_data;
3378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        loc_eng_ni_data_p->sessionEs.respTimeLeft = 0;
3388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        loc_eng_ni_data_p->sessionEs.respRecvd = FALSE;
3398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        loc_eng_ni_data_p->sessionEs.rawRequest = NULL;
3408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        loc_eng_ni_data_p->sessionEs.reqID = 0;
3418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pthread_cond_init(&loc_eng_ni_data_p->sessionEs.tCond, NULL);
3428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pthread_mutex_init(&loc_eng_ni_data_p->sessionEs.tLock, NULL);
3438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        loc_eng_ni_data_p->session.respTimeLeft = 0;
3458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        loc_eng_ni_data_p->session.respRecvd = FALSE;
3468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        loc_eng_ni_data_p->session.rawRequest = NULL;
3478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        loc_eng_ni_data_p->session.reqID = 0;
3488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pthread_cond_init(&loc_eng_ni_data_p->session.tCond, NULL);
3498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pthread_mutex_init(&loc_eng_ni_data_p->session.tLock, NULL);
3508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        loc_eng_data.ni_notify_cb = callbacks->notify_cb;
3528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        EXIT_LOG(%s, VOID_RET);
3538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
3548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
3558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*===========================================================================
3578c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION    loc_eng_ni_respond
3588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3598c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION
3608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   This function receives user response from upper layer framework
3618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3628c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES
3638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   NONE
3648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3658c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE
3668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   None
3678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3688c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS
3698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   N/A
3708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/
3728c2d3d5afc51d3f35150f748f263870367771b6fEd Tamvoid loc_eng_ni_respond(loc_eng_data_s_type &loc_eng_data,
3738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                        int notif_id, GpsUserResponseType user_response)
3748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
3758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    ENTRY_LOG_CALLFLOW();
3768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data.loc_eng_ni_data;
3778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    loc_eng_ni_session_s_type* pSession = NULL;
3788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (NULL == loc_eng_data.ni_notify_cb) {
3808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        EXIT_LOG(%s, "loc_eng_ni_init hasn't happened yet.");
3818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        return;
3828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
3838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (notif_id == loc_eng_ni_data_p->sessionEs.reqID &&
3858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        NULL != loc_eng_ni_data_p->sessionEs.rawRequest) {
3868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pSession = &loc_eng_ni_data_p->sessionEs;
3878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        // ignore any SUPL NI non-Es session if a SUPL NI ES is accepted
3888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        if (user_response == GPS_NI_RESPONSE_ACCEPT &&
3898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            NULL != loc_eng_ni_data_p->session.rawRequest) {
3908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                pthread_mutex_lock(&loc_eng_ni_data_p->session.tLock);
3918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                loc_eng_ni_data_p->session.resp = GPS_NI_RESPONSE_IGNORE;
3928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                loc_eng_ni_data_p->session.respRecvd = TRUE;
3938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                pthread_cond_signal(&loc_eng_ni_data_p->session.tCond);
3948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                pthread_mutex_unlock(&loc_eng_ni_data_p->session.tLock);
3958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        }
3968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    } else if (notif_id == loc_eng_ni_data_p->session.reqID &&
3978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        NULL != loc_eng_ni_data_p->session.rawRequest) {
3988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pSession = &loc_eng_ni_data_p->session;
3998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
4008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (pSession) {
4028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        LOC_LOGI("loc_eng_ni_respond: send user response %d for notif %d", user_response, notif_id);
4038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pthread_mutex_lock(&pSession->tLock);
4048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pSession->resp = user_response;
4058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pSession->respRecvd = TRUE;
4068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pthread_cond_signal(&pSession->tCond);
4078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        pthread_mutex_unlock(&pSession->tLock);
4088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
4098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    else {
4108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        LOC_LOGE("loc_eng_ni_respond: notif_id %d not an active session", notif_id);
4118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
4128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    EXIT_LOG(%s, VOID_RET);
4148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
415