1bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
2bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *
3bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * Redistribution and use in source and binary forms, with or without
4bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * modification, are permitted provided that the following conditions are
5bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * met:
6bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *     * Redistributions of source code must retain the above copyright
7bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       notice, this list of conditions and the following disclaimer.
8bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *     * Redistributions in binary form must reproduce the above
9bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       copyright notice, this list of conditions and the following
10bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       disclaimer in the documentation and/or other materials provided
11bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       with the distribution.
12bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *     * Neither the name of The Linux Foundation, nor the names of its
13bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       contributors may be used to endorse or promote products derived
14bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       from this software without specific prior written permission.
15bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *
16bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *
28bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo */
29bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
30bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOG_NDDEBUG 0
31bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOG_TAG "LocSvc_afw"
32bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
33bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <hardware/gps.h>
34bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <gps_extended.h>
35bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <loc_eng.h>
36bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <loc_target.h>
37bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <loc_log.h>
38bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <fcntl.h>
39bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <errno.h>
40bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <dlfcn.h>
41bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/types.h>
42bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/stat.h>
43bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <fcntl.h>
44bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <errno.h>
45bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <LocDualContext.h>
46bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <cutils/properties.h>
47bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
48bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russousing namespace loc_core;
49bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
50bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo//Globals defns
51bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic gps_location_callback gps_loc_cb = NULL;
52bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic gps_sv_status_callback gps_sv_cb = NULL;
53bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic agps_status_callback agps_status_cb = NULL;
54bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
55bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void local_loc_cb(UlpLocation* location, void* locExt);
56bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void local_sv_cb(GpsSvStatus* sv_status, void* svExt);
57bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_agps_status_cb(AGpsStatus* status);
58bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
59bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic const GpsGeofencingInterface* get_geofence_interface(void);
60bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
61bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo// Function declarations for sLocEngInterface
62bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int  loc_init(GpsCallbacks* callbacks);
63bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int  loc_start();
64bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int  loc_stop();
65bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_cleanup();
66bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int  loc_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty);
67bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int  loc_inject_location(double latitude, double longitude, float accuracy);
68bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_delete_aiding_data(GpsAidingData f);
69bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int  loc_set_position_mode(GpsPositionMode mode, GpsPositionRecurrence recurrence,
70bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                  uint32_t min_interval, uint32_t preferred_accuracy,
71bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                  uint32_t preferred_time);
72bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic const void* loc_get_extension(const char* name);
73bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_close_mdm_node();
74bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo// Defines the GpsInterface in gps.h
75bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic const GpsInterface sLocEngInterface =
76bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
77bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   sizeof(GpsInterface),
78bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_init,
79bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_start,
80bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_stop,
81bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_cleanup,
82bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_inject_time,
83bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_inject_location,
84bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_delete_aiding_data,
85bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_set_position_mode,
86bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_get_extension
87bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo};
88bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
89bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo// Function declarations for sLocEngAGpsInterface
90bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_agps_init(AGpsCallbacks* callbacks);
91bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int  loc_agps_open(const char* apn);
92bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int  loc_agps_closed();
93bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int  loc_agps_open_failed();
94bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int  loc_agps_set_server(AGpsType type, const char *hostname, int port);
95bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int  loc_agps_open_with_apniptype( const char* apn, ApnIpType apnIpType);
96bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
97bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic const AGpsInterface sLocEngAGpsInterface =
98bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
99bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   sizeof(AGpsInterface),
100bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_agps_init,
101bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_agps_open,
102bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_agps_closed,
103bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_agps_open_failed,
104bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_agps_set_server,
105bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_agps_open_with_apniptype
106bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo};
107bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
108bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_xtra_init(GpsXtraCallbacks* callbacks);
109bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_xtra_inject_data(char* data, int length);
110bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
111bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic const GpsXtraInterface sLocEngXTRAInterface =
112bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
113bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    sizeof(GpsXtraInterface),
114bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_xtra_init,
115bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_xtra_inject_data
116bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo};
117bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
118bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_ni_init(GpsNiCallbacks *callbacks);
119bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_ni_respond(int notif_id, GpsUserResponseType user_response);
120bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
121bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic const GpsNiInterface sLocEngNiInterface =
122bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
123bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   sizeof(GpsNiInterface),
124bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_ni_init,
125bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_ni_respond,
126bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo};
127bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
128bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo// For shutting down MDM in fusion devices
129bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int mdm_fd = -1;
130bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_gps_measurement_init(GpsMeasurementCallbacks* callbacks);
131bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_gps_measurement_close();
132bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
133bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic const GpsMeasurementInterface sLocEngGpsMeasurementInterface =
134bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
135bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    sizeof(GpsMeasurementInterface),
136bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_gps_measurement_init,
137bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_gps_measurement_close
138bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo};
139bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
140bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_agps_ril_init( AGpsRilCallbacks* callbacks );
141bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_agps_ril_set_ref_location(const AGpsRefLocation *agps_reflocation, size_t sz_struct);
142bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_agps_ril_set_set_id(AGpsSetIDType type, const char* setid);
143bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_agps_ril_ni_message(uint8_t *msg, size_t len);
144bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_agps_ril_update_network_state(int connected, int type, int roaming, const char* extra_info);
145bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_agps_ril_update_network_availability(int avaiable, const char* apn);
146bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
147bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic const AGpsRilInterface sLocEngAGpsRilInterface =
148bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
149bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   sizeof(AGpsRilInterface),
150bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_agps_ril_init,
151bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_agps_ril_set_ref_location,
152bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_agps_ril_set_set_id,
153bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_agps_ril_ni_message,
154bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_agps_ril_update_network_state,
155bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   loc_agps_ril_update_network_availability
156bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo};
157bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
158bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_agps_install_certificates(const DerEncodedCertificate* certificates,
159bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                         size_t length);
160bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_agps_revoke_certificates(const Sha1CertificateFingerprint* fingerprints,
161bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                        size_t length);
162bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
163bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic const SuplCertificateInterface sLocEngAGpsCertInterface =
164bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
165bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    sizeof(SuplCertificateInterface),
166bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_agps_install_certificates,
167bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_agps_revoke_certificates
168bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo};
169bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
170bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_configuration_update(const char* config_data, int32_t length);
171bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
172bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic const GnssConfigurationInterface sLocEngConfigInterface =
173bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
174bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    sizeof(GnssConfigurationInterface),
175bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_configuration_update
176bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo};
177bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
178bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic loc_eng_data_s_type loc_afw_data;
179bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int gss_fd = -1;
180bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
181bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
182bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    gps_get_hardware_interface
183bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
184bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
185bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Returns the GPS hardware interaface based on LOC API
186bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   if GPS is enabled.
187bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
188bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
189bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
190bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
191bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
192bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0: success
193bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
194bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
195bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
196bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
197bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
198bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoconst GpsInterface* gps_get_hardware_interface ()
199bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
200bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG_CALLFLOW();
201bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    const GpsInterface* ret_val;
202bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
203bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    char propBuf[PROPERTY_VALUE_MAX];
204bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
205bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_eng_read_config();
206bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
207bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    // check to see if GPS should be disabled
208bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    property_get("gps.disable", propBuf, "");
209bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (propBuf[0] == '1')
210bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    {
211bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGD("gps_get_interface returning NULL because gps.disable=1\n");
212bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        ret_val = NULL;
213bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    } else {
214bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        ret_val = &sLocEngInterface;
215bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
216bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
217bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_eng_read_config();
218bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
219bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%p, ret_val);
220bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
221bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
222bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
223bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo// for gps.c
224bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoextern "C" const GpsInterface* get_gps_interface()
225bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
226bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    unsigned int target = TARGET_DEFAULT;
227bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_eng_read_config();
228bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
229bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    target = loc_get_target();
230bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_LOGD("Target name check returned %s", loc_get_target_name(target));
231bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
232bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int gnssType = getTargetGnssType(target);
233bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    switch (gnssType)
234bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    {
235bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    case GNSS_GSS:
236bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        //APQ8064
237bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        gps_conf.CAPABILITIES &= ~(GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB);
238bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        gss_fd = open("/dev/gss", O_RDONLY);
239bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        if (gss_fd < 0) {
240bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            LOC_LOGE("GSS open failed: %s\n", strerror(errno));
241bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        }
242bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        else {
243bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            LOC_LOGD("GSS open success! CAPABILITIES %0lx\n",
244bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                     gps_conf.CAPABILITIES);
245bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        }
246bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        break;
247bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    case GNSS_NONE:
248bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        //MPQ8064
249bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGE("No GPS HW on this target. Not returning interface.");
250bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        return NULL;
251bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    case GNSS_QCA1530:
252bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        // qca1530 chip is present
253bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        gps_conf.CAPABILITIES &= ~(GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB);
254bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGD("qca1530 present: CAPABILITIES %0lx\n", gps_conf.CAPABILITIES);
255bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        break;
256bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
257bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return &sLocEngInterface;
258bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
259bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
260bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
261bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_init
262bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
263bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
264bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Initialize the location engine, this include setting up global datas
265bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   and registers location engien with loc api service.
266bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
267bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
268bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
269bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
270bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
271bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0: success
272bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
273bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
274bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/Ax
275bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
276bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
277bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_init(GpsCallbacks* callbacks)
278bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
279bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int retVal = -1;
280bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int i = 0;
281bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
282bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_API_ADAPTER_EVENT_MASK_T event;
283bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
284bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (NULL == callbacks) {
285bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGE("loc_init failed. cb = NULL\n");
286bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        EXIT_LOG(%d, retVal);
287bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        return retVal;
288bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
289bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
290bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    event = LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
291bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            LOC_API_ADAPTER_BIT_SATELLITE_REPORT |
292bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST |
293bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST |
294bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            LOC_API_ADAPTER_BIT_IOCTL_REPORT |
295bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            LOC_API_ADAPTER_BIT_STATUS_REPORT |
296bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT |
297bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST;
298bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
299bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LocCallbacks clientCallbacks = {local_loc_cb, /* location_cb */
300bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                    callbacks->status_cb, /* status_cb */
301bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                    local_sv_cb, /* sv_status_cb */
302bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                    callbacks->nmea_cb, /* nmea_cb */
303bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                    callbacks->set_capabilities_cb, /* set_capabilities_cb */
304bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                    callbacks->acquire_wakelock_cb, /* acquire_wakelock_cb */
305bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                    callbacks->release_wakelock_cb, /* release_wakelock_cb */
306bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                    callbacks->create_thread_cb, /* create_thread_cb */
307bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                    NULL, /* location_ext_parser */
308bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                    NULL, /* sv_ext_parser */
309bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                    callbacks->request_utc_time_cb, /* request_utc_time_cb */
310bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                    loc_close_mdm_node  /*loc_shutdown_cb*/};
311bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
312bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    gps_loc_cb = callbacks->location_cb;
313bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    gps_sv_cb = callbacks->sv_status_cb;
314bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
315bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    retVal = loc_eng_init(loc_afw_data, &clientCallbacks, event, NULL);
316bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_afw_data.adapter->mSupportsAgpsRequests = !loc_afw_data.adapter->hasAgpsExtendedCapabilities();
317bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_afw_data.adapter->mSupportsPositionInjection = !loc_afw_data.adapter->hasCPIExtendedCapabilities();
318bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_afw_data.adapter->setGpsLockMsg(0);
319bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_afw_data.adapter->requestUlp(gps_conf.CAPABILITIES);
320bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
321bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if(retVal) {
322bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGE("loc_eng_init() fail!");
323bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        goto err;
324bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
325bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
326bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_afw_data.adapter->setPowerVoteRight(loc_get_target() == TARGET_QCA1530);
327bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_afw_data.adapter->setPowerVote(true);
328bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
329bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_LOGD("loc_eng_init() success!");
330bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
331bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#ifdef PLATFORM_MSM8084
332bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (mdm_fd < 0) {
333bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        int (*open_first_external_modem)(void);
334bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        const char *name = "libdetectmodem.so";
335bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        const char *func = "open_first_external_modem";
336bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        const char *error;
337bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
338bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        void *lib = ::dlopen(name, RTLD_NOW);
339bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        error = ::dlerror();
340bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        if (!lib) {
341bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            LOC_LOGE("%s: could not find %s: %s", __func__, name, error);
342bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            goto err;
343bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        }
344bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
345bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        open_first_external_modem = NULL;
346bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        *(void **)(&open_first_external_modem) = ::dlsym(lib, func);
347bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        error = ::dlerror();
348bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
349bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        if (!open_first_external_modem) {
350bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            LOC_LOGE("%s: could not find symbol %s in %s: %s",
351bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                     __func__, func, name, error);
352bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        }
353bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        else {
354bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            errno = 0;
355bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            mdm_fd = open_first_external_modem();
356bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            if (mdm_fd < 0) {
357bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                LOC_LOGE("%s: %s failed: %s\n", __func__, func, strerror(errno));
358bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            }
359bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            else {
360bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                LOC_LOGD("%s: external power up modem opened successfully\n", __func__);
361bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            }
362bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        }
363bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        dlclose(lib);
364bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    } else {
365bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGD("powerup_node has been opened before");
366bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
367bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#endif //PLATFORM_MSM8084
368bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoerr:
369bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, retVal);
370bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return retVal;
371bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
372bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
373bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
374bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_close_mdm_node
375bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
376bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
377bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   closes mdm_fd which is the modem powerup node obtained in loc_init
378bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
379bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
380bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
381bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
382bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
383bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
384bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
385bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
386bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
387bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
388bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
389bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_close_mdm_node()
390bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
391bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
392bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (mdm_fd >= 0) {
393bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGD("closing the powerup node");
394bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        close(mdm_fd);
395bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        mdm_fd = -1;
396bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGD("finished closing the powerup node");
397bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    } else {
398bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGD("powerup node has not been opened yet.");
399bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
400bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
401bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%s, VOID_RET);
402bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
403bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
404bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
405bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_cleanup
406bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
407bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
408bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Cleans location engine. The location client handle will be released.
409bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
410bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
411bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
412bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
413bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
414bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
415bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
416bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
417bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
418bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
419bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
420bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_cleanup()
421bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
422bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
423bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
424bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_afw_data.adapter->setPowerVote(false);
425bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_afw_data.adapter->setGpsLockMsg(gps_conf.GPS_LOCK);
426bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
427bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_eng_cleanup(loc_afw_data);
428bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_close_mdm_node();
429bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    gps_loc_cb = NULL;
430bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    gps_sv_cb = NULL;
431bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
432bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%s, VOID_RET);
433bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
434bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
435bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
436bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_start
437bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
438bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
439bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Starts the tracking session
440bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
441bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
442bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
443bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
444bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
445bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0: success
446bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
447bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
448bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
449bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
450bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
451bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_start()
452bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
453bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
454bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = loc_eng_start(loc_afw_data);
455bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
456bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, ret_val);
457bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
458bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
459bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
460bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
461bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_stop
462bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
463bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
464bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Stops the tracking session
465bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
466bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
467bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
468bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
469bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
470bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0: success
471bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
472bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
473bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
474bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
475bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
476bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_stop()
477bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
478bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
479bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = -1;
480bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ret_val = loc_eng_stop(loc_afw_data);
481bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
482bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, ret_val);
483bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
484bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
485bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
486bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
487bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_set_position_mode
488bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
489bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
490bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Sets the mode and fix frequency for the tracking session.
491bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
492bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
493bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
494bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
495bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
496bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0: success
497bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
498bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
499bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
500bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
501bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
502bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int  loc_set_position_mode(GpsPositionMode mode,
503bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                  GpsPositionRecurrence recurrence,
504bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                  uint32_t min_interval,
505bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                  uint32_t preferred_accuracy,
506bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                  uint32_t preferred_time)
507bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
508bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
509bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = -1;
510bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LocPositionMode locMode;
511bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    switch (mode) {
512bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    case GPS_POSITION_MODE_MS_BASED:
513bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        locMode = LOC_POSITION_MODE_MS_BASED;
514bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        break;
515bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    case GPS_POSITION_MODE_MS_ASSISTED:
516bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        locMode = LOC_POSITION_MODE_MS_ASSISTED;
517bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        break;
518bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    default:
519bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        locMode = LOC_POSITION_MODE_STANDALONE;
520bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        break;
521bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
522bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
523bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LocPosMode params(locMode, recurrence, min_interval,
524bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                      preferred_accuracy, preferred_time, NULL, NULL);
525bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ret_val = loc_eng_set_position_mode(loc_afw_data, params);
526bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
527bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, ret_val);
528bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
529bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
530bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
531bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
532bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_inject_time
533bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
534bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
535bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   This is used by Java native function to do time injection.
536bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
537bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
538bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
539bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
540bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
541bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0
542bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
543bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
544bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
545bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
546bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
547bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty)
548bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
549bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
550bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = 0;
551bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
552bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ret_val = loc_eng_inject_time(loc_afw_data, time,
553bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                  timeReference, uncertainty);
554bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
555bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, ret_val);
556bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
557bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
558bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
559bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
560bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
561bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_inject_location
562bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
563bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
564bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   This is used by Java native function to do location injection.
565bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
566bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
567bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
568bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
569bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
570bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0          : Successful
571bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   error code : Failure
572bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
573bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
574bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
575bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
576bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_inject_location(double latitude, double longitude, float accuracy)
577bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
578bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    static bool initialized = false;
579bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    static bool enable_cpi = true;
580bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
581bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
582bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (accuracy < 1000)
583bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    {
584bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      accuracy = 1000;
585bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
586bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
587bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = 0;
588bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ret_val = loc_eng_inject_location(loc_afw_data, latitude, longitude, accuracy);
589bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
590bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if(!initialized)
591bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    {
592bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        char value[PROPERTY_VALUE_MAX];
593bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        memset(value, 0, sizeof(value));
594bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        (void)property_get("persist.gps.qc_nlp_in_use", value, "0");
595bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        if(0 == strcmp(value, "1"))
596bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        {
597bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            enable_cpi = false;
598bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            LOC_LOGI("GPS HAL coarse position injection disabled");
599bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        }
600bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        else
601bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        {
602bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            LOC_LOGI("GPS HAL coarse position injection enabled");
603bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        }
604bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        initialized = true;
605bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
606bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
607bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if(enable_cpi)
608bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    {
609bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      ret_val = loc_eng_inject_location(loc_afw_data, latitude, longitude, accuracy);
610bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
611bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, ret_val);
612bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
613bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
614bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
615bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
616bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
617bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_delete_aiding_data
618bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
619bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
620bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   This is used by Java native function to delete the aiding data. The function
621bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   updates the global variable for the aiding data to be deleted. If the GPS
622bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   engine is off, the aiding data will be deleted. Otherwise, the actual action
623bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   will happen when gps engine is turned off.
624bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
625bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
626bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Assumes the aiding data type specified in GpsAidingData matches with
627bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   LOC API specification.
628bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
629bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
630bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
631bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
632bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
633bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
634bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
635bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
636bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_delete_aiding_data(GpsAidingData f)
637bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
638bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
639bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_eng_delete_aiding_data(loc_afw_data, f);
640bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
641bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%s, VOID_RET);
642bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
643bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
644bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoconst GpsGeofencingInterface* get_geofence_interface(void)
645bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
646bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
647bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    void *handle;
648bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    const char *error;
649bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    typedef const GpsGeofencingInterface* (*get_gps_geofence_interface_function) (void);
650bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    get_gps_geofence_interface_function get_gps_geofence_interface;
651bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    static const GpsGeofencingInterface* geofence_interface = NULL;
652bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
653bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    dlerror();    /* Clear any existing error */
654bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
655bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    handle = dlopen ("libgeofence.so", RTLD_NOW);
656bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
657bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (!handle)
658bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    {
659bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        if ((error = dlerror()) != NULL)  {
660bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            LOC_LOGE ("%s, dlopen for libgeofence.so failed, error = %s\n", __func__, error);
661bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo           }
662bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        goto exit;
663bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
664bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    dlerror();    /* Clear any existing error */
665bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    get_gps_geofence_interface = (get_gps_geofence_interface_function)dlsym(handle, "gps_geofence_get_interface");
666bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if ((error = dlerror()) != NULL)  {
667bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGE ("%s, dlsym for get_gps_geofence_interface failed, error = %s\n", __func__, error);
668bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        goto exit;
669bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo     }
670bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
671bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    geofence_interface = get_gps_geofence_interface();
672bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
673bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoexit:
674bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, geofence_interface == NULL);
675bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return geofence_interface;
676bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
677bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
678bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_get_extension
679bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
680bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
681bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Get the gps extension to support XTRA.
682bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
683bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
684bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
685bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
686bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
687bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   The GPS extension interface.
688bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
689bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
690bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
691bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
692bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
693bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoconst void* loc_get_extension(const char* name)
694bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
695bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
696bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    const void* ret_val = NULL;
697bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
698bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   LOC_LOGD("%s:%d] For Interface = %s\n",__func__, __LINE__, name);
699bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   if (strcmp(name, GPS_XTRA_INTERFACE) == 0)
700bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   {
701bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo       ret_val = &sLocEngXTRAInterface;
702bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   }
703bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   else if (strcmp(name, AGPS_INTERFACE) == 0)
704bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   {
705bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo       ret_val = &sLocEngAGpsInterface;
706bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   }
707bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   else if (strcmp(name, GPS_NI_INTERFACE) == 0)
708bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   {
709bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo       ret_val = &sLocEngNiInterface;
710bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   }
711bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   else if (strcmp(name, AGPS_RIL_INTERFACE) == 0)
712bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   {
713bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo       char baseband[PROPERTY_VALUE_MAX];
714bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo       property_get("ro.baseband", baseband, "msm");
715bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo       if (strcmp(baseband, "csfb") == 0)
716bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo       {
717bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo           ret_val = &sLocEngAGpsRilInterface;
718bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo       }
719bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   }
720bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   else if (strcmp(name, GPS_GEOFENCING_INTERFACE) == 0)
721bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   {
722bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo       if ((gps_conf.CAPABILITIES | GPS_CAPABILITY_GEOFENCING) == gps_conf.CAPABILITIES ){
723bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo           ret_val = get_geofence_interface();
724bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo       }
725bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   }
726bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   else if (strcmp(name, SUPL_CERTIFICATE_INTERFACE) == 0)
727bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   {
728bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo       ret_val = &sLocEngAGpsCertInterface;
729bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   }
730bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   else if (strcmp(name, GNSS_CONFIGURATION_INTERFACE) == 0)
731bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   {
732bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo       ret_val = &sLocEngConfigInterface;
733bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   }
734bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   else if (strcmp(name, GPS_MEASUREMENT_INTERFACE) == 0)
735bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   {
736bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo       ret_val = &sLocEngGpsMeasurementInterface;
737bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   }
738bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   else
739bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   {
740bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      LOC_LOGE ("get_extension: Invalid interface passed in\n");
741bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   }
742bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%p, ret_val);
743bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
744bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
745bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
746bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
747bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_agps_init
748bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
749bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
750bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Initialize the AGps interface.
751bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
752bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
753bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   NONE
754bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
755bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
756bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0
757bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
758bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
759bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
760bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
761bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
762bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_agps_init(AGpsCallbacks* callbacks)
763bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
764bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
765bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (agps_status_cb == NULL) {
766bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        agps_status_cb = callbacks->status_cb;
767bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        callbacks->status_cb = loc_agps_status_cb;
768bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
769bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_eng_agps_init(loc_afw_data, (AGpsExtCallbacks*)callbacks);
770bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%s, VOID_RET);
771bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
772bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
773bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
774bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_agps_open
775bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
776bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
777bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   This function is called when on-demand data connection opening is successful.
778bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoIt should inform ARM 9 about the data open result.
779bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
780bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
781bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   NONE
782bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
783bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
784bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0
785bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
786bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
787bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
788bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
789bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
790bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_agps_open(const char* apn)
791bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
792bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
793bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    AGpsType agpsType = AGPS_TYPE_SUPL;
794bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    AGpsBearerType bearerType = AGPS_APN_BEARER_IPV4;
795bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = loc_eng_agps_open(loc_afw_data, agpsType, apn, bearerType);
796bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
797bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, ret_val);
798bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
799bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
800bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
801bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
802bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_agps_open_with_apniptype
803bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
804bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
805bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   This function is called when on-demand data connection opening is successful.
806bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoIt should inform ARM 9 about the data open result.
807bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
808bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
809bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   NONE
810bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
811bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
812bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0
813bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
814bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
815bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
816bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
817bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
818bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int  loc_agps_open_with_apniptype(const char* apn, ApnIpType apnIpType)
819bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
820bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
821bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    AGpsType agpsType = AGPS_TYPE_SUPL;
822bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    AGpsBearerType bearerType;
823bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
824bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    switch (apnIpType) {
825bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case APN_IP_IPV4:
826bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            bearerType = AGPS_APN_BEARER_IPV4;
827bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
828bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case APN_IP_IPV6:
829bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            bearerType = AGPS_APN_BEARER_IPV6;
830bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
831bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case APN_IP_IPV4V6:
832bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            bearerType = AGPS_APN_BEARER_IPV4V6;
833bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
834bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        default:
835d7b1204cc565f482a6067953cebe25b16cc2a148Dante Russo            bearerType = AGPS_APN_BEARER_IPV4;
836bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
837bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
838bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
839bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = loc_eng_agps_open(loc_afw_data, agpsType, apn, bearerType);
840bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
841bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, ret_val);
842bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
843bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
844bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
845bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
846bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_agps_closed
847bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
848bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
849bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   This function is called when on-demand data connection closing is done.
850bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoIt should inform ARM 9 about the data close result.
851bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
852bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
853bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   NONE
854bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
855bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
856bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0
857bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
858bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
859bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
860bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
861bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
862bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_agps_closed()
863bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
864bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
865bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    AGpsType agpsType = AGPS_TYPE_SUPL;
866bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = loc_eng_agps_closed(loc_afw_data, agpsType);
867bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
868bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, ret_val);
869bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
870bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
871bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
872bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
873bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_agps_open_failed
874bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
875bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
876bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   This function is called when on-demand data connection opening has failed.
877bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoIt should inform ARM 9 about the data open result.
878bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
879bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
880bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   NONE
881bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
882bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
883bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0
884bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
885bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
886bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
887bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
888bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
889bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_agps_open_failed()
890bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
891bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
892bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    AGpsType agpsType = AGPS_TYPE_SUPL;
893bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = loc_eng_agps_open_failed(loc_afw_data, agpsType);
894bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
895bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, ret_val);
896bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
897bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
898bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
899bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
900bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_agps_set_server
901bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
902bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
903bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   If loc_eng_set_server is called before loc_eng_init, it doesn't work. This
904bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   proxy buffers server settings and calls loc_eng_set_server when the client is
905bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   open.
906bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
907bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
908bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   NONE
909bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
910bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
911bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0
912bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
913bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
914bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
915bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
916bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
917bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_agps_set_server(AGpsType type, const char* hostname, int port)
918bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
919bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
920bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LocServerType serverType;
921bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    switch (type) {
922bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    case AGPS_TYPE_SUPL:
923bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        serverType = LOC_AGPS_SUPL_SERVER;
924bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        break;
925bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    case AGPS_TYPE_C2K:
926bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        serverType = LOC_AGPS_CDMA_PDE_SERVER;
927bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        break;
928bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    default:
929bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        serverType = LOC_AGPS_SUPL_SERVER;
930bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
931bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = loc_eng_set_server_proxy(loc_afw_data, serverType, hostname, port);
932bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
933bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, ret_val);
934bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
935bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
936bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
937bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
938bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTIONf571
939bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_xtra_init
940bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
941bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
942bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Initialize XTRA module.
943bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
944bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
945bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
946bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
947bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
948bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0: success
949bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
950bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
951bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
952bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
953bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
954bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_xtra_init(GpsXtraCallbacks* callbacks)
955bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
956bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
957bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = loc_eng_xtra_init(loc_afw_data, (GpsXtraExtCallbacks*)callbacks);
958bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
959bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, ret_val);
960bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
961bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
962bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
963bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
964bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
965bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_xtra_inject_data
966bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
967bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
968bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Initialize XTRA module.
969bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
970bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
971bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
972bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
973bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
974bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0: success
975bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
976bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
977bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
978bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
979bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
980bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_xtra_inject_data(char* data, int length)
981bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
982bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
983bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = -1;
984bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if( (data != NULL) && ((unsigned int)length <= XTRA_DATA_MAX_SIZE))
985bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        ret_val = loc_eng_xtra_inject_data(loc_afw_data, data, length);
986bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    else
987bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGE("%s, Could not inject XTRA data. Buffer address: %p, length: %d",
988bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                __func__, data, length);
989bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, ret_val);
990bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
991bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
992bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
993bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
994bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_gps_measurement_init
995bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
996bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
997bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   This function initializes the gps measurement interface
998bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
999bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
1000bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   NONE
1001bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1002bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
1003bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
1004bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1005bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
1006bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
1007bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1008bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
1009bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_gps_measurement_init(GpsMeasurementCallbacks* callbacks)
1010bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
1011bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
1012bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = loc_eng_gps_measurement_init(loc_afw_data,
1013bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                               callbacks);
1014bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1015bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, ret_val);
1016bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
1017bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
1018bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1019bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
1020bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_gps_measurement_close
1021bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1022bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
1023bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   This function closes the gps measurement interface
1024bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1025bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
1026bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   NONE
1027bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1028bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
1029bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
1030bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1031bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
1032bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
1033bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1034bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
1035bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_gps_measurement_close()
1036bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
1037bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
1038bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_eng_gps_measurement_close(loc_afw_data);
1039bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1040bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%s, VOID_RET);
1041bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
1042bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1043bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
1044bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_ni_init
1045bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1046bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
1047bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   This function initializes the NI interface
1048bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1049bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
1050bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   NONE
1051bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1052bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
1053bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
1054bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1055bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
1056bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
1057bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1058bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
1059bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russovoid loc_ni_init(GpsNiCallbacks *callbacks)
1060bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
1061bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
1062bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_eng_ni_init(loc_afw_data,(GpsNiExtCallbacks*) callbacks);
1063bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%s, VOID_RET);
1064bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
1065bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1066bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
1067bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_ni_respond
1068bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1069bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
1070bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   This function sends an NI respond to the modem processor
1071bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1072bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
1073bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   NONE
1074bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1075bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
1076bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
1077bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1078bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
1079bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
1080bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1081bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
1082bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russovoid loc_ni_respond(int notif_id, GpsUserResponseType user_response)
1083bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
1084bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
1085bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_eng_ni_respond(loc_afw_data, notif_id, user_response);
1086bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%s, VOID_RET);
1087bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
1088bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1089bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo// Below stub functions are members of sLocEngAGpsRilInterface
1090bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_agps_ril_init( AGpsRilCallbacks* callbacks ) {}
1091bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_agps_ril_set_ref_location(const AGpsRefLocation *agps_reflocation, size_t sz_struct) {}
1092bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_agps_ril_set_set_id(AGpsSetIDType type, const char* setid) {}
1093bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_agps_ril_ni_message(uint8_t *msg, size_t len) {}
1094bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_agps_ril_update_network_state(int connected, int type, int roaming, const char* extra_info) {}
1095bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1096bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
1097bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_agps_ril_update_network_availability
1098bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1099bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
1100bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Sets data call allow vs disallow flag to modem
1101bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   This is the only member of sLocEngAGpsRilInterface implemented.
1102bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1103bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
1104bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
1105bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1106bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
1107bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0: success
1108bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1109bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
1110bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
1111bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1112bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
1113bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_agps_ril_update_network_availability(int available, const char* apn)
1114bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
1115bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
1116bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_eng_agps_ril_update_network_availability(loc_afw_data, available, apn);
1117bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%s, VOID_RET);
1118bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
1119bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1120bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_agps_install_certificates(const DerEncodedCertificate* certificates,
1121bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                         size_t length)
1122bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
1123bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
1124bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = loc_eng_agps_install_certificates(loc_afw_data, certificates, length);
1125bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, ret_val);
1126bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
1127bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
1128bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic int loc_agps_revoke_certificates(const Sha1CertificateFingerprint* fingerprints,
1129bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                        size_t length)
1130bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
1131bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
1132bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_LOGE("agps_revoke_certificates not supported");
1133bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = AGPS_CERTIFICATE_ERROR_GENERIC;
1134bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%d, ret_val);
1135bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
1136bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
1137bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1138bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_configuration_update(const char* config_data, int32_t length)
1139bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
1140bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
1141bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_eng_configuration_update(loc_afw_data, config_data, length);
1142bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%s, VOID_RET);
1143bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
1144bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1145bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void local_loc_cb(UlpLocation* location, void* locExt)
1146bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
1147bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
1148bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (NULL != location) {
1149bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        CALLBACK_LOG_CALLFLOW("location_cb - from", %d, location->position_source);
1150bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1151bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        if (NULL != gps_loc_cb) {
1152bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            gps_loc_cb(&location->gpsLocation);
1153bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        }
1154bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
1155bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%s, VOID_RET);
1156bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
1157bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1158bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void local_sv_cb(GpsSvStatus* sv_status, void* svExt)
1159bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
1160bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
1161bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (NULL != gps_sv_cb) {
1162bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        CALLBACK_LOG_CALLFLOW("sv_status_cb -", %d, sv_status->num_svs);
1163bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        gps_sv_cb(sv_status);
1164bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
1165bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%s, VOID_RET);
1166bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
1167bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1168bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_agps_status_cb(AGpsStatus* status)
1169bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
1170bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
1171bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1172bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (NULL != agps_status_cb) {
1173bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        size_t realSize = sizeof(AGpsStatus);
1174bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGD("agps_status size=%d real-size=%d", status->size, realSize);
1175bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        status->size = realSize;
1176bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        agps_status_cb(status);
1177bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
1178bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG(%s, VOID_RET);
1179bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
1180bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
1181