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