1e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/* Copyright (c) 2009-2014, The Linux Foundation. All rights reserved.
2e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *
3e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * Redistribution and use in source and binary forms, with or without
4e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * modification, are permitted provided that the following conditions are
5e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * met:
6e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *     * Redistributions of source code must retain the above copyright
7e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *       notice, this list of conditions and the following disclaimer.
8e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *     * Redistributions in binary form must reproduce the above
9e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *       copyright notice, this list of conditions and the following
10e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *       disclaimer in the documentation and/or other materials provided
11e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *       with the distribution.
12e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *     * Neither the name of The Linux Foundation, nor the names of its
13e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *       contributors may be used to endorse or promote products derived
14e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *       from this software without specific prior written permission.
15e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *
16e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *
28e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti */
29e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
30e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#define LOG_NDDEBUG 0
31e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#define LOG_TAG "LocSvc_eng"
32e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
33e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <stdio.h>
34e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <stdlib.h>
35e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <sys/time.h>
36e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <pthread.h>
37e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <errno.h>
38e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <string.h>
39e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <ctype.h>
40e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <unistd.h>
41e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <time.h>
42e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <MsgTask.h>
43e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
44e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <loc_eng.h>
45e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
46e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include "log_util.h"
47e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include "platform_lib_includes.h"
48e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
49e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletiusing namespace loc_core;
50e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
51e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*=============================================================================
52e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *
53e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *                             DATA DECLARATION
54e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *
55e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *============================================================================*/
56e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
57e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*=============================================================================
58e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *
59e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *                             FUNCTION DECLARATIONS
60e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *
61e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *============================================================================*/
62e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletistatic void* ni_thread_proc(void *args);
63e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
64e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletistruct LocEngInformNiResponse : public LocMsg {
65e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    LocEngAdapter* mAdapter;
66e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    const GpsUserResponseType mResponse;
67e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    const void *mPayload;
68e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    inline LocEngInformNiResponse(LocEngAdapter* adapter,
69e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                                  GpsUserResponseType resp,
70e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                                  const void* data) :
71e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        LocMsg(), mAdapter(adapter),
72e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        mResponse(resp), mPayload(data)
73e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    {
74e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        locallog();
75e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
76e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    inline ~LocEngInformNiResponse()
77e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    {
78e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // this is a bit weird since mPayload is not
79e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // allocated by this class.  But there is no better way.
80e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // mPayload actually won't be NULL here.
81e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        free((void*)mPayload);
82e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
83e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    inline virtual void proc() const
84e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    {
85e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        mAdapter->informNiResponse(mResponse, mPayload);
86e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
87e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    inline void locallog() const
88e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    {
89e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        LOC_LOGV("LocEngInformNiResponse - "
90e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                 "response: %s\n  mPayload: %p",
91e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                 loc_get_ni_response_name(mResponse),
92e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                 mPayload);
93e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
94e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    inline virtual void log() const
95e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    {
96e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        locallog();
97e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
98e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti};
99e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
100e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
101e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
102e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION loc_eng_ni_request_handler
103e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
104e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
105e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Displays the NI request and awaits user input. If a previous request is
106e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   in session, it is ignored.
107e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
108e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
109e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   none
110e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
111e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
112e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletivoid loc_eng_ni_request_handler(loc_eng_data_s_type &loc_eng_data,
113e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                            const GpsNiNotification *notif,
114e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                            const void* passThrough)
115e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
116e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    ENTRY_LOG();
117e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    char lcs_addr[32]; // Decoded LCS address for UMTS CP NI
118e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data.loc_eng_ni_data;
119e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    loc_eng_ni_session_s_type* pSession = NULL;
120e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
121e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (NULL == loc_eng_data.ni_notify_cb) {
122e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        EXIT_LOG(%s, "loc_eng_ni_init hasn't happened yet.");
123e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        return;
124e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
125e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
126e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (notif->ni_type == GPS_NI_TYPE_EMERGENCY_SUPL) {
127e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (NULL != loc_eng_ni_data_p->sessionEs.rawRequest) {
128e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGW("loc_eng_ni_request_handler, supl es NI in progress, new supl es NI ignored, type: %d",
129e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                     notif->ni_type);
130e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            if (NULL != passThrough) {
131e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                free((void*)passThrough);
132e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
133e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        } else {
134e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            pSession = &loc_eng_ni_data_p->sessionEs;
135e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
136e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    } else {
137e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (NULL != loc_eng_ni_data_p->session.rawRequest ||
138e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            NULL != loc_eng_ni_data_p->sessionEs.rawRequest) {
139e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGW("loc_eng_ni_request_handler, supl NI in progress, new supl NI ignored, type: %d",
140e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                     notif->ni_type);
141e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            if (NULL != passThrough) {
142e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                free((void*)passThrough);
143e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
144e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        } else {
145e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            pSession = &loc_eng_ni_data_p->session;
146e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
147e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
148e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
149e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
150e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (pSession) {
151e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        /* Save request */
152e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pSession->rawRequest = (void*)passThrough;
153e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pSession->reqID = ++loc_eng_ni_data_p->reqIDCounter;
154e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pSession->adapter = loc_eng_data.adapter;
155e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
156e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        /* Fill in notification */
157e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        ((GpsNiNotification*)notif)->notification_id = pSession->reqID;
158e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
159e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (notif->notify_flags == GPS_NI_PRIVACY_OVERRIDE)
160e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
161e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            loc_eng_mute_one_session(loc_eng_data);
162e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
163e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
164e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        /* Log requestor ID and text for debugging */
165e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        LOC_LOGI("Notification: notif_type: %d, timeout: %d, default_resp: %d", notif->ni_type, notif->timeout, notif->default_response);
166e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        LOC_LOGI("              requestor_id: %s (encoding: %d)", notif->requestor_id, notif->requestor_id_encoding);
167e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        LOC_LOGI("              text: %s text (encoding: %d)", notif->text, notif->text_encoding);
168e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (notif->extras[0])
169e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
170e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGI("              extras: %s", notif->extras);
171e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
172e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
173e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        /* For robustness, spawn a thread at this point to timeout to clear up the notification status, even though
174e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         * the OEM layer in java does not do so.
175e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         **/
176e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pSession->respTimeLeft = 5 + (notif->timeout != 0 ? notif->timeout : LOC_NI_NO_RESPONSE_TIME);
177e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        LOC_LOGI("Automatically sends 'no response' in %d seconds (to clear status)\n", pSession->respTimeLeft);
178e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
179e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        int rc = 0;
180e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        rc = pthread_create(&pSession->thread, NULL, ni_thread_proc, pSession);
181e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (rc)
182e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
183e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGE("Loc NI thread is not created.\n");
184e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
185e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        rc = pthread_detach(pSession->thread);
186e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (rc)
187e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
188e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGE("Loc NI thread is not detached.\n");
189e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
190e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
191e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        CALLBACK_LOG_CALLFLOW("ni_notify_cb - id", %d, notif->notification_id);
192e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_data.ni_notify_cb((GpsNiNotification*)notif);
193e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
194e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    EXIT_LOG(%s, VOID_RET);
195e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
196e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
197e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
198e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
199e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION ni_thread_proc
200e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
201e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
202e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletistatic void* ni_thread_proc(void *args)
203e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
204e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    ENTRY_LOG();
205e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
206e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    loc_eng_ni_session_s_type* pSession = (loc_eng_ni_session_s_type*)args;
207e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int rc = 0;          /* return code from pthread calls */
208e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
209e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    struct timeval present_time;
210e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    struct timespec expire_time;
211e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
212e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    LOC_LOGD("Starting Loc NI thread...\n");
213e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    pthread_mutex_lock(&pSession->tLock);
214e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    /* Calculate absolute expire time */
215e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    gettimeofday(&present_time, NULL);
216e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    expire_time.tv_sec  = present_time.tv_sec + pSession->respTimeLeft;
217e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    expire_time.tv_nsec = present_time.tv_usec * 1000;
218e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    LOC_LOGD("ni_thread_proc-Time out set for abs time %ld with delay %d sec\n",
219e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti             (long) expire_time.tv_sec, pSession->respTimeLeft );
220e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
221e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    while (!pSession->respRecvd)
222e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    {
223e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        rc = pthread_cond_timedwait(&pSession->tCond,
224e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                                    &pSession->tLock,
225e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                                    &expire_time);
226e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (rc == ETIMEDOUT)
227e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
228e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            pSession->resp = GPS_NI_RESPONSE_NORESP;
229e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGD("ni_thread_proc-Thread time out after valting for specified time. Ret Val %d\n",rc );
230e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            break;
231e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
232e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
233e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    LOC_LOGD("ni_thread_proc-Java layer has sent us a user response and return value from "
234e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti             "pthread_cond_timedwait = %d\n",rc );
235e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    pSession->respRecvd = FALSE; /* Reset the user response flag for the next session*/
236e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
237e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    LOC_LOGD("pSession->resp is %d\n",pSession->resp);
238e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
239e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    // adding this check to support modem restart, in which case, we need the thread
240e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    // to exit without calling sending data. We made sure that rawRequest is NULL in
241e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    // loc_eng_ni_reset_on_engine_restart()
242e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    LocEngAdapter* adapter = pSession->adapter;
243e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    LocEngInformNiResponse *msg = NULL;
244e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
245e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (NULL != pSession->rawRequest) {
246e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (pSession->resp != GPS_NI_RESPONSE_IGNORE) {
247e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGD("pSession->resp != GPS_NI_RESPONSE_IGNORE \n");
248e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            msg = new LocEngInformNiResponse(adapter,
249e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                                             pSession->resp,
250e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                                             pSession->rawRequest);
251e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        } else {
252e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGD("this is the ignore reply for SUPL ES\n");
253e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            free(pSession->rawRequest);
254e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
255e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pSession->rawRequest = NULL;
256e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
257e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    pthread_mutex_unlock(&pSession->tLock);
258e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
259e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    pSession->respTimeLeft = 0;
260e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    pSession->reqID = 0;
261e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
262e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (NULL != msg) {
263e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        LOC_LOGD("ni_thread_proc: adapter->sendMsg(msg)\n");
264e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        adapter->sendMsg(msg);
265e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
266e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
267e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    EXIT_LOG(%s, VOID_RET);
268e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    return NULL;
269e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
270e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
271e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletivoid loc_eng_ni_reset_on_engine_restart(loc_eng_data_s_type &loc_eng_data)
272e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
273e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    ENTRY_LOG();
274e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data.loc_eng_ni_data;
275e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
276e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (NULL == loc_eng_data.ni_notify_cb) {
277e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        EXIT_LOG(%s, "loc_eng_ni_init hasn't happened yet.");
278e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        return;
279e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
280e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
281e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    // only if modem has requested but then died.
282e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (NULL != loc_eng_ni_data_p->sessionEs.rawRequest) {
283e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        free(loc_eng_ni_data_p->sessionEs.rawRequest);
284e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_ni_data_p->sessionEs.rawRequest = NULL;
285e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
286e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pthread_mutex_lock(&loc_eng_ni_data_p->sessionEs.tLock);
287e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // the goal is to wake up ni_thread_proc
288e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // and let it exit.
289e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_ni_data_p->sessionEs.respRecvd = TRUE;
290e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pthread_cond_signal(&loc_eng_ni_data_p->sessionEs.tCond);
291e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pthread_mutex_unlock(&loc_eng_ni_data_p->sessionEs.tLock);
292e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
293e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
294e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (NULL != loc_eng_ni_data_p->session.rawRequest) {
295e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        free(loc_eng_ni_data_p->session.rawRequest);
296e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_ni_data_p->session.rawRequest = NULL;
297e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
298e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pthread_mutex_lock(&loc_eng_ni_data_p->session.tLock);
299e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // the goal is to wake up ni_thread_proc
300e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // and let it exit.
301e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_ni_data_p->session.respRecvd = TRUE;
302e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pthread_cond_signal(&loc_eng_ni_data_p->session.tCond);
303e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pthread_mutex_unlock(&loc_eng_ni_data_p->session.tLock);
304e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
305e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
306e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    EXIT_LOG(%s, VOID_RET);
307e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
308e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
309e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
310e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_eng_ni_init
311e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
312e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
313e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   This function initializes the NI interface
314e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
315e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES
316e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   NONE
317e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
318e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
319e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   None
320e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
321e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS
322e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
323e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
324e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
325e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletivoid loc_eng_ni_init(loc_eng_data_s_type &loc_eng_data, GpsNiExtCallbacks *callbacks)
326e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
327e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    ENTRY_LOG_CALLFLOW();
328e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
329e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if(callbacks == NULL)
330e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        EXIT_LOG(%s, "loc_eng_ni_init: failed, cb is NULL");
331e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    else if (NULL == callbacks->notify_cb) {
332e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        EXIT_LOG(%s, "loc_eng_ni_init: failed, no cb.");
333e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    } else if (NULL != loc_eng_data.ni_notify_cb) {
334e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        EXIT_LOG(%s, "loc_eng_ni_init: already inited.");
335e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    } else {
336e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data.loc_eng_ni_data;
337e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_ni_data_p->sessionEs.respTimeLeft = 0;
338e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_ni_data_p->sessionEs.respRecvd = FALSE;
339e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_ni_data_p->sessionEs.rawRequest = NULL;
340e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_ni_data_p->sessionEs.reqID = 0;
341e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pthread_cond_init(&loc_eng_ni_data_p->sessionEs.tCond, NULL);
342e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pthread_mutex_init(&loc_eng_ni_data_p->sessionEs.tLock, NULL);
343e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
344e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_ni_data_p->session.respTimeLeft = 0;
345e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_ni_data_p->session.respRecvd = FALSE;
346e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_ni_data_p->session.rawRequest = NULL;
347e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_ni_data_p->session.reqID = 0;
348e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pthread_cond_init(&loc_eng_ni_data_p->session.tCond, NULL);
349e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pthread_mutex_init(&loc_eng_ni_data_p->session.tLock, NULL);
350e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
351e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_data.ni_notify_cb = callbacks->notify_cb;
352e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        EXIT_LOG(%s, VOID_RET);
353e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
354e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
355e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
356e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
357e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_eng_ni_respond
358e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
359e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
360e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   This function receives user response from upper layer framework
361e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
362e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES
363e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   NONE
364e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
365e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
366e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   None
367e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
368e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS
369e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
370e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
371e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
372e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletivoid loc_eng_ni_respond(loc_eng_data_s_type &loc_eng_data,
373e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        int notif_id, GpsUserResponseType user_response)
374e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
375e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    ENTRY_LOG_CALLFLOW();
376e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data.loc_eng_ni_data;
377e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    loc_eng_ni_session_s_type* pSession = NULL;
378e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
379e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (NULL == loc_eng_data.ni_notify_cb) {
380e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        EXIT_LOG(%s, "loc_eng_ni_init hasn't happened yet.");
381e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        return;
382e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
383e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
384e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (notif_id == loc_eng_ni_data_p->sessionEs.reqID &&
385e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        NULL != loc_eng_ni_data_p->sessionEs.rawRequest) {
386e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pSession = &loc_eng_ni_data_p->sessionEs;
387e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // ignore any SUPL NI non-Es session if a SUPL NI ES is accepted
388e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (user_response == GPS_NI_RESPONSE_ACCEPT &&
389e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            NULL != loc_eng_ni_data_p->session.rawRequest) {
390e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                pthread_mutex_lock(&loc_eng_ni_data_p->session.tLock);
391e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                loc_eng_ni_data_p->session.resp = GPS_NI_RESPONSE_IGNORE;
392e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                loc_eng_ni_data_p->session.respRecvd = TRUE;
393e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                pthread_cond_signal(&loc_eng_ni_data_p->session.tCond);
394e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                pthread_mutex_unlock(&loc_eng_ni_data_p->session.tLock);
395e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
396e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    } else if (notif_id == loc_eng_ni_data_p->session.reqID &&
397e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        NULL != loc_eng_ni_data_p->session.rawRequest) {
398e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pSession = &loc_eng_ni_data_p->session;
399e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
400e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
401e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (pSession) {
402e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        LOC_LOGI("loc_eng_ni_respond: send user response %d for notif %d", user_response, notif_id);
403e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pthread_mutex_lock(&pSession->tLock);
404e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pSession->resp = user_response;
405e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pSession->respRecvd = TRUE;
406e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pthread_cond_signal(&pSession->tCond);
407e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pthread_mutex_unlock(&pSession->tLock);
408e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
409e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    else {
410e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        LOC_LOGE("loc_eng_ni_respond: notif_id %d not an active session", notif_id);
411e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
412e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
413e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    EXIT_LOG(%s, VOID_RET);
414e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
415